PR binutils/609
[external/binutils.git] / ld / ldmisc.c
1 /* ldmisc.c
2    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2002, 2003, 2004, 2005
4    Free Software Foundation, Inc.
5    Written by Steve Chamberlain of Cygnus Support.
6
7    This file is part of GLD, the Gnu Linker.
8
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.
13
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.
18
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.  */
23
24 #include "bfd.h"
25 #include "bfdlink.h"
26 #include "sysdep.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  %s arbitrary string, like printf
59  %u integer, like printf
60  %v hex bfd_vma, no leading zeros
61 */
62
63 static void
64 vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
65 {
66   bfd_boolean fatal = FALSE;
67
68   while (*fmt != '\0')
69     {
70       while (*fmt != '%' && *fmt != '\0')
71         {
72           putc (*fmt, fp);
73           fmt++;
74         }
75
76       if (*fmt == '%')
77         {
78           fmt++;
79           switch (*fmt++)
80             {
81             default:
82               fprintf (fp, "%%%c", fmt[-1]);
83               break;
84
85             case '%':
86               /* literal % */
87               putc ('%', fp);
88               break;
89
90             case 'X':
91               /* no object output, fail return */
92               config.make_executable = FALSE;
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
120                  8 spaces.  */
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
148                 if (name == NULL || *name == 0)
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
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
187             case 'B':
188               /* filename from a bfd */
189               {
190                 bfd *abfd = va_arg (arg, bfd *);
191
192                 if (abfd == NULL)
193                   fprintf (fp, "<none>");
194                 else if (abfd->my_archive)
195                   fprintf (fp, "%s(%s)", abfd->my_archive->filename,
196                            abfd->filename);
197                 else
198                   fprintf (fp, "%s", abfd->filename);
199               }
200               break;
201
202             case 'F':
203               /* Error is fatal.  */
204               fatal = TRUE;
205               break;
206
207             case 'P':
208               /* Print program name.  */
209               fprintf (fp, "%s", program_name);
210               break;
211
212             case 'E':
213               /* current bfd error or errno */
214               fprintf (fp, "%s", bfd_errmsg (bfd_get_error ()));
215               break;
216
217             case 'I':
218               /* filename from a lang_input_statement_type */
219               {
220                 lang_input_statement_type *i;
221
222                 i = va_arg (arg, lang_input_statement_type *);
223                 if (bfd_my_archive (i->the_bfd) != NULL)
224                   fprintf (fp, "(%s)",
225                            bfd_get_filename (bfd_my_archive (i->the_bfd)));
226                 fprintf (fp, "%s", i->local_sym_name);
227                 if (bfd_my_archive (i->the_bfd) == NULL
228                     && strcmp (i->local_sym_name, i->filename) != 0)
229                   fprintf (fp, " (%s)", i->filename);
230               }
231               break;
232
233             case 'S':
234               /* Print script file and linenumber.  */
235               if (parsing_defsym)
236                 fprintf (fp, "--defsym %s", lex_string);
237               else if (ldfile_input_filename != NULL)
238                 fprintf (fp, "%s:%u", ldfile_input_filename, lineno);
239               else
240                 fprintf (fp, _("built in linker script:%u"), lineno);
241               break;
242
243             case 'R':
244               /* Print all that's interesting about a relent.  */
245               {
246                 arelent *relent = va_arg (arg, arelent *);
247
248                 lfinfo (fp, "%s+0x%v (type %s)",
249                         (*(relent->sym_ptr_ptr))->name,
250                         relent->addend,
251                         relent->howto->name);
252               }
253               break;
254
255             case 'C':
256             case 'D':
257             case 'G':
258               /* Clever filename:linenumber with function name if possible.
259                  The arguments are a BFD, a section, and an offset.  */
260               {
261                 static bfd *last_bfd;
262                 static char *last_file = NULL;
263                 static char *last_function = NULL;
264                 bfd *abfd;
265                 asection *section;
266                 bfd_vma offset;
267                 lang_input_statement_type *entry;
268                 asymbol **asymbols;
269                 const char *filename;
270                 const char *functionname;
271                 unsigned int linenumber;
272                 bfd_boolean discard_last;
273
274                 abfd = va_arg (arg, bfd *);
275                 section = va_arg (arg, asection *);
276                 offset = va_arg (arg, bfd_vma);
277
278                 entry = (lang_input_statement_type *) abfd->usrdata;
279                 if (entry != (lang_input_statement_type *) NULL
280                     && entry->asymbols != (asymbol **) NULL)
281                   asymbols = entry->asymbols;
282                 else
283                   {
284                     long symsize;
285                     long symbol_count;
286
287                     symsize = bfd_get_symtab_upper_bound (abfd);
288                     if (symsize < 0)
289                       einfo (_("%B%F: could not read symbols\n"), abfd);
290                     asymbols = xmalloc (symsize);
291                     symbol_count = bfd_canonicalize_symtab (abfd, asymbols);
292                     if (symbol_count < 0)
293                       einfo (_("%B%F: could not read symbols\n"), abfd);
294                     if (entry != (lang_input_statement_type *) NULL)
295                       {
296                         entry->asymbols = asymbols;
297                         entry->symbol_count = symbol_count;
298                       }
299                   }
300
301                 /* The GNU Coding Standard requires that error messages be of the form:
302                    
303                      source-file-name:lineno: message
304
305                    We do not always have a line number available so if we cannot find
306                    them we print out the section name and offset instread.  */
307                 discard_last = TRUE;
308                 if (bfd_find_nearest_line (abfd, section, asymbols, offset,
309                                            &filename, &functionname,
310                                            &linenumber))
311                   {
312                     if (functionname != NULL && fmt[-1] == 'C')
313                       {
314                         /* Detect the case where we are printing out a message
315                            for the same function as the last call to vinfo ("%C").
316                            In this situation do not print out the ABFD filename
317                            or the function name again.  Note - we do still print
318                            out the source filename, as this will allow programs
319                            that parse the linker's output (eg emacs) to correctly
320                            locate multiple errors in the same source file.  */
321                         if (last_bfd == NULL
322                             || last_file == NULL
323                             || last_function == NULL
324                             || last_bfd != abfd
325                             || (filename != NULL
326                                 && strcmp (last_file, filename) != 0)
327                             || strcmp (last_function, functionname) != 0)
328                           {
329                             lfinfo (fp, _("%B: In function `%T':\n"),
330                                     abfd, functionname);
331
332                             last_bfd = abfd;
333                             if (last_file != NULL)
334                               free (last_file);
335                             last_file = NULL;
336                             if (filename)
337                               last_file = xstrdup (filename);
338                             if (last_function != NULL)
339                               free (last_function);
340                             last_function = xstrdup (functionname);
341                           }
342                         discard_last = FALSE;
343                       }
344                     else
345                       lfinfo (fp, "%B:", abfd);
346
347                     if (filename != NULL)
348                       fprintf (fp, "%s:", filename);
349
350                     if (functionname != NULL && fmt[-1] == 'G')
351                       lfinfo (fp, "%T", functionname);
352                     else if (filename != NULL)
353                       {
354                         if (linenumber != 0)
355                           fprintf (fp, "%u", linenumber);
356                         else
357                           lfinfo (fp, "(%A+0x%v)", section, offset);
358                       }
359                   }
360                 else
361                   lfinfo (fp, "%B:(%A+0x%v)", abfd, section, offset);
362
363                 if (asymbols != NULL && entry == NULL)
364                   free (asymbols);
365
366                 if (discard_last)
367                   {
368                     last_bfd = NULL;
369                     if (last_file != NULL)
370                       {
371                         free (last_file);
372                         last_file = NULL;
373                       }
374                     if (last_function != NULL)
375                       {
376                         free (last_function);
377                         last_function = NULL;
378                       }
379                   }
380               }
381               break;
382
383             case 's':
384               /* arbitrary string, like printf */
385               fprintf (fp, "%s", va_arg (arg, char *));
386               break;
387
388             case 'd':
389               /* integer, like printf */
390               fprintf (fp, "%d", va_arg (arg, int));
391               break;
392
393             case 'u':
394               /* unsigned integer, like printf */
395               fprintf (fp, "%u", va_arg (arg, unsigned int));
396               break;
397             }
398         }
399     }
400
401   if (is_warning && config.fatal_warnings)
402     config.make_executable = FALSE;
403
404   if (fatal)
405     xexit (1);
406 }
407
408 /* Wrapper around cplus_demangle.  Strips leading underscores and
409    other such chars that would otherwise confuse the demangler.  */
410
411 char *
412 demangle (const char *name)
413 {
414   char *res;
415   const char *p;
416
417   if (output_bfd != NULL
418       && bfd_get_symbol_leading_char (output_bfd) == name[0])
419     ++name;
420
421   /* This is a hack for better error reporting on XCOFF, PowerPC64-ELF
422      or the MS PE format.  These formats have a number of leading '.'s
423      on at least some symbols, so we remove all dots to avoid
424      confusing the demangler.  */
425   p = name;
426   while (*p == '.')
427     ++p;
428
429   res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS);
430   if (res)
431     {
432       size_t dots = p - name;
433
434       /* Now put back any stripped dots.  */
435       if (dots != 0)
436         {
437           size_t len = strlen (res) + 1;
438           char *add_dots = xmalloc (len + dots);
439
440           memcpy (add_dots, name, dots);
441           memcpy (add_dots + dots, res, len);
442           free (res);
443           res = add_dots;
444         }
445       return res;
446     }
447   return xstrdup (name);
448 }
449
450 /* Format info message and print on stdout.  */
451
452 /* (You would think this should be called just "info", but then you
453    would be hosed by LynxOS, which defines that name in its libc.)  */
454
455 void
456 info_msg (const char *fmt, ...)
457 {
458   va_list arg;
459
460   va_start (arg, fmt);
461   vfinfo (stdout, fmt, arg, FALSE);
462   va_end (arg);
463 }
464
465 /* ('e' for error.) Format info message and print on stderr.  */
466
467 void
468 einfo (const char *fmt, ...)
469 {
470   va_list arg;
471
472   va_start (arg, fmt);
473   vfinfo (stderr, fmt, arg, TRUE);
474   va_end (arg);
475 }
476
477 void
478 info_assert (const char *file, unsigned int line)
479 {
480   einfo (_("%F%P: internal error %s %d\n"), file, line);
481 }
482
483 /* ('m' for map) Format info message and print on map.  */
484
485 void
486 minfo (const char *fmt, ...)
487 {
488   va_list arg;
489
490   va_start (arg, fmt);
491   vfinfo (config.map_file, fmt, arg, FALSE);
492   va_end (arg);
493 }
494
495 void
496 lfinfo (FILE *file, const char *fmt, ...)
497 {
498   va_list arg;
499
500   va_start (arg, fmt);
501   vfinfo (file, fmt, arg, FALSE);
502   va_end (arg);
503 }
504 \f
505 /* Functions to print the link map.  */
506
507 void
508 print_space (void)
509 {
510   fprintf (config.map_file, " ");
511 }
512
513 void
514 print_nl (void)
515 {
516   fprintf (config.map_file, "\n");
517 }
518
519 /* A more or less friendly abort message.  In ld.h abort is defined to
520    call this function.  */
521
522 void
523 ld_abort (const char *file, int line, const char *fn)
524 {
525   if (fn != NULL)
526     einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
527            file, line, fn);
528   else
529     einfo (_("%P: internal error: aborting at %s line %d\n"),
530            file, line);
531   einfo (_("%P%F: please report this bug\n"));
532   xexit (1);
533 }