* elflink.c (elf_link_add_object_symbols): Improve error
authorNick Clifton <nickc@redhat.com>
Thu, 5 Nov 2009 15:34:18 +0000 (15:34 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 5 Nov 2009 15:34:18 +0000 (15:34 +0000)
        message generated when a symbol is left unresolved because a
        --no-add-needed command line option has prevented the
        inclusion of the DSO defining it.

bfd/ChangeLog
bfd/elflink.c

index 3c8fd00..86af786 100644 (file)
@@ -1,3 +1,10 @@
+2009-11-05  Nick Clifton  <nickc@redhat.com>
+
+       * elflink.c (elf_link_add_object_symbols): Improve error
+       message generated when a symbol is left unresolved because a
+        --no-add-needed command line option has prevented the
+       inclusion of the DSO defining it.
+
 2009-11-03  Alan Modra  <amodra@bigpond.net.au>
            Ulrich Weigand  <uweigand@de.ibm.com>
 
index 65bba87..cd016b7 100644 (file)
@@ -3877,6 +3877,7 @@ error_free_dyn:
       bfd_boolean common;
       unsigned int old_alignment;
       bfd *old_bfd;
+      bfd * undef_bfd = NULL;
 
       override = FALSE;
 
@@ -4108,6 +4109,20 @@ 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))
+           {
+             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.u.undef.abfd)
+               undef_bfd = h->root.u.undef.abfd;
+           }
+
          if (!_bfd_elf_merge_symbol (abfd, info, name, isym, &sec,
                                      &value, &old_alignment,
                                      sym_hash, &skip, &override,
@@ -4447,9 +4462,12 @@ error_free_dyn:
              if ((elf_dyn_lib_class (abfd) & DYN_NO_NEEDED) != 0)
                {
                  (*_bfd_error_handler)
-                   (_("%B: invalid DSO for symbol `%s' definition"),
+                   (_("%B: undefined reference to symbol '%s'"),
+                    undef_bfd == NULL ? info->output_bfd : undef_bfd, name);
+                 (*_bfd_error_handler)
+                   (_("note: '%s' is defined in DSO %B so try adding it to the linker command line"),
                     abfd, name);
-                 bfd_set_error (bfd_error_bad_value);
+                 bfd_set_error (bfd_error_invalid_operation);
                  goto error_free_vers;
                }