aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/binutils/binutils-2.20.1/201_elflink_improve_noaddneeded_errors.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/binutils/binutils-2.20.1/201_elflink_improve_noaddneeded_errors.patch')
-rw-r--r--recipes/binutils/binutils-2.20.1/201_elflink_improve_noaddneeded_errors.patch70
1 files changed, 70 insertions, 0 deletions
diff --git a/recipes/binutils/binutils-2.20.1/201_elflink_improve_noaddneeded_errors.patch b/recipes/binutils/binutils-2.20.1/201_elflink_improve_noaddneeded_errors.patch
new file mode 100644
index 0000000000..85675a3d9e
--- /dev/null
+++ b/recipes/binutils/binutils-2.20.1/201_elflink_improve_noaddneeded_errors.patch
@@ -0,0 +1,70 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 201_elflink_improve_errors.dpatch by <kirr@landau.phys.spbu.ru>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Improves error messages regarding -no-add-needed cases; needed for
+## DP: later elflink patches
+## DP: Upstream status: submitted upstream for binutils-2_20-branch
+
+2010-08-07 Kirill Smelkov <kirr@landau.phys.spbu.ru>
+
+ Backport from mainline:
+ 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.
+
+@DPATCH@
+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
+