From owner-p4-projects@FreeBSD.ORG Thu Apr 1 21:28:22 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9E6DD16A4D0; Thu, 1 Apr 2004 21:28:22 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5D6EC16A4CE for ; Thu, 1 Apr 2004 21:28:22 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 414D943D2D for ; Thu, 1 Apr 2004 21:28:22 -0800 (PST) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id i325SMGe071735 for ; Thu, 1 Apr 2004 21:28:22 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i325SLQG071732 for perforce@freebsd.org; Thu, 1 Apr 2004 21:28:21 -0800 (PST) (envelope-from peter@freebsd.org) Date: Thu, 1 Apr 2004 21:28:21 -0800 (PST) Message-Id: <200404020528.i325SLQG071732@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 50165 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Apr 2004 05:28:23 -0000 http://perforce.freebsd.org/chv.cgi?CH=50165 Change 50165 by peter@peter_hammer on 2004/04/01 21:27:27 read shstrtab earlier so we can use it for debug output really fix the local symbol relocator (I hope) Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#22 edit Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#22 (text+ko) ==== @@ -416,6 +416,13 @@ error = ENOMEM; goto out; } +printf("reading shstrtab\n"); + error = vn_rdwr(UIO_READ, nd.ni_vp, + ef->shstrtab, shdr[shstrindex].sh_size, shdr[shstrindex].sh_offset, + UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, + &resid, td); + if (error) + goto out; } /* Size code/data(progbits) and bss(nobits). allocate space for relocs */ @@ -510,6 +517,10 @@ goto out; } mapbase = ef->address; + /* Wire the pages */ + vm_map_wire(kernel_map, (vm_offset_t)mapbase, + (vm_offset_t)mapbase + round_page(mapsize), + VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES); printf("final mapbase %p, final mapsize %ld\n", mapbase, mapsize); /* Add the base address to the previously calculated/aligned offsets */ @@ -538,15 +549,6 @@ &resid, td); if (error) goto out; - if (ef->shstrtab) { -printf("reading shstrtab\n"); - error = vn_rdwr(UIO_READ, nd.ni_vp, - ef->shstrtab, shdr[shstrindex].sh_size, shdr[shstrindex].sh_offset, - UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, - &resid, td); - if (error) - goto out; - } printf("reading progbits\n"); /* Read in the text/data/set/etc sections */ @@ -560,10 +562,6 @@ &resid, td); if (error) goto out; - /* Wire the pages */ - vm_map_wire(kernel_map, (vm_offset_t)ef->progtab[i].addr, - (vm_offset_t)ef->progtab[i].addr + ef->progtab[i].filesz, - VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES); } /* @@ -935,53 +933,47 @@ sym = ef->ddbsymtab + symidx; printf("sym: %p (base %p)\n", sym, ef->ddbsymtab); -#if 0 /* Theoretically we can avoid a lookup for some locals */ switch (ELF64_ST_BIND(sym->st_info)) { case STB_LOCAL: - case STB_GLOBAL: - case STB_WEAK: - } -#endif - switch (ELF64_ST_TYPE(sym->st_info)) { - case STT_OBJECT: - case STT_FUNC: - /* Relative to Data or Function name */ - symbol = ef->ddbstrtab + sym->st_name; -printf("strtab %p, st_name %d\n", ef->ddbstrtab, sym->st_name); -printf("symbol = %p (%s)\n", symbol, symbol); - - /* Force a lookup failure if the symbol name is bogus. */ - if (*symbol == 0) + /* Local, but undefined? huh? */ + if (sym->st_shndx == SHN_UNDEF) return (0); - -printf("calling linker_file_lookup_symbol, deps %d\n", deps); - ret = ((Elf_Addr)linker_file_lookup_symbol(lf, symbol, deps)); -printf("linker_file_lookup_symbol returns 0x%lx\n", ret); - return ret; - - case STT_SECTION: + ret = 0; /* Relative to section number */ for (i = 0; i < ef->nprogtab; i++) { if (sym->st_shndx == ef->progtab[i].sec) { printf("FOUND PROGBITS SECTION RELOC, name %s\n", ef->progtab[i].name); ret = (Elf_Addr)ef->progtab[i].addr; printf("returning base 0x%lx\n", ret); - return ret; + break; } } - for (i = 0; i < ef->nnobittab; i++) { - if (sym->st_shndx == ef->nobittab[i].sec) { + if (ret == 0) { + for (i = 0; i < ef->nnobittab; i++) { + if (sym->st_shndx == ef->nobittab[i].sec) { printf("FOUND NOBITS SECTION RELOC, name %s\n", ef->nobittab[i].name); - ret = (Elf_Addr)ef->nobittab[i].addr; + ret = (Elf_Addr)ef->nobittab[i].addr; printf("returning base 0x%lx\n", ret); - return ret; + break; + } } } -printf("STT_SECTION index %d not found!\n", sym->st_shndx); - return (0); + return ret + sym->st_value; + + case STB_GLOBAL: + /* Relative to Data or Function name */ + symbol = ef->ddbstrtab + sym->st_name; + + /* Force a lookup failure if the symbol name is bogus. */ + if (*symbol == 0) + return (0); +printf("calling linker_file_lookup_symbol, deps %d\n", deps); + ret = ((Elf_Addr)linker_file_lookup_symbol(lf, symbol, deps)); +printf("linker_file_lookup_symbol returns 0x%lx\n", ret); + return ret; default: -printf("Unknown symbol type! %d\n", ELF64_ST_TYPE(sym->st_info)); +printf("UNKNOWN BINDING %d\n", ELF64_ST_BIND(sym->st_info)); return (0); } }