From owner-p4-projects@FreeBSD.ORG Tue Mar 30 14:33:52 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 398C016A4D1; Tue, 30 Mar 2004 14:33:52 -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 C653B16A4CE for ; Tue, 30 Mar 2004 14:33:51 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id BAC3F43D3F for ; Tue, 30 Mar 2004 14:33:51 -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 i2UMXpGe045660 for ; Tue, 30 Mar 2004 14:33:51 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i2UMXpxB045657 for perforce@freebsd.org; Tue, 30 Mar 2004 14:33:51 -0800 (PST) (envelope-from peter@freebsd.org) Date: Tue, 30 Mar 2004 14:33:51 -0800 (PST) Message-Id: <200403302233.i2UMXpxB045657@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 50010 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, 30 Mar 2004 22:33:52 -0000 http://perforce.freebsd.org/chv.cgi?CH=50010 Change 50010 by peter@peter_daintree on 2004/03/30 14:33:40 oh the horror! make it compile. Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#10 edit Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#10 (text+ko) ==== @@ -65,20 +65,20 @@ typedef struct { void *addr; - Elf_Off filesz; + Elf_Off memsz; int align; int flags; } Elf_nobitent; typedef struct { - const Elf_Rel *rel; + Elf_Rel *rel; int relsize; Elf_Off fileoff; Elf_Off filesz; } Elf_relent; typedef struct { - const Elf_Rela *rela; + Elf_Rela *rela; int relasize; Elf_Off fileoff; Elf_Off filesz; @@ -189,10 +189,8 @@ Elf_Ehdr *hdr; caddr_t firstpage; int nbytes, i; - int nsegs; caddr_t mapbase; size_t mapsize; - Elf_Addr base_vlimit; int error = 0; int resid, flags; elf_file_t ef; @@ -200,8 +198,6 @@ Elf_Shdr *shdr; int symtabindex; int symstrindex; - int symcnt; - int strcnt; int nsym; int pb, nb, rl, ra; int alignmask; @@ -303,8 +299,8 @@ ef = (elf_file_t) lf; /* Scan the section header for information and table sizing. */ - ef->nprogent = 0; - ef->nnobits = 0; + ef->nprogtab = 0; + ef->nnobittab = 0; nsym = 0; ef->nrel = 0; ef->nrela = 0; @@ -324,14 +320,14 @@ symstrindex = shdr[i].sh_link; break; case SHT_REL: - ef->nreltab++; + ef->nrel++; break; case SHT_RELA: - ef->nrelatab++; + ef->nrela++; break; } } - if (nprogbits == 0 && nnobits == 0) { + if (ef->nprogtab == 0 && ef->nnobittab == 0) { link_elf_error("file has no contents"); error = ENOEXEC; goto out; @@ -342,7 +338,7 @@ error = ENOEXEC; goto out; } - if (symstrindex < 0 || sysmstrindex > hdr->e_shnum || + if (symstrindex < 0 || symstrindex > hdr->e_shnum || shdr[symstrindex].sh_type != SHT_STRTAB) { link_elf_error("file has invalid symbol strings"); error = ENOEXEC; @@ -354,19 +350,19 @@ if (ef->nprogtab != 0) ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab), M_LINKER, M_WAITOK); if (ef->nnobittab != 0) - ef->nobittab = malloc(ef->nobbittab * sizeof(*ef->nobittab), M_LINKER, M_WAITOK); - if (ef->nreltab != 0) - ef->reltab = malloc(ef->nreltab * sizeof(*ef->reltab), M_LINKER, M_WAITOK); - if (ef->nrelatab != 0) - ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab), M_LINKER, M_WAITOK); + ef->nobittab = malloc(ef->nnobittab * sizeof(*ef->nobittab), M_LINKER, M_WAITOK); + if (ef->nrel != 0) + ef->reltab = malloc(ef->nrel * sizeof(*ef->reltab), M_LINKER, M_WAITOK); + if (ef->nrela != 0) + ef->relatab = malloc(ef->nrela * sizeof(*ef->relatab), M_LINKER, M_WAITOK); /* XXX check for failures */ /* Space for symbol table */ ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym); - ef->ddbsymbase = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK); + ef->ddbsymtab = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK); ef->ddbstrcnt = shdr[symstrindex].sh_size; - ef->ddbstrbase = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK); + ef->ddbstrtab = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK); if (ef->symbase == NULL || ef->strbase == NULL) { error = ENOMEM; @@ -391,30 +387,30 @@ switch (shdr[i].sh_type) { case SHT_PROGBITS: - ef->progtab[pb].addr = mapsize; + ef->progtab[pb].addr = (void *)(uintptr_t)mapsize; ef->progtab[pb].fileoff = shdr[i].sh_offset; - ef->progtab[pb].size = shdr[i].sh_size; + ef->progtab[pb].filesz = shdr[i].sh_size; ef->progtab[pb].align = shdr[i].sh_addralign; mapsize += shdr[i].sh_size; pb++; break; case SHT_NOBITS: - ef->nobittab[nb].addr = mapsize; - ef->nobittab[nb].size = shdr[i].sh_size; + ef->nobittab[nb].addr = (void *)(uintptr_t)mapsize; + ef->nobittab[nb].memsz = shdr[i].sh_size; ef->nobittab[nb].align = shdr[i].sh_addralign; mapsize += shdr[i].sh_size; nb++; break; case SHT_REL: - ef->reltab[rl].addr = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK) + ef->reltab[rl].rel = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK); ef->reltab[rl].fileoff = shdr[i].sh_offset; - ef->reltab[rl].size = shdr[i].sh_size; + ef->reltab[rl].filesz = shdr[i].sh_size; rl++; break; case SHT_RELA: - ef->relatab[ra].addr = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK) + ef->relatab[ra].rela = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK); ef->relatab[ra].fileoff = shdr[i].sh_offset; - ef->relatab[ra].size = shdr[i].sh_size; + ef->relatab[ra].filesz = shdr[i].sh_size; ra++; break; } @@ -423,9 +419,9 @@ panic("lots progbits"); if (nb != ef->nnobittab) panic("lots nobits"); - if (rl != ef->nreltab) + if (rl != ef->nrel) panic("lots rel"); - if (ra != ef->nrelatab) + if (ra != ef->nrela) panic("lots rela"); /* @@ -440,21 +436,21 @@ } /* Add the base address to the previously calculated/aligned offsets */ - for (i = 0; i < ef->nprogtab) - ef->progtab[i].addr += mapbase; - for (i = 0; i < ef->nnobittab) - ef->nobittab[i].addr += mapbase; + for (i = 0; i < ef->nprogtab; i++) + ef->progtab[i].addr = mapbase + (uintptr_t)ef->progtab[i].addr; + for (i = 0; i < ef->nnobittab; i++) + ef->nobittab[i].addr = mapbase + (uintptr_t)ef->nobittab[i].addr; /* Load the symbol table. */ error = vn_rdwr(UIO_READ, nd.ni_vp, - ef->symbase, symcnt, shdr[symtabindex].sh_offset, + ef->symbase, ef->ddbsymcnt, shdr[symtabindex].sh_offset, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) goto out; error = vn_rdwr(UIO_READ, nd.ni_vp, - ef->strbase, strcnt, shdr[symstrindex].sh_offset, + ef->strbase, ef->ddbstrcnt, shdr[symstrindex].sh_offset, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) @@ -464,8 +460,8 @@ for (i = 0; i < ef->nprogtab; i++) { error = vn_rdwr(UIO_READ, nd.ni_vp, ef->progtab[pb].addr, - ef->progtab[pb].size, - ef->progtab[pb].fileoff + ef->progtab[pb].filesz, + ef->progtab[pb].fileoff, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) @@ -476,21 +472,21 @@ * Read in relocation tables. Platforms use rel or rela, but * usually not both. */ - for (i = 0; i < ef->nreltab; i++) { + for (i = 0; i < ef->nrel; i++) { error = vn_rdwr(UIO_READ, nd.ni_vp, - ef->reltab[pb].addr, - ef->reltab[pb].size, - ef->reltab[pb].fileoff + (void *)ef->reltab[pb].rel, + ef->reltab[pb].filesz, + ef->reltab[pb].fileoff, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) goto out; } - for (i = 0; i < ef->nrelatab; i++) { + for (i = 0; i < ef->nrela; i++) { error = vn_rdwr(UIO_READ, nd.ni_vp, - ef->relatab[pb].addr, - ef->relatab[pb].size, - ef->relatab[pb].fileoff + (void *)ef->relatab[pb].rela, + ef->relatab[pb].filesz, + ef->relatab[pb].fileoff, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) @@ -520,8 +516,6 @@ if (error) goto out; -nosyms: - *result = lf; out: @@ -559,8 +553,8 @@ const Elf_Sym *ref; if (ELF_R_SYM(r_info)) { - ref = ef->symtab + ELF_R_SYM(r_info); - return ef->strtab + ref->st_name; + ref = ef->ddbsymtab + ELF_R_SYM(r_info); + return ef->ddbstrtab + ref->st_name; } else return NULL; } @@ -573,63 +567,41 @@ const Elf_Rela *relalim; const Elf_Rela *rela; const char *symname; + int i; + /* Perform relocations without addend if there are any: */ - rel = ef->rel; - if (rel) { - rellim = (const Elf_Rel *)((const char *)ef->rel + ef->relsize); - while (rel < rellim) { - if (elf_reloc(&ef->lf, rel, ELF_RELOC_REL)) { - symname = symbol_name(ef, rel->r_info); - printf("link_elf: symbol %s undefined\n", symname); - return ENOENT; + for (i = 0; i < ef->nrel; i++) { + rel = ef->reltab[i].rel; + if (rel) { + rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].relsize); + while (rel < rellim) { + if (elf_reloc(&ef->lf, rel, ELF_RELOC_REL)) { + symname = symbol_name(ef, rel->r_info); + printf("link_elf: symbol %s undefined\n", symname); + return ENOENT; + } + rel++; } - rel++; } } /* Perform relocations with addend if there are any: */ - rela = ef->rela; - if (rela) { - relalim = (const Elf_Rela *)((const char *)ef->rela + ef->relasize); - while (rela < relalim) { - if (elf_reloc(&ef->lf, rela, ELF_RELOC_RELA)) { - symname = symbol_name(ef, rela->r_info); - printf("link_elf: symbol %s undefined\n", symname); - return ENOENT; - } - rela++; - } - } - - /* Perform PLT relocations without addend if there are any: */ - rel = ef->pltrel; - if (rel) { - rellim = (const Elf_Rel *)((const char *)ef->pltrel + ef->pltrelsize); - while (rel < rellim) { - if (elf_reloc(&ef->lf, rel, ELF_RELOC_REL)) { - symname = symbol_name(ef, rel->r_info); - printf("link_elf: symbol %s undefined\n", symname); - return ENOENT; + for (i = 0; i < ef->nrela; i++) { + rela = ef->relatab[i].rela; + if (rela) { + relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].relasize); + while (rela < relalim) { + if (elf_reloc(&ef->lf, rela, ELF_RELOC_RELA)) { + symname = symbol_name(ef, rela->r_info); + printf("link_elf: symbol %s undefined\n", symname); + return ENOENT; + } + rela++; } - rel++; } } - /* Perform relocations with addend if there are any: */ - rela = ef->pltrela; - if (rela) { - relalim = (const Elf_Rela *)((const char *)ef->pltrela + ef->pltrelasize); - while (rela < relalim) { - if (elf_reloc(&ef->lf, rela, ELF_RELOC_RELA)) { - symname = symbol_name(ef, rela->r_info); - printf("link_elf: symbol %s undefined\n", symname); - return ENOENT; - } - rela++; - } - } - return 0; } @@ -637,7 +609,6 @@ link_elf_lookup_symbol(linker_file_t lf, const char *name, c_linker_sym_t *sym) { elf_file_t ef = (elf_file_t) lf; - unsigned long symnum; const Elf_Sym *symp; const char *strp; int i; @@ -789,6 +760,7 @@ return (0); } +#if 0 const Elf_Sym * elf_get_sym(linker_file_t lf, Elf_Word symidx) { @@ -810,7 +782,9 @@ sym = ef->symtab + symidx; return (ef->strtab + sym->st_name); } +#endif +#if 0 /* * Symbol lookup function that can be used when the symbol index is known (ie * in relocations). It uses the symbol index instead of doing a fully fledged @@ -857,6 +831,7 @@ return ((Elf_Addr)linker_file_lookup_symbol(lf, symbol, deps)); } +#endif static void link_elf_reloc_local(linker_file_t lf) @@ -866,22 +841,29 @@ const Elf_Rela *relalim; const Elf_Rela *rela; elf_file_t ef = (elf_file_t)lf; + int i; /* Perform relocations without addend if there are any: */ - if ((rel = ef->rel) != NULL) { - rellim = (const Elf_Rel *)((const char *)ef->rel + ef->relsize); - while (rel < rellim) { - elf_reloc_local(lf, rel, ELF_RELOC_REL); - rel++; + for (i = 0; i < ef->nrel; i++) { + rel = ef->reltab[i].rel; + if (rel) { + rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].relsize); + while (rel < rellim) { + elf_reloc_local(lf, rel, ELF_RELOC_REL); + rel++; + } } } /* Perform relocations with addend if there are any: */ - if ((rela = ef->rela) != NULL) { - relalim = (const Elf_Rela *)((const char *)ef->rela + ef->relasize); - while (rela < relalim) { - elf_reloc_local(lf, rela, ELF_RELOC_RELA); - rela++; + for (i = 0; i < ef->nrela; i++) { + rela = ef->relatab[i].rela; + if (rela) { + relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].relasize); + while (rela < relalim) { + elf_reloc_local(lf, rela, ELF_RELOC_RELA); + rela++; + } } } }