public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* ld error message %C format
@ 2011-05-18 15:48 Alan Modra
  2011-05-18 15:51 ` H.J. Lu
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Alan Modra @ 2011-05-18 15:48 UTC (permalink / raw)
  To: binutils

How do people feel about extending typical linker error messages like
the following
	tmpdir/dump0.o: In function `foo':
	./compressed1.c:13: undefined reference to `bar'
to always include the section and offset information?
	tmpdir/dump0.o: In function `foo':
	./compressed1.c:13:(.text+0x8): undefined reference to `bar'

When debugging toolchain problems, the section and offset is often
more useful than the source information.  I've checked that this
change doesn't seem to break emacs parsing of error messages.

	* ldmisc.c (vfinfo <%C>): Always print section+offset.

Index: ld/ldmisc.c
===================================================================
RCS file: /cvs/src/src/ld/ldmisc.c,v
retrieving revision 1.39
diff -u -p -r1.39 ldmisc.c
--- ld/ldmisc.c	28 Feb 2011 18:34:52 -0000	1.39
+++ ld/ldmisc.c	14 May 2011 11:32:38 -0000
@@ -276,6 +276,7 @@ vfinfo (FILE *fp, const char *fmt, va_li
 		const char *functionname;
 		unsigned int linenumber;
 		bfd_boolean discard_last;
+		bfd_boolean done;
 
 		abfd = va_arg (arg, bfd *);
 		section = va_arg (arg, asection *);
@@ -343,15 +344,21 @@ vfinfo (FILE *fp, const char *fmt, va_li
 		    if (filename != NULL)
 		      fprintf (fp, "%s:", filename);
 
+		    done = fmt[-1] != 'C';
 		    if (functionname != NULL && fmt[-1] == 'G')
 		      lfinfo (fp, "%T", functionname);
 		    else if (filename != NULL && linenumber != 0)
-		      fprintf (fp, "%u", linenumber);
+		      fprintf (fp, "%u%s", linenumber, ":" + done);
 		    else
-		      lfinfo (fp, "(%A+0x%v)", section, offset);
+		      done = FALSE;
 		  }
 		else
-		  lfinfo (fp, "%B:(%A+0x%v)", abfd, section, offset);
+		  {
+		    lfinfo (fp, "%B:", abfd);
+		    done = FALSE;
+		  }
+		if (!done)
+		  lfinfo (fp, "(%A+0x%v)", section, offset);
 
 		if (discard_last)
 		  {
Index: ld/testsuite/ld-cris/undef2.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-cris/undef2.d,v
retrieving revision 1.1
diff -u -p -r1.1 undef2.d
--- ld/testsuite/ld-cris/undef2.d	7 Feb 2005 02:53:32 -0000	1.1
+++ ld/testsuite/ld-cris/undef2.d	14 May 2011 10:41:43 -0000
@@ -3,4 +3,4 @@
 # target: cris-*-*elf* cris-*-*aout*
 # as: --em=crisaout
 # ld: -mcrisaout
-# error: .o:/blah/foo.c:96: undefined reference to `globsym1'$
+# error: .o:/blah/foo.c:96:\(\.text\+0x4\): undefined reference to `globsym1'$
Index: ld/testsuite/ld-cris/undef3.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-cris/undef3.d,v
retrieving revision 1.1
diff -u -p -r1.1 undef3.d
--- ld/testsuite/ld-cris/undef3.d	7 Feb 2005 02:53:32 -0000	1.1
+++ ld/testsuite/ld-cris/undef3.d	14 May 2011 10:41:43 -0000
@@ -3,4 +3,4 @@
 #target: cris-*-*elf* cris-*-*aout*
 #as: --em=criself
 #ld: -mcriself
-#error: .o:/blah/foo.c:96: undefined reference to `globsym1'$
+#error: .o:/blah/foo.c:96:\(\.text\+0x4\): undefined reference to `globsym1'$
Index: ld/testsuite/ld-i386/compressed1.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-i386/compressed1.d,v
retrieving revision 1.1
diff -u -p -r1.1 compressed1.d
--- ld/testsuite/ld-i386/compressed1.d	15 Jul 2010 00:42:23 -0000	1.1
+++ ld/testsuite/ld-i386/compressed1.d	14 May 2011 10:41:44 -0000
@@ -1,7 +1,7 @@
 #name: undefined symbol with compressed debug sections
 #as: --32
 #ld: -e foo -melf_i386 --noinhibit-exec
-#warning: .*/compressed1.c:13: undefined reference to .bar.
+#warning: .*/compressed1.c:13.*: undefined reference to .bar.
 #nm: -n
 
 #...
Index: ld/testsuite/ld-ia64/line.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-ia64/line.exp,v
retrieving revision 1.1
diff -u -p -r1.1 line.exp
--- ld/testsuite/ld-ia64/line.exp	2 Sep 2007 13:29:20 -0000	1.1
+++ ld/testsuite/ld-ia64/line.exp	14 May 2011 10:41:44 -0000
@@ -52,6 +52,6 @@ proc checkund { string testname } {
     }
 }
 
-set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
+set ml "undefined.c:9*: undefined reference to `*this_function_is_not_defined'"
 
 checkund $ml $testline
Index: ld/testsuite/ld-undefined/undefined.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-undefined/undefined.exp,v
retrieving revision 1.32
diff -u -p -r1.32 undefined.exp
--- ld/testsuite/ld-undefined/undefined.exp	6 Apr 2011 17:09:56 -0000	1.32
+++ ld/testsuite/ld-undefined/undefined.exp	14 May 2011 10:41:44 -0000
@@ -90,7 +90,7 @@ if ![is_elf_format] {
     #setup_xfail "arm*-*-pe*"
 }
 
-set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
+set ml "undefined.c:9*: undefined reference to `*this_function_is_not_defined'"
 # With targets that use elf/dwarf2, such as the arm-elf
 # toolchain, the code in bfd/elf.c:_bfd_elf_find_nearest_line() is called
 # in order to locate the file name/line number where the undefined
Index: ld/testsuite/ld-x86-64/compressed1.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-x86-64/compressed1.d,v
retrieving revision 1.1
diff -u -p -r1.1 compressed1.d
--- ld/testsuite/ld-x86-64/compressed1.d	15 Jul 2010 00:42:23 -0000	1.1
+++ ld/testsuite/ld-x86-64/compressed1.d	14 May 2011 10:41:44 -0000
@@ -1,7 +1,7 @@
 #name: undefined symbol with compressed debug sections
 #as: --64
 #ld: -e foo -melf_x86_64 --noinhibit-exec
-#warning: .*/compressed1.c:13: undefined reference to .bar.
+#warning: .*/compressed1.c:13.*: undefined reference to .bar.
 #nm: -n
 
 #...
Index: ld/testsuite/ld-x86-64/line.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-x86-64/line.exp,v
retrieving revision 1.2
diff -u -p -r1.2 line.exp
--- ld/testsuite/ld-x86-64/line.exp	2 Sep 2007 13:29:20 -0000	1.2
+++ ld/testsuite/ld-x86-64/line.exp	14 May 2011 10:41:44 -0000
@@ -52,6 +52,6 @@ proc checkund { string testname } {
     }
 }
 
-set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
+set ml "undefined.c:9*: undefined reference to `*this_function_is_not_defined'"
 
 checkund $ml $testline

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-18 15:48 ld error message %C format Alan Modra
@ 2011-05-18 15:51 ` H.J. Lu
  2011-05-18 16:04 ` Jason Duerstock
  2011-05-18 23:59 ` Ian Lance Taylor
  2 siblings, 0 replies; 11+ messages in thread
From: H.J. Lu @ 2011-05-18 15:51 UTC (permalink / raw)
  To: binutils

On Wed, May 18, 2011 at 8:47 AM, Alan Modra <amodra@gmail.com> wrote:
> How do people feel about extending typical linker error messages like
> the following
>        tmpdir/dump0.o: In function `foo':
>        ./compressed1.c:13: undefined reference to `bar'
> to always include the section and offset information?
>        tmpdir/dump0.o: In function `foo':
>        ./compressed1.c:13:(.text+0x8): undefined reference to `bar'
>
> When debugging toolchain problems, the section and offset is often
> more useful than the source information.  I've checked that this
> change doesn't seem to break emacs parsing of error messages.
>
>        * ldmisc.c (vfinfo <%C>): Always print section+offset.
>

I like it.

Thanks.


-- 
H.J.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-18 15:48 ld error message %C format Alan Modra
  2011-05-18 15:51 ` H.J. Lu
