PERFORCE change 50010 for review
Peter Wemm
peter at FreeBSD.org
Tue Mar 30 14:33:52 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=50010
Change 50010 by peter at 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++;
+ }
}
}
}
More information about the p4-projects
mailing list