*** empty log message ***
[deliverable/binutils-gdb.git] / ld / ldmisc.c
CommitLineData
252b5132 1/* ldmisc.c
d003868e
AM
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2002, 2003, 2004
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
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, 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
d003868e 58 %s arbitrary string, like printf
252b5132 59 %u integer, like printf
d003868e 60 %v hex bfd_vma, no leading zeros
252b5132
RH
61*/
62
252b5132 63static void
1579bae1 64vfinfo (FILE *fp, const char *fmt, va_list arg)
252b5132 65{
b34976b6 66 bfd_boolean fatal = FALSE;
252b5132
RH
67
68 while (*fmt != '\0')
69 {
6d5e62f8 70 while (*fmt != '%' && *fmt != '\0')
252b5132
RH
71 {
72 putc (*fmt, fp);
73 fmt++;
74 }
75
6d5e62f8 76 if (*fmt == '%')
252b5132 77 {
6d5e62f8
KH
78 fmt++;
79 switch (*fmt++)
252b5132
RH
80 {
81 default:
6d5e62f8 82 fprintf (fp, "%%%c", fmt[-1]);
252b5132
RH
83 break;
84
85 case '%':
86 /* literal % */
87 putc ('%', fp);
88 break;
89
90 case 'X':
91 /* no object output, fail return */
b34976b6 92 config.make_executable = FALSE;
252b5132
RH
93 break;
94
95 case 'V':
96 /* hex bfd_vma */
97 {
98 bfd_vma value = va_arg (arg, bfd_vma);
99 fprintf_vma (fp, value);
100 }
101 break;
102
103 case 'v':
104 /* hex bfd_vma, no leading zeros */
105 {
106 char buf[100];
107 char *p = buf;
108 bfd_vma value = va_arg (arg, bfd_vma);
109 sprintf_vma (p, value);
110 while (*p == '0')
111 p++;
112 if (!*p)
113 p--;
114 fputs (p, fp);
115 }
116 break;
117
118 case 'W':
119 /* hex bfd_vma with 0x with no leading zeroes taking up
1579bae1 120 8 spaces. */
252b5132
RH
121 {
122 char buf[100];
123 bfd_vma value;
124 char *p;
125 int len;
126
127 value = va_arg (arg, bfd_vma);
128 sprintf_vma (buf, value);
129 for (p = buf; *p == '0'; ++p)
130 ;
131 if (*p == '\0')
132 --p;
133 len = strlen (p);
134 while (len < 8)
135 {
136 putc (' ', fp);
137 ++len;
138 }
139 fprintf (fp, "0x%s", p);
140 }
141 break;
142
143 case 'T':
144 /* Symbol name. */
145 {
146 const char *name = va_arg (arg, const char *);
147
1579bae1 148 if (name == NULL || *name == 0)
252b5132
RH
149 fprintf (fp, _("no symbol"));
150 else if (! demangling)
151 fprintf (fp, "%s", name);
152 else
153 {
154 char *demangled;
155
156 demangled = demangle (name);
157 fprintf (fp, "%s", demangled);
158 free (demangled);
159 }
160 }
161 break;
162
d003868e
AM
163 case 'A':
164 /* section name from a section */
165 {
166 asection *sec = va_arg (arg, asection *);
167 bfd *abfd = sec->owner;
168 const char *group = NULL;
169 struct coff_comdat_info *ci;
170
171 fprintf (fp, "%s", sec->name);
172 if (abfd != NULL
173 && bfd_get_flavour (abfd) == bfd_target_elf_flavour
174 && elf_next_in_group (sec) != NULL
175 && (sec->flags & SEC_GROUP) == 0)
176 group = elf_group_name (sec);
177 else if (abfd != NULL
178 && bfd_get_flavour (abfd) == bfd_target_coff_flavour
179 && (ci = bfd_coff_get_comdat_section (sec->owner,
180 sec)) != NULL)
181 group = ci->name;
182 if (group != NULL)
183 fprintf (fp, "[%s]", group);
184 }
185 break;
186
252b5132
RH
187 case 'B':
188 /* filename from a bfd */
6d5e62f8 189 {
252b5132
RH
190 bfd *abfd = va_arg (arg, bfd *);
191 if (abfd->my_archive)
192 fprintf (fp, "%s(%s)", abfd->my_archive->filename,
193 abfd->filename);
194 else
195 fprintf (fp, "%s", abfd->filename);
196 }
197 break;
198
199 case 'F':
6d5e62f8 200 /* Error is fatal. */
b34976b6 201 fatal = TRUE;
252b5132
RH
202 break;
203
204 case 'P':
6d5e62f8 205 /* Print program name. */
252b5132
RH
206 fprintf (fp, "%s", program_name);
207 break;
208
209 case 'E':
210 /* current bfd error or errno */
305c7206 211 fprintf (fp, "%s", bfd_errmsg (bfd_get_error ()));
252b5132
RH
212 break;
213
214 case 'I':
215 /* filename from a lang_input_statement_type */
216 {
217 lang_input_statement_type *i;
218
219 i = va_arg (arg, lang_input_statement_type *);
220 if (bfd_my_archive (i->the_bfd) != NULL)
221 fprintf (fp, "(%s)",
222 bfd_get_filename (bfd_my_archive (i->the_bfd)));
223 fprintf (fp, "%s", i->local_sym_name);
224 if (bfd_my_archive (i->the_bfd) == NULL
225 && strcmp (i->local_sym_name, i->filename) != 0)
226 fprintf (fp, " (%s)", i->filename);
227 }
228 break;
229
230 case 'S':
6d5e62f8 231 /* Print script file and linenumber. */
252b5132
RH
232 if (parsing_defsym)
233 fprintf (fp, "--defsym %s", lex_string);
234 else if (ldfile_input_filename != NULL)
235 fprintf (fp, "%s:%u", ldfile_input_filename, lineno);
236 else
237 fprintf (fp, _("built in linker script:%u"), lineno);
238 break;
239
240 case 'R':
6d5e62f8 241 /* Print all that's interesting about a relent. */
252b5132
RH
242 {
243 arelent *relent = va_arg (arg, arelent *);
6d5e62f8 244
252b5132
RH
245 lfinfo (fp, "%s+0x%v (type %s)",
246 (*(relent->sym_ptr_ptr))->name,
247 relent->addend,
248 relent->howto->name);
249 }
250 break;
6d5e62f8 251
252b5132
RH
252 case 'C':
253 case 'D':
254 case 'G':
5cfb2bb2
AM
255 /* Clever filename:linenumber with function name if possible.
256 The arguments are a BFD, a section, and an offset. */
252b5132
RH
257 {
258 static bfd *last_bfd;
259 static char *last_file = NULL;
260 static char *last_function = NULL;
261 bfd *abfd;
262 asection *section;
263 bfd_vma offset;
264 lang_input_statement_type *entry;
265 asymbol **asymbols;
266 const char *filename;
267 const char *functionname;
268 unsigned int linenumber;
b34976b6 269 bfd_boolean discard_last;
252b5132
RH
270
271 abfd = va_arg (arg, bfd *);
272 section = va_arg (arg, asection *);
273 offset = va_arg (arg, bfd_vma);
274
275 entry = (lang_input_statement_type *) abfd->usrdata;
276 if (entry != (lang_input_statement_type *) NULL
277 && entry->asymbols != (asymbol **) NULL)
278 asymbols = entry->asymbols;
279 else
280 {
281 long symsize;
282 long symbol_count;
283
284 symsize = bfd_get_symtab_upper_bound (abfd);
285 if (symsize < 0)
286 einfo (_("%B%F: could not read symbols\n"), abfd);
1579bae1 287 asymbols = xmalloc (symsize);
252b5132
RH
288 symbol_count = bfd_canonicalize_symtab (abfd, asymbols);
289 if (symbol_count < 0)
290 einfo (_("%B%F: could not read symbols\n"), abfd);
291 if (entry != (lang_input_statement_type *) NULL)
292 {
293 entry->asymbols = asymbols;
294 entry->symbol_count = symbol_count;
295 }
296 }
297
d003868e 298 lfinfo (fp, "%B(%A+0x%v)", abfd, section, offset);
5cfb2bb2 299
b34976b6 300 discard_last = TRUE;
252b5132
RH
301 if (bfd_find_nearest_line (abfd, section, asymbols, offset,
302 &filename, &functionname,
303 &linenumber))
304 {
b34976b6 305 bfd_boolean need_colon = TRUE;
252b5132 306
5cfb2bb2
AM
307 if (functionname != NULL && fmt[-1] == 'C')
308 {
252b5132
RH
309 if (last_bfd == NULL
310 || last_file == NULL
311 || last_function == NULL
312 || last_bfd != abfd
5cfb2bb2
AM
313 || (filename != NULL
314 && strcmp (last_file, filename) != 0)
252b5132
RH
315 || strcmp (last_function, functionname) != 0)
316 {
5cfb2bb2
AM
317 lfinfo (fp, _(": In function `%T':\n"),
318 functionname);
b34976b6 319 need_colon = FALSE;
252b5132
RH
320
321 last_bfd = abfd;
322 if (last_file != NULL)
323 free (last_file);
5cfb2bb2
AM
324 last_file = NULL;
325 if (filename)
326 last_file = xstrdup (filename);
252b5132
RH
327 if (last_function != NULL)
328 free (last_function);
d1b2b2dc 329 last_function = xstrdup (functionname);
252b5132 330 }
b34976b6 331 discard_last = FALSE;
252b5132 332 }
5cfb2bb2
AM
333
334 if (filename != NULL)
252b5132 335 {
5cfb2bb2
AM
336 if (need_colon)
337 putc (':', fp);
338 fputs (filename, fp);
252b5132 339 }
5cfb2bb2
AM
340
341 if (functionname != NULL && fmt[-1] == 'G')
342 lfinfo (fp, ":%T", functionname);
343 else if (filename != NULL && linenumber != 0)
344 fprintf (fp, ":%u", linenumber);
252b5132 345 }
252b5132 346
5ed6aba4
NC
347 if (asymbols != NULL && entry == NULL)
348 free (asymbols);
349
252b5132
RH
350 if (discard_last)
351 {
352 last_bfd = NULL;
353 if (last_file != NULL)
354 {
355 free (last_file);
356 last_file = NULL;
357 }
358 if (last_function != NULL)
359 {
360 free (last_function);
361 last_function = NULL;
362 }
363 }
364 }
365 break;
6d5e62f8 366
252b5132
RH
367 case 's':
368 /* arbitrary string, like printf */
369 fprintf (fp, "%s", va_arg (arg, char *));
370 break;
371
372 case 'd':
373 /* integer, like printf */
374 fprintf (fp, "%d", va_arg (arg, int));
375 break;
376
377 case 'u':
378 /* unsigned integer, like printf */
379 fprintf (fp, "%u", va_arg (arg, unsigned int));
380 break;
381 }
382 }
383 }
384
7ce691ae 385 if (config.fatal_warnings)
b34976b6 386 config.make_executable = FALSE;
7ce691ae 387
b34976b6 388 if (fatal)
6d5e62f8 389 xexit (1);
252b5132
RH
390}
391
b7b482a3
AM
392/* Wrapper around cplus_demangle. Strips leading underscores and
393 other such chars that would otherwise confuse the demangler. */
394
395char *
1579bae1 396demangle (const char *name)
b7b482a3
AM
397{
398 char *res;
399 const char *p;
400
401 if (output_bfd != NULL
402 && bfd_get_symbol_leading_char (output_bfd) == name[0])
403 ++name;
404
405 /* This is a hack for better error reporting on XCOFF, PowerPC64-ELF
406 or the MS PE format. These formats have a number of leading '.'s
407 on at least some symbols, so we remove all dots to avoid
408 confusing the demangler. */
409 p = name;
410 while (*p == '.')
411 ++p;
412
413 res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS);
414 if (res)
415 {
416 size_t dots = p - name;
417
418 /* Now put back any stripped dots. */
419 if (dots != 0)
420 {
421 size_t len = strlen (res) + 1;
422 char *add_dots = xmalloc (len + dots);
423
424 memcpy (add_dots, name, dots);
425 memcpy (add_dots + dots, res, len);
426 free (res);
427 res = add_dots;
428 }
429 return res;
430 }
431 return xstrdup (name);
432}
433
6d5e62f8 434/* Format info message and print on stdout. */
252b5132
RH
435
436/* (You would think this should be called just "info", but then you
1579bae1 437 would be hosed by LynxOS, which defines that name in its libc.) */
252b5132
RH
438
439void
1579bae1 440info_msg (const char *fmt, ...)
252b5132 441{
1579bae1 442 va_list arg;
252b5132 443
1579bae1 444 va_start (arg, fmt);
252b5132 445 vfinfo (stdout, fmt, arg);
1579bae1 446 va_end (arg);
252b5132
RH
447}
448
6d5e62f8 449/* ('e' for error.) Format info message and print on stderr. */
252b5132
RH
450
451void
1579bae1 452einfo (const char *fmt, ...)
252b5132 453{
1579bae1 454 va_list arg;
252b5132 455
1579bae1 456 va_start (arg, fmt);
252b5132 457 vfinfo (stderr, fmt, arg);
1579bae1 458 va_end (arg);
252b5132
RH
459}
460
6d5e62f8 461void
1579bae1 462info_assert (const char *file, unsigned int line)
252b5132
RH
463{
464 einfo (_("%F%P: internal error %s %d\n"), file, line);
465}
466
6d5e62f8 467/* ('m' for map) Format info message and print on map. */
252b5132
RH
468
469void
1579bae1 470minfo (const char *fmt, ...)
252b5132 471{
1579bae1 472 va_list arg;
252b5132 473
1579bae1 474 va_start (arg, fmt);
252b5132 475 vfinfo (config.map_file, fmt, arg);
1579bae1 476 va_end (arg);
252b5132
RH
477}
478
479void
1579bae1 480lfinfo (FILE *file, const char *fmt, ...)
252b5132 481{
1579bae1 482 va_list arg;
252b5132 483
1579bae1 484 va_start (arg, fmt);
252b5132 485 vfinfo (file, fmt, arg);
1579bae1 486 va_end (arg);
252b5132
RH
487}
488\f
489/* Functions to print the link map. */
490
6d5e62f8 491void
1579bae1 492print_space (void)
252b5132
RH
493{
494 fprintf (config.map_file, " ");
495}
496
6d5e62f8 497void
1579bae1 498print_nl (void)
252b5132
RH
499{
500 fprintf (config.map_file, "\n");
501}
45455cdd
ILT
502
503/* A more or less friendly abort message. In ld.h abort is defined to
504 call this function. */
505
506void
1579bae1 507ld_abort (const char *file, int line, const char *fn)
45455cdd
ILT
508{
509 if (fn != NULL)
510 einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
511 file, line, fn);
512 else
513 einfo (_("%P: internal error: aborting at %s line %d\n"),
514 file, line);
515 einfo (_("%P%F: please report this bug\n"));
516 xexit (1);
517}
This page took 0.310237 seconds and 4 git commands to generate.