* 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 c6154fe..0d70d2d 100644 (file)
@@ -1,5 +1,10 @@
 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.
        (build_plt_stub): Add plt_static_chain param, don't load r11 if false.
        (build_tls_get_addr_stub): Likewise.
index dc3840e..2e592f5 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;
     }