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