@ 2011-05-18 16:04 ` Jason Duerstock
  2011-05-18 16:19   ` Andreas Schwab
  2011-05-18 23:33   ` Alan Modra
  2011-05-18 23:59 ` Ian Lance Taylor
  2 siblings, 2 replies; 11+ messages in thread
From: Jason Duerstock @ 2011-05-18 16:04 UTC (permalink / raw)
  To: binutils

>+                     fprintf (fp, "%u%s", linenumber, ":" + done);

Isn't this a C++ism?  Shouldn't it be:

+             fprintf(fp, "%u:%s", linenumber, done);

?

Apologies if I'm have a braindead day.

Thanks

Jason

On Wed, May 18, 2011 at 11:47 AM, Alan Modra <amodra@gmail.com> wrote:
> How do people feel about extending typical linker error messages like
> the following
>        tmpdir/dump0.o: In function `foo':
>        ./compressed1.c:13: undefined reference to `bar'
> to always include the section and offset information?
>        tmpdir/dump0.o: In function `foo':
>        ./compressed1.c:13:(.text+0x8): undefined reference to `bar'
>
> When debugging toolchain problems, the section and offset is often
> more useful than the source information.  I've checked that this
> change doesn't seem to break emacs parsing of error messages.
>
>        * ldmisc.c (vfinfo <%C>): Always print section+offset.
>
> Index: ld/ldmisc.c
> ===================================================================
> RCS file: /cvs/src/src/ld/ldmisc.c,v
> retrieving revision 1.39
> diff -u -p -r1.39 ldmisc.c
> --- ld/ldmisc.c 28 Feb 2011 18:34:52 -0000      1.39
> +++ ld/ldmisc.c 14 May 2011 11:32:38 -0000
> @@ -276,6 +276,7 @@ vfinfo (FILE *fp, const char *fmt, va_li
>                const char *functionname;
>                unsigned int linenumber;
>                bfd_boolean discard_last;
> +               bfd_boolean done;
>
>                abfd = va_arg (arg, bfd *);
>                section = va_arg (arg, asection *);
> @@ -343,15 +344,21 @@ vfinfo (FILE *fp, const char *fmt, va_li
>                    if (filename != NULL)
>                      fprintf (fp, "%s:", filename);
>
> +                   done = fmt[-1] != 'C';
>                    if (functionname != NULL && fmt[-1] == 'G')
>                      lfinfo (fp, "%T", functionname);
>                    else if (filename != NULL && linenumber != 0)
> -                     fprintf (fp, "%u", linenumber);
> +                     fprintf (fp, "%u%s", linenumber, ":" + done);
>                    else
> -                     lfinfo (fp, "(%A+0x%v)", section, offset);
> +                     done = FALSE;
>                  }
>                else
> -                 lfinfo (fp, "%B:(%A+0x%v)", abfd, section, offset);
> +                 {
> +                   lfinfo (fp, "%B:", abfd);
> +                   done = FALSE;
> +                 }
> +               if (!done)
> +                 lfinfo (fp, "(%A+0x%v)", section, offset);
>
>                if (discard_last)
>                  {
> Index: ld/testsuite/ld-cris/undef2.d
> ===================================================================
> RCS file: /cvs/src/src/ld/testsuite/ld-cris/undef2.d,v
> retrieving revision 1.1
> diff -u -p -r1.1 undef2.d
> --- ld/testsuite/ld-cris/undef2.d       7 Feb 2005 02:53:32 -0000       1.1
> +++ ld/testsuite/ld-cris/undef2.d       14 May 2011 10:41:43 -0000
> @@ -3,4 +3,4 @@
>  # target: cris-*-*elf* cris-*-*aout*
>  # as: --em=crisaout
>  # ld: -mcrisaout
> -# error: .o:/blah/foo.c:96: undefined reference to `globsym1'$
> +# error: .o:/blah/foo.c:96:\(\.text\+0x4\): undefined reference to `globsym1'$
> Index: ld/testsuite/ld-cris/undef3.d
> ===================================================================
> RCS file: /cvs/src/src/ld/testsuite/ld-cris/undef3.d,v
> retrieving revision 1.1
> diff -u -p -r1.1 undef3.d
> --- ld/testsuite/ld-cris/undef3.d       7 Feb 2005 02:53:32 -0000       1.1
> +++ ld/testsuite/ld-cris/undef3.d       14 May 2011 10:41:43 -0000
> @@ -3,4 +3,4 @@
>  #target: cris-*-*elf* cris-*-*aout*
>  #as: --em=criself
>  #ld: -mcriself
> -#error: .o:/blah/foo.c:96: undefined reference to `globsym1'$
> +#error: .o:/blah/foo.c:96:\(\.text\+0x4\): undefined reference to `globsym1'$
> Index: ld/testsuite/ld-i386/compressed1.d
> ===================================================================
> RCS file: /cvs/src/src/ld/testsuite/ld-i386/compressed1.d,v
> retrieving revision 1.1
> diff -u -p -r1.1 compressed1.d
> --- ld/testsuite/ld-i386/compressed1.d  15 Jul 2010 00:42:23 -0000      1.1
> +++ ld/testsuite/ld-i386/compressed1.d  14 May 2011 10:41:44 -0000
> @@ -1,7 +1,7 @@
>  #name: undefined symbol with compressed debug sections
>  #as: --32
>  #ld: -e foo -melf_i386 --noinhibit-exec
> -#warning: .*/compressed1.c:13: undefined reference to .bar.
> +#warning: .*/compressed1.c:13.*: undefined reference to .bar.
>  #nm: -n
>
>  #...
> Index: ld/testsuite/ld-ia64/line.exp
> ===================================================================
> RCS file: /cvs/src/src/ld/testsuite/ld-ia64/line.exp,v
> retrieving revision 1.1
> diff -u -p -r1.1 line.exp
> --- ld/testsuite/ld-ia64/line.exp       2 Sep 2007 13:29:20 -0000       1.1
> +++ ld/testsuite/ld-ia64/line.exp       14 May 2011 10:41:44 -0000
> @@ -52,6 +52,6 @@ proc checkund { string testname } {
>     }
>  }
>
> -set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
> +set ml "undefined.c:9*: undefined reference to `*this_function_is_not_defined'"
>
>  checkund $ml $testline
> Index: ld/testsuite/ld-undefined/undefined.exp
> ===================================================================
> RCS file: /cvs/src/src/ld/testsuite/ld-undefined/undefined.exp,v
> retrieving revision 1.32
> diff -u -p -r1.32 undefined.exp
> --- ld/testsuite/ld-undefined/undefined.exp     6 Apr 2011 17:09:56 -0000       1.32
> +++ ld/testsuite/ld-undefined/undefined.exp     14 May 2011 10:41:44 -0000
> @@ -90,7 +90,7 @@ if ![is_elf_format] {
>     #setup_xfail "arm*-*-pe*"
>  }
>
> -set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
> +set ml "undefined.c:9*: undefined reference to `*this_function_is_not_defined'"
>  # With targets that use elf/dwarf2, such as the arm-elf
>  # toolchain, the code in bfd/elf.c:_bfd_elf_find_nearest_line() is called
>  # in order to locate the file name/line number where the undefined
> Index: ld/testsuite/ld-x86-64/compressed1.d
> ===================================================================
> RCS file: /cvs/src/src/ld/testsuite/ld-x86-64/compressed1.d,v
> retrieving revision 1.1
> diff -u -p -r1.1 compressed1.d
> --- ld/testsuite/ld-x86-64/compressed1.d        15 Jul 2010 00:42:23 -0000      1.1
> +++ ld/testsuite/ld-x86-64/compressed1.d        14 May 2011 10:41:44 -0000
> @@ -1,7 +1,7 @@
>  #name: undefined symbol with compressed debug sections
>  #as: --64
>  #ld: -e foo -melf_x86_64 --noinhibit-exec
> -#warning: .*/compressed1.c:13: undefined reference to .bar.
> +#warning: .*/compressed1.c:13.*: undefined reference to .bar.
>  #nm: -n
>
>  #...
> Index: ld/testsuite/ld-x86-64/line.exp
> ===================================================================
> RCS file: /cvs/src/src/ld/testsuite/ld-x86-64/line.exp,v
> retrieving revision 1.2
> diff -u -p -r1.2 line.exp
> --- ld/testsuite/ld-x86-64/line.exp     2 Sep 2007 13:29:20 -0000       1.2
> +++ ld/testsuite/ld-x86-64/line.exp     14 May 2011 10:41:44 -0000
> @@ -52,6 +52,6 @@ proc checkund { string testname } {
>     }
>  }
>
> -set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
> +set ml "undefined.c:9*: undefined reference to `*this_function_is_not_defined'"
>
>  checkund $ml $testline
>
> --
> Alan Modra
> Australia Development Lab, IBM
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-18 16:04 ` Jason Duerstock
@ 2011-05-18 16:19   ` Andreas Schwab
  2011-05-18 23:33   ` Alan Modra
  1 sibling, 0 replies; 11+ messages in thread
From: Andreas Schwab @ 2011-05-18 16:19 UTC (permalink / raw)
  To: Jason Duerstock; +Cc: binutils

Jason Duerstock <jason.duerstock@gmail.com> writes:

>>+                     fprintf (fp, "%u%s", linenumber, ":" + done);
>
> Isn't this a C++ism?  Shouldn't it be:
>
> +             fprintf(fp, "%u:%s", linenumber, done);

done isn't a string.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-18 16:04 ` Jason Duerstock
  2011-05-18 16:19   ` Andreas Schwab
@ 2011-05-18 23:33   ` Alan Modra
  2011-05-19  0:10     ` Jason Duerstock
  1 sibling, 1 reply; 11+ messages in thread
From: Alan Modra @ 2011-05-18 23:33 UTC (permalink / raw)
  To: Jason Duerstock; +Cc: binutils

On Wed, May 18, 2011 at 12:03:42PM -0400, Jason Duerstock wrote:
> >+                     fprintf (fp, "%u%s", linenumber, ":" + done);
> 
> Isn't this a C++ism?  Shouldn't it be:

No, just an old C trick.  ":"+done is either ":" or "".

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-18 15:48 ld error message %C format Alan Modra
  2011-05-18 15:51 ` H.J. Lu
  2011-05-18 16:04 ` Jason Duerstock
@ 2011-05-18 23:59 ` Ian Lance Taylor
  2011-05-20  0:00   ` Alan Modra
  2 siblings, 1 reply; 11+ messages in thread
From: Ian Lance Taylor @ 2011-05-18 23:59 UTC (permalink / raw)
  To: binutils

Alan Modra <amodra@gmail.com> writes:

> How do people feel about extending typical linker error messages like
> the following
> 	tmpdir/dump0.o: In function `foo':
> 	./compressed1.c:13: undefined reference to `bar'
> to always include the section and offset information?
> 	tmpdir/dump0.o: In function `foo':
> 	./compressed1.c:13:(.text+0x8): undefined reference to `bar'
>
> When debugging toolchain problems, the section and offset is often
> more useful than the source information.  I've checked that this
> change doesn't seem to break emacs parsing of error messages.

While I'm generally not happy about adding options, I think this is a
case where we should consider it.  That is, consider an option
requesting more verbose information from linker errors.  I think that
for ordinary users of the linker, i.e., 99.9% of linker users, the
section+offset will be far more confusing than helpful.

Ian

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-18 23:33   ` Alan Modra
@ 2011-05-19  0:10     ` Jason Duerstock
  0 siblings, 0 replies; 11+ messages in thread
From: Jason Duerstock @ 2011-05-19  0:10 UTC (permalink / raw)
  To: binutils

Hadn't seen that one before.  Thank you for the explanation.

Jason

On Wed, May 18, 2011 at 7:33 PM, Alan Modra <amodra@gmail.com> wrote:
> On Wed, May 18, 2011 at 12:03:42PM -0400, Jason Duerstock wrote:
>> >+                     fprintf (fp, "%u%s", linenumber, ":" + done);
>>
>> Isn't this a C++ism?  Shouldn't it be:
>
> No, just an old C trick.  ":"+done is either ":" or "".
>
> --
> Alan Modra
> Australia Development Lab, IBM
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-18 23:59 ` Ian Lance Taylor
@ 2011-05-20  0:00   ` Alan Modra
  2011-05-20  0:24     ` Ian Lance Taylor
  0 siblings, 1 reply; 11+ messages in thread
