This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Committed: Do not report a weak need for a DT_NEEDED DSO
- From: Nick Clifton <nickc at redhat dot com>
- To: binutils at sourceware dot org
- Date: Thu, 21 Jan 2010 14:53:58 +0000
- Subject: Committed: Do not report a weak need for a DT_NEEDED DSO
Hi Guys,
A user recently reported that the linker's -no-copy-dt-needed option
could trigger error messages for DSO that are "needed" to satisfy weak
references. This is obviously wrong and so I am applying the patch
below to fix the problem. The patch also improves the error reporting
for non-weak references that really do need a DSO, so that the correct
input file name is used.
Cheers
Nick
bfd/ChangeLog
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.
Index: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.365
diff -c -3 -p -r1.365 elflink.c
*** bfd/elflink.c 8 Jan 2010 03:03:16 -0000 1.365
--- bfd/elflink.c 21 Jan 2010 14:43:06 -0000
*************** error_free_dyn:
*** 3999,4004 ****
--- 3999,4018 ----
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)
*************** error_free_dyn:
*** 4106,4121 ****
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;
}
--- 4120,4134 ----
name = newname;
}
! /* 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.u.undef.abfd)
undef_bfd = h->root.u.undef.abfd;
}
*************** error_free_dyn:
*** 4455,4466 ****
/* 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)
{
(*_bfd_error_handler)
(_("%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);
--- 4468,4481 ----
/* 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 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, name);
(*_bfd_error_handler)
(_("note: '%s' is defined in DSO %B so try adding it to the linker command line"),
abfd, name);