From owner-p4-projects@FreeBSD.ORG Mon May 17 21:56:41 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3ABEB16A4D0; Mon, 17 May 2004 21:56:41 -0700 (PDT) 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 E060816A4CE for ; Mon, 17 May 2004 21:56:40 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id B756743D58 for ; Mon, 17 May 2004 21:56:36 -0700 (PDT) (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 i4I4uaGe084617 for ; Mon, 17 May 2004 21:56:36 -0700 (PDT) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i4I4ua24084614 for perforce@freebsd.org; Mon, 17 May 2004 21:56:36 -0700 (PDT) (envelope-from peter@freebsd.org) Date: Mon, 17 May 2004 21:56:36 -0700 (PDT) Message-Id: <200405180456.i4I4ua24084614@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 52965 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: Tue, 18 May 2004 04:56:41 -0000 http://perforce.freebsd.org/chv.cgi?CH=52965 Change 52965 by peter@peter_hammer on 2004/05/17 21:56:07 Fix last(?) outstanding bug. Even global bind symbols might have a local definition (!). Use that in preference, if it exists. While here.. eliminate padding; remove 'align' field from progtab; convert some silent failures on programming errors to panics. Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#37 edit Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#37 (text+ko) ==== @@ -61,7 +61,6 @@ typedef struct { void *addr; Elf_Off size; - int align; int flags; int sec; /* Original section */ char *name; @@ -83,7 +82,6 @@ typedef struct elf_file { struct linker_file lf; /* Common fields */ - char pad0[80]; caddr_t address; /* Relocation address */ vm_object_t object; /* VM object to hold file pages */ Elf_Shdr *e_shdr; @@ -104,7 +102,6 @@ caddr_t shstrtab; /* Section name string table */ long shstrcnt; /* number of bytes in string table */ - char pad2[80]; } *elf_file_t; @@ -503,7 +500,6 @@ bzero(ef->progtab[pb].addr, shdr[i].sh_size); } ef->progtab[pb].size = shdr[i].sh_size; - ef->progtab[pb].align = shdr[i].sh_addralign; ef->progtab[pb].sec = i; if (ef->shstrtab && shdr[i].sh_name != 0) ef->progtab[pb].name = @@ -673,7 +669,7 @@ for (i = 0; i < ef->nrel; i++) { rel = ef->reltab[i].rel; if (rel == NULL) - continue; + panic("lost a reltab!"); rellim = rel + ef->reltab[i].nrel; base = findbase(ef, ef->reltab[i].sec); for ( ; rel < rellim; rel++) { @@ -698,7 +694,7 @@ for (i = 0; i < ef->nrela; i++) { rela = ef->relatab[i].rela; if (rela == NULL) - continue; + panic("lost a relatab!"); relalim = rela + ef->relatab[i].nrela; base = findbase(ef, ef->relatab[i].sec); for ( ; rela < relalim; rela++) { @@ -872,12 +868,8 @@ sym = ef->ddbsymtab + symidx; - /* Theoretically we can avoid a lookup for some locals */ - switch (ELF_ST_BIND(sym->st_info)) { - case STB_LOCAL: - /* Local, but undefined? huh? */ - if (sym->st_shndx == SHN_UNDEF) - return (0); + /* Quick answer if there is a definition included. */ + if (sym->st_shndx != SHN_UNDEF) { ret = 0; /* Relative to section number */ for (i = 0; i < ef->nprogtab; i++) { @@ -887,7 +879,14 @@ } } return ret + sym->st_value; + } + /* If we get here, then it is undefined and needs a lookup. */ + switch (ELF_ST_BIND(sym->st_info)) { + case STB_LOCAL: + /* Local, but undefined? huh? */ + return (0); + case STB_GLOBAL: /* Relative to Data or Function name */ symbol = ef->ddbstrtab + sym->st_name; @@ -925,7 +924,7 @@ for (i = 0; i < ef->nrel; i++) { rel = ef->reltab[i].rel; if (rel == NULL) - continue; + panic("lost a reltab!"); rellim = rel + ef->reltab[i].nrel; base = findbase(ef, ef->reltab[i].sec); for ( ; rel < rellim; rel++) { @@ -945,7 +944,7 @@ for (i = 0; i < ef->nrela; i++) { rela = ef->relatab[i].rela; if (rela == NULL) - continue; + panic("lost a relatab!"); relalim = rela + ef->relatab[i].nrela; base = findbase(ef, ef->relatab[i].sec); for ( ; rela < relalim; rela++) {