From b918acf91acd5c088b50e5d0be96a62fd8826134 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 21 Jan 2010 14:54:40 +0000 Subject: [PATCH] * 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. --- bfd/ChangeLog | 8 +++++++- bfd/elflink.c | 33 ++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 470610ee8da..b292f45662f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,11 @@ +2010-01-21 Nick Clifton + + * 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-01-21 Andreas Krebbel - + * elf32-s390.c (elf32_s390_merge_private_bfd_data): New function. (bfd_elf32_bfd_merge_private_bfd_data): New macro definition. diff --git a/bfd/elflink.c b/bfd/elflink.c index 24d870299a5..6576252a774 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -3999,6 +3999,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) @@ -4106,16 +4120,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; } @@ -4455,12 +4468,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); -- 2.30.2