PERFORCE change 50152 for review
Peter Wemm
peter at FreeBSD.org
Thu Apr 1 17:10:47 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=50152
Change 50152 by peter at peter_hammer on 2004/04/01 17:10:10
more debug-by-printf
Affected files ...
.. //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#14 edit
.. //depot/projects/hammer/sys/kern/link_elf_obj.c#15 edit
Differences ...
==== //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#14 (text+ko) ====
@@ -108,12 +108,14 @@
{
Elf_Addr relocbase = (Elf_Addr) lf->address;
Elf_Addr *where;
+ int32_t *where32;
Elf_Addr addr;
Elf_Addr addend;
Elf_Word rtype, symidx;
const Elf_Rel *rel;
const Elf_Rela *rela;
+printf("elf_reloc_internal: data %p, local %d\n", data, local);
switch (type) {
case ELF_RELOC_REL:
rel = (const Elf_Rel *)data;
@@ -121,6 +123,7 @@
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;
@@ -128,16 +131,20 @@
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 (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);
}
@@ -145,25 +152,31 @@
switch (rtype) {
case R_X86_64_NONE: /* none */
+printf("R_X86_64_NONE\n");
break;
case R_X86_64_64: /* S + A */
addr = elf_lookup(lf, symidx, 1);
+printf("R_X86_64_64: addr 0x%lx, addend 0x%lx\n", addr, addend);
if (addr == 0)
return -1;
addr += addend;
if (*where != addr)
*where = addr;
+printf("*where = 0x%lx\n", *where);
break;
case R_X86_64_PC32: /* S + A - P */
addr = elf_lookup(lf, symidx, 1);
+printf("R_X86_64_PC32: addr 0x%lx, addend 0x%lx\n", addr, addend);
if (addr == 0)
return -1;
addr += addend - (Elf_Addr)where;
/* XXX needs to be 32 bit *where, not 64 bit */
- if (*where != addr)
- *where = addr;
+ where32 = (int32_t *)where;
+ if (*where32 != addr)
+ *where32 = addr;
+printf("*where32 = 0x%x\n", *where32);
break;
case R_X86_64_COPY: /* none */
@@ -177,10 +190,12 @@
case R_X86_64_GLOB_DAT: /* S */
addr = elf_lookup(lf, symidx, 1);
+printf("R_X86_64_GLOB_DAT: addr 0x%lx\n", addr);
if (addr == 0)
return -1;
if (*where != addr)
*where = addr;
+printf("*where = 0x%lx\n", *where);
break;
case R_X86_64_RELATIVE: /* B + A */
==== //depot/projects/hammer/sys/kern/link_elf_obj.c#15 (text+ko) ====
@@ -72,14 +72,12 @@
typedef struct {
Elf_Rel *rel;
- int relsize;
Elf_Off fileoff;
Elf_Off filesz;
} Elf_relent;
typedef struct {
Elf_Rela *rela;
- int relasize;
Elf_Off fileoff;
Elf_Off filesz;
} Elf_relaent;
@@ -508,8 +506,8 @@
* Read in relocation tables. Platforms use rel or rela, but
* usually not both.
*/
-printf("reading rel\n");
for (i = 0; i < ef->nrel; i++) {
+printf("reading rel segment %d\n", i);
error = vn_rdwr(UIO_READ, nd.ni_vp,
(void *)ef->reltab[i].rel,
ef->reltab[i].filesz,
@@ -519,8 +517,8 @@
if (error)
goto out;
}
-printf("reading rela\n");
for (i = 0; i < ef->nrela; i++) {
+printf("reading rela segment %d\n", i);
error = vn_rdwr(UIO_READ, nd.ni_vp,
(void *)ef->relatab[i].rela,
ef->relatab[i].filesz,
@@ -618,9 +616,12 @@
/* Perform relocations without addend if there are any: */
for (i = 0; i < ef->nrel; i++) {
rel = ef->reltab[i].rel;
+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].relsize);
+ rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].filesz);
+printf("rellim is %p\n", rellim);
while (rel < rellim) {
+printf("rel doing: %p\n", rel);
if (elf_reloc(&ef->lf, rel, ELF_RELOC_REL)) {
symname = symbol_name(ef, rel->r_info);
printf("link_elf: symbol %s undefined\n", symname);
@@ -634,9 +635,12 @@
/* Perform relocations with addend if there are any: */
for (i = 0; i < ef->nrela; i++) {
rela = ef->relatab[i].rela;
+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].relasize);
+ relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].filesz);
+printf("relalim is %p\n", relalim);
while (rela < relalim) {
+printf("rela doing: %p\n", rela);
if (elf_reloc(&ef->lf, rela, ELF_RELOC_RELA)) {
symname = symbol_name(ef, rela->r_info);
printf("link_elf: symbol %s undefined\n", symname);
@@ -647,6 +651,7 @@
}
}
+printf("relocate_file done\n");
return 0;
}
@@ -740,6 +745,8 @@
void **start, **stop;
int len, error = 0, count;
+printf("lookup_set: name %s\n", name);
+
len = strlen(name) + sizeof("__start_set_"); /* sizeof includes \0 */
setsym = malloc(len, M_LINKER, M_WAITOK);
if (setsym == NULL)
@@ -748,9 +755,11 @@
/* get address of first entry */
snprintf(setsym, len, "%s%s", "__start_set_", name);
error = link_elf_lookup_symbol(lf, setsym, &sym);
+printf("symbol %s result %d\n", setsym, error);
if (error)
goto out;
link_elf_symbol_values(lf, sym, &symval);
+printf("value %p\n", symval.value);
if (symval.value == 0) {
error = ESRCH;
goto out;
@@ -760,9 +769,11 @@
/* get address of last entry */
snprintf(setsym, len, "%s%s", "__stop_set_", name);
error = link_elf_lookup_symbol(lf, setsym, &sym);
+printf("symbol %s result %d\n", setsym, error);
if (error)
goto out;
link_elf_symbol_values(lf, sym, &symval);
+printf("value %p\n", symval.value);
if (symval.value == 0) {
error = ESRCH;
goto out;
@@ -780,6 +791,7 @@
if (countp)
*countp = count;
+printf("lookup_set: success\n");
out:
free(setsym, M_LINKER);
return error;
@@ -891,9 +903,12 @@
/* Perform relocations without addend if there are any: */
for (i = 0; i < ef->nrel; i++) {
rel = ef->reltab[i].rel;
+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].relsize);
+ rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].filesz);
+printf("rellim is %p\n", rellim);
while (rel < rellim) {
+printf("rel doing: %p\n", rel);
elf_reloc_local(lf, rel, ELF_RELOC_REL);
rel++;
}
@@ -903,9 +918,12 @@
/* Perform relocations with addend if there are any: */
for (i = 0; i < ef->nrela; i++) {
rela = ef->relatab[i].rela;
+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].relasize);
+ relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].filesz);
+printf("relalim is %p\n", relalim);
while (rela < relalim) {
+printf("rela doing: %p\n", rela);
elf_reloc_local(lf, rela, ELF_RELOC_RELA);
rela++;
}
More information about the p4-projects
mailing list