* elfxx-mips.c (mips_elf_create_dynamic_relocation): Do not create
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 11 Mar 2003 19:11:38 +0000 (19:11 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Tue, 11 Mar 2003 19:11:38 +0000 (19:11 +0000)
dynamic relocations pointing to local or section symbols, use the
NULL symbol instead.  Document the choice to not emit an
additional R_MIPS_64 relocation.

bfd/ChangeLog
bfd/elfxx-mips.c

index d0616258372071f7bc71807d3e7b7284c69968cb..051769b2cad8ab613033b056c9278d179d2b79eb 100644 (file)
@@ -1,3 +1,10 @@
+2003-03-11  Alexandre Oliva  <aoliva@redhat.com>
+
+       * elfxx-mips.c (mips_elf_create_dynamic_relocation): Do not create
+       dynamic relocations pointing to local or section symbols, use the
+       NULL symbol instead.  Document the choice to not emit an
+       additional R_MIPS_64 relocation.
+
 2003-03-11  Alan Modra  <amodra@bigpond.net.au>
 
        * elf32-ppc.c (ppc_elf_relocate_section): Subtract tls seg vma from
index 6ca4f063af2bb28cce062e6669175be023ac439b..420a951d7195cff924dc812650b8530bc380ea88 100644 (file)
@@ -3832,7 +3832,6 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
   else
     {
       long indx;
-      bfd_vma section_offset;
 
       /* We must now calculate the dynamic symbol table index to use
         in the relocation.  */
@@ -3862,15 +3861,18 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
                abort ();
            }
 
-         /* Figure out how far the target of the relocation is from
-            the beginning of its section.  */
-         section_offset = symbol - sec->output_section->vma;
-         /* The relocation we're building is section-relative.
-            Therefore, the original addend must be adjusted by the
-            section offset.  */
-         *addendp += section_offset;
-         /* Now, the relocation is just against the section.  */
-         symbol = sec->output_section->vma;
+         /* Instead of generating a relocation using the section
+            symbol, we may as well make it a fully relative
+            relocation.  We want to avoid generating relocations to
+            local symbols because we used to generate them
+            incorrectly, without adding the original symbol value,
+            which is mandated by the ABI for section symbols.  In
+            order to give dynamic loaders and applications time to
+            phase out the incorrect use, we refrain from emitting
+            section-relative relocations.  It's not like they're
+            useful, after all.  This should be a bit more efficient
+            as well.  */
+         indx = 0;
        }
 
       /* If the relocation was previously an absolute relocation and
@@ -3884,6 +3886,18 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
         know where the shared library will wind up at load-time.  */
       outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
                                     R_MIPS_REL32);
+      /* For strict adherence to the ABI specification, we should
+        generate a R_MIPS_64 relocation record by itself before the
+        _REL32/_64 record as well, such that the addend is read in as
+        a 64-bit value (REL32 is a 32-bit relocation, after all).
+        However, since none of the existing ELF64 MIPS dynamic
+        loaders seems to care, we don't waste space with these
+        artificial relocations.  If this turns out to not be true,
+        mips_elf_allocate_dynamic_relocation() should be tweaked so
+        as to make room for a pair of dynamic relocations per
+        invocation if ABI_64_P, and here we should generate an
+        additional relocation record with R_MIPS_64 by itself for a
+        NULL symbol before this relocation record.  */
       outrel[1].r_info = ELF_R_INFO (output_bfd, (unsigned long) 0,
                                     ABI_64_P (output_bfd)
                                     ? R_MIPS_64