2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011, 2012
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"
28 #include "filenames.h"
43 %A section name from a section
44 %B filename from a bfd
45 %C clever filename:linenumber with function
46 %D like %C, but no function name
47 %E current bfd error or errno
49 %G like %D, but only function name
50 %H like %C but in addition emit section+offset
51 %I filename from a lang_input_statement_type
53 %R info about a relent
54 %S print script file and linenumber from etree_type.
57 %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces
58 %X no object output, fail return
59 %d integer, like printf
61 %lu unsigned long, like printf
62 %p native (host) void* pointer, like printf
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 arg, bfd_boolean is_warning)
71 bfd_boolean fatal = FALSE;
75 const char *str = fmt;
76 while (*fmt != '%' && *fmt != '\0')
79 if (fwrite (str, 1, fmt - str, fp))
95 /* no object output, fail return */
96 config.make_executable = FALSE;
102 bfd_vma value = va_arg (arg, bfd_vma);
103 fprintf_vma (fp, value);
108 /* hex bfd_vma, no leading zeros */
112 bfd_vma value = va_arg (arg, bfd_vma);
113 sprintf_vma (p, value);
123 /* hex bfd_vma with 0x with no leading zeroes taking up
131 value = va_arg (arg, bfd_vma);
132 sprintf_vma (buf, value);
133 for (p = buf; *p == '0'; ++p)
143 fprintf (fp, "0x%s", p);
150 const char *name = va_arg (arg, const char *);
152 if (name == NULL || *name == 0)
154 fprintf (fp, _("no symbol"));
161 demangled = bfd_demangle (link_info.output_bfd, name,
162 DMGL_ANSI | DMGL_PARAMS);
163 if (demangled != NULL)
165 fprintf (fp, "%s", demangled);
170 fprintf (fp, "%s", name);
175 /* section name from a section */
177 asection *sec = va_arg (arg, asection *);
178 bfd *abfd = sec->owner;
179 const char *group = NULL;
180 struct coff_comdat_info *ci;
182 fprintf (fp, "%s", sec->name);
184 && bfd_get_flavour (abfd) == bfd_target_elf_flavour
185 && elf_next_in_group (sec) != NULL
186 && (sec->flags & SEC_GROUP) == 0)
187 group = elf_group_name (sec);
188 else if (abfd != NULL
189 && bfd_get_flavour (abfd) == bfd_target_coff_flavour
190 && (ci = bfd_coff_get_comdat_section (sec->owner,
194 fprintf (fp, "[%s]", group);
199 /* filename from a bfd */
201 bfd *abfd = va_arg (arg, bfd *);
204 fprintf (fp, "%s generated", program_name);
205 else if (abfd->my_archive)
206 fprintf (fp, "%s(%s)", abfd->my_archive->filename,
209 fprintf (fp, "%s", abfd->filename);
214 /* Error is fatal. */
219 /* Print program name. */
220 fprintf (fp, "%s", program_name);
224 /* current bfd error or errno */
225 fprintf (fp, "%s", bfd_errmsg (bfd_get_error ()));
229 /* filename from a lang_input_statement_type */
231 lang_input_statement_type *i;
233 i = va_arg (arg, lang_input_statement_type *);
234 if (bfd_my_archive (i->the_bfd) != NULL)
236 bfd_get_filename (bfd_my_archive (i->the_bfd)));
237 fprintf (fp, "%s", i->local_sym_name);
238 if (bfd_my_archive (i->the_bfd) == NULL
239 && filename_cmp (i->local_sym_name, i->filename) != 0)
240 fprintf (fp, " (%s)", i->filename);
245 /* Print script file and linenumber. */
248 etree_type *tp = va_arg (arg, etree_type *);
253 tp->type.filename = ldlex_filename ();
254 tp->type.lineno = lineno;
256 if (tp->type.filename != NULL)
257 fprintf (fp, "%s:%u", tp->type.filename, tp->type.lineno);
262 /* Print all that's interesting about a relent. */
264 arelent *relent = va_arg (arg, arelent *);
266 lfinfo (fp, "%s+0x%v (type %s)",
267 (*(relent->sym_ptr_ptr))->name,
269 relent->howto->name);
277 /* Clever filename:linenumber with function name if possible.
278 The arguments are a BFD, a section, and an offset. */
280 static bfd *last_bfd;
281 static char *last_file = NULL;
282 static char *last_function = NULL;
286 asymbol **asymbols = NULL;
287 const char *filename;
288 const char *functionname;
289 unsigned int linenumber;
290 bfd_boolean discard_last;
293 abfd = va_arg (arg, bfd *);
294 section = va_arg (arg, asection *);
295 offset = va_arg (arg, bfd_vma);
299 if (!bfd_generic_link_read_symbols (abfd))
300 einfo (_("%B%F: could not read symbols: %E\n"), abfd);
302 asymbols = bfd_get_outsymbols (abfd);
305 /* The GNU Coding Standard requires that error messages
308 source-file-name:lineno: message
310 We do not always have a line number available so if
311 we cannot find them we print out the section name and
315 && bfd_find_nearest_line (abfd, section, asymbols, offset,
316 &filename, &functionname,
319 if (functionname != NULL
320 && (fmt[-1] == 'C' || fmt[-1] == 'H'))
322 /* Detect the case where we are printing out a
323 message for the same function as the last
324 call to vinfo ("%C"). In this situation do
325 not print out the ABFD filename or the
326 function name again. Note - we do still
327 print out the source filename, as this will
328 allow programs that parse the linker's output
329 (eg emacs) to correctly locate multiple
330 errors in the same source file. */
333 || last_function == NULL
336 && filename_cmp (last_file, filename) != 0)
337 || strcmp (last_function, functionname) != 0)
339 lfinfo (fp, _("%B: In function `%T':\n"),
343 if (last_file != NULL)
347 last_file = xstrdup (filename);
348 if (last_function != NULL)
349 free (last_function);
350 last_function = xstrdup (functionname);
352 discard_last = FALSE;
355 lfinfo (fp, "%B:", abfd);
357 if (filename != NULL)
358 fprintf (fp, "%s:", filename);
360 done = fmt[-1] != 'H';
361 if (functionname != NULL && fmt[-1] == 'G')
362 lfinfo (fp, "%T", functionname);
363 else if (filename != NULL && linenumber != 0)
364 fprintf (fp, "%u%s", linenumber, ":" + done);
370 lfinfo (fp, "%B:", abfd);
374 lfinfo (fp, "(%A+0x%v)", section, offset);
379 if (last_file != NULL)
384 if (last_function != NULL)
386 free (last_function);
387 last_function = NULL;
394 /* native (host) void* pointer, like printf */
395 fprintf (fp, "%p", va_arg (arg, void *));
399 /* arbitrary string, like printf */
400 fprintf (fp, "%s", va_arg (arg, char *));
404 /* integer, like printf */
405 fprintf (fp, "%d", va_arg (arg, int));
409 /* unsigned integer, like printf */
410 fprintf (fp, "%u", va_arg (arg, unsigned int));
416 fprintf (fp, "%ld", va_arg (arg, long));
420 else if (*fmt == 'u')
422 fprintf (fp, "%lu", va_arg (arg, unsigned long));
429 fprintf (fp, "%%%c", fmt[-1]);
435 if (is_warning && config.fatal_warnings)
436 config.make_executable = FALSE;
442 /* Format info message and print on stdout. */
444 /* (You would think this should be called just "info", but then you
445 would be hosed by LynxOS, which defines that name in its libc.) */
448 info_msg (const char *fmt, ...)
453 vfinfo (stdout, fmt, arg, FALSE);
457 /* ('e' for error.) Format info message and print on stderr. */
460 einfo (const char *fmt, ...)
466 vfinfo (stderr, fmt, arg, TRUE);
472 info_assert (const char *file, unsigned int line)
474 einfo (_("%F%P: internal error %s %d\n"), file, line);
477 /* ('m' for map) Format info message and print on map. */
480 minfo (const char *fmt, ...)
482 if (config.map_file != NULL)
487 vfinfo (config.map_file, fmt, arg, FALSE);
493 lfinfo (FILE *file, const char *fmt, ...)
498 vfinfo (file, fmt, arg, FALSE);
502 /* Functions to print the link map. */
507 fprintf (config.map_file, " ");
513 fprintf (config.map_file, "\n");
516 /* A more or less friendly abort message. In ld.h abort is defined to
517 call this function. */
520 ld_abort (const char *file, int line, const char *fn)
523 einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
526 einfo (_("%P: internal error: aborting at %s line %d\n"),
528 einfo (_("%P%F: please report this bug\n"));