diff options
-rw-r--r-- | gold/target-reloc.h | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/gold/target-reloc.h b/gold/target-reloc.h index 09f5076d857..2823c1796c0 100644 --- a/gold/target-reloc.h +++ b/gold/target-reloc.h @@ -375,7 +375,7 @@ relocate_for_relocatable( off_t offset_in_output_section, const Relocatable_relocs* rr, unsigned char* view, - typename elfcpp::Elf_types<size>::Elf_Addr, + typename elfcpp::Elf_types<size>::Elf_Addr view_address, section_size_type, unsigned char* reloc_view, section_size_type reloc_view_size) @@ -466,6 +466,12 @@ relocate_for_relocatable( gold_assert(new_offset != -1); } + // In an object file, r_offset is an offset within the section. + // In an executable or dynamic object, generated by + // --emit-relocs, r_offset is an absolute address. + if (!parameters->options().relocatable()) + new_offset += view_address; + reloc_write.put_r_offset(new_offset); reloc_write.put_r_info(elfcpp::elf_r_info<size>(new_symndx, r_type)); |