ld error messages

Alan Modra amodra@bigpond.net.au
Sat Sep 21 20:27:00 GMT 2002


File, function and line number might be all users need to know to
correct such errors as undefined symbols, but sometimes section and
offset info are useful in tracking down bugs.

ld/ChangeLog
	* ldmisc.c (vfinfo <%C,%D,%G>): Always output bfd, section and offset.

ld/testsuite/ChangeLog
	* ld-undefined/undefined.exp: Adjust function test.

Index: ld/ldmisc.c
===================================================================
RCS file: /cvs/src/src/ld/ldmisc.c,v
retrieving revision 1.11
diff -c -r1.11 ldmisc.c
*** ld/ldmisc.c	2 Jul 2002 04:21:57 -0000	1.11
--- ld/ldmisc.c	21 Sep 2002 13:57:22 -0000
***************
*** 236,244 ****
  	    case 'C':
  	    case 'D':
  	    case 'G':
! 	      /* Clever filename:linenumber with function name if possible,
! 		 or section name as a last resort.  The arguments are a BFD,
! 		 a section, and an offset.  */
  	      {
  		static bfd *last_bfd;
  		static char *last_file = NULL;
--- 236,243 ----
  	    case 'C':
  	    case 'D':
  	    case 'G':
! 	      /* Clever filename:linenumber with function name if possible.
! 		 The arguments are a BFD, a section, and an offset.  */
  	      {
  		static bfd *last_bfd;
  		static char *last_file = NULL;
***************
*** 280,347 ****
  		      }
  		  }
  
  		discard_last = true;
  		if (bfd_find_nearest_line (abfd, section, asymbols, offset,
  					   &filename, &functionname,
  					   &linenumber))
  		  {
! 		    if (functionname != NULL && fmt[-1] == 'G')
! 		      {
! 			lfinfo (fp, "%B:", abfd);
! 			if (filename != NULL
! 			    && strcmp (filename, bfd_get_filename (abfd)) != 0)
! 			  fprintf (fp, "%s:", filename);
! 			lfinfo (fp, "%T", functionname);
! 		      }
! 		    else if (functionname != NULL && fmt[-1] == 'C')
! 		      {
! 			if (filename == (char *) NULL)
! 			  filename = abfd->filename;
  
  			if (last_bfd == NULL
  			    || last_file == NULL
  			    || last_function == NULL
  			    || last_bfd != abfd
! 			    || strcmp (last_file, filename) != 0
  			    || strcmp (last_function, functionname) != 0)
  			  {
! 			    /* We use abfd->filename in this initial line,
! 			       in case filename is a .h file or something
! 			       similarly unhelpful.  */
! 			    lfinfo (fp, _("%B: In function `%T':\n"),
! 				    abfd, functionname);
  
  			    last_bfd = abfd;
  			    if (last_file != NULL)
  			      free (last_file);
! 			    last_file = xstrdup (filename);
  			    if (last_function != NULL)
  			      free (last_function);
  			    last_function = xstrdup (functionname);
  			  }
  			discard_last = false;
- 			if (linenumber != 0)
- 			  fprintf (fp, "%s:%u", filename, linenumber);
- 			else
- 			  lfinfo (fp, "%s(%s+0x%v)", filename, section->name,
- 				  offset);
  		      }
! 		    else if (filename == NULL
! 			     || strcmp (filename, abfd->filename) == 0)
  		      {
! 			lfinfo (fp, "%B(%s+0x%v)", abfd, section->name,
! 				offset);
! 			if (linenumber != 0)
! 			  lfinfo (fp, ":%u", linenumber);
  		      }
! 		    else if (linenumber != 0)
! 		      lfinfo (fp, "%B:%s:%u", abfd, filename, linenumber);
! 		    else
! 		      lfinfo (fp, "%B(%s+0x%v):%s", abfd, section->name,
! 			      offset, filename);
  		  }
- 		else
- 		  lfinfo (fp, "%B(%s+0x%v)", abfd, section->name, offset);
  
  		if (discard_last)
  		  {
--- 279,332 ----
  		      }
  		  }
  
+ 		lfinfo (fp, "%B(%s+0x%v)", abfd, section->name, offset);
+ 
  		discard_last = true;
  		if (bfd_find_nearest_line (abfd, section, asymbols, offset,
  					   &filename, &functionname,
  					   &linenumber))
  		  {
! 		    boolean need_colon = true;
  
+ 		    if (functionname != NULL && fmt[-1] == 'C')
+ 		      {
  			if (last_bfd == NULL
  			    || last_file == NULL
  			    || last_function == NULL
  			    || last_bfd != abfd
! 			    || (filename != NULL
! 				&& strcmp (last_file, filename) != 0)
  			    || strcmp (last_function, functionname) != 0)
  			  {
! 			    lfinfo (fp, _(": In function `%T':\n"),
! 				    functionname);
! 			    need_colon = false;
  
  			    last_bfd = abfd;
  			    if (last_file != NULL)
  			      free (last_file);
! 			    last_file = NULL;
! 			    if (filename)
! 			      last_file = xstrdup (filename);
  			    if (last_function != NULL)
  			      free (last_function);
  			    last_function = xstrdup (functionname);
  			  }
  			discard_last = false;
  		      }
! 
! 		    if (filename != NULL)
  		      {
! 			if (need_colon)
! 			  putc (':', fp);
! 			fputs (filename, fp);
  		      }
! 
! 		    if (functionname != NULL && fmt[-1] == 'G')
! 		      lfinfo (fp, ":%T", functionname);
! 		    else if (filename != NULL && linenumber != 0)
! 		      fprintf (fp, ":%u", linenumber);
  		  }
  
  		if (discard_last)
  		  {
Index: ld/testsuite/ld-undefined/undefined.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-undefined/undefined.exp,v
retrieving revision 1.14
diff -c -r1.14 undefined.exp
*** ld/testsuite/ld-undefined/undefined.exp	11 Jun 2002 09:50:44 -0000	1.14
--- ld/testsuite/ld-undefined/undefined.exp	21 Sep 2002 13:57:23 -0000
***************
*** 79,85 ****
  setup_xfail "mn10300-*-elf"
  setup_xfail "sh-*-*"
  
! set mf "tmpdir/undefined.o: In function `function':"
  checkund $mf $testfn
  
  # COFF SH gets this test wrong--it reports line 10, because although
--- 79,85 ----
  setup_xfail "mn10300-*-elf"
  setup_xfail "sh-*-*"
  
! set mf "tmpdir/undefined.o* In function `function':"
  checkund $mf $testfn
  
  # COFF SH gets this test wrong--it reports line 10, because although

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre



More information about the Binutils mailing list