* elflink.c (elf_link_add_object_symbols): Look up name of
authorNick Clifton <nickc@redhat.com>
Thu, 21 Jan 2010 14:54:40 +0000 (14:54 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 21 Jan 2010 14:54:40 +0000 (14:54 +0000)
        undefined symbol both before and after versioning has been
        applied.  Do not bother with symbols that are weakly undefined.

bfd/ChangeLog
bfd/elflink.c

index 470610ee8dabb286db00a1d99031dfc01023aba3..b292f45662f7c6b794bb06da18ecc2e87a77aaf7 100644 (file)
@@ -1,5 +1,11 @@
+2010-01-21  Nick Clifton  <nickc@redhat.com>
+
+       * elflink.c (elf_link_add_object_symbols): Look up name of
+       undefined symbol both before and after versioning has been
+       applied.  Do not bother with symbols that are weakly undefined.
+
 2010-01-21  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
-       
+
        * elf32-s390.c (elf32_s390_merge_private_bfd_data): New function.
        (bfd_elf32_bfd_merge_private_bfd_data): New macro definition.
 
index 24d870299a5f2f11d28dcc83d8b4d808f9c53412..6576252a774becd7be6460ee01baf832a2e4cb41 100644 (file)
@@ -3999,6 +3999,20 @@ error_free_dyn:
          unsigned int vernum = 0;
          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.  */
+         if (! bfd_is_und_section (sec))
+           {
+             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.u.undef.abfd)
+               undef_bfd = h->root.u.undef.abfd;
+           }
+         
          if (ever == NULL)
            {
              if (info->default_imported_symver)
@@ -4106,16 +4120,15 @@ error_free_dyn:
              name = newname;
            }
 
-         /* If this is a definition of a previously undefined symbol
-            make a note of the bfd that contained the reference in
-            case we need to refer to it later on in error messages.  */
-         if (! bfd_is_und_section (sec))
+         /* If necessary, make a second attempt to locate the bfd
+            containing an unresolved, non-weak 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);
 
              if (h != NULL
-                 && (h->root.type == bfd_link_hash_undefined
-                     || h->root.type == bfd_link_hash_undefweak)
+                 && h->root.type == bfd_link_hash_undefined
                  && h->root.u.undef.abfd)
                undef_bfd = h->root.u.undef.abfd;
            }
@@ -4455,12 +4468,14 @@ error_free_dyn:
              /* A symbol from a library loaded via DT_NEEDED of some
                 other library is referenced by a regular object.
                 Add a DT_NEEDED entry for it.  Issue an error if
-                --no-add-needed is used.  */
-             if ((elf_dyn_lib_class (abfd) & DYN_NO_NEEDED) != 0)
+                --no-add-needed is used and the reference was not
+                a weak one.  */
+             if (undef_bfd != NULL
+                 && (elf_dyn_lib_class (abfd) & DYN_NO_NEEDED) != 0)
                {
                  (*_bfd_error_handler)
                    (_("%B: undefined reference to symbol '%s'"),
-                    undef_bfd == NULL ? info->output_bfd : undef_bfd, name);
+                    undef_bfd, name);
                  (*_bfd_error_handler)
                    (_("note: '%s' is defined in DSO %B so try adding it to the linker command line"),
                     abfd, name);