* elflink.c (_bfd_elf_fix_symbol_flags): Loop on indirect syms.
	(_bfd_elf_adjust_dynamic_symbol): Remove FIXME.
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index c6154fe..0d70d2d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index dc3840e..2e592f5 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -2517,7 +2517,7 @@
       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 @@
 
   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;
     }