2 Copyright (C) 1991-2020 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 %s arbitrary string, like printf
63 %u integer, like printf
64 %v hex bfd_vma, no leading zeros
68 vfinfo (FILE *fp
, const char *fmt
, va_list ap
, bfd_boolean is_warning
)
70 bfd_boolean fatal
= FALSE
;
73 unsigned int arg_count
= 0;
97 for (arg_no
= 0; arg_no
< sizeof (args
) / sizeof (args
[0]); arg_no
++)
98 args
[arg_no
].type
= Bad
;
102 while (*scan
!= '\0')
104 while (*scan
!= '%' && *scan
!= '\0')
112 if (*scan
!= '0' && ISDIGIT (*scan
) && scan
[1] == '$')
114 arg_no
= *scan
- '1';
136 if (*scan
== 'A' || *scan
== 'B' || *scan
== 'I'
137 || *scan
== 'R' || *scan
== 'S' || *scan
== 'T')
155 if (*scan
== 'd' || *scan
== 'u')
167 if (arg_no
>= sizeof (args
) / sizeof (args
[0]))
169 args
[arg_no
].type
= arg_type
;
175 for (arg_no
= 0; arg_no
< arg_count
; arg_no
++)
177 switch (args
[arg_no
].type
)
180 args
[arg_no
].i
= va_arg (ap
, int);
183 args
[arg_no
].l
= va_arg (ap
, long);
186 args
[arg_no
].p
= va_arg (ap
, void *);
189 args
[arg_no
].v
= va_arg (ap
, bfd_vma
);
192 args
[arg_no
].reladdr
.abfd
= va_arg (ap
, bfd
*);
193 args
[arg_no
].reladdr
.sec
= va_arg (ap
, asection
*);
194 args
[arg_no
].reladdr
.off
= va_arg (ap
, bfd_vma
);
204 const char *str
= fmt
;
205 while (*fmt
!= '%' && *fmt
!= '\0')
208 if (fwrite (str
, 1, fmt
- str
, fp
))
218 if (*fmt
!= '0' && ISDIGIT (*fmt
) && fmt
[1] == '$')
236 /* no object output, fail return */
237 config
.make_executable
= FALSE
;
243 bfd_vma value
= args
[arg_no
].v
;
245 fprintf_vma (fp
, value
);
250 /* hex bfd_vma, no leading zeros */
254 bfd_vma value
= args
[arg_no
].v
;
256 sprintf_vma (p
, value
);
266 /* hex bfd_vma with 0x with no leading zeroes taking up
274 value
= args
[arg_no
].v
;
276 sprintf_vma (buf
, value
);
277 for (p
= buf
; *p
== '0'; ++p
)
287 fprintf (fp
, "0x%s", p
);
292 /* Error is fatal. */
297 /* Print program name. */
298 fprintf (fp
, "%s", program_name
);
302 /* current bfd error or errno */
303 fprintf (fp
, "%s", bfd_errmsg (bfd_get_error ()));
310 /* Clever filename:linenumber with function name if possible.
311 The arguments are a BFD, a section, and an offset. */
313 static bfd
*last_bfd
;
314 static char *last_file
;
315 static char *last_function
;
319 asymbol
**asymbols
= NULL
;
320 const char *filename
;
321 const char *functionname
;
322 unsigned int linenumber
;
323 bfd_boolean discard_last
;
325 bfd_error_type last_bfd_error
= bfd_get_error ();
327 abfd
= args
[arg_no
].reladdr
.abfd
;
328 section
= args
[arg_no
].reladdr
.sec
;
329 offset
= args
[arg_no
].reladdr
.off
;
334 if (!bfd_generic_link_read_symbols (abfd
))
335 einfo (_("%F%P: %pB: could not read symbols: %E\n"), abfd
);
337 asymbols
= bfd_get_outsymbols (abfd
);
340 /* The GNU Coding Standard requires that error messages
343 source-file-name:lineno: message
345 We do not always have a line number available so if
346 we cannot find them we print out the section name and
350 && bfd_find_nearest_line (abfd
, section
, asymbols
, offset
,
351 &filename
, &functionname
,
354 if (functionname
!= NULL
355 && (fmt
[-1] == 'C' || fmt
[-1] == 'H'))
357 /* Detect the case where we are printing out a
358 message for the same function as the last
359 call to vinfo ("%C"). In this situation do
360 not print out the ABFD filename or the
361 function name again. Note - we do still
362 print out the source filename, as this will
363 allow programs that parse the linker's output
364 (eg emacs) to correctly locate multiple
365 errors in the same source file. */
367 || last_function
== NULL
369 || (last_file
== NULL
) != (filename
== NULL
)
371 && filename_cmp (last_file
, filename
) != 0)
372 || strcmp (last_function
, functionname
) != 0)
374 lfinfo (fp
, _("%pB: in function `%pT':\n"),
378 if (last_file
!= NULL
)
382 last_file
= xstrdup (filename
);
383 if (last_function
!= NULL
)
384 free (last_function
);
385 last_function
= xstrdup (functionname
);
387 discard_last
= FALSE
;
390 lfinfo (fp
, "%pB:", abfd
);
392 if (filename
!= NULL
)
393 fprintf (fp
, "%s:", filename
);
395 done
= fmt
[-1] != 'H';
396 if (functionname
!= NULL
&& fmt
[-1] == 'G')
397 lfinfo (fp
, "%pT", functionname
);
398 else if (filename
!= NULL
&& linenumber
!= 0)
399 fprintf (fp
, "%u%s", linenumber
, done
? "" : ":");
405 lfinfo (fp
, "%pB:", abfd
);
409 lfinfo (fp
, "(%pA+0x%v)", section
, offset
);
410 bfd_set_error (last_bfd_error
);
415 if (last_file
!= NULL
)
420 if (last_function
!= NULL
)
422 free (last_function
);
423 last_function
= NULL
;
432 /* section name from a section */
437 sec
= (asection
*) args
[arg_no
].p
;
439 fprintf (fp
, "%s", sec
->name
);
443 const char *group
= bfd_group_name (abfd
, sec
);
445 fprintf (fp
, "[%s]", group
);
448 else if (*fmt
== 'B')
450 /* filename from a bfd */
451 bfd
*abfd
= (bfd
*) args
[arg_no
].p
;
456 fprintf (fp
, "%s generated", program_name
);
457 else if (abfd
->my_archive
!= NULL
458 && !bfd_is_thin_archive (abfd
->my_archive
))
459 fprintf (fp
, "%s(%s)",
460 bfd_get_filename (abfd
->my_archive
),
461 bfd_get_filename (abfd
));
463 fprintf (fp
, "%s", bfd_get_filename (abfd
));
465 else if (*fmt
== 'I')
467 /* filename from a lang_input_statement_type */
468 lang_input_statement_type
*i
;
471 i
= (lang_input_statement_type
*) args
[arg_no
].p
;
473 if (i
->the_bfd
!= NULL
474 && i
->the_bfd
->my_archive
!= NULL
475 && !bfd_is_thin_archive (i
->the_bfd
->my_archive
))
476 fprintf (fp
, "(%s)%s",
477 bfd_get_filename (i
->the_bfd
->my_archive
),
480 fprintf (fp
, "%s", i
->filename
);
482 else if (*fmt
== 'R')
484 /* Print all that's interesting about a relent. */
485 arelent
*relent
= (arelent
*) args
[arg_no
].p
;
489 lfinfo (fp
, "%s+0x%v (type %s)",
490 (*(relent
->sym_ptr_ptr
))->name
,
492 relent
->howto
->name
);
494 else if (*fmt
== 'S')
496 /* Print script file and linenumber. */
498 etree_type
*tp
= (etree_type
*) args
[arg_no
].p
;
505 tp
->type
.filename
= ldlex_filename ();
506 tp
->type
.lineno
= lineno
;
508 if (tp
->type
.filename
!= NULL
)
509 fprintf (fp
, "%s:%u", tp
->type
.filename
, tp
->type
.lineno
);
511 else if (*fmt
== 'T')
514 const char *name
= (const char *) args
[arg_no
].p
;
518 if (name
== NULL
|| *name
== 0)
520 fprintf (fp
, _("no symbol"));
527 demangled
= bfd_demangle (link_info
.output_bfd
, name
,
528 DMGL_ANSI
| DMGL_PARAMS
);
529 if (demangled
!= NULL
)
531 fprintf (fp
, "%s", demangled
);
536 fprintf (fp
, "%s", name
);
540 /* native (host) void* pointer, like printf */
541 fprintf (fp
, "%p", args
[arg_no
].p
);
547 /* arbitrary string, like printf */
548 fprintf (fp
, "%s", (char *) args
[arg_no
].p
);
553 /* integer, like printf */
554 fprintf (fp
, "%d", args
[arg_no
].i
);
559 /* unsigned integer, like printf */
560 fprintf (fp
, "%u", args
[arg_no
].i
);
567 fprintf (fp
, "%ld", args
[arg_no
].l
);
572 else if (*fmt
== 'u')
574 fprintf (fp
, "%lu", args
[arg_no
].l
);
582 fprintf (fp
, "%%%c", fmt
[-1]);
588 if (is_warning
&& config
.fatal_warnings
)
589 config
.make_executable
= FALSE
;
595 /* Format info message and print on stdout. */
597 /* (You would think this should be called just "info", but then you
598 would be hosed by LynxOS, which defines that name in its libc.) */
601 info_msg (const char *fmt
, ...)
606 vfinfo (stdout
, fmt
, arg
, FALSE
);
610 /* ('e' for error.) Format info message and print on stderr. */
613 einfo (const char *fmt
, ...)
619 vfinfo (stderr
, fmt
, arg
, TRUE
);
625 info_assert (const char *file
, unsigned int line
)
627 einfo (_("%F%P: internal error %s %d\n"), file
, line
);
630 /* ('m' for map) Format info message and print on map. */
633 minfo (const char *fmt
, ...)
635 if (config
.map_file
!= NULL
)
640 if (fmt
[0] == '%' && fmt
[1] == '!' && fmt
[2] == 0)
642 /* Stash info about --as-needed shared libraries. Print
643 later so they don't appear intermingled with archive
645 struct asneeded_minfo
*m
= xmalloc (sizeof *m
);
648 m
->soname
= va_arg (arg
, const char *);
649 m
->ref
= va_arg (arg
, bfd
*);
650 m
->name
= va_arg (arg
, const char *);
651 *asneeded_list_tail
= m
;
652 asneeded_list_tail
= &m
->next
;
655 vfinfo (config
.map_file
, fmt
, arg
, FALSE
);
661 lfinfo (FILE *file
, const char *fmt
, ...)
666 vfinfo (file
, fmt
, arg
, FALSE
);
670 /* Functions to print the link map. */
675 fprintf (config
.map_file
, " ");
681 fprintf (config
.map_file
, "\n");
684 /* A more or less friendly abort message. In ld.h abort is defined to
685 call this function. */
688 ld_abort (const char *file
, int line
, const char *fn
)
691 einfo (_("%P: internal error: aborting at %s:%d in %s\n"),
694 einfo (_("%P: internal error: aborting at %s:%d\n"),
696 einfo (_("%F%P: please report this bug\n"));