* bfd/elfxx-mips.c (mips_elf_create_dynamic_relocation): In SGI-
authorRichard Sandiford <rdsandiford@googlemail.com>
Wed, 9 Jul 2003 11:50:16 +0000 (11:50 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Wed, 9 Jul 2003 11:50:16 +0000 (11:50 +0000)
compatible objects, add the values of defined external symbols
to the addend.

bfd/ChangeLog
bfd/elfxx-mips.c

index 6b5d783c1f63221d1190ee547acd7459f85d4d3b..b9f0b2ea6cec9f6b234009a0d884b052b8f119b2 100644 (file)
@@ -1,3 +1,9 @@
+2003-07-09  Richard Sandiford  <rsandifo@redhat.com>
+
+       * bfd/elfxx-mips.c (mips_elf_create_dynamic_relocation): In SGI-
+       compatible objects, add the values of defined external symbols
+       to the addend.
+
 2003-07-09  Richard Sandiford  <rsandifo@redhat.com>
 
        * elfxx-mips.c (_bfd_mips_elf_finish_dynamic_symbol): Always
index 986ba697f5b2f66ea71a2f211a814fefac274e04..00dc08424b2da23bd4731d19746e5fc08cb3eda6 100644 (file)
@@ -3887,6 +3887,7 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
   else
     {
       long indx;
+      bfd_boolean defined_p;
 
       /* We must now calculate the dynamic symbol table index to use
         in the relocation.  */
@@ -3899,6 +3900,15 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
             become local.  */
          if (indx == -1)
            indx = 0;
+         if (SGI_COMPAT (output_bfd))
+           defined_p = ((h->root.elf_link_hash_flags
+                         & ELF_LINK_HASH_DEF_REGULAR) != 0);
+         else
+           /* ??? glibc's ld.so just adds the final GOT entry to the
+              relocation field.  It therefore treats relocs against
+              defined symbols in the same way as relocs against
+              undefined symbols.  */
+           defined_p = FALSE;
        }
       else
        {
@@ -3928,13 +3938,14 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
             useful, after all.  This should be a bit more efficient
             as well.  */
          indx = 0;
+         defined_p = TRUE;
        }
 
       /* If the relocation was previously an absolute relocation and
         this symbol will not be referred to by the relocation, we must
         adjust it by the value we give it in the dynamic symbol table.
         Otherwise leave the job up to the dynamic linker.  */
-      if (!indx && r_type != R_MIPS_REL32)
+      if (defined_p && r_type != R_MIPS_REL32)
        *addendp += symbol;
 
       /* The relocation is always an REL32 relocation because we don't