This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]