PERFORCE change 50199 for review
Peter Wemm
peter at FreeBSD.org
Fri Apr 2 09:46:00 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=50199
Change 50199 by peter at peter_hammer on 2004/04/02 09:45:28
put the printf's on a diet
Affected files ...
.. //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#18 edit
.. //depot/projects/hammer/sys/kern/link_elf_obj.c#25 edit
Differences ...
==== //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#18 (text+ko) ====
@@ -106,7 +106,7 @@
static int
elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data, int type, int local, elf_lookup_fn lu)
{
- Elf64_Addr *where;
+ Elf64_Addr *where, val;
Elf32_Addr *where32, val32;
Elf_Addr addr;
Elf_Addr addend;
@@ -114,7 +114,6 @@
const Elf_Rel *rel;
const Elf_Rela *rela;
-printf("elf_reloc_internal: relocbase 0x%lx, data %p, local %d\n", relocbase, data, local);
switch (type) {
case ELF_RELOC_REL:
rel = (const Elf_Rel *)data;
@@ -122,7 +121,6 @@
addend = *where;
rtype = ELF_R_TYPE(rel->r_info);
symidx = ELF_R_SYM(rel->r_info);
-printf("rel %p\n", rel);
break;
case ELF_RELOC_RELA:
rela = (const Elf_Rela *)data;
@@ -130,75 +128,48 @@
addend = rela->r_addend;
rtype = ELF_R_TYPE(rela->r_info);
symidx = ELF_R_SYM(rela->r_info);
-printf("rela %p\n", rela);
break;
default:
panic("unknown reloc type %d\n", type);
}
-printf("where %p, addend 0x%lx, rtype %ld, symindx %ld\n", where, addend, rtype, symidx);
-#if 0
- if (local) {
- if (rtype == R_X86_64_RELATIVE) { /* A + B */
- addr = relocbase + addend;
-printf("R_X86_64_RELATIVE: addr 0x%lx\n", addr);
- if (*where != addr)
- *where = addr;
-printf("*where = 0x%lx\n", *where);
- }
- return (0);
- }
-#endif
-
switch (rtype) {
- case R_X86_64_RELATIVE:
- addr = relocbase + addend;
-printf("R_X86_64_RELATIVE: addr 0x%lx\n", addr);
- if (*where != addr)
- *where = addr;
- break;
case R_X86_64_NONE: /* none */
printf("R_X86_64_NONE\n");
break;
case R_X86_64_64: /* S + A */
-printf("R_X86_64_64\n");
addr = lu(lf, symidx, 1);
-printf("addr 0x%lx, addend 0x%lx\n", addr, addend);
+ val = addr + addend;
+printf("R_X86_64_64 %p -> (addr 0x%lx + addend 0x%lx) = 0x%lx\n", where, addr, addend, val);
if (addr == 0)
return -1;
- addr += addend;
- if (*where != addr)
- *where = addr;
-printf("*where = 0x%lx\n", *where);
+ if (*where != val)
+ *where = val;
break;
case R_X86_64_PC32: /* S + A - P */
-printf("R_X86_64_PC32\n");
addr = lu(lf, symidx, 1);
-printf("addr 0x%lx, addend 0x%lx\n", addr, addend);
+ where32 = (Elf32_Addr *)where;
+ val32 = (Elf32_Addr)(addr + addend - (Elf_Addr)where);
+printf("R_X86_64_PC32: %p -> (addr 0x%lx, addend 0x%lx - where) = 0x%x\n", where, addr, addend, val32);
if (addr == 0)
return -1;
- val32 = (Elf32_Addr)(addr + addend - (Elf_Addr)where);
- where32 = (int32_t *)where;
if (*where32 != val32)
*where32 = val32;
-printf("*where32 = 0x%x\n", *where32);
break;
case R_X86_64_32S: /* S + A sign extend */
-printf("R_X86_64_32\n");
addr = lu(lf, symidx, 1);
-printf("addr 0x%lx, addend 0x%lx\n", addr, addend);
+ val32 = (Elf32_Addr)(addr + addend);
+ where32 = (Elf32_Addr *)where;
+printf("R_X86_64_32: %p -> (addr 0x%lx + addend 0x%lx) = 0x%x\n", where, addr, addend, val32);
if (addr == 0)
return -1;
- val32 = (Elf32_Addr)(addr + addend);
- where32 = (Elf32_Addr *)where;
if (*where32 != val32)
*where32 = val32;
-printf("*where32 = 0x%x\n", *where32);
break;
case R_X86_64_COPY: /* none */
@@ -211,20 +182,21 @@
break;
case R_X86_64_GLOB_DAT: /* S */
-printf("R_X86_64_GLOB_DAT\n");
addr = lu(lf, symidx, 1);
-printf("addr 0x%lx\n", addr);
+printf("R_X86_64_GLOB_DAT: %p -> addr 0x%lx\n", where, addr);
if (addr == 0)
return -1;
if (*where != addr)
*where = addr;
-printf("*where = 0x%lx\n", *where);
break;
-#if 0
case R_X86_64_RELATIVE: /* B + A */
+ addr = relocbase + addend;
+ val = addr;
+printf("R_X86_64_RELATIVE: %p -> 0x%lx\n", where, val);
+ if (*where != val)
+ *where = val;
break;
-#endif
default:
printf("kldload: unexpected relocation type %ld\n",
==== //depot/projects/hammer/sys/kern/link_elf_obj.c#25 (text+ko) ====
@@ -58,8 +58,6 @@
#include "linker_if.h"
-int biteme = 0;
-
typedef struct {
void *addr;
Elf_Off fileoff;
@@ -120,10 +118,6 @@
caddr_t shstrtab; /* Section name string table */
long shstrcnt; /* number of bytes in string table */
-#if 0
- caddr_t symbase; /* malloc'ed symbol base */
- caddr_t strbase; /* malloc'ed string base */
-#endif
} *elf_file_t;
static int link_elf_link_preload(linker_class_t cls,
@@ -242,7 +236,7 @@
}
#endif
-printf("link_elf_obj: malloc header\n");
+printf("link_elf_obj: begin!\n");
/* Read the elf header from the file. */
hdr = malloc(sizeof(*hdr), M_LINKER, M_WAITOK);
if (hdr == NULL) {
@@ -259,33 +253,28 @@
goto out;
}
-printf("link_elf_obj: is_elf?\n");
if (!IS_ELF(*hdr)) {
error = ENOEXEC;
goto out;
}
-printf("link_elf_obj: right class?\n");
if (hdr->e_ident[EI_CLASS] != ELF_TARG_CLASS
|| hdr->e_ident[EI_DATA] != ELF_TARG_DATA) {
link_elf_error("Unsupported file layout");
error = ENOEXEC;
goto out;
}
-printf("link_elf_obj: right version?\n");
if (hdr->e_ident[EI_VERSION] != EV_CURRENT
|| hdr->e_version != EV_CURRENT) {
link_elf_error("Unsupported file version");
error = ENOEXEC;
goto out;
}
-printf("link_elf_obj: relocatable?\n");
if (hdr->e_type != ET_REL) {
link_elf_error("Unsupported file type");
error = ENOEXEC;
goto out;
}
-printf("link_elf_obj: right machine?\n");
if (hdr->e_machine != ELF_TARG_MACH) {
link_elf_error("Unsupported machine");
error = ENOEXEC;
@@ -294,8 +283,6 @@
printf("elf_load_obj: initial checks look ok!\n");
-biteme++;
-printf("section table read in ok\n");
lf = linker_make_file(filename, &link_elf_class);
if (!lf) {
error = ENOMEM;
@@ -330,8 +317,8 @@
error = ENOEXEC;
goto out;
}
+printf("section table read in ok\n");
-printf("scan header1\n");
/* Scan the section header for information and table sizing. */
nsym = 0;
symtabindex = -1;
@@ -339,28 +326,25 @@
for (i = 0; i < hdr->e_shnum; i++) {
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
-printf("scan: progbits!\n");
ef->nprogtab++;
break;
case SHT_NOBITS:
-printf("scan: nobits!\n");
ef->nnobittab++;
break;
case SHT_SYMTAB:
-printf("scan: symtab!\n");
nsym++;
symtabindex = i;
symstrindex = shdr[i].sh_link;
-printf("[symtab peer is %d]\n", symstrindex);
+printf("[symtab %d peer is %d]\n", i, symstrindex);
break;
case SHT_REL:
-printf("scan: rel!\n");
ef->nrel++;
break;
case SHT_RELA:
-printf("scan: rela!\n");
ef->nrela++;
break;
+ case SHT_STRTAB:
+ break;
default:
printf("scan: unknown section type %d\n", shdr[i].sh_type);
break;
@@ -436,7 +420,6 @@
rl = 0;
ra = 0;
alignmask = 0;
-printf("scan pass 2\n");
for (i = 0; i < hdr->e_shnum; i++) {
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
@@ -557,7 +540,6 @@
if (error)
goto out;
-printf("reading progbits\n");
/* Read in the text/data/set/etc sections */
for (i = 0; i < ef->nprogtab; i++) {
printf("reading progbits %d\n", i);
@@ -598,8 +580,6 @@
goto out;
}
-
-printf("now do post link stuff\n");
/* Inform the kld system about the situation */
lf->address = ef->address = mapbase;
lf->size = mapsize;
@@ -638,7 +618,6 @@
VOP_UNLOCK(nd.ni_vp, 0, td);
vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
-biteme--;
return error;
}
@@ -715,10 +694,10 @@
/* Perform relocations without addend if there are any: */
for (i = 0; i < ef->nrel; i++) {
rel = ef->reltab[i].rel;
+printf("==============================\n");
printf("doing rel relocation block %d: %p, size %ld\n", i, rel, ef->reltab[i].filesz);
if (rel) {
rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].filesz);
-printf("rellim is %p\n", rellim);
base = findbase(ef, ef->reltab[i].sec);
while (rel < rellim) {
printf("rel doing: %p\n", rel);
@@ -736,15 +715,16 @@
rel++;
}
}
+printf("\n");
}
/* Perform relocations with addend if there are any: */
for (i = 0; i < ef->nrela; i++) {
rela = ef->relatab[i].rela;
+printf("\n==============================\n");
printf("doing rela relocation block %d, %p, size %ld\n", i, rela, ef->relatab[i].filesz);
if (rela) {
relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].filesz);
-printf("relalim is %p\n", relalim);
base = findbase(ef, ef->relatab[i].sec);
while (rela < relalim) {
printf("rela doing: %p\n", rela);
@@ -762,9 +742,10 @@
rela++;
}
}
+printf("\n");
}
-printf("relocate_file done\n");
+printf("relocate_file finished\n");
return 0;
}
@@ -938,14 +919,11 @@
Elf_Addr ret;
int i;
-printf("elf_obj_lookup: symidx %ld (< %ld?)\n", symidx, ef->ddbsymcnt);
-
/* Don't even try to lookup the symbol if the index is bogus. */
if (symidx >= ef->ddbsymcnt)
return (0);
sym = ef->ddbsymtab + symidx;
-printf("sym: %p (base %p)\n", sym, ef->ddbsymtab);
/* Theoretically we can avoid a lookup for some locals */
switch (ELF64_ST_BIND(sym->st_info)) {
@@ -957,18 +935,16 @@
/* 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);
+printf("STB_LOCAL: sym %p idx %lx -> progbits section '%s', base 0x%lx\n", sym, symidx, ef->progtab[i].name, ret);
break;
}
}
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;
-printf("returning base 0x%lx\n", ret);
+printf("STB_LOCAL: sym %p idx %lx -> nobits section '%s', base 0x%lx\n", sym, symidx, ef->nobittab[i].name, ret);
break;
}
}
@@ -982,9 +958,8 @@
/* 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);
+printf("STB_GLOBAL: sym %p idx %lx name '%s' -> 0x%lx\n", sym, symidx, symbol, ret);
return ret;
default:
printf("UNKNOWN BINDING %d\n", ELF64_ST_BIND(sym->st_info));
@@ -1011,10 +986,10 @@
/* Perform relocations without addend if there are any: */
for (i = 0; i < ef->nrel; i++) {
rel = ef->reltab[i].rel;
+printf("==============================\n");
printf("doing rel relocation block %d: %p, size %ld\n", i, rel, ef->relatab[i].filesz);
if (rel) {
rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].filesz);
-printf("rellim is %p\n", rellim);
base = findbase(ef, ef->reltab[i].sec);
while (rel < rellim) {
printf("rel doing: %p\n", rel);
@@ -1027,15 +1002,16 @@
rel++;
}
}
+printf("\n");
}
/* Perform relocations with addend if there are any: */
for (i = 0; i < ef->nrela; i++) {
rela = ef->relatab[i].rela;
+printf("==============================\n");
printf("doing rela relocation block %d: %p, size %ld\n", i, rela, ef->relatab[i].filesz);
if (rela) {
relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].filesz);
-printf("relalim is %p\n", relalim);
base = findbase(ef, ef->relatab[i].sec);
while (rela < relalim) {
printf("rela doing: %p\n", rela);
@@ -1048,5 +1024,6 @@
rela++;
}
}
+printf("\n");
}
}
More information about the p4-projects
mailing list