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);