* elflink.c (_bfd_elf_fix_symbol_flags): Loop on indirect syms.
authorAlan Modra <amodra@gmail.com>
Thu, 14 Jul 2011 03:57:18 +0000 (03:57 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 14 Jul 2011 03:57:18 +0000 (03:57 +0000)
(_bfd_elf_adjust_dynamic_symbol): Remove FIXME.

bfd/ChangeLog
bfd/elflink.c

index c6154fea28c02bd06db63eff0c460304a57553db..0d70d2d598d2d50518aa71d696e979a10174d553 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-14  Alan Modra  <amodra@gmail.com>
+
+       * elflink.c (_bfd_elf_fix_symbol_flags): Loop on indirect syms.
+       (_bfd_elf_adjust_dynamic_symbol): Remove FIXME.
+
 2011-07-14  Alan Modra  <amodra@gmail.com>
 
        * elf64-ppc.c (struct ppc_link_hash_table): Add plt_static_chain.
index dc3840e33dba1ea5adcd6393c7b64c14f9892ea9..2e592f5e0f7f40ccab9802b91e76f82418036c97 100644 (file)
@@ -2517,7 +2517,7 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
       struct elf_link_hash_entry *weakdef;
 
       weakdef = h->u.weakdef;
-      if (h->root.type == bfd_link_hash_indirect)
+      while (h->root.type == bfd_link_hash_indirect)
        h = (struct elf_link_hash_entry *) h->root.u.i.link;
 
       BFD_ASSERT (h->root.type == bfd_link_hash_defined
@@ -2621,12 +2621,12 @@ _bfd_elf_adjust_dynamic_symbol (struct elf_link_hash_entry *h, void *data)
 
   if (h->u.weakdef != NULL)
     {
-      /* If we get to this point, we know there is an implicit
-        reference by a regular object file via the weak symbol H.
-        FIXME: Is this really true?  What if the traversal finds
-        H->U.WEAKDEF before it finds H?  */
+      /* If we get to this point, there is an implicit reference to
+        H->U.WEAKDEF by a regular object file via the weak symbol H.  */
       h->u.weakdef->ref_regular = 1;
 
+      /* Ensure that the backend adjust_dynamic_symbol function sees
+        H->U.WEAKDEF before H by recursively calling ourselves.  */
       if (! _bfd_elf_adjust_dynamic_symbol (h->u.weakdef, eif))
        return FALSE;
     }