summaryrefslogtreecommitdiffstats
path: root/usr.sbin/kldxref/ef_obj.c
diff options
context:
space:
mode:
authoriedowse <iedowse@FreeBSD.org>2004-08-28 19:31:10 +0000
committeriedowse <iedowse@FreeBSD.org>2004-08-28 19:31:10 +0000
commitd0d1e68e58c10e5172f1d8f13525f20e9cdc942f (patch)
treedf9e4ff7a3c76c8c08fd9ddaf5e27dba6ee28c29 /usr.sbin/kldxref/ef_obj.c
parentc409ad7413ce9b5f3bfb661a5d87805c96d093b7 (diff)
downloadFreeBSD-src-d0d1e68e58c10e5172f1d8f13525f20e9cdc942f.zip
FreeBSD-src-d0d1e68e58c10e5172f1d8f13525f20e9cdc942f.tar.gz
Explicitly pass in the relocation base and data offset into ef_reloc()
rather than relying on a trick that happens to work for the current relocation schemes. Also add some comments and improve variable naming.
Diffstat (limited to 'usr.sbin/kldxref/ef_obj.c')
-rw-r--r--usr.sbin/kldxref/ef_obj.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/usr.sbin/kldxref/ef_obj.c b/usr.sbin/kldxref/ef_obj.c
index 884a1b3..3ed4e40 100644
--- a/usr.sbin/kldxref/ef_obj.c
+++ b/usr.sbin/kldxref/ef_obj.c
@@ -240,9 +240,9 @@ ef_obj_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len, void *dest)
char *memaddr;
Elf_Rel *r;
Elf_Rela *a;
- Elf_Off secoff;
+ Elf_Off secbase, dataoff;
int error, i, sec;
-
+
if (offset + len > ef->size) {
if (ef->ef_verbose)
warnx("ef_seg_read_rel(%s): bad offset/len (%lx:%ld)",
@@ -254,6 +254,7 @@ ef_obj_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len, void *dest)
/* Find out which section contains the data. */
memaddr = ef->address + offset;
sec = -1;
+ secbase = dataoff = 0;
for (i = 0; i < ef->nprogtab; i++) {
if (ef->progtab[i].addr == NULL)
continue;
@@ -261,7 +262,9 @@ ef_obj_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len, void *dest)
(char *)ef->progtab[i].addr + ef->progtab[i].size)
continue;
sec = ef->progtab[i].sec;
- secoff = memaddr - (char *)ef->progtab[i].addr;
+ /* We relocate to address 0. */
+ secbase = (char *)ef->progtab[i].addr - ef->address;
+ dataoff = memaddr - ef->address;
break;
}
@@ -274,8 +277,8 @@ ef_obj_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len, void *dest)
continue;
for (r = ef->reltab[i].rel;
r < &ef->reltab[i].rel[ef->reltab[i].nrel]; r++) {
- error = ef_reloc(ef->ef_efile, r, EF_RELOC_REL, secoff,
- len, dest);
+ error = ef_reloc(ef->ef_efile, r, EF_RELOC_REL, secbase,
+ dataoff, len, dest);
if (error != 0)
return (error);
}
@@ -285,8 +288,8 @@ ef_obj_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len, void *dest)
continue;
for (a = ef->relatab[i].rela;
a < &ef->relatab[i].rela[ef->relatab[i].nrela]; a++) {
- error = ef_reloc(ef->ef_efile, a, EF_RELOC_RELA, secoff,
- len, dest);
+ error = ef_reloc(ef->ef_efile, a, EF_RELOC_RELA,
+ secbase, dataoff, len, dest);
if (error != 0)
return (error);
}
OpenPOWER on IntegriCloud