* elf32-arm.c (elf32_arm_final_link_relocate): When generating an
authorMark Mitchell <mark@codesourcery.com>
Mon, 8 Nov 2004 22:08:07 +0000 (22:08 +0000)
committerMark Mitchell <mark@codesourcery.com>
Mon, 8 Nov 2004 22:08:07 +0000 (22:08 +0000)
R_ARM_RELATIVE relocation for Symbian OS, mention the section
symbol in the relocation.

bfd/ChangeLog
bfd/elf32-arm.c

index e1a4e8781cc80c05156fafccd1d96de1ccd8db01..a03140e62766c54a332bdb92328755cba44f81ca 100644 (file)
@@ -1,3 +1,9 @@
+2004-11-08  Mark Mitchell  <mark@codesourcery.com>
+
+       * elf32-arm.c (elf32_arm_final_link_relocate): When generating an
+       R_ARM_RELATIVE relocation for Symbian OS, mention the section
+       symbol in the relocation.
+
 2004-11-08  Inderpreet Singh   <inderpreetb@nioda.hcltech.com>
            Vineet Sharma      <vineets@noida.hcltech.com>
 
index 11dc6fb6bb01772e8bc07c7819b7d87971699fa1..80851092109ac5b1ac10357e6d42547d95e7172b 100644 (file)
@@ -2376,9 +2376,26 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
            outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
          else
            {
+             int symbol;
+
              /* This symbol is local, or marked to become local.  */
              relocate = TRUE;
-             outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
+             if (globals->symbian_p)
+               /* On Symbian OS, the data segment and text segement
+                  can be relocated independently.  Therefore, we must
+                  indicate the segment to which this relocation is
+                  relative.  The BPABI allows us to use any symbol in
+                  the right segment; we just use the section symbol
+                  as it is convenient.  (We cannot use the symbol
+                  given by "h" directly as it will not appear in the
+                  dynamic symbol table.)  */
+               symbol = input_section->output_section->target_index;
+             else
+               /* On SVR4-ish systems, the dynamic loader cannot
+                  relocate the text and data segments independently,
+                  so the symbol does not matter.  */
+               symbol = 0;
+             outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
            }
 
          loc = sreloc->contents;