diff options
author | iedowse <iedowse@FreeBSD.org> | 2004-08-28 19:31:10 +0000 |
---|---|---|
committer | iedowse <iedowse@FreeBSD.org> | 2004-08-28 19:31:10 +0000 |
commit | d0d1e68e58c10e5172f1d8f13525f20e9cdc942f (patch) | |
tree | df9e4ff7a3c76c8c08fd9ddaf5e27dba6ee28c29 /usr.sbin/kldxref/ef_obj.c | |
parent | c409ad7413ce9b5f3bfb661a5d87805c96d093b7 (diff) | |
download | FreeBSD-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.c | 17 |
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); } |