From: Nick Clifton <[email protected]>

commit f332f7169a8ffc0252aac24ddc1db5662642e763 on trunk
---
 bfd/ChangeLog |   10 ++++++++++
 bfd/elflink.c |   22 ++++++++++++++++++++--
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 202f4ad..3755cad 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,6 +1,16 @@
 2010-08-07  Kirill Smelkov  <[email protected]>
 
        Backport from mainline:
+       2009-11-05  Nick Clifton  <[email protected]>
+
+       * 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.
+
+2010-08-07  Kirill Smelkov  <[email protected]>
+
+       Backport from mainline:
        2009-10-12  Roland McGrath  <[email protected]>
 
        * elflink.c (elf_link_add_object_symbols, _bfd_elf_merge_symbol):
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 4a348de..10eee8c 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -3866,6 +3866,7 @@ error_free_dyn:
       bfd_boolean common;
       unsigned int old_alignment;
       bfd *old_bfd;
+      bfd * undef_bfd = NULL;
 
       override = FALSE;
 
@@ -4097,6 +4098,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,
@@ -4437,9 +4452,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;
                }
 
-- 
1.7.2.1.44.g721e7



-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to