* elfxx-mips.c (_bfd_mips_elf_add_symbol_hook): Ignore _gp_disp
authorDavid Daney <ddaney@avtrex.com>
Fri, 29 Jul 2005 23:24:01 +0000 (23:24 +0000)
committerDavid Daney <ddaney@avtrex.com>
Fri, 29 Jul 2005 23:24:01 +0000 (23:24 +0000)
if it is in the *ABS* section.

bfd/ChangeLog
bfd/elfxx-mips.c

index b52a2eccdb61249426efff6c8b021580fc3659f4..ef863dcd6c2866eac0ba538ad6e6c9414e725600 100644 (file)
@@ -1,3 +1,8 @@
+2005-07-29  David Daney  <ddaney@avtrex.com>
+
+       * elfxx-mips.c (_bfd_mips_elf_add_symbol_hook):  Ignore _gp_disp
+       if it is in the *ABS* section.
+
 2005-07-29  Paul Brook  <paul@codesourcery.com>
 
        * reloc.c: Add BFD_RELOC_ARM_T32_ADD_PC12.
index bd900e021e84dc21d1b73551ecf6222778f72979..316114e3b8ff7b5be5b1ca71b6f1cfe2ed2cda49 100644 (file)
@@ -5414,6 +5414,20 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
       return TRUE;
     }
 
+  /* Shared objects may have a dynamic symbol '_gp_disp' defined as
+     a SECTION *ABS*.  This causes ld to think it can resolve _gp_disp
+     by setting a DT_NEEDED for the shared object.  Since _gp_disp is
+     a magic symbol resolved by the linker, we ignore this bogus definition
+     of _gp_disp.  New ABI objects do not suffer from this problem so this
+     is not done for them. */
+  if (!NEWABI_P(abfd)
+      && (sym->st_shndx == SHN_ABS)
+      && (strcmp (*namep, "_gp_disp") == 0))
+    {
+      *namep = NULL;
+      return TRUE;
+    }
+
   switch (sym->st_shndx)
     {
     case SHN_COMMON: