* elfxx-sparc.c (_bfd_sparc_elf_check_relocs): When STT_GNU_IFUNC and
authorDavid S. Miller <davem@redhat.com>
Tue, 2 Mar 2010 01:46:09 +0000 (01:46 +0000)
committerDavid S. Miller <davem@redhat.com>
Tue, 2 Mar 2010 01:46:09 +0000 (01:46 +0000)
h->def_regular, set h->ref_regular.
(allocate_dynrelocs): Only force output of STT_GNU_IFUNC plt entries
and dynamic relocations if h->ref_regular.

bfd/ChangeLog
bfd/elfxx-sparc.c

index f86430202d4503f6052ecc546e0af5dc8fd24261..c2128e0993c0afc98b99b0a5bf8679ae28043506 100644 (file)
@@ -1,3 +1,10 @@
+2010-03-01  David S. Miller  <davem@davemloft.net>
+
+       * elfxx-sparc.c (_bfd_sparc_elf_check_relocs): When STT_GNU_IFUNC and
+       h->def_regular, set h->ref_regular.
+       (allocate_dynrelocs): Only force output of STT_GNU_IFUNC plt entries
+       and dynamic relocations if h->ref_regular.
+
 2010-02-25  Alan Modra  <amodra@gmail.com>
 
        PR ld/11304
index 1947d1a1e87c456ccd628b0ef8e5819d57847048..2137df088f2a4e6530ef799c0cb42202723e6dcc 100644 (file)
@@ -1277,7 +1277,10 @@ _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
       if (h && h->type == STT_GNU_IFUNC)
        {
          if (h->def_regular)
-           h->plt.refcount += 1;
+           {
+             h->ref_regular = 1;
+             h->plt.refcount += 1;
+           }
        }
 
       /* Compatibility with old R_SPARC_REV32 reloc conflicting
@@ -2022,7 +2025,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
   if ((htab->elf.dynamic_sections_created
        && h->plt.refcount > 0)
       || (h->type == STT_GNU_IFUNC
-         && h->def_regular))
+         && h->def_regular
+         && h->ref_regular))
     {
       /* Make sure this symbol is output as a dynamic symbol.
         Undefined weak syms won't yet be marked as dynamic.  */
@@ -2034,7 +2038,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
        }
 
       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h)
-         || h->type == STT_GNU_IFUNC)
+         || (h->type == STT_GNU_IFUNC
+             && h->def_regular))
        {
          asection *s = htab->elf.splt;