This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH 2_20 3/3] * 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.
- From: Kirill Smelkov <kirr at landau dot phys dot spbu dot ru>
- To: binutils at sourceware dot org
- Cc: Roland McGrath <roland at frob dot com>, Nick Clifton <nickc at redhat dot com>, 591405 at bugs dot debian dot org
- Date: Sat, 7 Aug 2010 18:32:42 +0400
- Subject: [PATCH 2_20 3/3] * 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.
- References: <cover.1281189992.git.kirr@landau.phys.spbu.ru>
- References: <cover.1281189992.git.kirr@landau.phys.spbu.ru>
From: Nick Clifton <nickc@redhat.com>
commit f52ff3cba39902ccfea13e49267d6f14dfc1f6f6 on trunk
---
bfd/ChangeLog | 10 ++++++++++
bfd/elflink.c | 33 ++++++++++++++++++++++++---------
2 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3755cad..247cd3f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,6 +1,16 @@
2010-08-07 Kirill Smelkov <kirr@landau.phys.spbu.ru>
Backport from mainline:
+ 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-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
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 10eee8c..e058064 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -3991,6 +3991,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)
@@ -4098,16 +4112,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;
}
@@ -4448,12 +4461,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);
--
1.7.2.1.44.g721e7