Use absolute address for relocations when not doing a relocatable
authorIan Lance Taylor <iant@google.com>
Thu, 6 Mar 2008 06:10:44 +0000 (06:10 +0000)
committerIan Lance Taylor <iant@google.com>
Thu, 6 Mar 2008 06:10:44 +0000 (06:10 +0000)
link.

gold/target-reloc.h

index 09f5076d8572d1d8156f77ba0cfac9bc1e3f3bce..2823c1796c088d5c077560f45da84cb658825a77 100644 (file)
@@ -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));