Also track weak references
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 16 Feb 2013 17:48:57 +0000 (17:48 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 16 Feb 2013 17:48:57 +0000 (17:48 +0000)
PR ld/15149
* elflink.c (elf_link_add_object_symbols): Also track weak
references.

bfd/ChangeLog
bfd/elflink.c

index 72d12ef9563cc1186790ddef5a7e89263bce7000..c6fb5b1b42da540d506163f9a323861981385199 100644 (file)
@@ -1,3 +1,9 @@
+2013-02-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/15149
+       * elflink.c (elf_link_add_object_symbols): Also track weak
+       references.
+
 2013-02-15  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR binutils/15151
index d423ca41a219931ef2829db4ac44eeed1fb0b5c3..1a45110597ceee17f561e9f1a4394ea63de00bdd 100644 (file)
@@ -4002,15 +4002,17 @@ error_free_dyn:
          bfd_boolean skip;
 
          /* If this is a definition of a symbol which was previously
-            referenced in a non-weak manner then make a note of the bfd
-            that contained the reference.  This is used if we need to
-            refer to the source of the reference later on.  */
+            referenced, then make a note of the bfd that contained the
+            reference.  This is used if we need to refer to the source
+            of the reference later on.  */
          if (! bfd_is_und_section (sec))
            {
-             h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE);
+             h = elf_link_hash_lookup (elf_hash_table (info), name,
+                                       FALSE, FALSE, FALSE);
 
              if (h != NULL
-                 && h->root.type == bfd_link_hash_undefined
+                 && (h->root.type == bfd_link_hash_undefined
+                     || h->root.type == bfd_link_hash_undefweak)
                  && h->root.u.undef.abfd)
                undef_bfd = h->root.u.undef.abfd;
            }
@@ -4123,14 +4125,15 @@ error_free_dyn:
            }
 
          /* If necessary, make a second attempt to locate the bfd
-            containing an unresolved, non-weak reference to the
-            current symbol.  */
+            containing an unresolved reference to the current symbol.  */
          if (! bfd_is_und_section (sec) && undef_bfd == NULL)
            {
-             h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE);
+             h = elf_link_hash_lookup (elf_hash_table (info), name,
+                                       FALSE, FALSE, FALSE);
 
              if (h != NULL
-                 && h->root.type == bfd_link_hash_undefined
+                 && (h->root.type == bfd_link_hash_undefined
+                     || h->root.type == bfd_link_hash_undefweak)
                  && h->root.u.undef.abfd)
                undef_bfd = h->root.u.undef.abfd;
            }