From: Alan Modra @ 2011-05-20  0:00 UTC (permalink / raw)
  To: Ian Lance Taylor; +Cc: binutils

On Wed, May 18, 2011 at 04:59:07PM -0700, Ian Lance Taylor wrote:
> Alan Modra <amodra@gmail.com> writes:
> 
> > How do people feel about extending typical linker error messages like
> > the following
> > 	tmpdir/dump0.o: In function `foo':
> > 	./compressed1.c:13: undefined reference to `bar'
> > to always include the section and offset information?
> > 	tmpdir/dump0.o: In function `foo':
> > 	./compressed1.c:13:(.text+0x8): undefined reference to `bar'
> >
> > When debugging toolchain problems, the section and offset is often
> > more useful than the source information.  I've checked that this
> > change doesn't seem to break emacs parsing of error messages.
> 
> While I'm generally not happy about adding options, I think this is a
> case where we should consider it.  That is, consider an option
> requesting more verbose information from linker errors.  I think that
> for ordinary users of the linker, i.e., 99.9% of linker users, the
> section+offset will be far more confusing than helpful.

Perhaps I should give some more background as to why I'd like to make
this change.  Current uses of %C are
- multiple definition error
- warning symbol call-back
- undefined symbol error
- reloc overflow/dangerous/unattached errors
- cross reference error
- one use in each of pe.em, pep.em, pe-dll.c
- two uses in each of elf64-ppc.c, elf32-ppc.c, elf32-sh.c

I'd say that some of these existing uses of %C would benefit from the
extra information, particularly the reloc and cross ref errors.  Also,
it's not as if emitting section+offset is entirely new:  You get that
for all of these errors if debug info is missing.  However, the main
reason I want the section+offset is for replacing uses of
_bfd_error_handler with info->callbacks->einfo in BFD back-end linker
support functions.  Some of these already report section+offset.  I
don't like to idea of removing information..

einfo is attractive for the source function and line info, and %v for
offset doesn't truncate like %lx for 32-bit host, 64-bit target.

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-20  0:00   ` Alan Modra
@ 2011-05-20  0:24     ` Ian Lance Taylor
  2011-05-23  6:13       ` Alan Modra
  0 siblings, 1 reply; 11+ messages in thread
From: Ian Lance Taylor @ 2011-05-20  0:24 UTC (permalink / raw)
  To: binutils

Alan Modra <amodra@gmail.com> writes:

> On Wed, May 18, 2011 at 04:59:07PM -0700, Ian Lance Taylor wrote:
>> Alan Modra <amodra@gmail.com> writes:
>> 
>> > How do people feel about extending typical linker error messages like
>> > the following
>> > 	tmpdir/dump0.o: In function `foo':
>> > 	./compressed1.c:13: undefined reference to `bar'
>> > to always include the section and offset information?
>> > 	tmpdir/dump0.o: In function `foo':
>> > 	./compressed1.c:13:(.text+0x8): undefined reference to `bar'
>> >
>> > When debugging toolchain problems, the section and offset is often
>> > more useful than the source information.  I've checked that this
>> > change doesn't seem to break emacs parsing of error messages.
>> 
>> While I'm generally not happy about adding options, I think this is a
>> case where we should consider it.  That is, consider an option
>> requesting more verbose information from linker errors.  I think that
>> for ordinary users of the linker, i.e., 99.9% of linker users, the
>> section+offset will be far more confusing than helpful.
>
> Perhaps I should give some more background as to why I'd like to make
> this change.  Current uses of %C are
> - multiple definition error
> - warning symbol call-back
> - undefined symbol error
> - reloc overflow/dangerous/unattached errors
> - cross reference error
> - one use in each of pe.em, pep.em, pe-dll.c
> - two uses in each of elf64-ppc.c, elf32-ppc.c, elf32-sh.c
>
> I'd say that some of these existing uses of %C would benefit from the
> extra information, particularly the reloc and cross ref errors.  Also,
> it's not as if emitting section+offset is entirely new:  You get that
> for all of these errors if debug info is missing.  However, the main
> reason I want the section+offset is for replacing uses of
> _bfd_error_handler with info->callbacks->einfo in BFD back-end linker
> support functions.  Some of these already report section+offset.  I
> don't like to idea of removing information..
>
> einfo is attractive for the source function and line info, and %v for
> offset doesn't truncate like %lx for 32-bit host, 64-bit target.

It's specifically the multiple definition error and the undefined symbol
error where I think we should tread carefully.  Those are the cases
which people will see routinely, and the information about be presented
in a way that makes sense and is easy to use for people who know nothing
about linkers.  I agree that it is somewhat odd to remove information,
but I've gotten complaints about verbose linker error messages.  And, of
course, it's a very common complaint about g++'s error messages.  It's
hard to know what the right balance is, but I'm pretty sure that
presenting all information by default is not it.

But I won't continue this conversation farther; you should proceed as
you see best.

Ian

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-20  0:24     ` Ian Lance Taylor
@ 2011-05-23  6:13       ` Alan Modra
  2011-05-24  1:24         ` Ian Lance Taylor
  0 siblings, 1 reply; 11+ messages in thread
