Upload Tizen:Base source
[external/binutils.git] / ld / ldmisc.c
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 "filenames.h"
29 #include "demangle.h"
30 #include <stdarg.h>
31 #include "ld.h"
32 #include "ldmisc.h"
33 #include "ldexp.h"
34 #include "ldlang.h"
35 #include <ldgram.h>
36 #include "ldlex.h"
37 #include "ldmain.h"
38 #include "ldfile.h"
39 #include "elf-bfd.h"
40
41 /*
42  %% literal %
43  %A section name from a section
44  %B filename from a bfd
45  %C clever filename:linenumber with function
46  %D like %C, but no function name
47  %E current bfd error or errno
48  %F error is fatal
49  %G like %D, but only function name
50  %I filename from a lang_input_statement_type
51  %P print program name
52  %R info about a relent
53  %S print script file and linenumber
54  %T symbol name
55  %V hex bfd_vma
56  %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces
57  %X no object output, fail return
58  %d integer, like printf
59  %ld long, like printf
60  %lu unsigned long, like printf
61  %p native (host) void* pointer, like printf
62  %s arbitrary string, like printf
63  %u integer, like printf
64  %v hex bfd_vma, no leading zeros
65 */
66
67 void
68 vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
69 {
70   bfd_boolean fatal = FALSE;
71
72   while (*fmt != '\0')
73     {
74       while (*fmt != '%' && *fmt != '\0')
75         {
76           putc (*fmt, fp);
77           fmt++;
78         }
79
80       if (*fmt == '%')
81         {
82           fmt++;
83           switch (*fmt++)
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                   {
150                     fprintf (fp, _("no symbol"));
151                     break;
152                   }
153                 else if (demangling)
154                   {
155                     char *demangled;
156
157                     demangled = bfd_demangle (link_info.output_bfd, name,
158                                               DMGL_ANSI | DMGL_PARAMS);
159                     if (demangled != NULL)
160                       {
161                         fprintf (fp, "%s", demangled);
162                         free (demangled);
163                         break;
164                       }
165                   }
166                 fprintf (fp, "%s", name);
167               }
168               break;
169
170             case 'A':
171               /* section name from a section */
172               {
173                 asection *sec = va_arg (arg, asection *);
174                 bfd *abfd = sec->owner;
175                 const char *group = NULL;
176                 struct coff_comdat_info *ci;
177
178                 fprintf (fp, "%s", sec->name);
179                 if (abfd != NULL
180                     && bfd_get_flavour (abfd) == bfd_target_elf_flavour
181                     && elf_next_in_group (sec) != NULL
182                     && (sec->flags & SEC_GROUP) == 0)
183                   group = elf_group_name (sec);
184                 else if (abfd != NULL
185                          && bfd_get_flavour (abfd) == bfd_target_coff_flavour
186                          && (ci = bfd_coff_get_comdat_section (sec->owner,
187                                                                sec)) != NULL)
188                   group = ci->name;
189                 if (group != NULL)
190                   fprintf (fp, "[%s]", group);
191               }
192               break;
193
194             case 'B':
195               /* filename from a bfd */
196               {
197                 bfd *abfd = va_arg (arg, bfd *);
198
199                 if (abfd == NULL)
200                   fprintf (fp, "%s generated", program_name);
201                 else if (abfd->my_archive)
202                   fprintf (fp, "%s(%s)", abfd->my_archive->filename,
203                            abfd->filename);
204                 else
205                   fprintf (fp, "%s", abfd->filename);
206               }
207               break;
208
209             case 'F':
210               /* Error is fatal.  */
211               fatal = TRUE;
212               break;
213
214             case 'P':
215               /* Print program name.  */
216               fprintf (fp, "%s", program_name);
217               break;
218
219             case 'E':
220               /* current bfd error or errno */
221               fprintf (fp, "%s", bfd_errmsg (bfd_get_error ()));
222               break;
223
224             case 'I':
225               /* filename from a lang_input_statement_type */
226               {
227                 lang_input_statement_type *i;
228
229                 i = va_arg (arg, lang_input_statement_type *);
230                 if (bfd_my_archive (i->the_bfd) != NULL)
231                   fprintf (fp, "(%s)",
232                            bfd_get_filename (bfd_my_archive (i->the_bfd)));
233                 fprintf (fp, "%s", i->local_sym_name);
234                 if (bfd_my_archive (i->the_bfd) == NULL
235                     && filename_cmp (i->local_sym_name, i->filename) != 0)
236                   fprintf (fp, " (%s)", i->filename);
237               }
238               break;
239
240             case 'S':
241               /* Print script file and linenumber.  */
242               if (parsing_defsym)
243                 fprintf (fp, "--defsym %s", lex_string);
244               else if (ldfile_input_filename != NULL)
245                 fprintf (fp, "%s:%u", ldfile_input_filename, lineno);
246               else
247                 fprintf (fp, _("built in linker script:%u"), lineno);
248               break;
249
250             case 'R':
251               /* Print all that's interesting about a relent.  */
252               {
253                 arelent *relent = va_arg (arg, arelent *);
254
255                 lfinfo (fp, "%s+0x%v (type %s)",
256                         (*(relent->sym_ptr_ptr))->name,
257                         relent->addend,
258                         relent->howto->name);
259               }
260               break;
261
262             case 'C':
263             case 'D':
264             case 'G':
265               /* Clever filename:linenumber with function name if possible.
266                  The arguments are a BFD, a section, and an offset.  */
267               {
268                 static bfd *last_bfd;
269                 static char *last_file = NULL;
270                 static char *last_function = NULL;
271                 bfd *abfd;
272                 asection *section;
273                 bfd_vma offset;
274                 asymbol **asymbols = NULL;
275                 const char *filename;
276                 const char *functionname;
277                 unsigned int linenumber;
278                 bfd_boolean discard_last;
279
280                 abfd = va_arg (arg, bfd *);
281                 section = va_arg (arg, asection *);
282                 offset = va_arg (arg, bfd_vma);
283
284                 if (abfd != NULL)
285                   {
286                     if (!bfd_generic_link_read_symbols (abfd))
287                       einfo (_("%B%F: could not read symbols: %E\n"), abfd);
288
289                     asymbols = bfd_get_outsymbols (abfd);
290                   }
291
292                 /* The GNU Coding Standard requires that error messages
293                    be of the form:
294                    
295                      source-file-name:lineno: message
296
297                    We do not always have a line number available so if
298                    we cannot find them we print out the section name and
299                    offset instread.  */
300                 discard_last = TRUE;
301                 if (abfd != NULL
302                     && bfd_find_nearest_line (abfd, section, asymbols, offset,
303                                               &filename, &functionname,
304                                               &linenumber))
305                   {
306                     if (functionname != NULL && fmt[-1] == 'C')
307                       {
308                         /* Detect the case where we are printing out a
309                            message for the same function as the last
310                            call to vinfo ("%C").  In this situation do
311                            not print out the ABFD filename or the
312                            function name again.  Note - we do still
313                            print out the source filename, as this will
314                            allow programs that parse the linker's output
315                            (eg emacs) to correctly locate multiple
316                            errors in the same source file.  */
317                         if (last_bfd == NULL
318                             || last_file == NULL
319                             || last_function == NULL
320                             || last_bfd != abfd
321                             || (filename != NULL
322                                 && filename_cmp (last_file, filename) != 0)
323                             || strcmp (last_function, functionname) != 0)
324                           {
325                             lfinfo (fp, _("%B: In function `%T':\n"),
326                                     abfd, functionname);
327
328                             last_bfd = abfd;
329                             if (last_file != NULL)
330                               free (last_file);
331                             last_file = NULL;
332                             if (filename)
333                               last_file = xstrdup (filename);
334                             if (last_function != NULL)
335                               free (last_function);
336                             last_function = xstrdup (functionname);
337                           }
338                         discard_last = FALSE;
339                       }
340                     else
341                       lfinfo (fp, "%B:", abfd);
342
343                     if (filename != NULL)
344                       fprintf (fp, "%s:", filename);
345
346                     if (functionname != NULL && fmt[-1] == 'G')
347                       lfinfo (fp, "%T", functionname);
348                     else if (filename != NULL && linenumber != 0)
349                       fprintf (fp, "%u", linenumber);
350                     else
351                       lfinfo (fp, "(%A+0x%v)", section, offset);
352                   }
353                 else
354                   lfinfo (fp, "%B:(%A+0x%v)", abfd, section, offset);
355
356                 if (discard_last)
357                   {
358                     last_bfd = NULL;
359                     if (last_file != NULL)
360                       {
361                         free (last_file);
362                         last_file = NULL;
363                       }
364                     if (last_function != NULL)
365                       {
366                         free (last_function);
367                         last_function = NULL;
368                       }
369                   }
370               }
371               break;
372
373             case 'p':
374               /* native (host) void* pointer, like printf */
375               fprintf (fp, "%p", va_arg (arg, void *));
376               break;
377
378             case 's':
379               /* arbitrary string, like printf */
380               fprintf (fp, "%s", va_arg (arg, char *));
381               break;
382
383             case 'd':
384               /* integer, like printf */
385               fprintf (fp, "%d", va_arg (arg, int));
386               break;
387
388             case 'u':
389               /* unsigned integer, like printf */
390               fprintf (fp, "%u", va_arg (arg, unsigned int));
391               break;
392
393             case 'l':
394               if (*fmt == 'd')
395                 {
396                   fprintf (fp, "%ld", va_arg (arg, long));
397                   ++fmt;
398                   break;
399                 }
400               else if (*fmt == 'u')
401                 {
402                   fprintf (fp, "%lu", va_arg (arg, unsigned long));
403                   ++fmt;
404                   break;
405                 }
406               /* Fall thru */
407
408             default:
409               fprintf (fp, "%%%c", fmt[-1]);
410               break;
411             }
412         }
413     }
414
415   if (is_warning && config.fatal_warnings)
416     config.make_executable = FALSE;
417
418   if (fatal)
419     xexit (1);
420 }
421
422 /* Format info message and print on stdout.  */
423
424 /* (You would think this should be called just "info", but then you
425    would be hosed by LynxOS, which defines that name in its libc.)  */
426
427 void
428 info_msg (const char *fmt, ...)
429 {
430   va_list arg;
431
432   va_start (arg, fmt);
433   vfinfo (stdout, fmt, arg, FALSE);
434   va_end (arg);
435 }
436
437 /* ('e' for error.) Format info message and print on stderr.  */
438
439 void
440 einfo (const char *fmt, ...)
441 {
442   va_list arg;
443
444   fflush (stdout);
445   va_start (arg, fmt);
446   vfinfo (stderr, fmt, arg, TRUE);
447   va_end (arg);
448   fflush (stderr);
449 }
450
451 void
452 info_assert (const char *file, unsigned int line)
453 {
454   einfo (_("%F%P: internal error %s %d\n"), file, line);
455 }
456
457 /* ('m' for map) Format info message and print on map.  */
458
459 void
460 minfo (const char *fmt, ...)
461 {
462   if (config.map_file != NULL)
463     {
464       va_list arg;
465
466       va_start (arg, fmt);
467       vfinfo (config.map_file, fmt, arg, FALSE);
468       va_end (arg);
469     }
470 }
471
472 void
473 lfinfo (FILE *file, const char *fmt, ...)
474 {
475   va_list arg;
476
477   va_start (arg, fmt);
478   vfinfo (file, fmt, arg, FALSE);
479   va_end (arg);
480 }
481 \f
482 /* Functions to print the link map.  */
483
484 void
485 print_space (void)
486 {
487   fprintf (config.map_file, " ");
488 }
489
490 void
491 print_nl (void)
492 {
493   fprintf (config.map_file, "\n");
494 }
495
496 /* A more or less friendly abort message.  In ld.h abort is defined to
497    call this function.  */
498
499 void
500 ld_abort (const char *file, int line, const char *fn)
501 {
502   if (fn != NULL)
503     einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
504            file, line, fn);
505   else
506     einfo (_("%P: internal error: aborting at %s line %d\n"),
507            file, line);
508   einfo (_("%P%F: please report this bug\n"));
509   xexit (1);
510 }