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 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;
247 value
= args
[arg_no
].v
;
249 bfd_sprintf_vma (link_info
.output_bfd
, buf
, value
);
250 fprintf (fp
, "%s", buf
);
255 /* hex bfd_vma, no leading zeros */
257 uint64_t value
= args
[arg_no
].v
;
259 fprintf (fp
, "%" PRIx64
, value
);
264 /* hex bfd_vma with 0x with no leading zeroes taking up
265 10 spaces (including the 0x). */
270 value
= args
[arg_no
].v
;
272 sprintf (buf
, "0x%" PRIx64
, value
);
273 fprintf (fp
, "%10s", buf
);
278 /* Error is fatal. */
283 /* Print program name. */
284 fprintf (fp
, "%s", program_name
);
288 /* current bfd error or errno */
289 fprintf (fp
, "%s", bfd_errmsg (bfd_get_error ()));
296 /* Clever filename:linenumber with function name if possible.
297 The arguments are a BFD, a section, and an offset. */
299 static bfd
*last_bfd
;
300 static char *last_file
;
301 static char *last_function
;
305 asymbol
**asymbols
= NULL
;
306 const char *filename
;
307 const char *functionname
;
308 unsigned int linenumber
;
311 bfd_error_type last_bfd_error
= bfd_get_error ();
313 abfd
= args
[arg_no
].reladdr
.abfd
;
314 section
= args
[arg_no
].reladdr
.sec
;
315 offset
= args
[arg_no
].reladdr
.off
;
320 if (!bfd_generic_link_read_symbols (abfd
))
321 einfo (_("%F%P: %pB: could not read symbols: %E\n"), abfd
);
323 asymbols
= bfd_get_outsymbols (abfd
);
326 /* The GNU Coding Standard requires that error messages
329 source-file-name:lineno: message
331 We do not always have a line number available so if
332 we cannot find them we print out the section name and
336 && bfd_find_nearest_line (abfd
, section
, asymbols
, offset
,
337 &filename
, &functionname
,
340 if (functionname
!= NULL
341 && (fmt
[-1] == 'C' || fmt
[-1] == 'H'))
343 /* Detect the case where we are printing out a
344 message for the same function as the last
345 call to vinfo ("%C"). In this situation do
346 not print out the ABFD filename or the
347 function name again. Note - we do still
348 print out the source filename, as this will
349 allow programs that parse the linker's output
350 (eg emacs) to correctly locate multiple
351 errors in the same source file. */
353 || last_function
== NULL
355 || (last_file
== NULL
) != (filename
== NULL
)
357 && filename_cmp (last_file
, filename
) != 0)
358 || strcmp (last_function
, functionname
) != 0)
360 lfinfo (fp
, _("%pB: in function `%pT':\n"),
367 last_file
= xstrdup (filename
);
368 free (last_function
);
369 last_function
= xstrdup (functionname
);
371 discard_last
= false;
374 lfinfo (fp
, "%pB:", abfd
);
376 if (filename
!= NULL
)
377 fprintf (fp
, "%s:", filename
);
379 done
= fmt
[-1] != 'H';
380 if (functionname
!= NULL
&& fmt
[-1] == 'G')
381 lfinfo (fp
, "%pT", functionname
);
382 else if (filename
!= NULL
&& linenumber
!= 0)
383 fprintf (fp
, "%u%s", linenumber
, done
? "" : ":");
389 lfinfo (fp
, "%pB:", abfd
);
393 lfinfo (fp
, "(%pA+0x%v)", section
, offset
);
394 bfd_set_error (last_bfd_error
);
401 free (last_function
);
402 last_function
= NULL
;
410 /* section name from a section */
415 sec
= (asection
*) args
[arg_no
].p
;
417 fprintf (fp
, "%s", sec
->name
);
421 const char *group
= bfd_group_name (abfd
, sec
);
423 fprintf (fp
, "[%s]", group
);
426 else if (*fmt
== 'B')
428 /* filename from a bfd */
429 bfd
*abfd
= (bfd
*) args
[arg_no
].p
;
434 fprintf (fp
, "%s generated", program_name
);
435 else if (abfd
->my_archive
!= NULL
436 && !bfd_is_thin_archive (abfd
->my_archive
))
437 fprintf (fp
, "%s(%s)",
438 bfd_get_filename (abfd
->my_archive
),
439 bfd_get_filename (abfd
));
441 fprintf (fp
, "%s", bfd_get_filename (abfd
));
443 else if (*fmt
== 'I')
445 /* filename from a lang_input_statement_type */
446 lang_input_statement_type
*i
;
449 i
= (lang_input_statement_type
*) args
[arg_no
].p
;
451 if (i
->the_bfd
!= NULL
452 && i
->the_bfd
->my_archive
!= NULL
453 && !bfd_is_thin_archive (i
->the_bfd
->my_archive
))
454 fprintf (fp
, "(%s)%s",
455 bfd_get_filename (i
->the_bfd
->my_archive
),
458 fprintf (fp
, "%s", i
->filename
);
460 else if (*fmt
== 'R')
462 /* Print all that's interesting about a relent. */
463 arelent
*relent
= (arelent
*) args
[arg_no
].p
;
467 lfinfo (fp
, "%s+0x%v (type %s)",
468 (*(relent
->sym_ptr_ptr
))->name
,
470 relent
->howto
->name
);
472 else if (*fmt
== 'S' || *fmt
== 'U')
474 /* Print script file and perhaps the associated linenumber. */
476 etree_type
*tp
= (etree_type
*) args
[arg_no
].p
;
483 tp
->type
.filename
= ldlex_filename ();
484 tp
->type
.lineno
= lineno
;
486 if (tp
->type
.filename
!= NULL
&& fmt
[-1] == 'S')
487 fprintf (fp
, "%s:%u", tp
->type
.filename
, tp
->type
.lineno
);
488 else if (tp
->type
.filename
!= NULL
&& fmt
[-1] == 'U')
489 fprintf (fp
, "%s", tp
->type
.filename
);
491 else if (*fmt
== 'T')
494 const char *name
= (const char *) args
[arg_no
].p
;
498 if (name
== NULL
|| *name
== 0)
500 fprintf (fp
, _("no symbol"));
507 demangled
= bfd_demangle (link_info
.output_bfd
, name
,
508 DMGL_ANSI
| DMGL_PARAMS
);
509 if (demangled
!= NULL
)
511 fprintf (fp
, "%s", demangled
);
516 fprintf (fp
, "%s", name
);
520 /* native (host) void* pointer, like printf */
521 fprintf (fp
, "%p", args
[arg_no
].p
);
527 /* arbitrary string, like printf */
528 fprintf (fp
, "%s", (char *) args
[arg_no
].p
);
533 /* integer, like printf */
534 fprintf (fp
, "%d", args
[arg_no
].i
);
539 /* unsigned integer, like printf */
540 fprintf (fp
, "%u", args
[arg_no
].i
);
547 fprintf (fp
, "%ld", args
[arg_no
].l
);
552 else if (*fmt
== 'u')
554 fprintf (fp
, "%lu", args
[arg_no
].l
);
562 fprintf (fp
, "%%%c", fmt
[-1]);
568 if (is_warning
&& config
.fatal_warnings
)
569 config
.make_executable
= false;
575 /* Format info message and print on stdout. */
577 /* (You would think this should be called just "info", but then you
578 would be hosed by LynxOS, which defines that name in its libc.) */
581 info_msg (const char *fmt
, ...)
586 vfinfo (stdout
, fmt
, arg
, false);
590 /* ('e' for error.) Format info message and print on stderr. */
593 einfo (const char *fmt
, ...)
599 vfinfo (stderr
, fmt
, arg
, true);
605 info_assert (const char *file
, unsigned int line
)
607 einfo (_("%F%P: internal error %s %d\n"), file
, line
);
610 /* ('m' for map) Format info message and print on map. */
613 minfo (const char *fmt
, ...)
615 if (config
.map_file
!= NULL
)
620 if (fmt
[0] == '%' && fmt
[1] == '!' && fmt
[2] == 0)
622 /* Stash info about --as-needed shared libraries. Print
623 later so they don't appear intermingled with archive
625 struct asneeded_minfo
*m
= xmalloc (sizeof *m
);
628 m
->soname
= va_arg (arg
, const char *);
629 m
->ref
= va_arg (arg
, bfd
*);
630 m
->name
= va_arg (arg
, const char *);
631 *asneeded_list_tail
= m
;
632 asneeded_list_tail
= &m
->next
;
635 vfinfo (config
.map_file
, fmt
, arg
, false);
641 lfinfo (FILE *file
, const char *fmt
, ...)
646 vfinfo (file
, fmt
, arg
, false);
650 /* Functions to print the link map. */
653 print_spaces (int count
)
655 fprintf (config
.map_file
, "%*s", count
, "");
661 fprintf (config
.map_file
, "\n");
664 /* A more or less friendly abort message. In ld.h abort is defined to
665 call this function. */
668 ld_abort (const char *file
, int line
, const char *fn
)
671 einfo (_("%P: internal error: aborting at %s:%d in %s\n"),
674 einfo (_("%P: internal error: aborting at %s:%d\n"),
676 einfo (_("%F%P: please report this bug\n"));