From: Alan Modra @ 2011-05-23  6:13 UTC (permalink / raw)
  To: Ian Lance Taylor; +Cc: binutils

On Thu, May 19, 2011 at 05:24:15PM -0700, Ian Lance Taylor wrote:
> It's specifically the multiple definition error and the undefined symbol
> error where I think we should tread carefully.

Fair enough.  I'll introduce a new format specifier.

bfd/
	* elf32-frv.c: Use info->callbacks->einfo throughout file in linker
	functions rather than warning callback or _bfd_error_handler.
	* elf32-ppc.c: Likewise.
	* elf64-ppc.c: Likewise.
	* elf32-ppc.c (ppc_elf_tls_optimize): Use %H in __tls_get_addr lost
	arg error.
	* elf64-ppc.c (ppc64_elf_tls_optimize): Likewise.
ld/
	* ldmisc.c (vfinfo): Add %H.
	* ldmain.c (reloc_overflow): Use %H rather than %C.
	(reloc_dangerous, unattached_reloc): Likewise.

Index: bfd/elf32-frv.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-frv.c,v
retrieving revision 1.72
diff -u -p -r1.72 elf32-frv.c
--- bfd/elf32-frv.c	28 Feb 2011 18:30:16 -0000	1.72
+++ bfd/elf32-frv.c	23 May 2011 01:15:35 -0000
@@ -1,5 +1,5 @@
 /* FRV-specific support for 32-bit ELF.
-   Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -2884,8 +2884,9 @@ elf32_frv_relocate_section (output_bfd, 
 						      osec, sym,
 						      rel->r_addend))
 	    {
-	      (*_bfd_error_handler)
-		(_("%B(%A+0x%x): relocation to `%s+%x' may have caused the error above"),
+	      info->callbacks->einfo
+		(_("%H: relocation to `%s+%v'"
+		   " may have caused the error above\n"),
 		 input_bfd, input_section, rel->r_offset, name, rel->r_addend);
 	      return FALSE;
 	    }
@@ -2897,9 +2898,10 @@ elf32_frv_relocate_section (output_bfd, 
 	  picrel = NULL;
 	  if (h && ! FRVFDPIC_SYM_LOCAL (info, h))
 	    {
-	      info->callbacks->warning
-		(info, _("relocation references symbol not defined in the module"),
-		 name, input_bfd, input_section, rel->r_offset);
+	      info->callbacks->einfo
+		(_("%H: relocation references symbol"
+		   " not defined in the module\n"),
+		 input_bfd, input_section, rel->r_offset);
 	      return FALSE;
 	    }
 	  break;
@@ -2972,10 +2974,9 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this a call instruction?  */
 	    if ((insn & (unsigned long)0x01fc0000) != 0x003c0000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_GETTLSOFF not applied to a call instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_GETTLSOFF not applied to a call instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3014,10 +3015,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this an lddi instruction?  */
 	    if ((insn & (unsigned long)0x01fc0000) != 0x00cc0000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_GOTTLSDESC12 not applied to an lddi instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_GOTTLSDESC12"
+		     " not applied to an lddi instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3085,10 +3086,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this a sethi instruction?  */
 	    if ((insn & (unsigned long)0x01ff0000) != 0x00f80000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_GOTTLSDESCHI not applied to a sethi instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_GOTTLSDESCHI"
+		     " not applied to a sethi instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3122,11 +3123,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this a setlo or setlos instruction?  */
 	    if ((insn & (unsigned long)0x01f70000) != 0x00f40000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_GOTTLSDESCLO"
-		     " not applied to a setlo or setlos instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_GOTTLSDESCLO"
+		     " not applied to a setlo or setlos instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3170,10 +3170,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this an ldd instruction?  */
 	    if ((insn & (unsigned long)0x01fc0fc0) != 0x00080140)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_TLSDESC_RELAX not applied to an ldd instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_TLSDESC_RELAX"
+		     " not applied to an ldd instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3254,11 +3254,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this a calll or callil instruction?  */
 	    if ((insn & (unsigned long)0x7ff80fc0) != 0x02300000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_GETTLSOFF_RELAX"
-		     " not applied to a calll instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_GETTLSOFF_RELAX"
+		     " not applied to a calll instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3309,10 +3308,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this an ldi instruction?  */
 	    if ((insn & (unsigned long)0x01fc0000) != 0x00c80000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_GOTTLSOFF12 not applied to an ldi instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_GOTTLSOFF12"
+		     " not applied to an ldi instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3339,10 +3338,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this a sethi instruction?  */
 	    if ((insn & (unsigned long)0x01ff0000) != 0x00f80000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_GOTTLSOFFHI not applied to a sethi instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_GOTTLSOFFHI"
+		     " not applied to a sethi instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3368,11 +3367,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this a setlo or setlos instruction?  */
 	    if ((insn & (unsigned long)0x01f70000) != 0x00f40000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_GOTTLSOFFLO"
-		     " not applied to a setlo or setlos instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_GOTTLSOFFLO"
+		     " not applied to a setlo or setlos instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3399,10 +3397,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this an ld instruction?  */
 	    if ((insn & (unsigned long)0x01fc0fc0) != 0x00080100)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_TLSOFF_RELAX not applied to an ld instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_TLSOFF_RELAX"
+		     " not applied to an ld instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3444,10 +3442,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this a sethi instruction?  */
 	    if ((insn & (unsigned long)0x01ff0000) != 0x00f80000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_TLSMOFFHI not applied to a sethi instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("%H: R_FRV_TLSMOFFHI"
+		     " not applied to a sethi instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3471,11 +3469,10 @@ elf32_frv_relocate_section (output_bfd, 
 	    /* Is this a setlo or setlos instruction?  */
 	    if ((insn & (unsigned long)0x01f70000) != 0x00f40000)
 	      {
-		r = info->callbacks->warning
-		  (info,
-		   _("R_FRV_TLSMOFFLO"
-		     " not applied to a setlo or setlos instruction"),
-		   name, input_bfd, input_section, rel->r_offset);
+		info->callbacks->einfo
+		  (_("R_FRV_TLSMOFFLO"
+		     " not applied to a setlo or setlos instruction\n"),
+		   input_bfd, input_section, rel->r_offset);
 		return FALSE;
 	      }
 
@@ -3593,9 +3590,10 @@ elf32_frv_relocate_section (output_bfd, 
 		  {
 		    if (addend)
 		      {
-			info->callbacks->warning
-			  (info, _("R_FRV_FUNCDESC references dynamic symbol with nonzero addend"),
-			   name, input_bfd, input_section, rel->r_offset);
+			info->callbacks->einfo
+			  (_("%H: R_FRV_FUNCDESC references dynamic symbol"
+			     " with nonzero addend\n"),
+			   input_bfd, input_section, rel->r_offset);
 			return FALSE;
 		      }
 		    dynindx = h->dynindx;
@@ -3633,10 +3631,10 @@ elf32_frv_relocate_section (output_bfd, 
 						       input_section
 						       ->output_section))
 			  {
-			    info->callbacks->warning
-			      (info,
-			       _("cannot emit fixups in read-only section"),
-			       name, input_bfd, input_section, rel->r_offset);
+			    info->callbacks->einfo
+			      (_("%H: cannot emit fixups"
+				 " in read-only section\n"),
+			       input_bfd, input_section, rel->r_offset);
 			    return FALSE;
 			  }
 
@@ -3664,10 +3662,10 @@ elf32_frv_relocate_section (output_bfd, 
 						   input_section
 						   ->output_section))
 		      {
-			info->callbacks->warning
-			  (info,
-			   _("cannot emit dynamic relocations in read-only section"),
-			   name, input_bfd, input_section, rel->r_offset);
+			info->callbacks->einfo
+			  (_("%H: cannot emit dynamic relocations"
+			     " in read-only section\n"),
+			   input_bfd, input_section, rel->r_offset);
 			return FALSE;
 		      }
 
@@ -3713,9 +3711,10 @@ elf32_frv_relocate_section (output_bfd, 
 	      {
 		if (addend && r_type == R_FRV_FUNCDESC_VALUE)
 		  {
-		    info->callbacks->warning
-		      (info, _("R_FRV_FUNCDESC_VALUE references dynamic symbol with nonzero addend"),
-		       name, input_bfd, input_section, rel->r_offset);
+		    info->callbacks->einfo
+		      (_("%H: R_FRV_FUNCDESC_VALUE"
+			 " references dynamic symbol with nonzero addend\n"),
+		       input_bfd, input_section, rel->r_offset);
 		    return FALSE;
 		  }
 		dynindx = h->dynindx;
@@ -3754,10 +3753,9 @@ elf32_frv_relocate_section (output_bfd, 
 						   input_section
 						   ->output_section))
 		      {
-			info->callbacks->warning
-			  (info,
-			   _("cannot emit fixups in read-only section"),
-			   name, input_bfd, input_section, rel->r_offset);
+			info->callbacks->einfo
+			  (_("%H: cannot emit fixups in read-only section\n"),
+			   input_bfd, input_section, rel->r_offset);
 			return FALSE;
 		      }
 		    if (!h || h->root.type != bfd_link_hash_undefweak)
@@ -3798,10 +3796,10 @@ elf32_frv_relocate_section (output_bfd, 
 						   input_section
 						   ->output_section))
 		      {
-			info->callbacks->warning
-			  (info,
-			   _("cannot emit dynamic relocations in read-only section"),
-			   name, input_bfd, input_section, rel->r_offset);
+			info->callbacks->einfo
+			  (_("%H: cannot emit dynamic relocations"
+			     " in read-only section\n"),
+			   input_bfd, input_section, rel->r_offset);
 			return FALSE;
 		      }
 
@@ -3969,16 +3967,9 @@ elf32_frv_relocate_section (output_bfd, 
 	      && !(picrel && picrel->symndx == -1
 		   && picrel->d.h->root.type == bfd_link_hash_undefined))
 	    {
-	      if (info->shared || info->pie)
-		(*_bfd_error_handler)
-		  (_("%B(%A+0x%lx): reloc against `%s': %s"),
-		   input_bfd, input_section, (long)rel->r_offset, name,
-		   _("relocation references a different segment"));
-	      else
-		info->callbacks->warning
-		  (info,
-		   _("relocation references a different segment"),
-		   name, input_bfd, input_section, rel->r_offset);
+	      info->callbacks->einfo
+		(_("%H: reloc against `%s' references a different segment\n"),
+		 input_bfd, input_section, rel->r_offset, name);
 	    }
 	  if (!silence_segment_error && (info->shared || info->pie))
 	    return FALSE;
@@ -4126,9 +4117,9 @@ elf32_frv_relocate_section (output_bfd, 
 
 	  if (msg)
 	    {
-	      (*_bfd_error_handler)
-		(_("%B(%A+0x%lx): reloc against `%s': %s"),
-		 input_bfd, input_section, (long)rel->r_offset, name, msg);
+	      info->callbacks->einfo
+		(_("%H: reloc against `%s': %s\n"),
+		 input_bfd, input_section, rel->r_offset, name, msg);
 	      return FALSE;
 	    }
 
@@ -5882,8 +5873,8 @@ elf32_frvfdpic_finish_dynamic_sections (
 	      != (frvfdpic_gotfixup_section (info)->reloc_count * 4))
 	    {
 	    error:
-	      (*_bfd_error_handler)
-		("LINKER BUG: .rofixup section size mismatch");
+	      info->callbacks->einfo
+		("LINKER BUG: .rofixup section size mismatch\n");
 	      return FALSE;
 	    }
 
@@ -6402,8 +6393,8 @@ elf32_frv_check_relocs (abfd, info, sec,
 
 	default:
 	bad_reloc:
-	  (*_bfd_error_handler)
-	    (_("%B: unsupported relocation type %i"),
+	  info->callbacks->einfo
+	    (_("%B: unsupported relocation type %i\n"),
 	     abfd, ELF32_R_TYPE (rel->r_info));
 	  return FALSE;
         }
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.294
diff -u -p -r1.294 elf32-ppc.c
--- bfd/elf32-ppc.c	10 May 2011 06:13:07 -0000	1.294
+++ bfd/elf32-ppc.c	23 May 2011 01:15:37 -0000
@@ -3703,12 +3683,9 @@ ppc_elf_check_relocs (bfd *abfd,
 	    {
 	      /* It does not make sense to have a procedure linkage
 		 table entry for a local symbol.  */
-	      (*_bfd_error_handler) (_("%B(%A+0x%lx): %s reloc against "
-				       "local symbol"),
-				     abfd,
-				     sec,
-				     (long) rel->r_offset,
-				     ppc_elf_howto_table[r_type]->name);
+	      info->callbacks->einfo (_("%H: %s reloc against local symbol\n"),
+				      abfd, sec, rel->r_offset,
+				      ppc_elf_howto_table[r_type]->name);
 	      bfd_set_error (bfd_error_bad_value);
 	      return FALSE;
 	    }
@@ -4704,7 +4681,7 @@ ppc_elf_tls_optimize (bfd *obfd ATTRIBUT
 		      && !expecting_tls_get_addr
 		      && is_branch_reloc (r_type))
 		    {
-		      info->callbacks->minfo ("%C __tls_get_addr lost arg, "
+		      info->callbacks->minfo ("%H __tls_get_addr lost arg, "
 					      "TLS optimization disabled\n",
 					      ibfd, sec, rel->r_offset);
 		      if (elf_section_data (sec)->relocs != relstart)
@@ -4790,7 +4767,7 @@ ppc_elf_tls_optimize (bfd *obfd ATTRIBUT
 			 could just mark this symbol to exclude it
 			 from tls optimization but it's safer to skip
 			 the entire optimization.  */
-		      info->callbacks->minfo (_("%C arg lost __tls_get_addr, "
+		      info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
 						"TLS optimization disabled\n"),
 					      ibfd, sec, rel->r_offset);
 		      if (elf_section_data (sec)->relocs != relstart)
@@ -5025,8 +5002,8 @@ ppc_elf_adjust_dynamic_symbol (struct bf
 
   if (h->size == 0)
     {
-      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
-			     h->root.root.string);
+      info->callbacks->einfo (_("dynamic variable `%s' is zero size\n"),
+			      h->root.root.string);
       return TRUE;
     }
 
@@ -7222,8 +7199,8 @@ ppc_elf_relocate_section (bfd *output_bf
       switch (r_type)
 	{
 	default:
-	  (*_bfd_error_handler)
-	    (_("%B: unknown relocation type %d for symbol %s"),
+	  info->callbacks->einfo
+	    (_("%B: unknown relocation type %d for symbol %s\n"),
 	     input_bfd, (int) r_type, sym_name);
 
 	  bfd_set_error (bfd_error_bad_value);
@@ -7483,11 +7460,9 @@ ppc_elf_relocate_section (bfd *output_bf
 	       generated by a hash table traversal, the value in the
 	       got at entry m+n bears little relation to the entry m.  */
 	    if (addend != 0)
-	      (*_bfd_error_handler)
-		(_("%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"),
-		 input_bfd,
-		 input_section,
-		 (long) rel->r_offset,
+	      info->callbacks->einfo
+		(_("%H: non-zero addend on %s reloc against `%s'\n"),
+		 input_bfd, input_section, rel->r_offset,
 		 howto->name,
 		 sym_name);
 	  }
@@ -7681,12 +7656,10 @@ ppc_elf_relocate_section (bfd *output_bf
 			     non-executable to apply text relocations.
 			     So we'll segfault when trying to run the
 			     indirection function to resolve the reloc.  */
-			  (*_bfd_error_handler)
-			    (_("%B(%A+0x%lx): relocation %s for indirect "
-			       "function %s unsupported"),
-			     input_bfd,
-			     input_section,
-			     (long) rel->r_offset,
+			  info->callbacks->einfo
+			    (_("%H: relocation %s for indirect "
+			       "function %s unsupported\n"),
+			     input_bfd, input_section, rel->r_offset,
 			     howto->name,
 			     sym_name);
 			  ret = FALSE;
@@ -7911,9 +7884,9 @@ ppc_elf_relocate_section (bfd *output_bf
 		   || (CONST_STRNEQ (name, ".sbss")
 		       && (name[5] == 0 || name[5] == '.'))))
 	      {
-		(*_bfd_error_handler)
+		info->callbacks->einfo
 		  (_("%B: the target (%s) of a %s relocation is "
-		     "in the wrong output section (%s)"),
+		     "in the wrong output section (%s)\n"),
 		   input_bfd,
 		   sym_name,
 		   howto->name,
@@ -7941,9 +7914,9 @@ ppc_elf_relocate_section (bfd *output_bf
 	    if (! (CONST_STRNEQ (name, ".sdata2")
 		   || CONST_STRNEQ (name, ".sbss2")))
 	      {
-		(*_bfd_error_handler)
+		info->callbacks->einfo
 		  (_("%B: the target (%s) of a %s relocation is "
-		     "in the wrong output section (%s)"),
+		     "in the wrong output section (%s)\n"),
 		   input_bfd,
 		   sym_name,
 		   howto->name,
@@ -7988,9 +7961,9 @@ ppc_elf_relocate_section (bfd *output_bf
 	      }
 	    else
 	      {
-		(*_bfd_error_handler)
+		info->callbacks->einfo
 		  (_("%B: the target (%s) of a %s relocation is "
-		     "in the wrong output section (%s)"),
+		     "in the wrong output section (%s)\n"),
 		   input_bfd,
 		   sym_name,
 		   howto->name,
@@ -8060,8 +8033,8 @@ ppc_elf_relocate_section (bfd *output_bf
 	case R_PPC_EMB_RELST_HI:
 	case R_PPC_EMB_RELST_HA:
 	case R_PPC_EMB_BIT_FLD:
-	  (*_bfd_error_handler)
-	    (_("%B: relocation %s is not yet supported for symbol %s."),
+	  info->callbacks->einfo
+	    (_("%B: relocation %s is not yet supported for symbol %s\n"),
 	     input_bfd,
 	     howto->name,
 	     sym_name);
@@ -8119,11 +8092,9 @@ ppc_elf_relocate_section (bfd *output_bf
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
 	       && h->def_dynamic))
 	{
-	  (*_bfd_error_handler)
-	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
-	     input_bfd,
-	     input_section,
-	     (long) rel->r_offset,
+	  info->callbacks->einfo
+	    (_("%H: unresolvable %s relocation against symbol `%s'\n"),
+	     input_bfd, input_section, rel->r_offset,
 	     howto->name,
 	     sym_name);
 	  ret = FALSE;
@@ -8168,10 +8139,10 @@ ppc_elf_relocate_section (bfd *output_bf
 	    }
 	  else
 	    {
-	      (*_bfd_error_handler)
-		(_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
-		 input_bfd, input_section,
-		 (long) rel->r_offset, howto->name, sym_name, (int) r);
+	      info->callbacks->einfo
+		(_("%H: %s reloc against `%s': error %d\n"),
+		 input_bfd, input_section, rel->r_offset,
+		 howto->name, sym_name, (int) r);
 	      ret = FALSE;
 	    }
 	}
@@ -8660,10 +8631,10 @@ ppc_elf_finish_dynamic_sections (bfd *ou
 	}
       else
 	{
-	  (*_bfd_error_handler) (_("%s not defined in linker created %s"),
-				 htab->elf.hgot->root.root.string,
-				 (htab->sgotplt != NULL
-				  ? htab->sgotplt->name : htab->got->name));
+	  info->callbacks->einfo (_("%s not defined in linker created %s\n"),
+				  htab->elf.hgot->root.root.string,
+				  (htab->sgotplt != NULL
+				   ? htab->sgotplt->name : htab->got->name));
 	  bfd_set_error (bfd_error_bad_value);
 	  ret = FALSE;
 	}
Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.350
diff -u -p -r1.350 elf64-ppc.c
--- bfd/elf64-ppc.c	10 May 2011 06:13:07 -0000	1.350
+++ bfd/elf64-ppc.c	23 May 2011 01:15:41 -0000
@@ -4138,8 +4118,9 @@ ppc_get_stub_entry (const asection *inpu
 static struct ppc_stub_hash_entry *
 ppc_add_stub (const char *stub_name,
 	      asection *section,
-	      struct ppc_link_hash_table *htab)
+	      struct bfd_link_info *info)
 {
+  struct ppc_link_hash_table *htab = ppc_hash_table (info);
   asection *link_sec;
   asection *stub_sec;
   struct ppc_stub_hash_entry *stub_entry;
@@ -4176,8 +4157,8 @@ ppc_add_stub (const char *stub_name,
 				     TRUE, FALSE);
   if (stub_entry == NULL)
     {
-      (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
-			     section->owner, stub_name);
+      info->callbacks->einfo (_("%B: cannot create stub entry %s\n"),
+			      section->owner, stub_name);
       return NULL;
     }
 
@@ -6499,9 +6480,9 @@ ppc64_elf_adjust_dynamic_symbol (struct 
 	 function pointers, vtable refs and suchlike in read-only
 	 sections.  Allow them to proceed, but warn that this might
 	 break at runtime.  */
-      (*_bfd_error_handler)
+      info->callbacks->einfo
 	(_("copy reloc against `%s' requires lazy plt linking; "
-	   "avoid setting LD_BIND_NOW=1 or upgrade gcc"),
+	   "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
 	 h->root.root.string);
     }
 
@@ -6510,8 +6491,8 @@ ppc64_elf_adjust_dynamic_symbol (struct 
 
   if (h->size == 0)
     {
-      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
-			     h->root.root.string);
+      info->callbacks->einfo (_("dynamic variable `%s' is zero size\n"),
+			      h->root.root.string);
       return TRUE;
     }
 
@@ -6928,8 +6909,8 @@ dec_dynrel_count (bfd_vma r_info,
       pp = &p->next;
     }
 
-  (*_bfd_error_handler) (_("dynreloc miscount for %B, section %A"),
-			   sec->owner, sec);
+  info->callbacks->einfo (_("dynreloc miscount for %B, section %A\n"),
+			  sec->owner, sec);
   bfd_set_error (bfd_error_bad_value);
   return FALSE;
 }
@@ -7600,7 +7581,7 @@ ppc64_elf_tls_optimize (struct bfd_link_
 		      && !found_tls_get_addr_arg
 		      && is_branch_reloc (r_type))
 		    {
-		      info->callbacks->minfo (_("%C __tls_get_addr lost arg, "
+		      info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
 						"TLS optimization disabled\n"),
 					      ibfd, sec, rel->r_offset);
 		      ret = TRUE;
@@ -7794,7 +7775,7 @@ ppc64_elf_tls_optimize (struct bfd_link_
 			 could just mark this symbol to exclude it
 			 from tls optimization but it's safer to skip
 			 the entire optimization.  */
-		      info->callbacks->minfo (_("%C arg lost __tls_get_addr, "
+		      info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
 						"TLS optimization disabled\n"),
 					      ibfd, sec, rel->r_offset);
 		      ret = TRUE;
@@ -9473,9 +9454,10 @@ get_relocs (asection *sec, int count)
 }
 
 static bfd_vma
-get_r2off (struct ppc_link_hash_table *htab,
+get_r2off (struct bfd_link_info *info,
 	   struct ppc_stub_hash_entry *stub_entry)
 {
+  struct ppc_link_hash_table *htab = ppc_hash_table (info);
   bfd_vma r2off = htab->stub_group[stub_entry->target_section->id].toc_off;
 
   if (r2off == 0)
@@ -9489,15 +9471,15 @@ get_r2off (struct ppc_link_hash_table *h
       if (strcmp (opd->name, ".opd") != 0
 	  || opd->reloc_count != 0)
 	{
-	  (*_bfd_error_handler) (_("cannot find opd entry toc for %s"),
-				 stub_entry->h->elf.root.root.string);
+	  info->callbacks->einfo (_("cannot find opd entry toc for %s\n"),
+				  stub_entry->h->elf.root.root.string);
 	  bfd_set_error (bfd_error_bad_value);
 	  return 0;
 	}
       if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
 	return 0;
       r2off = bfd_get_64 (opd->owner, buf);
-      r2off -= elf_gp (stub_entry->id_sec->output_section->owner);
+      r2off -= elf_gp (info->output_bfd);
     }
   r2off -= htab->stub_group[stub_entry->id_sec->id].toc_off;
   return r2off;
@@ -9547,7 +9529,7 @@ ppc_build_one_stub (struct bfd_hash_entr
       size = 4;
       if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
 	{
-	  bfd_vma r2off = get_r2off (htab, stub_entry);
+	  bfd_vma r2off = get_r2off (info, stub_entry);
 
 	  if (r2off == 0)
 	    {
@@ -9571,8 +9553,8 @@ ppc_build_one_stub (struct bfd_hash_entr
 
       if (off + (1 << 25) >= (bfd_vma) (1 << 26))
 	{
-	  (*_bfd_error_handler) (_("long branch stub `%s' offset overflow"),
-				 stub_entry->root.string);
+	  info->callbacks->einfo (_("long branch stub `%s' offset overflow\n"),
+				  stub_entry->root.string);
 	  htab->stub_error = TRUE;
 	  return FALSE;
 	}
@@ -9630,8 +9612,8 @@ ppc_build_one_stub (struct bfd_hash_entr
 					 FALSE, FALSE);
       if (br_entry == NULL)
 	{
-	  (*_bfd_error_handler) (_("can't find branch stub `%s'"),
-				 stub_entry->root.string);
+	  info->callbacks->einfo (_("can't find branch stub `%s'\n"),
+				  stub_entry->root.string);
 	  htab->stub_error = TRUE;
 	  return FALSE;
 	}
@@ -9691,8 +9673,8 @@ ppc_build_one_stub (struct bfd_hash_entr
 
       if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
 	{
-	  (*_bfd_error_handler)
-	    (_("linkage table error against `%s'"),
+	  info->callbacks->einfo
+	    (_("linkage table error against `%s'\n"),
 	     stub_entry->root.string);
 	  bfd_set_error (bfd_error_bad_value);
 	  htab->stub_error = TRUE;
@@ -9737,7 +9719,7 @@ ppc_build_one_stub (struct bfd_hash_entr
 	}
       else
 	{
-	  bfd_vma r2off = get_r2off (htab, stub_entry);
+	  bfd_vma r2off = get_r2off (info, stub_entry);
 
 	  if (r2off == 0)
 	    {
@@ -9833,8 +9815,8 @@ ppc_build_one_stub (struct bfd_hash_entr
 
       if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
 	{
-	  (*_bfd_error_handler)
-	    (_("linkage table error against `%s'"),
+	  info->callbacks->einfo
+	    (_("linkage table error against `%s'\n"),
 	     stub_entry->h != NULL
 	     ? stub_entry->h->elf.root.root.string
 	     : "<local sym>");
@@ -9986,7 +9968,7 @@ ppc_size_one_stub (struct bfd_hash_entry
       size = 4;
       if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
 	{
-	  r2off = get_r2off (htab, stub_entry);
+	  r2off = get_r2off (info, stub_entry);
 	  if (r2off == 0)
 	    {
 	      htab->stub_error = TRUE;
@@ -10008,8 +9990,8 @@ ppc_size_one_stub (struct bfd_hash_entry
 					     TRUE, FALSE);
 	  if (br_entry == NULL)
 	    {
-	      (*_bfd_error_handler) (_("can't build branch stub `%s'"),
-				     stub_entry->root.string);
+	      info->callbacks->einfo (_("can't build branch stub `%s'\n"),
+				      stub_entry->root.string);
 	      htab->stub_error = TRUE;
 	      return FALSE;
 	    }
@@ -11151,7 +11133,7 @@ ppc64_elf_size_stubs (struct bfd_link_in
 		      continue;
 		    }
 
-		  stub_entry = ppc_add_stub (stub_name, section, htab);
+		  stub_entry = ppc_add_stub (stub_name, section, info);
 		  if (stub_entry == NULL)
 		    {
 		      free (stub_name);
@@ -11472,7 +11454,7 @@ ppc64_elf_build_stubs (bfd_boolean emit_
       || htab->glink->rawsize != htab->glink->size)
     {
       htab->stub_error = TRUE;
-      (*_bfd_error_handler) (_("stubs don't match calculated size"));
+      info->callbacks->einfo (_("stubs don't match calculated size\n"));
     }
 
   if (htab->stub_error)
@@ -11832,13 +11814,11 @@ ppc64_elf_relocate_section (bfd *output_
 	    /* R_PPC64_TLS is OK against a symbol in the TOC.  */
 	    ;
 	  else
-	    (*_bfd_error_handler)
+	    info->callbacks->einfo
 	      (!IS_PPC64_TLS_RELOC (r_type)
-	       ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
-	       : _("%B(%A+0x%lx): %s used with non-TLS symbol %s"),
-	       input_bfd,
-	       input_section,
-	       (long) rel->r_offset,
+	       ? _("%H: %s used with TLS symbol %s\n")
+	       : _("%H: %s used with non-TLS symbol %s\n"),
+	       input_bfd, input_section, rel->r_offset,
 	       ppc64_elf_howto_table[r_type]->name,
 	       sym_name);
 	}
@@ -12334,23 +12314,19 @@ ppc64_elf_relocate_section (bfd *output_
 				  ".init") == 0
 			  || strcmp (input_section->output_section->name,
 				     ".fini") == 0)
-			(*_bfd_error_handler)
-			  (_("%B(%A+0x%lx): automatic multiple TOCs "
+			info->callbacks->einfo
+			  (_("%H: automatic multiple TOCs "
 			     "not supported using your crt files; "
-			     "recompile with -mminimal-toc or upgrade gcc"),
-			   input_bfd,
-			   input_section,
-			   (long) rel->r_offset);
+			     "recompile with -mminimal-toc or upgrade gcc\n"),
+			   input_bfd, input_section, rel->r_offset);
 		      else
-			(*_bfd_error_handler)
-			  (_("%B(%A+0x%lx): sibling call optimization to `%s' "
+			info->callbacks->einfo
+			  (_("%H: sibling call optimization to `%s' "
 			     "does not allow automatic multiple TOCs; "
 			     "recompile with -mminimal-toc or "
 			     "-fno-optimize-sibling-calls, "
-			     "or make `%s' extern"),
-			   input_bfd,
-			   input_section,
-			   (long) rel->r_offset,
+			     "or make `%s' extern\n"),
+			   input_bfd, input_section, rel->r_offset,
 			   sym_name,
 			   sym_name);
 		      bfd_set_error (bfd_error_bad_value);
@@ -12451,8 +12427,8 @@ ppc64_elf_relocate_section (bfd *output_
       switch (r_type)
 	{
 	default:
-	  (*_bfd_error_handler)
-	    (_("%B: unknown relocation type %d for symbol %s"),
+	  info->callbacks->einfo
+	    (_("%B: unknown relocation type %d for symbol %s\n"),
 	     input_bfd, (int) r_type, sym_name);
 
 	  bfd_set_error (bfd_error_bad_value);
@@ -12956,12 +12932,10 @@ ppc64_elf_relocate_section (bfd *output_
 			  ? h->elf.type == STT_GNU_IFUNC
 			  : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
 			{
-			  (*_bfd_error_handler)
-			    (_("%B(%A+0x%lx): relocation %s for indirect "
-			       "function %s unsupported"),
-			     input_bfd,
-			     input_section,
-			     (long) rel->r_offset,
+			  info->callbacks->einfo
+			    (_("%H: relocation %s for indirect "
+			       "function %s unsupported\n"),
+			     input_bfd, input_section, rel->r_offset,
 			     ppc64_elf_howto_table[r_type]->name,
 			     sym_name);
 			  ret = FALSE;
@@ -13063,8 +13037,8 @@ ppc64_elf_relocate_section (bfd *output_
 	case R_PPC64_PLTREL64:
 	  /* These ones haven't been implemented yet.  */
 
-	  (*_bfd_error_handler)
-	    (_("%B: relocation %s is not supported for symbol %s."),
+	  info->callbacks->einfo
+	    (_("%B: relocation %s is not supported for symbol %s\n"),
 	     input_bfd,
 	     ppc64_elf_howto_table[r_type]->name, sym_name);
 
@@ -13240,9 +13214,9 @@ ppc64_elf_relocate_section (bfd *output_
 	    mask = 15;
 	  if (((relocation + addend) & mask) != 0)
 	    {
-	      (*_bfd_error_handler)
-		(_("%B(%A+0x%lx): error: %s not a multiple of %u"),
-		 input_bfd, input_section, (long) rel->r_offset,
+	      info->callbacks->einfo
+		(_("%H: error: %s not a multiple of %u\n"),
+		 input_bfd, input_section, rel->r_offset,
 		 ppc64_elf_howto_table[r_type]->name,
 		 mask + 1);
 	      bfd_set_error (bfd_error_bad_value);
@@ -13259,11 +13233,9 @@ ppc64_elf_relocate_section (bfd *output_
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
 	       && h->elf.def_dynamic))
 	{
-	  (*_bfd_error_handler)
-	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
-	     input_bfd,
-	     input_section,
-	     (long) rel->r_offset,
+	  info->callbacks->einfo
+	    (_("%H: unresolvable %s relocation against symbol `%s'\n"),
+	     input_bfd, input_section, rel->r_offset,
 	     ppc64_elf_howto_table[(int) r_type]->name,
 	     h->elf.root.root.string);
 	  ret = FALSE;
@@ -13306,11 +13278,9 @@ ppc64_elf_relocate_section (bfd *output_
 	    }
 	  else
 	    {
-	      (*_bfd_error_handler)
-		(_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
-		 input_bfd,
-		 input_section,
-		 (long) rel->r_offset,
+	      info->callbacks->einfo
+		(_("%H: %s reloc against `%s': error %d\n"),
+		 input_bfd, input_section, rel->r_offset,
 		 ppc64_elf_howto_table[r_type]->name,
 		 sym_name,
 		 (int) r);
Index: ld/ldmain.c
===================================================================
RCS file: /cvs/src/src/ld/ldmain.c,v
retrieving revision 1.155
diff -u -p -r1.155 ldmain.c
--- ld/ldmain.c	17 May 2011 13:02:18 -0000	1.155
+++ ld/ldmain.c	23 May 2011 01:16:20 -0000
@@ -1399,7 +1399,7 @@ reloc_overflow (struct bfd_link_info *in
   if (overflow_cutoff_limit == -1)
     return TRUE;
 
-  einfo ("%X%C:", abfd, section, address);
+  einfo ("%X%H:", abfd, section, address);
 
   if (overflow_cutoff_limit >= 0
       && overflow_cutoff_limit-- == 0)
@@ -1451,7 +1451,7 @@ reloc_dangerous (struct bfd_link_info *i
 		 asection *section,
 		 bfd_vma address)
 {
-  einfo (_("%X%C: dangerous relocation: %s\n"),
+  einfo (_("%X%H: dangerous relocation: %s\n"),
 	 abfd, section, address, message);
   return TRUE;
 }
@@ -1466,7 +1466,7 @@ unattached_reloc (struct bfd_link_info *
 		  asection *section,
 		  bfd_vma address)
 {
-  einfo (_("%X%C: reloc refers to symbol `%T' which is not being output\n"),
+  einfo (_("%X%H: reloc refers to symbol `%T' which is not being output\n"),
 	 abfd, section, address, name);
   return TRUE;
 }
Index: ld/ldmisc.c
===================================================================
RCS file: /cvs/src/src/ld/ldmisc.c,v
retrieving revision 1.39
diff -u -p -r1.39 ldmisc.c
--- ld/ldmisc.c	28 Feb 2011 18:34:52 -0000	1.39
+++ ld/ldmisc.c	23 May 2011 01:16:20 -0000
@@ -47,6 +47,7 @@
  %E current bfd error or errno
  %F error is fatal
  %G like %D, but only function name
+ %H like %C but in addition emit section+offset
  %I filename from a lang_input_statement_type
  %P print program name
  %R info about a relent
@@ -262,6 +263,7 @@ vfinfo (FILE *fp, const char *fmt, va_li
 	    case 'C':
 	    case 'D':
 	    case 'G':
+	    case 'H':
 	      /* Clever filename:linenumber with function name if possible.
 		 The arguments are a BFD, a section, and an offset.  */
 	      {
@@ -276,6 +278,7 @@ vfinfo (FILE *fp, const char *fmt, va_li
 		const char *functionname;
 		unsigned int linenumber;
 		bfd_boolean discard_last;
+		bfd_boolean done;
 
 		abfd = va_arg (arg, bfd *);
 		section = va_arg (arg, asection *);
@@ -296,14 +299,15 @@ vfinfo (FILE *fp, const char *fmt, va_li
 
 		   We do not always have a line number available so if
 		   we cannot find them we print out the section name and
-		   offset instread.  */
+		   offset instead.  */
 		discard_last = TRUE;
 		if (abfd != NULL
 		    && bfd_find_nearest_line (abfd, section, asymbols, offset,
 					      &filename, &functionname,
 					      &linenumber))
 		  {
-		    if (functionname != NULL && fmt[-1] == 'C')
+		    if (functionname != NULL
+			&& (fmt[-1] == 'C' || fmt[-1] == 'H'))
 		      {
 			/* Detect the case where we are printing out a
 			   message for the same function as the last
@@ -343,15 +347,21 @@ vfinfo (FILE *fp, const char *fmt, va_li
 		    if (filename != NULL)
 		      fprintf (fp, "%s:", filename);
 
+		    done = fmt[-1] != 'H';
 		    if (functionname != NULL && fmt[-1] == 'G')
 		      lfinfo (fp, "%T", functionname);
 		    else if (filename != NULL && linenumber != 0)
-		      fprintf (fp, "%u", linenumber);
+		      fprintf (fp, "%u%s", linenumber, ":" + done);
 		    else
-		      lfinfo (fp, "(%A+0x%v)", section, offset);
+		      done = FALSE;
 		  }
 		else
-		  lfinfo (fp, "%B:(%A+0x%v)", abfd, section, offset);
+		  {
+		    lfinfo (fp, "%B:", abfd);
+		    done = FALSE;
+		  }
+		if (!done)
+		  lfinfo (fp, "(%A+0x%v)", section, offset);
 
 		if (discard_last)
 		  {


-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: ld error message %C format
  2011-05-23  6:13       ` Alan Modra
@ 2011-05-24  1:24         ` Ian Lance Taylor
  0 siblings, 0 replies; 11+ messages in thread
From: Ian Lance Taylor @ 2011-05-24  1:24 UTC (permalink / raw)
  To: binutils

Alan Modra <amodra@gmail.com> writes:

> On Thu, May 19, 2011 at 05:24:15PM -0700, Ian Lance Taylor wrote:
>> It's specifically the multiple definition error and the undefined symbol
>> error where I think we should tread carefully.
>
> Fair enough.  I'll introduce a new format specifier.

Thanks.

Ian

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2011-05-24  1:24 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-18 15:48 ld error message %C format Alan Modra
2011-05-18 15:51 ` H.J. Lu
2011-05-18 16:04 ` Jason Duerstock
2011-05-18 16:19   ` Andreas Schwab
2011-05-18 23:33   ` Alan Modra
2011-05-19  0:10     ` Jason Duerstock
2011-05-18 23:59 ` Ian Lance Taylor
2011-05-20  0:00   ` Alan Modra
2011-05-20  0:24     ` Ian Lance Taylor
2011-05-23  6:13       ` Alan Modra
2011-05-24  1:24         ` Ian Lance Taylor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).