diff options
author | Alan Modra <amodra@gmail.com> | 2015-08-20 12:02:45 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2015-08-20 12:02:45 +0930 |
commit | 9215b98bb27c071386a277f5578dbb17569a1471 (patch) | |
tree | 62014c06b7d3255ba6b1833c41aa654a8c6056b6 /gold/target-reloc.h | |
parent | 9d1f51209437ebee8f0a930b9613d59759ea8dc0 (diff) | |
download | gdb-9215b98bb27c071386a277f5578dbb17569a1471.zip gdb-9215b98bb27c071386a277f5578dbb17569a1471.tar.gz gdb-9215b98bb27c071386a277f5578dbb17569a1471.tar.bz2 |
gold --emit-relocs
A symbol value in an ELF final linked binary is absolute, in contrast
to a relocatable object file where the value is section relative. For
--emit-relocs it is therefore incorrect to use the value of a section
symbol as the addend when adjusting relocs against input section
symbols to output section symbols.
PR gold/18846
* target-reloc.h (relocate_relocs <RELOC_ADJUST_FOR_SECTION_RELA>):
Subtract os->address() from addend.
* powerpc.cc (relocate_relocs): Likewise.
Diffstat (limited to 'gold/target-reloc.h')
-rw-r--r-- | gold/target-reloc.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/gold/target-reloc.h b/gold/target-reloc.h index c135459..89906af 100644 --- a/gold/target-reloc.h +++ b/gold/target-reloc.h @@ -666,6 +666,7 @@ relocate_relocs( // Get the new symbol index. + Output_section* os = NULL; unsigned int new_symndx; if (r_sym < local_count) { @@ -698,7 +699,7 @@ relocate_relocs( unsigned int shndx = object->local_symbol_input_shndx(r_sym, &is_ordinary); gold_assert(is_ordinary); - Output_section* os = object->output_section(shndx); + os = object->output_section(shndx); gold_assert(os != NULL); gold_assert(os->needs_symtab_index()); new_symndx = os->symtab_index(); @@ -780,7 +781,8 @@ relocate_relocs( typename elfcpp::Elf_types<size>::Elf_Swxword addend; addend = Reloc_types<sh_type, size, big_endian>:: get_reloc_addend(&reloc); - addend = psymval->value(object, addend); + gold_assert(os != NULL); + addend = psymval->value(object, addend) - os->address(); Reloc_types<sh_type, size, big_endian>:: set_reloc_addend(&reloc_write, addend); } |