2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006
4 Free Software Foundation, Inc.
5 Written by Steve Chamberlain of Cygnus Support.
7 This file is part of GLD, the Gnu Linker.
9 GLD 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 2, or (at your option)
14 GLD 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 GLD; see the file COPYING. If not, write to the Free
21 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
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 %s arbitrary string, like printf
61 %u integer, like printf
62 %v hex bfd_vma, no leading zeros
66 vfinfo (FILE *fp
, const char *fmt
, va_list arg
, bfd_boolean is_warning
)
68 bfd_boolean fatal
= FALSE
;
72 while (*fmt
!= '%' && *fmt
!= '\0')
89 /* no object output, fail return */
90 config
.make_executable
= FALSE
;
96 bfd_vma value
= va_arg (arg
, bfd_vma
);
97 fprintf_vma (fp
, value
);
102 /* hex bfd_vma, no leading zeros */
106 bfd_vma value
= va_arg (arg
, bfd_vma
);
107 sprintf_vma (p
, value
);
117 /* hex bfd_vma with 0x with no leading zeroes taking up
125 value
= va_arg (arg
, bfd_vma
);
126 sprintf_vma (buf
, value
);
127 for (p
= buf
; *p
== '0'; ++p
)
137 fprintf (fp
, "0x%s", p
);
144 const char *name
= va_arg (arg
, const char *);
146 if (name
== NULL
|| *name
== 0)
147 fprintf (fp
, _("no symbol"));
148 else if (! demangling
)
149 fprintf (fp
, "%s", name
);
154 demangled
= demangle (name
);
155 fprintf (fp
, "%s", demangled
);
162 /* section name from a section */
164 asection
*sec
= va_arg (arg
, asection
*);
165 bfd
*abfd
= sec
->owner
;
166 const char *group
= NULL
;
167 struct coff_comdat_info
*ci
;
169 fprintf (fp
, "%s", sec
->name
);
171 && bfd_get_flavour (abfd
) == bfd_target_elf_flavour
172 && elf_next_in_group (sec
) != NULL
173 && (sec
->flags
& SEC_GROUP
) == 0)
174 group
= elf_group_name (sec
);
175 else if (abfd
!= NULL
176 && bfd_get_flavour (abfd
) == bfd_target_coff_flavour
177 && (ci
= bfd_coff_get_comdat_section (sec
->owner
,
181 fprintf (fp
, "[%s]", group
);
186 /* filename from a bfd */
188 bfd
*abfd
= va_arg (arg
, bfd
*);
191 fprintf (fp
, "%s generated", program_name
);
192 else if (abfd
->my_archive
)
193 fprintf (fp
, "%s(%s)", abfd
->my_archive
->filename
,
196 fprintf (fp
, "%s", abfd
->filename
);
201 /* Error is fatal. */
206 /* Print program name. */
207 fprintf (fp
, "%s", program_name
);
211 /* current bfd error or errno */
212 fprintf (fp
, "%s", bfd_errmsg (bfd_get_error ()));
216 /* filename from a lang_input_statement_type */
218 lang_input_statement_type
*i
;
220 i
= va_arg (arg
, lang_input_statement_type
*);
221 if (bfd_my_archive (i
->the_bfd
) != NULL
)
223 bfd_get_filename (bfd_my_archive (i
->the_bfd
)));
224 fprintf (fp
, "%s", i
->local_sym_name
);
225 if (bfd_my_archive (i
->the_bfd
) == NULL
226 && strcmp (i
->local_sym_name
, i
->filename
) != 0)
227 fprintf (fp
, " (%s)", i
->filename
);
232 /* Print script file and linenumber. */
234 fprintf (fp
, "--defsym %s", lex_string
);
235 else if (ldfile_input_filename
!= NULL
)
236 fprintf (fp
, "%s:%u", ldfile_input_filename
, lineno
);
238 fprintf (fp
, _("built in linker script:%u"), lineno
);
242 /* Print all that's interesting about a relent. */
244 arelent
*relent
= va_arg (arg
, arelent
*);
246 lfinfo (fp
, "%s+0x%v (type %s)",
247 (*(relent
->sym_ptr_ptr
))->name
,
249 relent
->howto
->name
);
256 /* Clever filename:linenumber with function name if possible.
257 The arguments are a BFD, a section, and an offset. */
259 static bfd
*last_bfd
;
260 static char *last_file
= NULL
;
261 static char *last_function
= NULL
;
265 lang_input_statement_type
*entry
;
267 const char *filename
;
268 const char *functionname
;
269 unsigned int linenumber
;
270 bfd_boolean discard_last
;
272 abfd
= va_arg (arg
, bfd
*);
273 section
= va_arg (arg
, asection
*);
274 offset
= va_arg (arg
, bfd_vma
);
283 entry
= (lang_input_statement_type
*) abfd
->usrdata
;
284 if (entry
!= (lang_input_statement_type
*) NULL
285 && entry
->asymbols
!= (asymbol
**) NULL
)
286 asymbols
= entry
->asymbols
;
292 symsize
= bfd_get_symtab_upper_bound (abfd
);
294 einfo (_("%B%F: could not read symbols\n"), abfd
);
295 asymbols
= xmalloc (symsize
);
296 sym_count
= bfd_canonicalize_symtab (abfd
, asymbols
);
298 einfo (_("%B%F: could not read symbols\n"), abfd
);
299 if (entry
!= (lang_input_statement_type
*) NULL
)
301 entry
->asymbols
= asymbols
;
302 entry
->symbol_count
= sym_count
;
307 /* The GNU Coding Standard requires that error messages
310 source-file-name:lineno: message
312 We do not always have a line number available so if
313 we cannot find them we print out the section name and
317 && bfd_find_nearest_line (abfd
, section
, asymbols
, offset
,
318 &filename
, &functionname
,
321 if (functionname
!= NULL
&& fmt
[-1] == 'C')
323 /* Detect the case where we are printing out a
324 message for the same function as the last
325 call to vinfo ("%C"). In this situation do
326 not print out the ABFD filename or the
327 function name again. Note - we do still
328 print out the source filename, as this will
329 allow programs that parse the linker's output
330 (eg emacs) to correctly locate multiple
331 errors in the same source file. */
334 || last_function
== NULL
337 && strcmp (last_file
, filename
) != 0)
338 || strcmp (last_function
, functionname
) != 0)
340 lfinfo (fp
, _("%B: In function `%T':\n"),
344 if (last_file
!= NULL
)
348 last_file
= xstrdup (filename
);
349 if (last_function
!= NULL
)
350 free (last_function
);
351 last_function
= xstrdup (functionname
);
353 discard_last
= FALSE
;
356 lfinfo (fp
, "%B:", abfd
);
358 if (filename
!= NULL
)
359 fprintf (fp
, "%s:", filename
);
361 if (functionname
!= NULL
&& fmt
[-1] == 'G')
362 lfinfo (fp
, "%T", functionname
);
363 else if (filename
!= NULL
&& linenumber
!= 0)
364 fprintf (fp
, "%u", linenumber
);
366 lfinfo (fp
, "(%A+0x%v)", section
, offset
);
369 lfinfo (fp
, "%B:(%A+0x%v)", abfd
, section
, offset
);
371 if (asymbols
!= NULL
&& entry
== NULL
)
377 if (last_file
!= NULL
)
382 if (last_function
!= NULL
)
384 free (last_function
);
385 last_function
= NULL
;
392 /* arbitrary string, like printf */
393 fprintf (fp
, "%s", va_arg (arg
, char *));
397 /* integer, like printf */
398 fprintf (fp
, "%d", va_arg (arg
, int));
402 /* unsigned integer, like printf */
403 fprintf (fp
, "%u", va_arg (arg
, unsigned int));
409 fprintf (fp
, "%ld", va_arg (arg
, long));
413 else if (*fmt
== 'u')
415 fprintf (fp
, "%lu", va_arg (arg
, unsigned long));
422 fprintf (fp
, "%%%c", fmt
[-1]);
428 if (is_warning
&& config
.fatal_warnings
)
429 config
.make_executable
= FALSE
;
435 /* Wrapper around cplus_demangle. Strips leading underscores and
436 other such chars that would otherwise confuse the demangler. */
439 demangle (const char *name
)
444 if (output_bfd
!= NULL
445 && bfd_get_symbol_leading_char (output_bfd
) == name
[0])
448 /* This is a hack for better error reporting on XCOFF, PowerPC64-ELF
449 or the MS PE format. These formats have a number of leading '.'s
450 on at least some symbols, so we remove all dots to avoid
451 confusing the demangler. */
456 res
= cplus_demangle (p
, DMGL_ANSI
| DMGL_PARAMS
);
459 size_t dots
= p
- name
;
461 /* Now put back any stripped dots. */
464 size_t len
= strlen (res
) + 1;
465 char *add_dots
= xmalloc (len
+ dots
);
467 memcpy (add_dots
, name
, dots
);
468 memcpy (add_dots
+ dots
, res
, len
);
474 return xstrdup (name
);
477 /* Format info message and print on stdout. */
479 /* (You would think this should be called just "info", but then you
480 would be hosed by LynxOS, which defines that name in its libc.) */
483 info_msg (const char *fmt
, ...)
488 vfinfo (stdout
, fmt
, arg
, FALSE
);
492 /* ('e' for error.) Format info message and print on stderr. */
495 einfo (const char *fmt
, ...)
500 vfinfo (stderr
, fmt
, arg
, TRUE
);
505 info_assert (const char *file
, unsigned int line
)
507 einfo (_("%F%P: internal error %s %d\n"), file
, line
);
510 /* ('m' for map) Format info message and print on map. */
513 minfo (const char *fmt
, ...)
518 vfinfo (config
.map_file
, fmt
, arg
, FALSE
);
523 lfinfo (FILE *file
, const char *fmt
, ...)
528 vfinfo (file
, fmt
, arg
, FALSE
);
532 /* Functions to print the link map. */
537 fprintf (config
.map_file
, " ");
543 fprintf (config
.map_file
, "\n");
546 /* A more or less friendly abort message. In ld.h abort is defined to
547 call this function. */
550 ld_abort (const char *file
, int line
, const char *fn
)
553 einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
556 einfo (_("%P: internal error: aborting at %s line %d\n"),
558 einfo (_("%P%F: please report this bug\n"));