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