2006-03-31 Andrew Stubbs <andrew.stubbs@st.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,
aef6203b 3 2001, 2002, 2003, 2004, 2005
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
RH
23
24#include "bfd.h"
6f6f27f8 25#include "bfdlink.h"
252b5132
RH
26#include "sysdep.h"
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)
252b5132
RH
147 fprintf (fp, _("no symbol"));
148 else if (! demangling)
149 fprintf (fp, "%s", name);
150 else
151 {
152 char *demangled;
153
154 demangled = demangle (name);
155 fprintf (fp, "%s", demangled);
156 free (demangled);
157 }
158 }
159 break;
160
d003868e
AM
161 case 'A':
162 /* section name from a section */
163 {
164 asection *sec = va_arg (arg, asection *);
165 bfd *abfd = sec->owner;
166 const char *group = NULL;
167 struct coff_comdat_info *ci;
168
169 fprintf (fp, "%s", sec->name);
170 if (abfd != NULL
171 && bfd_get_flavour (abfd) == bfd_target_elf_flavour
172 && elf_next_in_group (sec) != NULL
173 && (sec->flags & SEC_GROUP) == 0)
174 group = elf_group_name (sec);
175 else if (abfd != NULL
176 && bfd_get_flavour (abfd) == bfd_target_coff_flavour
177 && (ci = bfd_coff_get_comdat_section (sec->owner,
178 sec)) != NULL)
179 group = ci->name;
180 if (group != NULL)
181 fprintf (fp, "[%s]", group);
182 }
183 break;
184
252b5132
RH
185 case 'B':
186 /* filename from a bfd */
6d5e62f8 187 {
252b5132 188 bfd *abfd = va_arg (arg, bfd *);
f2763b01
NC
189
190 if (abfd == NULL)
e1fffbe6 191 fprintf (fp, "%s generated", program_name);
f2763b01 192 else if (abfd->my_archive)
252b5132
RH
193 fprintf (fp, "%s(%s)", abfd->my_archive->filename,
194 abfd->filename);
195 else
196 fprintf (fp, "%s", abfd->filename);
197 }
198 break;
199
200 case 'F':
6d5e62f8 201 /* Error is fatal. */
b34976b6 202 fatal = TRUE;
252b5132
RH
203 break;
204
205 case 'P':
6d5e62f8 206 /* Print program name. */
252b5132
RH
207 fprintf (fp, "%s", program_name);
208 break;
209
210 case 'E':
211 /* current bfd error or errno */
305c7206 212 fprintf (fp, "%s", bfd_errmsg (bfd_get_error ()));
252b5132
RH
213 break;
214
215 case 'I':
216 /* filename from a lang_input_statement_type */
217 {
218 lang_input_statement_type *i;
219
220 i = va_arg (arg, lang_input_statement_type *);
221 if (bfd_my_archive (i->the_bfd) != NULL)
222 fprintf (fp, "(%s)",
223 bfd_get_filename (bfd_my_archive (i->the_bfd)));
224 fprintf (fp, "%s", i->local_sym_name);
225 if (bfd_my_archive (i->the_bfd) == NULL
226 && strcmp (i->local_sym_name, i->filename) != 0)
227 fprintf (fp, " (%s)", i->filename);
228 }
229 break;
230
231 case 'S':
6d5e62f8 232 /* Print script file and linenumber. */
252b5132
RH
233 if (parsing_defsym)
234 fprintf (fp, "--defsym %s", lex_string);
235 else if (ldfile_input_filename != NULL)
236 fprintf (fp, "%s:%u", ldfile_input_filename, lineno);
237 else
238 fprintf (fp, _("built in linker script:%u"), lineno);
239 break;
240
241 case 'R':
6d5e62f8 242 /* Print all that's interesting about a relent. */
252b5132
RH
243 {
244 arelent *relent = va_arg (arg, arelent *);
6d5e62f8 245
252b5132
RH
246 lfinfo (fp, "%s+0x%v (type %s)",
247 (*(relent->sym_ptr_ptr))->name,
248 relent->addend,
249 relent->howto->name);
250 }
251 break;
6d5e62f8 252
252b5132
RH
253 case 'C':
254 case 'D':
255 case 'G':
5cfb2bb2
AM
256 /* Clever filename:linenumber with function name if possible.
257 The arguments are a BFD, a section, and an offset. */
252b5132
RH
258 {
259 static bfd *last_bfd;
260 static char *last_file = NULL;
261 static char *last_function = NULL;
262 bfd *abfd;
263 asection *section;
264 bfd_vma offset;
265 lang_input_statement_type *entry;
266 asymbol **asymbols;
267 const char *filename;
268 const char *functionname;
269 unsigned int linenumber;
b34976b6 270 bfd_boolean discard_last;
252b5132
RH
271
272 abfd = va_arg (arg, bfd *);
273 section = va_arg (arg, asection *);
274 offset = va_arg (arg, bfd_vma);
275
e1fffbe6
AM
276 if (abfd == NULL)
277 {
278 entry = NULL;
279 asymbols = NULL;
280 }
252b5132
RH
281 else
282 {
e1fffbe6
AM
283 entry = (lang_input_statement_type *) abfd->usrdata;
284 if (entry != (lang_input_statement_type *) NULL
285 && entry->asymbols != (asymbol **) NULL)
286 asymbols = entry->asymbols;
287 else
252b5132 288 {
e1fffbe6
AM
289 long symsize;
290 long sym_count;
291
292 symsize = bfd_get_symtab_upper_bound (abfd);
293 if (symsize < 0)
294 einfo (_("%B%F: could not read symbols\n"), abfd);
295 asymbols = xmalloc (symsize);
296 sym_count = bfd_canonicalize_symtab (abfd, asymbols);
297 if (sym_count < 0)
298 einfo (_("%B%F: could not read symbols\n"), abfd);
299 if (entry != (lang_input_statement_type *) NULL)
300 {
301 entry->asymbols = asymbols;
302 entry->symbol_count = sym_count;
303 }
252b5132
RH
304 }
305 }
306
e1fffbe6
AM
307 /* The GNU Coding Standard requires that error messages
308 be of the form:
98d87ee7
NC
309
310 source-file-name:lineno: message
5cfb2bb2 311
e1fffbe6
AM
312 We do not always have a line number available so if
313 we cannot find them we print out the section name and
314 offset instread. */
b34976b6 315 discard_last = TRUE;
e1fffbe6
AM
316 if (abfd != NULL
317 && bfd_find_nearest_line (abfd, section, asymbols, offset,
318 &filename, &functionname,
319 &linenumber))
252b5132 320 {
5cfb2bb2
AM
321 if (functionname != NULL && fmt[-1] == 'C')
322 {
e1fffbe6
AM
323 /* Detect the case where we are printing out a
324 message for the same function as the last
325 call to vinfo ("%C"). In this situation do
326 not print out the ABFD filename or the
327 function name again. Note - we do still
328 print out the source filename, as this will
329 allow programs that parse the linker's output
330 (eg emacs) to correctly locate multiple
331 errors in the same source file. */
252b5132
RH
332 if (last_bfd == NULL
333 || last_file == NULL
334 || last_function == NULL
335 || last_bfd != abfd
5cfb2bb2
AM
336 || (filename != NULL
337 && strcmp (last_file, filename) != 0)
252b5132
RH
338 || strcmp (last_function, functionname) != 0)
339 {
f0e0fb23 340 lfinfo (fp, _("%B: In function `%T'"),
98d87ee7 341 abfd, functionname);
252b5132
RH
342
343 last_bfd = abfd;
344 if (last_file != NULL)
345 free (last_file);
5cfb2bb2
AM
346 last_file = NULL;
347 if (filename)
348 last_file = xstrdup (filename);
252b5132
RH
349 if (last_function != NULL)
350 free (last_function);
d1b2b2dc 351 last_function = xstrdup (functionname);
252b5132 352 }
b34976b6 353 discard_last = FALSE;
252b5132 354 }
98d87ee7 355 else
f0e0fb23 356 lfinfo (fp, "%B", abfd);
5cfb2bb2
AM
357
358 if (filename != NULL)
f0e0fb23 359 fprintf (fp, ":%s", filename);
5cfb2bb2
AM
360
361 if (functionname != NULL && fmt[-1] == 'G')
f0e0fb23 362 lfinfo (fp, ":%T", functionname);
98d87ee7
NC
363 else if (filename != NULL)
364 {
365 if (linenumber != 0)
f0e0fb23 366 fprintf (fp, ":%u", linenumber);
98d87ee7 367 else
f0e0fb23 368 lfinfo (fp, ":(%A+0x%v)", section, offset);
98d87ee7 369 }
252b5132 370 }
98d87ee7
NC
371 else
372 lfinfo (fp, "%B:(%A+0x%v)", abfd, section, offset);
252b5132 373
5ed6aba4
NC
374 if (asymbols != NULL && entry == NULL)
375 free (asymbols);
376
252b5132
RH
377 if (discard_last)
378 {
379 last_bfd = NULL;
380 if (last_file != NULL)
381 {
382 free (last_file);
383 last_file = NULL;
384 }
385 if (last_function != NULL)
386 {
387 free (last_function);
388 last_function = NULL;
389 }
390 }
391 }
392 break;
6d5e62f8 393
252b5132
RH
394 case 's':
395 /* arbitrary string, like printf */
396 fprintf (fp, "%s", va_arg (arg, char *));
397 break;
398
399 case 'd':
400 /* integer, like printf */
401 fprintf (fp, "%d", va_arg (arg, int));
402 break;
403
404 case 'u':
405 /* unsigned integer, like printf */
406 fprintf (fp, "%u", va_arg (arg, unsigned int));
407 break;
94b50910
AM
408
409 case 'l':
410 if (*fmt == 'd')
411 {
412 fprintf (fp, "%ld", va_arg (arg, long));
413 ++fmt;
414 break;
415 }
416 else if (*fmt == 'u')
417 {
418 fprintf (fp, "%lu", va_arg (arg, unsigned long));
419 ++fmt;
420 break;
421 }
422 /* Fall thru */
423
424 default:
425 fprintf (fp, "%%%c", fmt[-1]);
426 break;
252b5132
RH
427 }
428 }
429 }
430
59ef2528 431 if (is_warning && config.fatal_warnings)
b34976b6 432 config.make_executable = FALSE;
7ce691ae 433
b34976b6 434 if (fatal)
6d5e62f8 435 xexit (1);
252b5132
RH
436}
437
b7b482a3
AM
438/* Wrapper around cplus_demangle. Strips leading underscores and
439 other such chars that would otherwise confuse the demangler. */
440
441char *
1579bae1 442demangle (const char *name)
b7b482a3
AM
443{
444 char *res;
445 const char *p;
446
447 if (output_bfd != NULL
448 && bfd_get_symbol_leading_char (output_bfd) == name[0])
449 ++name;
450
451 /* This is a hack for better error reporting on XCOFF, PowerPC64-ELF
452 or the MS PE format. These formats have a number of leading '.'s
453 on at least some symbols, so we remove all dots to avoid
454 confusing the demangler. */
455 p = name;
456 while (*p == '.')
457 ++p;
458
459 res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS);
460 if (res)
461 {
462 size_t dots = p - name;
463
464 /* Now put back any stripped dots. */
465 if (dots != 0)
466 {
467 size_t len = strlen (res) + 1;
468 char *add_dots = xmalloc (len + dots);
469
470 memcpy (add_dots, name, dots);
471 memcpy (add_dots + dots, res, len);
472 free (res);
473 res = add_dots;
474 }
475 return res;
476 }
477 return xstrdup (name);
478}
479
6d5e62f8 480/* Format info message and print on stdout. */
252b5132
RH
481
482/* (You would think this should be called just "info", but then you
1579bae1 483 would be hosed by LynxOS, which defines that name in its libc.) */
252b5132
RH
484
485void
1579bae1 486info_msg (const char *fmt, ...)
252b5132 487{
1579bae1 488 va_list arg;
252b5132 489
1579bae1 490 va_start (arg, fmt);
59ef2528 491 vfinfo (stdout, fmt, arg, FALSE);
1579bae1 492 va_end (arg);
252b5132
RH
493}
494
6d5e62f8 495/* ('e' for error.) Format info message and print on stderr. */
252b5132
RH
496
497void
1579bae1 498einfo (const char *fmt, ...)
252b5132 499{
1579bae1 500 va_list arg;
252b5132 501
1579bae1 502 va_start (arg, fmt);
59ef2528 503 vfinfo (stderr, fmt, arg, TRUE);
1579bae1 504 va_end (arg);
252b5132
RH
505}
506
6d5e62f8 507void
1579bae1 508info_assert (const char *file, unsigned int line)
252b5132
RH
509{
510 einfo (_("%F%P: internal error %s %d\n"), file, line);
511}
512
6d5e62f8 513/* ('m' for map) Format info message and print on map. */
252b5132
RH
514
515void
1579bae1 516minfo (const char *fmt, ...)
252b5132 517{
1579bae1 518 va_list arg;
252b5132 519
1579bae1 520 va_start (arg, fmt);
59ef2528 521 vfinfo (config.map_file, fmt, arg, FALSE);
1579bae1 522 va_end (arg);
252b5132
RH
523}
524
525void
1579bae1 526lfinfo (FILE *file, const char *fmt, ...)
252b5132 527{
1579bae1 528 va_list arg;
252b5132 529
1579bae1 530 va_start (arg, fmt);
59ef2528 531 vfinfo (file, fmt, arg, FALSE);
1579bae1 532 va_end (arg);
252b5132
RH
533}
534\f
535/* Functions to print the link map. */
536
6d5e62f8 537void
1579bae1 538print_space (void)
252b5132
RH
539{
540 fprintf (config.map_file, " ");
541}
542
6d5e62f8 543void
1579bae1 544print_nl (void)
252b5132
RH
545{
546 fprintf (config.map_file, "\n");
547}
45455cdd
ILT
548
549/* A more or less friendly abort message. In ld.h abort is defined to
550 call this function. */
551
552void
1579bae1 553ld_abort (const char *file, int line, const char *fn)
45455cdd
ILT
554{
555 if (fn != NULL)
556 einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
557 file, line, fn);
558 else
559 einfo (_("%P: internal error: aborting at %s line %d\n"),
560 file, line);
561 einfo (_("%P%F: please report this bug\n"));
562 xexit (1);
563}
This page took 0.356822 seconds and 4 git commands to generate.