2 Copyright (C) 1991-2022 Free Software Foundation, Inc.
3 Written by Steve Chamberlain of Cygnus Support.
5 This file is part of the GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
25 #include "libiberty.h"
27 #include "safe-ctype.h"
28 #include "filenames.h"
42 %C clever filename:linenumber with function
43 %D like %C, but no function name
44 %E current bfd error or errno
46 %G like %D, but only function name
47 %H like %C but in addition emit section+offset
50 %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces
51 %X no object output, fail return
52 %d integer, like printf
54 %lu unsigned long, like printf
55 %p native (host) void* pointer, like printf
56 %pA section name from a section
57 %pB filename from a bfd
58 %pI filename from a lang_input_statement_type
59 %pR info about a relent
60 %pS print script file and linenumber from etree_type.
62 %pU print script file without linenumber from etree_type.
63 %s arbitrary string, like printf
64 %u integer, like printf
65 %v hex bfd_vma, no leading zeros
69 vfinfo (FILE *fp
, const char *fmt
, va_list ap
, bool is_warning
)
74 unsigned int arg_count
= 0;
98 for (arg_no
= 0; arg_no
< sizeof (args
) / sizeof (args
[0]); arg_no
++)
99 args
[arg_no
].type
= Bad
;
103 while (*scan
!= '\0')
105 while (*scan
!= '%' && *scan
!= '\0')
113 if (*scan
!= '0' && ISDIGIT (*scan
) && scan
[1] == '$')
115 arg_no
= *scan
- '1';
137 if (*scan
== 'A' || *scan
== 'B' || *scan
== 'I'
138 || *scan
== 'R' || *scan
== 'S' || *scan
== 'T')
156 if (*scan
== 'd' || *scan
== 'u')
168 if (arg_no
>= sizeof (args
) / sizeof (args
[0]))
170 args
[arg_no
].type
= arg_type
;
176 for (arg_no
= 0; arg_no
< arg_count
; arg_no
++)
178 switch (args
[arg_no
].type
)
181 args
[arg_no
].i
= va_arg (ap
, int);
184 args
[arg_no
].l
= va_arg (ap
, long);
187 args
[arg_no
].p
= va_arg (ap
, void *);
190 args
[arg_no
].v
= va_arg (ap
, bfd_vma
);
193 args
[arg_no
].reladdr
.abfd
= va_arg (ap
, bfd
*);
194 args
[arg_no
].reladdr
.sec
= va_arg (ap
, asection
*);
195 args
[arg_no
].reladdr
.off
= va_arg (ap
, bfd_vma
);
205 const char *str
= fmt
;
206 while (*fmt
!= '%' && *fmt
!= '\0')
209 if (fwrite (str
, 1, fmt
- str
, fp
))
219 if (*fmt
!= '0' && ISDIGIT (*fmt
) && fmt
[1] == '$')
237 /* no object output, fail return */
238 config
.make_executable
= false;
244 bfd_vma value
= args
[arg_no
].v
;
246 fprintf_vma (fp
, value
);
251 /* hex bfd_vma, no leading zeros */
255 bfd_vma value
= args
[arg_no
].v
;
257 sprintf_vma (p
, value
);
267 /* hex bfd_vma with 0x with no leading zeroes taking up
275 value
= args
[arg_no
].v
;
277 sprintf_vma (buf
, value
);
278 for (p
= buf
; *p
== '0'; ++p
)
288 fprintf (fp
, "0x%s", p
);
293 /* Error is fatal. */
298 /* Print program name. */
299 fprintf (fp
, "%s", program_name
);
303 /* current bfd error or errno */
304 fprintf (fp
, "%s", bfd_errmsg (bfd_get_error ()));
311 /* Clever filename:linenumber with function name if possible.
312 The arguments are a BFD, a section, and an offset. */
314 static bfd
*last_bfd
;
315 static char *last_file
;
316 static char *last_function
;
320 asymbol
**asymbols
= NULL
;
321 const char *filename
;
322 const char *functionname
;
323 unsigned int linenumber
;
326 bfd_error_type last_bfd_error
= bfd_get_error ();
328 abfd
= args
[arg_no
].reladdr
.abfd
;
329 section
= args
[arg_no
].reladdr
.sec
;
330 offset
= args
[arg_no
].reladdr
.off
;
335 if (!bfd_generic_link_read_symbols (abfd
))
336 einfo (_("%F%P: %pB: could not read symbols: %E\n"), abfd
);
338 asymbols
= bfd_get_outsymbols (abfd
);
341 /* The GNU Coding Standard requires that error messages
344 source-file-name:lineno: message
346 We do not always have a line number available so if
347 we cannot find them we print out the section name and
351 && bfd_find_nearest_line (abfd
, section
, asymbols
, offset
,
352 &filename
, &functionname
,
355 if (functionname
!= NULL
356 && (fmt
[-1] == 'C' || fmt
[-1] == 'H'))
358 /* Detect the case where we are printing out a
359 message for the same function as the last
360 call to vinfo ("%C"). In this situation do
361 not print out the ABFD filename or the
362 function name again. Note - we do still
363 print out the source filename, as this will
364 allow programs that parse the linker's output
365 (eg emacs) to correctly locate multiple
366 errors in the same source file. */
368 || last_function
== NULL
370 || (last_file
== NULL
) != (filename
== NULL
)
372 && filename_cmp (last_file
, filename
) != 0)
373 || strcmp (last_function
, functionname
) != 0)
375 lfinfo (fp
, _("%pB: in function `%pT':\n"),
382 last_file
= xstrdup (filename
);
383 free (last_function
);
384 last_function
= xstrdup (functionname
);
386 discard_last
= false;
389 lfinfo (fp
, "%pB:", abfd
);
391 if (filename
!= NULL
)
392 fprintf (fp
, "%s:", filename
);
394 done
= fmt
[-1] != 'H';
395 if (functionname
!= NULL
&& fmt
[-1] == 'G')
396 lfinfo (fp
, "%pT", functionname
);
397 else if (filename
!= NULL
&& linenumber
!= 0)
398 fprintf (fp
, "%u%s", linenumber
, done
? "" : ":");
404 lfinfo (fp
, "%pB:", abfd
);
408 lfinfo (fp
, "(%pA+0x%v)", section
, offset
);
409 bfd_set_error (last_bfd_error
);
416 free (last_function
);
417 last_function
= NULL
;
425 /* section name from a section */
430 sec
= (asection
*) args
[arg_no
].p
;
432 fprintf (fp
, "%s", sec
->name
);
436 const char *group
= bfd_group_name (abfd
, sec
);
438 fprintf (fp
, "[%s]", group
);
441 else if (*fmt
== 'B')
443 /* filename from a bfd */
444 bfd
*abfd
= (bfd
*) args
[arg_no
].p
;
449 fprintf (fp
, "%s generated", program_name
);
450 else if (abfd
->my_archive
!= NULL
451 && !bfd_is_thin_archive (abfd
->my_archive
))
452 fprintf (fp
, "%s(%s)",
453 bfd_get_filename (abfd
->my_archive
),
454 bfd_get_filename (abfd
));
456 fprintf (fp
, "%s", bfd_get_filename (abfd
));
458 else if (*fmt
== 'I')
460 /* filename from a lang_input_statement_type */
461 lang_input_statement_type
*i
;
464 i
= (lang_input_statement_type
*) args
[arg_no
].p
;
466 if (i
->the_bfd
!= NULL
467 && i
->the_bfd
->my_archive
!= NULL
468 && !bfd_is_thin_archive (i
->the_bfd
->my_archive
))
469 fprintf (fp
, "(%s)%s",
470 bfd_get_filename (i
->the_bfd
->my_archive
),
473 fprintf (fp
, "%s", i
->filename
);
475 else if (*fmt
== 'R')
477 /* Print all that's interesting about a relent. */
478 arelent
*relent
= (arelent
*) args
[arg_no
].p
;
482 lfinfo (fp
, "%s+0x%v (type %s)",
483 (*(relent
->sym_ptr_ptr
))->name
,
485 relent
->howto
->name
);
487 else if (*fmt
== 'S' || *fmt
== 'U')
489 /* Print script file and perhaps the associated linenumber. */
491 etree_type
*tp
= (etree_type
*) args
[arg_no
].p
;
498 tp
->type
.filename
= ldlex_filename ();
499 tp
->type
.lineno
= lineno
;
501 if (tp
->type
.filename
!= NULL
&& fmt
[-1] == 'S')
502 fprintf (fp
, "%s:%u", tp
->type
.filename
, tp
->type
.lineno
);
503 else if (tp
->type
.filename
!= NULL
&& fmt
[-1] == 'U')
504 fprintf (fp
, "%s", tp
->type
.filename
);
506 else if (*fmt
== 'T')
509 const char *name
= (const char *) args
[arg_no
].p
;
513 if (name
== NULL
|| *name
== 0)
515 fprintf (fp
, _("no symbol"));
522 demangled
= bfd_demangle (link_info
.output_bfd
, name
,
523 DMGL_ANSI
| DMGL_PARAMS
);
524 if (demangled
!= NULL
)
526 fprintf (fp
, "%s", demangled
);
531 fprintf (fp
, "%s", name
);
535 /* native (host) void* pointer, like printf */
536 fprintf (fp
, "%p", args
[arg_no
].p
);
542 /* arbitrary string, like printf */
543 fprintf (fp
, "%s", (char *) args
[arg_no
].p
);
548 /* integer, like printf */
549 fprintf (fp
, "%d", args
[arg_no
].i
);
554 /* unsigned integer, like printf */
555 fprintf (fp
, "%u", args
[arg_no
].i
);
562 fprintf (fp
, "%ld", args
[arg_no
].l
);
567 else if (*fmt
== 'u')
569 fprintf (fp
, "%lu", args
[arg_no
].l
);
577 fprintf (fp
, "%%%c", fmt
[-1]);
583 if (is_warning
&& config
.fatal_warnings
)
584 config
.make_executable
= false;
590 /* Format info message and print on stdout. */
592 /* (You would think this should be called just "info", but then you
593 would be hosed by LynxOS, which defines that name in its libc.) */
596 info_msg (const char *fmt
, ...)
601 vfinfo (stdout
, fmt
, arg
, false);
605 /* ('e' for error.) Format info message and print on stderr. */
608 einfo (const char *fmt
, ...)
614 vfinfo (stderr
, fmt
, arg
, true);
620 info_assert (const char *file
, unsigned int line
)
622 einfo (_("%F%P: internal error %s %d\n"), file
, line
);
625 /* ('m' for map) Format info message and print on map. */
628 minfo (const char *fmt
, ...)
630 if (config
.map_file
!= NULL
)
635 if (fmt
[0] == '%' && fmt
[1] == '!' && fmt
[2] == 0)
637 /* Stash info about --as-needed shared libraries. Print
638 later so they don't appear intermingled with archive
640 struct asneeded_minfo
*m
= xmalloc (sizeof *m
);
643 m
->soname
= va_arg (arg
, const char *);
644 m
->ref
= va_arg (arg
, bfd
*);
645 m
->name
= va_arg (arg
, const char *);
646 *asneeded_list_tail
= m
;
647 asneeded_list_tail
= &m
->next
;
650 vfinfo (config
.map_file
, fmt
, arg
, false);
656 lfinfo (FILE *file
, const char *fmt
, ...)
661 vfinfo (file
, fmt
, arg
, false);
665 /* Functions to print the link map. */
670 fprintf (config
.map_file
, " ");
676 fprintf (config
.map_file
, "\n");
679 /* A more or less friendly abort message. In ld.h abort is defined to
680 call this function. */
683 ld_abort (const char *file
, int line
, const char *fn
)
686 einfo (_("%P: internal error: aborting at %s:%d in %s\n"),
689 einfo (_("%P: internal error: aborting at %s:%d\n"),
691 einfo (_("%F%P: please report this bug\n"));