xref: /dflybsd-src/contrib/binutils-2.34/ld/ldmisc.c (revision b52ef7118d1621abed722c5bbbd542210290ecef)
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