2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005
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, 59 Temple Place - Suite 330, 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
58 %s arbitrary string, like printf
59 %u integer, like printf
60 %v hex bfd_vma, no leading zeros
64 vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
66 bfd_boolean fatal = FALSE;
70 while (*fmt != '%' && *fmt != '\0')
82 fprintf (fp, "%%%c", fmt[-1]);
91 /* no object output, fail return */
92 config.make_executable = FALSE;
98 bfd_vma value = va_arg (arg, bfd_vma);
99 fprintf_vma (fp, value);
104 /* hex bfd_vma, no leading zeros */
108 bfd_vma value = va_arg (arg, bfd_vma);
109 sprintf_vma (p, value);
119 /* hex bfd_vma with 0x with no leading zeroes taking up
127 value = va_arg (arg, bfd_vma);
128 sprintf_vma (buf, value);
129 for (p = buf; *p == '0'; ++p)
139 fprintf (fp, "0x%s", p);
146 const char *name = va_arg (arg, const char *);
148 if (name == NULL || *name == 0)
149 fprintf (fp, _("no symbol"));
150 else if (! demangling)
151 fprintf (fp, "%s", name);
156 demangled = demangle (name);
157 fprintf (fp, "%s", demangled);
164 /* section name from a section */
166 asection *sec = va_arg (arg, asection *);
167 bfd *abfd = sec->owner;
168 const char *group = NULL;
169 struct coff_comdat_info *ci;
171 fprintf (fp, "%s", sec->name);
173 && bfd_get_flavour (abfd) == bfd_target_elf_flavour
174 && elf_next_in_group (sec) != NULL
175 && (sec->flags & SEC_GROUP) == 0)
176 group = elf_group_name (sec);
177 else if (abfd != NULL
178 && bfd_get_flavour (abfd) == bfd_target_coff_flavour
179 && (ci = bfd_coff_get_comdat_section (sec->owner,
183 fprintf (fp, "[%s]", group);
188 /* filename from a bfd */
190 bfd *abfd = va_arg (arg, bfd *);
193 fprintf (fp, "<none>");
194 else if (abfd->my_archive)
195 fprintf (fp, "%s(%s)", abfd->my_archive->filename,
198 fprintf (fp, "%s", abfd->filename);
203 /* Error is fatal. */
208 /* Print program name. */
209 fprintf (fp, "%s", program_name);
213 /* current bfd error or errno */
214 fprintf (fp, "%s", bfd_errmsg (bfd_get_error ()));
218 /* filename from a lang_input_statement_type */
220 lang_input_statement_type *i;
222 i = va_arg (arg, lang_input_statement_type *);
223 if (bfd_my_archive (i->the_bfd) != NULL)
225 bfd_get_filename (bfd_my_archive (i->the_bfd)));
226 fprintf (fp, "%s", i->local_sym_name);
227 if (bfd_my_archive (i->the_bfd) == NULL
228 && strcmp (i->local_sym_name, i->filename) != 0)
229 fprintf (fp, " (%s)", i->filename);
234 /* Print script file and linenumber. */
236 fprintf (fp, "--defsym %s", lex_string);
237 else if (ldfile_input_filename != NULL)
238 fprintf (fp, "%s:%u", ldfile_input_filename, lineno);
240 fprintf (fp, _("built in linker script:%u"), lineno);
244 /* Print all that's interesting about a relent. */
246 arelent *relent = va_arg (arg, arelent *);
248 lfinfo (fp, "%s+0x%v (type %s)",
249 (*(relent->sym_ptr_ptr))->name,
251 relent->howto->name);
258 /* Clever filename:linenumber with function name if possible.
259 The arguments are a BFD, a section, and an offset. */
261 static bfd *last_bfd;
262 static char *last_file = NULL;
263 static char *last_function = NULL;
267 lang_input_statement_type *entry;
269 const char *filename;
270 const char *functionname;
271 unsigned int linenumber;
272 bfd_boolean discard_last;
274 abfd = va_arg (arg, bfd *);
275 section = va_arg (arg, asection *);
276 offset = va_arg (arg, bfd_vma);
278 entry = (lang_input_statement_type *) abfd->usrdata;
279 if (entry != (lang_input_statement_type *) NULL
280 && entry->asymbols != (asymbol **) NULL)
281 asymbols = entry->asymbols;
287 symsize = bfd_get_symtab_upper_bound (abfd);
289 einfo (_("%B%F: could not read symbols\n"), abfd);
290 asymbols = xmalloc (symsize);
291 symbol_count = bfd_canonicalize_symtab (abfd, asymbols);
292 if (symbol_count < 0)
293 einfo (_("%B%F: could not read symbols\n"), abfd);
294 if (entry != (lang_input_statement_type *) NULL)
296 entry->asymbols = asymbols;
297 entry->symbol_count = symbol_count;
301 /* The GNU Coding Standard requires that error messages be of the form:
303 source-file-name:lineno: message
305 We do not always have a line number available so if we cannot find
306 them we print out the section name and offset instread. */
308 if (bfd_find_nearest_line (abfd, section, asymbols, offset,
309 &filename, &functionname,
312 if (functionname != NULL && fmt[-1] == 'C')
314 /* Detect the case where we are printing out a message
315 for the same function as the last call to vinfo ("%C").
316 In this situation do not print out the ABFD filename
317 or the function name again. Note - we do still print
318 out the source filename, as this will allow programs
319 that parse the linker's output (eg emacs) to correctly
320 locate multiple errors in the same source file. */
323 || last_function == NULL
326 && strcmp (last_file, filename) != 0)
327 || strcmp (last_function, functionname) != 0)
329 lfinfo (fp, _("%B: In function `%T':\n"),
333 if (last_file != NULL)
337 last_file = xstrdup (filename);
338 if (last_function != NULL)
339 free (last_function);
340 last_function = xstrdup (functionname);
342 discard_last = FALSE;
345 lfinfo (fp, "%B:", abfd);
347 if (filename != NULL)
348 fprintf (fp, "%s:", filename);
350 if (functionname != NULL && fmt[-1] == 'G')
351 lfinfo (fp, "%T", functionname);
352 else if (filename != NULL)
355 fprintf (fp, "%u", linenumber);
357 lfinfo (fp, "(%A+0x%v)", section, offset);
361 lfinfo (fp, "%B:(%A+0x%v)", abfd, section, offset);
363 if (asymbols != NULL && entry == NULL)
369 if (last_file != NULL)
374 if (last_function != NULL)
376 free (last_function);
377 last_function = NULL;
384 /* arbitrary string, like printf */
385 fprintf (fp, "%s", va_arg (arg, char *));
389 /* integer, like printf */
390 fprintf (fp, "%d", va_arg (arg, int));
394 /* unsigned integer, like printf */
395 fprintf (fp, "%u", va_arg (arg, unsigned int));
401 if (is_warning && config.fatal_warnings)
402 config.make_executable = FALSE;
408 /* Wrapper around cplus_demangle. Strips leading underscores and
409 other such chars that would otherwise confuse the demangler. */
412 demangle (const char *name)
417 if (output_bfd != NULL
418 && bfd_get_symbol_leading_char (output_bfd) == name[0])
421 /* This is a hack for better error reporting on XCOFF, PowerPC64-ELF
422 or the MS PE format. These formats have a number of leading '.'s
423 on at least some symbols, so we remove all dots to avoid
424 confusing the demangler. */
429 res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS);
432 size_t dots = p - name;
434 /* Now put back any stripped dots. */
437 size_t len = strlen (res) + 1;
438 char *add_dots = xmalloc (len + dots);
440 memcpy (add_dots, name, dots);
441 memcpy (add_dots + dots, res, len);
447 return xstrdup (name);
450 /* Format info message and print on stdout. */
452 /* (You would think this should be called just "info", but then you
453 would be hosed by LynxOS, which defines that name in its libc.) */
456 info_msg (const char *fmt, ...)
461 vfinfo (stdout, fmt, arg, FALSE);
465 /* ('e' for error.) Format info message and print on stderr. */
468 einfo (const char *fmt, ...)
473 vfinfo (stderr, fmt, arg, TRUE);
478 info_assert (const char *file, unsigned int line)
480 einfo (_("%F%P: internal error %s %d\n"), file, line);
483 /* ('m' for map) Format info message and print on map. */
486 minfo (const char *fmt, ...)
491 vfinfo (config.map_file, fmt, arg, FALSE);
496 lfinfo (FILE *file, const char *fmt, ...)
501 vfinfo (file, fmt, arg, FALSE);
505 /* Functions to print the link map. */
510 fprintf (config.map_file, " ");
516 fprintf (config.map_file, "\n");
519 /* A more or less friendly abort message. In ld.h abort is defined to
520 call this function. */
523 ld_abort (const char *file, int line, const char *fn)
526 einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
529 einfo (_("%P: internal error: aborting at %s line %d\n"),
531 einfo (_("%P%F: please report this bug\n"));