diff options
author | Ed Maste <emaste@FreeBSD.org> | 2016-03-11 16:24:39 +0000 |
---|---|---|
committer | Ed Maste <emaste@FreeBSD.org> | 2016-03-11 16:24:39 +0000 |
commit | 1e248b8346cbf585990a4da0199c6cc3b9cc2340 (patch) | |
tree | 7d5c5de6c37775ecf94afd847caa354427a7b7e0 | |
parent | ed5e3d7a834781c76acfbc4e7cc4196ad9299b2f (diff) | |
download | src-1e248b8346cbf585990a4da0199c6cc3b9cc2340.tar.gz src-1e248b8346cbf585990a4da0199c6cc3b9cc2340.zip |
libdwarf: fix SHT_REL relocation processing
Relocation of type SHT_REL must use the current value as addend.
PR: 204084
Obtained from: NetBSD libdwarf_elf_init.c v1.4
Notes
Notes:
svn path=/head/; revision=296663
-rw-r--r-- | contrib/elftoolchain/libdwarf/libdwarf_elf_init.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/contrib/elftoolchain/libdwarf/libdwarf_elf_init.c b/contrib/elftoolchain/libdwarf/libdwarf_elf_init.c index af2d370b980c..5ab6ffc96b50 100644 --- a/contrib/elftoolchain/libdwarf/libdwarf_elf_init.c +++ b/contrib/elftoolchain/libdwarf/libdwarf_elf_init.c @@ -51,7 +51,8 @@ static const char *debug_name[] = { static void _dwarf_elf_write_reloc(Dwarf_Debug dbg, Elf_Data *symtab_data, int endian, - void *buf, uint64_t offset, GElf_Xword r_info, GElf_Sxword r_addend) + void *buf, uint64_t offset, GElf_Xword r_info, GElf_Sxword r_addend, + int is_rel) { GElf_Sym sym; int size; @@ -60,6 +61,14 @@ _dwarf_elf_write_reloc(Dwarf_Debug dbg, Elf_Data *symtab_data, int endian, return; if ((size = _dwarf_get_reloc_size(dbg, GELF_R_TYPE(r_info))) == 0) return; /* Unknown or non-absolute relocation. */ + if (is_rel) { + uint64_t roffset = offset; + + if (endian == ELFDATA2MSB) + r_addend = _dwarf_read_msb(buf, &roffset, size); + else + r_addend = _dwarf_read_lsb(buf, &roffset, size); + } if (endian == ELFDATA2MSB) _dwarf_write_msb(buf, &offset, sym.st_value + r_addend, size); else @@ -76,7 +85,7 @@ _dwarf_elf_apply_rel_reloc(Dwarf_Debug dbg, void *buf, Elf_Data *rel_data, j = 0; while (gelf_getrel(rel_data, j++, &rel) != NULL) _dwarf_elf_write_reloc(dbg, symtab_data, endian, buf, - rel.r_offset, rel.r_info, 0); + rel.r_offset, rel.r_info, 0, 1); } static void @@ -89,7 +98,7 @@ _dwarf_elf_apply_rela_reloc(Dwarf_Debug dbg, void *buf, Elf_Data *rel_data, j = 0; while (gelf_getrela(rel_data, j++, &rela) != NULL) _dwarf_elf_write_reloc(dbg, symtab_data, endian, buf, - rela.r_offset, rela.r_info, rela.r_addend); + rela.r_offset, rela.r_info, rela.r_addend, 0); } static int |