2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4 Free Software Foundation, Inc.
5 Written by Steve Chamberlain of Cygnus Support.
7 This file is part of the GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
27 #include "libiberty.h"
42 %A section name from a section
43 %B filename from a bfd
44 %C clever filename:linenumber with function
45 %D like %C, but no function name
46 %E current bfd error or errno
48 %G like %D, but only function name
49 %I filename from a lang_input_statement_type
51 %R info about a relent
52 %S print script file and linenumber
55 %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces
56 %X no object output, fail return
57 %d integer, like printf
59 %lu unsigned long, like printf
60 %p native (host) void* pointer, like printf
61 %s arbitrary string, like printf
62 %u integer, like printf
63 %v hex bfd_vma, no leading zeros
67 vfinfo (FILE *fp
, const char *fmt
, va_list arg
, bfd_boolean is_warning
)
69 bfd_boolean fatal
= FALSE
;
73 while (*fmt
!= '%' && *fmt
!= '\0')
90 /* no object output, fail return */
91 config
.make_executable
= FALSE
;
97 bfd_vma value
= va_arg (arg
, bfd_vma
);
98 fprintf_vma (fp
, value
);
103 /* hex bfd_vma, no leading zeros */
107 bfd_vma value
= va_arg (arg
, bfd_vma
);
108 sprintf_vma (p
, value
);
118 /* hex bfd_vma with 0x with no leading zeroes taking up
126 value
= va_arg (arg
, bfd_vma
);
127 sprintf_vma (buf
, value
);
128 for (p
= buf
; *p
== '0'; ++p
)
138 fprintf (fp
, "0x%s", p
);
145 const char *name
= va_arg (arg
, const char *);
147 if (name
== NULL
|| *name
== 0)
149 fprintf (fp
, _("no symbol"));
156 demangled
= bfd_demangle (link_info
.output_bfd
, name
,
157 DMGL_ANSI
| DMGL_PARAMS
);
158 if (demangled
!= NULL
)
160 fprintf (fp
, "%s", demangled
);
165 fprintf (fp
, "%s", name
);
170 /* section name from a section */
172 asection
*sec
= va_arg (arg
, asection
*);
173 bfd
*abfd
= sec
->owner
;
174 const char *group
= NULL
;
175 struct coff_comdat_info
*ci
;
177 fprintf (fp
, "%s", sec
->name
);
179 && bfd_get_flavour (abfd
) == bfd_target_elf_flavour
180 && elf_next_in_group (sec
) != NULL
181 && (sec
->flags
& SEC_GROUP
) == 0)
182 group
= elf_group_name (sec
);
183 else if (abfd
!= NULL
184 && bfd_get_flavour (abfd
) == bfd_target_coff_flavour
185 && (ci
= bfd_coff_get_comdat_section (sec
->owner
,
189 fprintf (fp
, "[%s]", group
);
194 /* filename from a bfd */
196 bfd
*abfd
= va_arg (arg
, bfd
*);
199 fprintf (fp
, "%s generated", program_name
);
200 else if (abfd
->my_archive
)
201 fprintf (fp
, "%s(%s)", abfd
->my_archive
->filename
,
204 fprintf (fp
, "%s", abfd
->filename
);
209 /* Error is fatal. */
214 /* Print program name. */
215 fprintf (fp
, "%s", program_name
);
219 /* current bfd error or errno */
220 fprintf (fp
, "%s", bfd_errmsg (bfd_get_error ()));
224 /* filename from a lang_input_statement_type */
226 lang_input_statement_type
*i
;
228 i
= va_arg (arg
, lang_input_statement_type
*);
229 if (bfd_my_archive (i
->the_bfd
) != NULL
)
231 bfd_get_filename (bfd_my_archive (i
->the_bfd
)));
232 fprintf (fp
, "%s", i
->local_sym_name
);
233 if (bfd_my_archive (i
->the_bfd
) == NULL
234 && strcmp (i
->local_sym_name
, i
->filename
) != 0)
235 fprintf (fp
, " (%s)", i
->filename
);
240 /* Print script file and linenumber. */
242 fprintf (fp
, "--defsym %s", lex_string
);
243 else if (ldfile_input_filename
!= NULL
)
244 fprintf (fp
, "%s:%u", ldfile_input_filename
, lineno
);
246 fprintf (fp
, _("built in linker script:%u"), lineno
);
250 /* Print all that's interesting about a relent. */
252 arelent
*relent
= va_arg (arg
, arelent
*);
254 lfinfo (fp
, "%s+0x%v (type %s)",
255 (*(relent
->sym_ptr_ptr
))->name
,
257 relent
->howto
->name
);
264 /* Clever filename:linenumber with function name if possible.
265 The arguments are a BFD, a section, and an offset. */
267 static bfd
*last_bfd
;
268 static char *last_file
= NULL
;
269 static char *last_function
= NULL
;
273 asymbol
**asymbols
= NULL
;
274 const char *filename
;
275 const char *functionname
;
276 unsigned int linenumber
;
277 bfd_boolean discard_last
;
279 abfd
= va_arg (arg
, bfd
*);
280 section
= va_arg (arg
, asection
*);
281 offset
= va_arg (arg
, bfd_vma
);
285 if (!bfd_generic_link_read_symbols (abfd
))
286 einfo (_("%B%F: could not read symbols: %E\n"), abfd
);
288 asymbols
= bfd_get_outsymbols (abfd
);
291 /* The GNU Coding Standard requires that error messages
294 source-file-name:lineno: message
296 We do not always have a line number available so if
297 we cannot find them we print out the section name and
301 && bfd_find_nearest_line (abfd
, section
, asymbols
, offset
,
302 &filename
, &functionname
,
305 if (functionname
!= NULL
&& fmt
[-1] == 'C')
307 /* Detect the case where we are printing out a
308 message for the same function as the last
309 call to vinfo ("%C"). In this situation do
310 not print out the ABFD filename or the
311 function name again. Note - we do still
312 print out the source filename, as this will
313 allow programs that parse the linker's output
314 (eg emacs) to correctly locate multiple
315 errors in the same source file. */
318 || last_function
== NULL
321 && strcmp (last_file
, filename
) != 0)
322 || strcmp (last_function
, functionname
) != 0)
324 lfinfo (fp
, _("%B: In function `%T':\n"),
328 if (last_file
!= NULL
)
332 last_file
= xstrdup (filename
);
333 if (last_function
!= NULL
)
334 free (last_function
);
335 last_function
= xstrdup (functionname
);
337 discard_last
= FALSE
;
340 lfinfo (fp
, "%B:", abfd
);
342 if (filename
!= NULL
)
343 fprintf (fp
, "%s:", filename
);
345 if (functionname
!= NULL
&& fmt
[-1] == 'G')
346 lfinfo (fp
, "%T", functionname
);
347 else if (filename
!= NULL
&& linenumber
!= 0)
348 fprintf (fp
, "%u", linenumber
);
350 lfinfo (fp
, "(%A+0x%v)", section
, offset
);
353 lfinfo (fp
, "%B:(%A+0x%v)", abfd
, section
, offset
);
358 if (last_file
!= NULL
)
363 if (last_function
!= NULL
)
365 free (last_function
);
366 last_function
= NULL
;
373 /* native (host) void* pointer, like printf */
374 fprintf (fp
, "%p", va_arg (arg
, void *));
378 /* arbitrary string, like printf */
379 fprintf (fp
, "%s", va_arg (arg
, char *));
383 /* integer, like printf */
384 fprintf (fp
, "%d", va_arg (arg
, int));
388 /* unsigned integer, like printf */
389 fprintf (fp
, "%u", va_arg (arg
, unsigned int));
395 fprintf (fp
, "%ld", va_arg (arg
, long));
399 else if (*fmt
== 'u')
401 fprintf (fp
, "%lu", va_arg (arg
, unsigned long));
408 fprintf (fp
, "%%%c", fmt
[-1]);
414 if (is_warning
&& config
.fatal_warnings
)
415 config
.make_executable
= FALSE
;
421 /* Format info message and print on stdout. */
423 /* (You would think this should be called just "info", but then you
424 would be hosed by LynxOS, which defines that name in its libc.) */
427 info_msg (const char *fmt
, ...)
432 vfinfo (stdout
, fmt
, arg
, FALSE
);
436 /* ('e' for error.) Format info message and print on stderr. */
439 einfo (const char *fmt
, ...)
444 vfinfo (stderr
, fmt
, arg
, TRUE
);
449 info_assert (const char *file
, unsigned int line
)
451 einfo (_("%F%P: internal error %s %d\n"), file
, line
);
454 /* ('m' for map) Format info message and print on map. */
457 minfo (const char *fmt
, ...)
459 if (config
.map_file
!= NULL
)
464 vfinfo (config
.map_file
, fmt
, arg
, FALSE
);
470 lfinfo (FILE *file
, const char *fmt
, ...)
475 vfinfo (file
, fmt
, arg
, FALSE
);
479 /* Functions to print the link map. */
484 fprintf (config
.map_file
, " ");
490 fprintf (config
.map_file
, "\n");
493 /* A more or less friendly abort message. In ld.h abort is defined to
494 call this function. */
497 ld_abort (const char *file
, int line
, const char *fn
)
500 einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
503 einfo (_("%P: internal error: aborting at %s line %d\n"),
505 einfo (_("%P%F: please report this bug\n"));