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