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