1*a9fa9459Szrj /* ldmisc.c
2*a9fa9459Szrj Copyright (C) 1991-2016 Free Software Foundation, Inc.
3*a9fa9459Szrj Written by Steve Chamberlain of Cygnus Support.
4*a9fa9459Szrj
5*a9fa9459Szrj This file is part of the GNU Binutils.
6*a9fa9459Szrj
7*a9fa9459Szrj This program is free software; you can redistribute it and/or modify
8*a9fa9459Szrj it under the terms of the GNU General Public License as published by
9*a9fa9459Szrj the Free Software Foundation; either version 3 of the License, or
10*a9fa9459Szrj (at your option) any later version.
11*a9fa9459Szrj
12*a9fa9459Szrj This program is distributed in the hope that it will be useful,
13*a9fa9459Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
14*a9fa9459Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*a9fa9459Szrj GNU General Public License for more details.
16*a9fa9459Szrj
17*a9fa9459Szrj You should have received a copy of the GNU General Public License
18*a9fa9459Szrj along with this program; if not, write to the Free Software
19*a9fa9459Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20*a9fa9459Szrj MA 02110-1301, USA. */
21*a9fa9459Szrj
22*a9fa9459Szrj #include "sysdep.h"
23*a9fa9459Szrj #include "bfd.h"
24*a9fa9459Szrj #include "bfdlink.h"
25*a9fa9459Szrj #include "libiberty.h"
26*a9fa9459Szrj #include "filenames.h"
27*a9fa9459Szrj #include "demangle.h"
28*a9fa9459Szrj #include <stdarg.h>
29*a9fa9459Szrj #include "ld.h"
30*a9fa9459Szrj #include "ldmisc.h"
31*a9fa9459Szrj #include "ldexp.h"
32*a9fa9459Szrj #include "ldlang.h"
33*a9fa9459Szrj #include <ldgram.h>
34*a9fa9459Szrj #include "ldlex.h"
35*a9fa9459Szrj #include "ldmain.h"
36*a9fa9459Szrj #include "ldfile.h"
37*a9fa9459Szrj #include "elf-bfd.h"
38*a9fa9459Szrj #include "coff-bfd.h"
39*a9fa9459Szrj
40*a9fa9459Szrj /*
41*a9fa9459Szrj %% literal %
42*a9fa9459Szrj %A section name from a section
43*a9fa9459Szrj %B filename from a bfd
44*a9fa9459Szrj %C clever filename:linenumber with function
45*a9fa9459Szrj %D like %C, but no function name
46*a9fa9459Szrj %E current bfd error or errno
47*a9fa9459Szrj %F error is fatal
48*a9fa9459Szrj %G like %D, but only function name
49*a9fa9459Szrj %H like %C but in addition emit section+offset
50*a9fa9459Szrj %I filename from a lang_input_statement_type
51*a9fa9459Szrj %P print program name
52*a9fa9459Szrj %R info about a relent
53*a9fa9459Szrj %S print script file and linenumber from etree_type.
54*a9fa9459Szrj %T symbol name
55*a9fa9459Szrj %V hex bfd_vma
56*a9fa9459Szrj %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces
57*a9fa9459Szrj %X no object output, fail return
58*a9fa9459Szrj %d integer, like printf
59*a9fa9459Szrj %ld long, like printf
60*a9fa9459Szrj %lu unsigned long, like printf
61*a9fa9459Szrj %p native (host) void* pointer, like printf
62*a9fa9459Szrj %s arbitrary string, like printf
63*a9fa9459Szrj %u integer, like printf
64*a9fa9459Szrj %v hex bfd_vma, no leading zeros
65*a9fa9459Szrj */
66*a9fa9459Szrj
67*a9fa9459Szrj void
vfinfo(FILE * fp,const char * fmt,va_list arg,bfd_boolean is_warning)68*a9fa9459Szrj vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
69*a9fa9459Szrj {
70*a9fa9459Szrj bfd_boolean fatal = FALSE;
71*a9fa9459Szrj
72*a9fa9459Szrj while (*fmt != '\0')
73*a9fa9459Szrj {
74*a9fa9459Szrj const char *str = fmt;
75*a9fa9459Szrj while (*fmt != '%' && *fmt != '\0')
76*a9fa9459Szrj fmt++;
77*a9fa9459Szrj if (fmt != str)
78*a9fa9459Szrj if (fwrite (str, 1, fmt - str, fp))
79*a9fa9459Szrj {
80*a9fa9459Szrj /* Ignore. */
81*a9fa9459Szrj }
82*a9fa9459Szrj
83*a9fa9459Szrj if (*fmt == '%')
84*a9fa9459Szrj {
85*a9fa9459Szrj fmt++;
86*a9fa9459Szrj switch (*fmt++)
87*a9fa9459Szrj {
88*a9fa9459Szrj case '%':
89*a9fa9459Szrj /* literal % */
90*a9fa9459Szrj putc ('%', fp);
91*a9fa9459Szrj break;
92*a9fa9459Szrj
93*a9fa9459Szrj case 'X':
94*a9fa9459Szrj /* no object output, fail return */
95*a9fa9459Szrj config.make_executable = FALSE;
96*a9fa9459Szrj break;
97*a9fa9459Szrj
98*a9fa9459Szrj case 'V':
99*a9fa9459Szrj /* hex bfd_vma */
100*a9fa9459Szrj {
101*a9fa9459Szrj bfd_vma value = va_arg (arg, bfd_vma);
102*a9fa9459Szrj fprintf_vma (fp, value);
103*a9fa9459Szrj }
104*a9fa9459Szrj break;
105*a9fa9459Szrj
106*a9fa9459Szrj case 'v':
107*a9fa9459Szrj /* hex bfd_vma, no leading zeros */
108*a9fa9459Szrj {
109*a9fa9459Szrj char buf[100];
110*a9fa9459Szrj char *p = buf;
111*a9fa9459Szrj bfd_vma value = va_arg (arg, bfd_vma);
112*a9fa9459Szrj sprintf_vma (p, value);
113*a9fa9459Szrj while (*p == '0')
114*a9fa9459Szrj p++;
115*a9fa9459Szrj if (!*p)
116*a9fa9459Szrj p--;
117*a9fa9459Szrj fputs (p, fp);
118*a9fa9459Szrj }
119*a9fa9459Szrj break;
120*a9fa9459Szrj
121*a9fa9459Szrj case 'W':
122*a9fa9459Szrj /* hex bfd_vma with 0x with no leading zeroes taking up
123*a9fa9459Szrj 8 spaces. */
124*a9fa9459Szrj {
125*a9fa9459Szrj char buf[100];
126*a9fa9459Szrj bfd_vma value;
127*a9fa9459Szrj char *p;
128*a9fa9459Szrj int len;
129*a9fa9459Szrj
130*a9fa9459Szrj value = va_arg (arg, bfd_vma);
131*a9fa9459Szrj sprintf_vma (buf, value);
132*a9fa9459Szrj for (p = buf; *p == '0'; ++p)
133*a9fa9459Szrj ;
134*a9fa9459Szrj if (*p == '\0')
135*a9fa9459Szrj --p;
136*a9fa9459Szrj len = strlen (p);
137*a9fa9459Szrj while (len < 8)
138*a9fa9459Szrj {
139*a9fa9459Szrj putc (' ', fp);
140*a9fa9459Szrj ++len;
141*a9fa9459Szrj }
142*a9fa9459Szrj fprintf (fp, "0x%s", p);
143*a9fa9459Szrj }
144*a9fa9459Szrj break;
145*a9fa9459Szrj
146*a9fa9459Szrj case 'T':
147*a9fa9459Szrj /* Symbol name. */
148*a9fa9459Szrj {
149*a9fa9459Szrj const char *name = va_arg (arg, const char *);
150*a9fa9459Szrj
151*a9fa9459Szrj if (name == NULL || *name == 0)
152*a9fa9459Szrj {
153*a9fa9459Szrj fprintf (fp, _("no symbol"));
154*a9fa9459Szrj break;
155*a9fa9459Szrj }
156*a9fa9459Szrj else if (demangling)
157*a9fa9459Szrj {
158*a9fa9459Szrj char *demangled;
159*a9fa9459Szrj
160*a9fa9459Szrj demangled = bfd_demangle (link_info.output_bfd, name,
161*a9fa9459Szrj DMGL_ANSI | DMGL_PARAMS);
162*a9fa9459Szrj if (demangled != NULL)
163*a9fa9459Szrj {
164*a9fa9459Szrj fprintf (fp, "%s", demangled);
165*a9fa9459Szrj free (demangled);
166*a9fa9459Szrj break;
167*a9fa9459Szrj }
168*a9fa9459Szrj }
169*a9fa9459Szrj fprintf (fp, "%s", name);
170*a9fa9459Szrj }
171*a9fa9459Szrj break;
172*a9fa9459Szrj
173*a9fa9459Szrj case 'A':
174*a9fa9459Szrj /* section name from a section */
175*a9fa9459Szrj {
176*a9fa9459Szrj asection *sec = va_arg (arg, asection *);
177*a9fa9459Szrj bfd *abfd = sec->owner;
178*a9fa9459Szrj const char *group = NULL;
179*a9fa9459Szrj struct coff_comdat_info *ci;
180*a9fa9459Szrj
181*a9fa9459Szrj fprintf (fp, "%s", sec->name);
182*a9fa9459Szrj if (abfd != NULL
183*a9fa9459Szrj && bfd_get_flavour (abfd) == bfd_target_elf_flavour
184*a9fa9459Szrj && elf_next_in_group (sec) != NULL
185*a9fa9459Szrj && (sec->flags & SEC_GROUP) == 0)
186*a9fa9459Szrj group = elf_group_name (sec);
187*a9fa9459Szrj else if (abfd != NULL
188*a9fa9459Szrj && bfd_get_flavour (abfd) == bfd_target_coff_flavour
189*a9fa9459Szrj && (ci = bfd_coff_get_comdat_section (sec->owner,
190*a9fa9459Szrj sec)) != NULL)
191*a9fa9459Szrj group = ci->name;
192*a9fa9459Szrj if (group != NULL)
193*a9fa9459Szrj fprintf (fp, "[%s]", group);
194*a9fa9459Szrj }
195*a9fa9459Szrj break;
196*a9fa9459Szrj
197*a9fa9459Szrj case 'B':
198*a9fa9459Szrj /* filename from a bfd */
199*a9fa9459Szrj {
200*a9fa9459Szrj bfd *abfd = va_arg (arg, bfd *);
201*a9fa9459Szrj
202*a9fa9459Szrj if (abfd == NULL)
203*a9fa9459Szrj fprintf (fp, "%s generated", program_name);
204*a9fa9459Szrj else if (abfd->my_archive != NULL
205*a9fa9459Szrj && !bfd_is_thin_archive (abfd->my_archive))
206*a9fa9459Szrj fprintf (fp, "%s(%s)", abfd->my_archive->filename,
207*a9fa9459Szrj abfd->filename);
208*a9fa9459Szrj else
209*a9fa9459Szrj fprintf (fp, "%s", abfd->filename);
210*a9fa9459Szrj }
211*a9fa9459Szrj break;
212*a9fa9459Szrj
213*a9fa9459Szrj case 'F':
214*a9fa9459Szrj /* Error is fatal. */
215*a9fa9459Szrj fatal = TRUE;
216*a9fa9459Szrj break;
217*a9fa9459Szrj
218*a9fa9459Szrj case 'P':
219*a9fa9459Szrj /* Print program name. */
220*a9fa9459Szrj fprintf (fp, "%s", program_name);
221*a9fa9459Szrj break;
222*a9fa9459Szrj
223*a9fa9459Szrj case 'E':
224*a9fa9459Szrj /* current bfd error or errno */
225*a9fa9459Szrj fprintf (fp, "%s", bfd_errmsg (bfd_get_error ()));
226*a9fa9459Szrj break;
227*a9fa9459Szrj
228*a9fa9459Szrj case 'I':
229*a9fa9459Szrj /* filename from a lang_input_statement_type */
230*a9fa9459Szrj {
231*a9fa9459Szrj lang_input_statement_type *i;
232*a9fa9459Szrj
233*a9fa9459Szrj i = va_arg (arg, lang_input_statement_type *);
234*a9fa9459Szrj if (i->the_bfd->my_archive != NULL
235*a9fa9459Szrj && !bfd_is_thin_archive (i->the_bfd->my_archive))
236*a9fa9459Szrj fprintf (fp, "(%s)",
237*a9fa9459Szrj bfd_get_filename (i->the_bfd->my_archive));
238*a9fa9459Szrj fprintf (fp, "%s", i->local_sym_name);
239*a9fa9459Szrj if ((i->the_bfd->my_archive == NULL
240*a9fa9459Szrj || bfd_is_thin_archive (i->the_bfd->my_archive))
241*a9fa9459Szrj && filename_cmp (i->local_sym_name, i->filename) != 0)
242*a9fa9459Szrj fprintf (fp, " (%s)", i->filename);
243*a9fa9459Szrj }
244*a9fa9459Szrj break;
245*a9fa9459Szrj
246*a9fa9459Szrj case 'S':
247*a9fa9459Szrj /* Print script file and linenumber. */
248*a9fa9459Szrj {
249*a9fa9459Szrj etree_type node;
250*a9fa9459Szrj etree_type *tp = va_arg (arg, etree_type *);
251*a9fa9459Szrj
252*a9fa9459Szrj if (tp == NULL)
253*a9fa9459Szrj {
254*a9fa9459Szrj tp = &node;
255*a9fa9459Szrj tp->type.filename = ldlex_filename ();
256*a9fa9459Szrj tp->type.lineno = lineno;
257*a9fa9459Szrj }
258*a9fa9459Szrj if (tp->type.filename != NULL)
259*a9fa9459Szrj fprintf (fp, "%s:%u", tp->type.filename, tp->type.lineno);
260*a9fa9459Szrj }
261*a9fa9459Szrj break;
262*a9fa9459Szrj
263*a9fa9459Szrj case 'R':
264*a9fa9459Szrj /* Print all that's interesting about a relent. */
265*a9fa9459Szrj {
266*a9fa9459Szrj arelent *relent = va_arg (arg, arelent *);
267*a9fa9459Szrj
268*a9fa9459Szrj lfinfo (fp, "%s+0x%v (type %s)",
269*a9fa9459Szrj (*(relent->sym_ptr_ptr))->name,
270*a9fa9459Szrj relent->addend,
271*a9fa9459Szrj relent->howto->name);
272*a9fa9459Szrj }
273*a9fa9459Szrj break;
274*a9fa9459Szrj
275*a9fa9459Szrj case 'C':
276*a9fa9459Szrj case 'D':
277*a9fa9459Szrj case 'G':
278*a9fa9459Szrj case 'H':
279*a9fa9459Szrj /* Clever filename:linenumber with function name if possible.
280*a9fa9459Szrj The arguments are a BFD, a section, and an offset. */
281*a9fa9459Szrj {
282*a9fa9459Szrj static bfd *last_bfd;
283*a9fa9459Szrj static char *last_file = NULL;
284*a9fa9459Szrj static char *last_function = NULL;
285*a9fa9459Szrj bfd *abfd;
286*a9fa9459Szrj asection *section;
287*a9fa9459Szrj bfd_vma offset;
288*a9fa9459Szrj asymbol **asymbols = NULL;
289*a9fa9459Szrj const char *filename;
290*a9fa9459Szrj const char *functionname;
291*a9fa9459Szrj unsigned int linenumber;
292*a9fa9459Szrj bfd_boolean discard_last;
293*a9fa9459Szrj bfd_boolean done;
294*a9fa9459Szrj
295*a9fa9459Szrj abfd = va_arg (arg, bfd *);
296*a9fa9459Szrj section = va_arg (arg, asection *);
297*a9fa9459Szrj offset = va_arg (arg, bfd_vma);
298*a9fa9459Szrj
299*a9fa9459Szrj if (abfd != NULL)
300*a9fa9459Szrj {
301*a9fa9459Szrj if (!bfd_generic_link_read_symbols (abfd))
302*a9fa9459Szrj einfo (_("%B%F: could not read symbols: %E\n"), abfd);
303*a9fa9459Szrj
304*a9fa9459Szrj asymbols = bfd_get_outsymbols (abfd);
305*a9fa9459Szrj }
306*a9fa9459Szrj
307*a9fa9459Szrj /* The GNU Coding Standard requires that error messages
308*a9fa9459Szrj be of the form:
309*a9fa9459Szrj
310*a9fa9459Szrj source-file-name:lineno: message
311*a9fa9459Szrj
312*a9fa9459Szrj We do not always have a line number available so if
313*a9fa9459Szrj we cannot find them we print out the section name and
314*a9fa9459Szrj offset instead. */
315*a9fa9459Szrj discard_last = TRUE;
316*a9fa9459Szrj if (abfd != NULL
317*a9fa9459Szrj && bfd_find_nearest_line (abfd, section, asymbols, offset,
318*a9fa9459Szrj &filename, &functionname,
319*a9fa9459Szrj &linenumber))
320*a9fa9459Szrj {
321*a9fa9459Szrj if (functionname != NULL
322*a9fa9459Szrj && (fmt[-1] == 'C' || fmt[-1] == 'H'))
323*a9fa9459Szrj {
324*a9fa9459Szrj /* Detect the case where we are printing out a
325*a9fa9459Szrj message for the same function as the last
326*a9fa9459Szrj call to vinfo ("%C"). In this situation do
327*a9fa9459Szrj not print out the ABFD filename or the
328*a9fa9459Szrj function name again. Note - we do still
329*a9fa9459Szrj print out the source filename, as this will
330*a9fa9459Szrj allow programs that parse the linker's output
331*a9fa9459Szrj (eg emacs) to correctly locate multiple
332*a9fa9459Szrj errors in the same source file. */
333*a9fa9459Szrj if (last_bfd == NULL
334*a9fa9459Szrj || last_file == NULL
335*a9fa9459Szrj || last_function == NULL
336*a9fa9459Szrj || last_bfd != abfd
337*a9fa9459Szrj || (filename != NULL
338*a9fa9459Szrj && filename_cmp (last_file, filename) != 0)
339*a9fa9459Szrj || strcmp (last_function, functionname) != 0)
340*a9fa9459Szrj {
341*a9fa9459Szrj lfinfo (fp, _("%B: In function `%T':\n"),
342*a9fa9459Szrj abfd, functionname);
343*a9fa9459Szrj
344*a9fa9459Szrj last_bfd = abfd;
345*a9fa9459Szrj if (last_file != NULL)
346*a9fa9459Szrj free (last_file);
347*a9fa9459Szrj last_file = NULL;
348*a9fa9459Szrj if (filename)
349*a9fa9459Szrj last_file = xstrdup (filename);
350*a9fa9459Szrj if (last_function != NULL)
351*a9fa9459Szrj free (last_function);
352*a9fa9459Szrj last_function = xstrdup (functionname);
353*a9fa9459Szrj }
354*a9fa9459Szrj discard_last = FALSE;
355*a9fa9459Szrj }
356*a9fa9459Szrj else
357*a9fa9459Szrj lfinfo (fp, "%B:", abfd);
358*a9fa9459Szrj
359*a9fa9459Szrj if (filename != NULL)
360*a9fa9459Szrj fprintf (fp, "%s:", filename);
361*a9fa9459Szrj
362*a9fa9459Szrj done = fmt[-1] != 'H';
363*a9fa9459Szrj if (functionname != NULL && fmt[-1] == 'G')
364*a9fa9459Szrj lfinfo (fp, "%T", functionname);
365*a9fa9459Szrj else if (filename != NULL && linenumber != 0)
366*a9fa9459Szrj fprintf (fp, "%u%s", linenumber, done ? "" : ":");
367*a9fa9459Szrj else
368*a9fa9459Szrj done = FALSE;
369*a9fa9459Szrj }
370*a9fa9459Szrj else
371*a9fa9459Szrj {
372*a9fa9459Szrj lfinfo (fp, "%B:", abfd);
373*a9fa9459Szrj done = FALSE;
374*a9fa9459Szrj }
375*a9fa9459Szrj if (!done)
376*a9fa9459Szrj lfinfo (fp, "(%A+0x%v)", section, offset);
377*a9fa9459Szrj
378*a9fa9459Szrj if (discard_last)
379*a9fa9459Szrj {
380*a9fa9459Szrj last_bfd = NULL;
381*a9fa9459Szrj if (last_file != NULL)
382*a9fa9459Szrj {
383*a9fa9459Szrj free (last_file);
384*a9fa9459Szrj last_file = NULL;
385*a9fa9459Szrj }
386*a9fa9459Szrj if (last_function != NULL)
387*a9fa9459Szrj {
388*a9fa9459Szrj free (last_function);
389*a9fa9459Szrj last_function = NULL;
390*a9fa9459Szrj }
391*a9fa9459Szrj }
392*a9fa9459Szrj }
393*a9fa9459Szrj break;
394*a9fa9459Szrj
395*a9fa9459Szrj case 'p':
396*a9fa9459Szrj /* native (host) void* pointer, like printf */
397*a9fa9459Szrj fprintf (fp, "%p", va_arg (arg, void *));
398*a9fa9459Szrj break;
399*a9fa9459Szrj
400*a9fa9459Szrj case 's':
401*a9fa9459Szrj /* arbitrary string, like printf */
402*a9fa9459Szrj fprintf (fp, "%s", va_arg (arg, char *));
403*a9fa9459Szrj break;
404*a9fa9459Szrj
405*a9fa9459Szrj case 'd':
406*a9fa9459Szrj /* integer, like printf */
407*a9fa9459Szrj fprintf (fp, "%d", va_arg (arg, int));
408*a9fa9459Szrj break;
409*a9fa9459Szrj
410*a9fa9459Szrj case 'u':
411*a9fa9459Szrj /* unsigned integer, like printf */
412*a9fa9459Szrj fprintf (fp, "%u", va_arg (arg, unsigned int));
413*a9fa9459Szrj break;
414*a9fa9459Szrj
415*a9fa9459Szrj case 'l':
416*a9fa9459Szrj if (*fmt == 'd')
417*a9fa9459Szrj {
418*a9fa9459Szrj fprintf (fp, "%ld", va_arg (arg, long));
419*a9fa9459Szrj ++fmt;
420*a9fa9459Szrj break;
421*a9fa9459Szrj }
422*a9fa9459Szrj else if (*fmt == 'u')
423*a9fa9459Szrj {
424*a9fa9459Szrj fprintf (fp, "%lu", va_arg (arg, unsigned long));
425*a9fa9459Szrj ++fmt;
426*a9fa9459Szrj break;
427*a9fa9459Szrj }
428*a9fa9459Szrj /* Fall thru */
429*a9fa9459Szrj
430*a9fa9459Szrj default:
431*a9fa9459Szrj fprintf (fp, "%%%c", fmt[-1]);
432*a9fa9459Szrj break;
433*a9fa9459Szrj }
434*a9fa9459Szrj }
435*a9fa9459Szrj }
436*a9fa9459Szrj
437*a9fa9459Szrj if (is_warning && config.fatal_warnings)
438*a9fa9459Szrj config.make_executable = FALSE;
439*a9fa9459Szrj
440*a9fa9459Szrj if (fatal)
441*a9fa9459Szrj xexit (1);
442*a9fa9459Szrj }
443*a9fa9459Szrj
444*a9fa9459Szrj /* Format info message and print on stdout. */
445*a9fa9459Szrj
446*a9fa9459Szrj /* (You would think this should be called just "info", but then you
447*a9fa9459Szrj would be hosed by LynxOS, which defines that name in its libc.) */
448*a9fa9459Szrj
449*a9fa9459Szrj void
info_msg(const char * fmt,...)450*a9fa9459Szrj info_msg (const char *fmt, ...)
451*a9fa9459Szrj {
452*a9fa9459Szrj va_list arg;
453*a9fa9459Szrj
454*a9fa9459Szrj va_start (arg, fmt);
455*a9fa9459Szrj vfinfo (stdout, fmt, arg, FALSE);
456*a9fa9459Szrj va_end (arg);
457*a9fa9459Szrj }
458*a9fa9459Szrj
459*a9fa9459Szrj /* ('e' for error.) Format info message and print on stderr. */
460*a9fa9459Szrj
461*a9fa9459Szrj void
einfo(const char * fmt,...)462*a9fa9459Szrj einfo (const char *fmt, ...)
463*a9fa9459Szrj {
464*a9fa9459Szrj va_list arg;
465*a9fa9459Szrj
466*a9fa9459Szrj fflush (stdout);
467*a9fa9459Szrj va_start (arg, fmt);
468*a9fa9459Szrj vfinfo (stderr, fmt, arg, TRUE);
469*a9fa9459Szrj va_end (arg);
470*a9fa9459Szrj fflush (stderr);
471*a9fa9459Szrj }
472*a9fa9459Szrj
473*a9fa9459Szrj void
info_assert(const char * file,unsigned int line)474*a9fa9459Szrj info_assert (const char *file, unsigned int line)
475*a9fa9459Szrj {
476*a9fa9459Szrj einfo (_("%F%P: internal error %s %d\n"), file, line);
477*a9fa9459Szrj }
478*a9fa9459Szrj
479*a9fa9459Szrj /* ('m' for map) Format info message and print on map. */
480*a9fa9459Szrj
481*a9fa9459Szrj void
minfo(const char * fmt,...)482*a9fa9459Szrj minfo (const char *fmt, ...)
483*a9fa9459Szrj {
484*a9fa9459Szrj if (config.map_file != NULL)
485*a9fa9459Szrj {
486*a9fa9459Szrj va_list arg;
487*a9fa9459Szrj
488*a9fa9459Szrj va_start (arg, fmt);
489*a9fa9459Szrj if (fmt[0] == '%' && fmt[1] == '!' && fmt[2] == 0)
490*a9fa9459Szrj {
491*a9fa9459Szrj /* Stash info about --as-needed shared libraries. Print
492*a9fa9459Szrj later so they don't appear intermingled with archive
493*a9fa9459Szrj library info. */
494*a9fa9459Szrj struct asneeded_minfo *m = xmalloc (sizeof *m);
495*a9fa9459Szrj
496*a9fa9459Szrj m->next = NULL;
497*a9fa9459Szrj m->soname = va_arg (arg, const char *);
498*a9fa9459Szrj m->ref = va_arg (arg, bfd *);
499*a9fa9459Szrj m->name = va_arg (arg, const char *);
500*a9fa9459Szrj *asneeded_list_tail = m;
501*a9fa9459Szrj asneeded_list_tail = &m->next;
502*a9fa9459Szrj }
503*a9fa9459Szrj else
504*a9fa9459Szrj vfinfo (config.map_file, fmt, arg, FALSE);
505*a9fa9459Szrj va_end (arg);
506*a9fa9459Szrj }
507*a9fa9459Szrj }
508*a9fa9459Szrj
509*a9fa9459Szrj void
lfinfo(FILE * file,const char * fmt,...)510*a9fa9459Szrj lfinfo (FILE *file, const char *fmt, ...)
511*a9fa9459Szrj {
512*a9fa9459Szrj va_list arg;
513*a9fa9459Szrj
514*a9fa9459Szrj va_start (arg, fmt);
515*a9fa9459Szrj vfinfo (file, fmt, arg, FALSE);
516*a9fa9459Szrj va_end (arg);
517*a9fa9459Szrj }
518*a9fa9459Szrj
519*a9fa9459Szrj /* Functions to print the link map. */
520*a9fa9459Szrj
521*a9fa9459Szrj void
print_space(void)522*a9fa9459Szrj print_space (void)
523*a9fa9459Szrj {
524*a9fa9459Szrj fprintf (config.map_file, " ");
525*a9fa9459Szrj }
526*a9fa9459Szrj
527*a9fa9459Szrj void
print_nl(void)528*a9fa9459Szrj print_nl (void)
529*a9fa9459Szrj {
530*a9fa9459Szrj fprintf (config.map_file, "\n");
531*a9fa9459Szrj }
532*a9fa9459Szrj
533*a9fa9459Szrj /* A more or less friendly abort message. In ld.h abort is defined to
534*a9fa9459Szrj call this function. */
535*a9fa9459Szrj
536*a9fa9459Szrj void
ld_abort(const char * file,int line,const char * fn)537*a9fa9459Szrj ld_abort (const char *file, int line, const char *fn)
538*a9fa9459Szrj {
539*a9fa9459Szrj if (fn != NULL)
540*a9fa9459Szrj einfo (_("%P: internal error: aborting at %s:%d in %s\n"),
541*a9fa9459Szrj file, line, fn);
542*a9fa9459Szrj else
543*a9fa9459Szrj einfo (_("%P: internal error: aborting at %s:%d\n"),
544*a9fa9459Szrj file, line);
545*a9fa9459Szrj einfo (_("%P%F: please report this bug\n"));
546*a9fa9459Szrj xexit (1);
547*a9fa9459Szrj }
548