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 10 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 if (is_warning
&& config
.no_warnings
)
101 for (arg_no
= 0; arg_no
< sizeof (args
) / sizeof (args
[0]); arg_no
++)
102 args
[arg_no
].type
= Bad
;
106 while (*scan
!= '\0')
108 while (*scan
!= '%' && *scan
!= '\0')
116 if (*scan
!= '0' && ISDIGIT (*scan
) && scan
[1] == '$')
118 arg_no
= *scan
- '1';
140 if (*scan
== 'A' || *scan
== 'B' || *scan
== 'I'
141 || *scan
== 'R' || *scan
== 'S' || *scan
== 'T')
159 if (*scan
== 'd' || *scan
== 'u')
171 if (arg_no
>= sizeof (args
) / sizeof (args
[0]))
173 args
[arg_no
].type
= arg_type
;
179 for (arg_no
= 0; arg_no
< arg_count
; arg_no
++)
181 switch (args
[arg_no
].type
)
184 args
[arg_no
].i
= va_arg (ap
, int);
187 args
[arg_no
].l
= va_arg (ap
, long);
190 args
[arg_no
].p
= va_arg (ap
, void *);
193 args
[arg_no
].v
= va_arg (ap
, bfd_vma
);
196 args
[arg_no
].reladdr
.abfd
= va_arg (ap
, bfd
*);
197 args
[arg_no
].reladdr
.sec
= va_arg (ap
, asection
*);
198 args
[arg_no
].reladdr
.off
= va_arg (ap
, bfd_vma
);
208 const char *str
= fmt
;
209 while (*fmt
!= '%' && *fmt
!= '\0')
212 if (fwrite (str
, 1, fmt
- str
, fp
))
222 if (*fmt
!= '0' && ISDIGIT (*fmt
) && fmt
[1] == '$')
240 /* no object output, fail return */
241 config
.make_executable
= false;
250 value
= args
[arg_no
].v
;
252 bfd_sprintf_vma (link_info
.output_bfd
, buf
, value
);
253 fprintf (fp
, "%s", buf
);
258 /* hex bfd_vma, no leading zeros */
260 uint64_t value
= args
[arg_no
].v
;
262 fprintf (fp
, "%" PRIx64
, value
);
267 /* hex bfd_vma with 0x with no leading zeroes taking up
268 10 spaces (including the 0x). */
273 value
= args
[arg_no
].v
;
275 sprintf (buf
, "0x%" PRIx64
, value
);
276 fprintf (fp
, "%10s", buf
);
281 /* Error is fatal. */
286 /* Print program name. */
287 fprintf (fp
, "%s", program_name
);
291 /* current bfd error or errno */
292 fprintf (fp
, "%s", bfd_errmsg (bfd_get_error ()));
299 /* Clever filename:linenumber with function name if possible.
300 The arguments are a BFD, a section, and an offset. */
302 static bfd
*last_bfd
;
303 static char *last_file
;
304 static char *last_function
;
308 asymbol
**asymbols
= NULL
;
309 const char *filename
;
310 const char *functionname
;
311 unsigned int linenumber
;
314 bfd_error_type last_bfd_error
= bfd_get_error ();
316 abfd
= args
[arg_no
].reladdr
.abfd
;
317 section
= args
[arg_no
].reladdr
.sec
;
318 offset
= args
[arg_no
].reladdr
.off
;
323 if (!bfd_generic_link_read_symbols (abfd
))
324 einfo (_("%F%P: %pB: could not read symbols: %E\n"), abfd
);
326 asymbols
= bfd_get_outsymbols (abfd
);
329 /* The GNU Coding Standard requires that error messages
332 source-file-name:lineno: message
334 We do not always have a line number available so if
335 we cannot find them we print out the section name and
339 && bfd_find_nearest_line (abfd
, section
, asymbols
, offset
,
340 &filename
, &functionname
,
343 if (functionname
!= NULL
344 && (fmt
[-1] == 'C' || fmt
[-1] == 'H'))
346 /* Detect the case where we are printing out a
347 message for the same function as the last
348 call to vinfo ("%C"). In this situation do
349 not print out the ABFD filename or the
350 function name again. Note - we do still
351 print out the source filename, as this will
352 allow programs that parse the linker's output
353 (eg emacs) to correctly locate multiple
354 errors in the same source file. */
356 || last_function
== NULL
358 || (last_file
== NULL
) != (filename
== NULL
)
360 && filename_cmp (last_file
, filename
) != 0)
361 || strcmp (last_function
, functionname
) != 0)
363 lfinfo (fp
, _("%pB: in function `%pT':\n"),
370 last_file
= xstrdup (filename
);
371 free (last_function
);
372 last_function
= xstrdup (functionname
);
374 discard_last
= false;
377 lfinfo (fp
, "%pB:", abfd
);
379 if (filename
!= NULL
)
380 fprintf (fp
, "%s:", filename
);
382 done
= fmt
[-1] != 'H';
383 if (functionname
!= NULL
&& fmt
[-1] == 'G')
384 lfinfo (fp
, "%pT", functionname
);
385 else if (filename
!= NULL
&& linenumber
!= 0)
386 fprintf (fp
, "%u%s", linenumber
, done
? "" : ":");
392 lfinfo (fp
, "%pB:", abfd
);
396 lfinfo (fp
, "(%pA+0x%v)", section
, offset
);
397 bfd_set_error (last_bfd_error
);
404 free (last_function
);
405 last_function
= NULL
;
413 /* section name from a section */
418 sec
= (asection
*) args
[arg_no
].p
;
420 fprintf (fp
, "%s", sec
->name
);
424 const char *group
= bfd_group_name (abfd
, sec
);
426 fprintf (fp
, "[%s]", group
);
429 else if (*fmt
== 'B')
431 /* filename from a bfd */
432 bfd
*abfd
= (bfd
*) args
[arg_no
].p
;
437 fprintf (fp
, "%s generated", program_name
);
438 else if (abfd
->my_archive
!= NULL
439 && !bfd_is_thin_archive (abfd
->my_archive
))
440 fprintf (fp
, "%s(%s)",
441 bfd_get_filename (abfd
->my_archive
),
442 bfd_get_filename (abfd
));
444 fprintf (fp
, "%s", bfd_get_filename (abfd
));
446 else if (*fmt
== 'I')
448 /* filename from a lang_input_statement_type */
449 lang_input_statement_type
*i
;
452 i
= (lang_input_statement_type
*) args
[arg_no
].p
;
454 if (i
->the_bfd
!= NULL
455 && i
->the_bfd
->my_archive
!= NULL
456 && !bfd_is_thin_archive (i
->the_bfd
->my_archive
))
457 fprintf (fp
, "(%s)%s",
458 bfd_get_filename (i
->the_bfd
->my_archive
),
461 fprintf (fp
, "%s", i
->filename
);
463 else if (*fmt
== 'R')
465 /* Print all that's interesting about a relent. */
466 arelent
*relent
= (arelent
*) args
[arg_no
].p
;
470 lfinfo (fp
, "%s+0x%v (type %s)",
471 (*(relent
->sym_ptr_ptr
))->name
,
473 relent
->howto
->name
);
475 else if (*fmt
== 'S' || *fmt
== 'U')
477 /* Print script file and perhaps the associated linenumber. */
479 etree_type
*tp
= (etree_type
*) args
[arg_no
].p
;
486 tp
->type
.filename
= ldlex_filename ();
487 tp
->type
.lineno
= lineno
;
489 if (tp
->type
.filename
!= NULL
&& fmt
[-1] == 'S')
490 fprintf (fp
, "%s:%u", tp
->type
.filename
, tp
->type
.lineno
);
491 else if (tp
->type
.filename
!= NULL
&& fmt
[-1] == 'U')
492 fprintf (fp
, "%s", tp
->type
.filename
);
494 else if (*fmt
== 'T')
497 const char *name
= (const char *) args
[arg_no
].p
;
501 if (name
== NULL
|| *name
== 0)
503 fprintf (fp
, _("no symbol"));
510 demangled
= bfd_demangle (link_info
.output_bfd
, name
,
511 DMGL_ANSI
| DMGL_PARAMS
);
512 if (demangled
!= NULL
)
514 fprintf (fp
, "%s", demangled
);
519 fprintf (fp
, "%s", name
);
523 /* native (host) void* pointer, like printf */
524 fprintf (fp
, "%p", args
[arg_no
].p
);
530 /* arbitrary string, like printf */
531 fprintf (fp
, "%s", (char *) args
[arg_no
].p
);
536 /* integer, like printf */
537 fprintf (fp
, "%d", args
[arg_no
].i
);
542 /* unsigned integer, like printf */
543 fprintf (fp
, "%u", args
[arg_no
].i
);
550 fprintf (fp
, "%ld", args
[arg_no
].l
);
555 else if (*fmt
== 'u')
557 fprintf (fp
, "%lu", args
[arg_no
].l
);
565 fprintf (fp
, "%%%c", fmt
[-1]);
571 if (is_warning
&& config
.fatal_warnings
)
572 config
.make_executable
= false;
578 /* Format info message and print on stdout. */
580 /* (You would think this should be called just "info", but then you
581 would be hosed by LynxOS, which defines that name in its libc.) */
584 info_msg (const char *fmt
, ...)
589 vfinfo (stdout
, fmt
, arg
, false);
593 /* ('e' for error.) Format info message and print on stderr. */
596 einfo (const char *fmt
, ...)
602 vfinfo (stderr
, fmt
, arg
, true);
608 info_assert (const char *file
, unsigned int line
)
610 einfo (_("%F%P: internal error %s %d\n"), file
, line
);
613 /* ('m' for map) Format info message and print on map. */
616 minfo (const char *fmt
, ...)
618 if (config
.map_file
!= NULL
)
623 if (fmt
[0] == '%' && fmt
[1] == '!' && fmt
[2] == 0)
625 /* Stash info about --as-needed shared libraries. Print
626 later so they don't appear intermingled with archive
628 struct asneeded_minfo
*m
= xmalloc (sizeof *m
);
631 m
->soname
= va_arg (arg
, const char *);
632 m
->ref
= va_arg (arg
, bfd
*);
633 m
->name
= va_arg (arg
, const char *);
634 *asneeded_list_tail
= m
;
635 asneeded_list_tail
= &m
->next
;
638 vfinfo (config
.map_file
, fmt
, arg
, false);
644 lfinfo (FILE *file
, const char *fmt
, ...)
649 vfinfo (file
, fmt
, arg
, false);
653 /* Functions to print the link map. */
656 print_spaces (int count
)
658 fprintf (config
.map_file
, "%*s", count
, "");
664 fprintf (config
.map_file
, "\n");
667 /* A more or less friendly abort message. In ld.h abort is defined to
668 call this function. */
671 ld_abort (const char *file
, int line
, const char *fn
)
674 einfo (_("%P: internal error: aborting at %s:%d in %s\n"),
677 einfo (_("%P: internal error: aborting at %s:%d\n"),
679 einfo (_("%F%P: please report this bug\n"));