1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24: #include "sysdep.h"
25: #include "bfd.h"
26: #include "bfdlink.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:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65: static void
66: vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
67: {
68: bfd_boolean fatal = FALSE;
69:
70: while (*fmt != '\0')
71: {
72: while (*fmt != '%' && *fmt != '\0')
73: {
74: putc (*fmt, fp);
75: fmt++;
76: }
77:
78: if (*fmt == '%')
79: {
80: fmt++;
81: switch (*fmt++)
82: {
83: case '%':
84:
85: putc ('%', fp);
86: break;
87:
88: case 'X':
89:
90: config.make_executable = FALSE;
91: break;
92:
93: case 'V':
94:
95: {
96: bfd_vma value = va_arg (arg, bfd_vma);
97: fprintf_vma (fp, value);
98: }
99: break;
100:
101: case 'v':
102:
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:
118:
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:
143: {
144: const char *name = va_arg (arg, const char *);
145:
146: if (name == NULL || *name == 0)
147: {
148: fprintf (fp, _("no symbol"));
149: break;
150: }
151: else if (demangling)
152: {
153: char *demangled;
154:
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: }
163: }
164: fprintf (fp, "%s", name);
165: }
166: break;
167:
168: case 'A':
169:
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:
192: case 'B':
193:
194: {
195: bfd *abfd = va_arg (arg, bfd *);
196:
197: if (abfd == NULL)
198: fprintf (fp, "%s generated", program_name);
199: else if (abfd->my_archive)
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':
208:
209: fatal = TRUE;
210: break;
211:
212: case 'P':
213:
214: fprintf (fp, "%s", program_name);
215: break;
216:
217: case 'E':
218:
219: fprintf (fp, "%s", bfd_errmsg (bfd_get_error ()));
220: break;
221:
222: case 'I':
223:
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':
239:
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':
249:
250: {
251: arelent *relent = va_arg (arg, arelent *);
252:
253: lfinfo (fp, "%s+0x%v (type %s)",
254: (*(relent->sym_ptr_ptr))->name,
255: relent->addend,
256: relent->howto->name);
257: }
258: break;
259:
260: case 'C':
261: case 'D':
262: case 'G':
263:
264:
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;
277: bfd_boolean discard_last;
278:
279: abfd = va_arg (arg, bfd *);
280: section = va_arg (arg, asection *);
281: offset = va_arg (arg, bfd_vma);
282:
283: if (abfd == NULL)
284: {
285: entry = NULL;
286: asymbols = NULL;
287: }
288: else
289: {
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
295: {
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: }
311: }
312: }
313:
314:
315:
316:
317:
318:
319:
320:
321:
322: discard_last = TRUE;
323: if (abfd != NULL
324: && bfd_find_nearest_line (abfd, section, asymbols, offset,
325: &filename, &functionname,
326: &linenumber))
327: {
328: if (functionname != NULL && fmt[-1] == 'C')
329: {
330:
331:
332:
333:
334:
335:
336:
337:
338:
339: if (last_bfd == NULL
340: || last_file == NULL
341: || last_function == NULL
342: || last_bfd != abfd
343: || (filename != NULL
344: && strcmp (last_file, filename) != 0)
345: || strcmp (last_function, functionname) != 0)
346: {
347: lfinfo (fp, _("%B: In function `%T':\n"),
348: abfd, functionname);
349:
350: last_bfd = abfd;
351: if (last_file != NULL)
352: free (last_file);
353: last_file = NULL;
354: if (filename)
355: last_file = xstrdup (filename);
356: if (last_function != NULL)
357: free (last_function);
358: last_function = xstrdup (functionname);
359: }
360: discard_last = FALSE;
361: }
362: else
363: lfinfo (fp, "%B:", abfd);
364:
365: if (filename != NULL)
366: fprintf (fp, "%s:", filename);
367:
368: if (functionname != NULL && fmt[-1] == 'G')
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);
374: }
375: else
376: lfinfo (fp, "%B:(%A+0x%v)", abfd, section, offset);
377:
378: if (asymbols != NULL && entry == NULL)
379: free (asymbols);
380:
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;
397:
398: case 's':
399:
400: fprintf (fp, "%s", va_arg (arg, char *));
401: break;
402:
403: case 'd':
404:
405: fprintf (fp, "%d", va_arg (arg, int));
406: break;
407:
408: case 'u':
409:
410: fprintf (fp, "%u", va_arg (arg, unsigned int));
411: break;
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:
427:
428: default:
429: fprintf (fp, "%%%c", fmt[-1]);
430: break;
431: }
432: }
433: }
434:
435: if (is_warning && config.fatal_warnings)
436: config.make_executable = FALSE;
437:
438: if (fatal)
439: xexit (1);
440: }
441:
442:
443:
444:
445:
446:
447: void
448: info_msg (const char *fmt, ...)
449: {
450: va_list arg;
451:
452: va_start (arg, fmt);
453: vfinfo (stdout, fmt, arg, FALSE);
454: va_end (arg);
455: }
456:
457:
458:
459: void
460: einfo (const char *fmt, ...)
461: {
462: va_list arg;
463:
464: va_start (arg, fmt);
465: vfinfo (stderr, fmt, arg, TRUE);
466: va_end (arg);
467: }
468:
469: void
470: info_assert (const char *file, unsigned int line)
471: {
472: einfo (_("%F%P: internal error %s %d\n"), file, line);
473: }
474:
475:
476:
477: void
478: minfo (const char *fmt, ...)
479: {
480: if (config.map_file != NULL)
481: {
482: va_list arg;
483:
484: va_start (arg, fmt);
485: vfinfo (config.map_file, fmt, arg, FALSE);
486: va_end (arg);
487: }
488: }
489:
490: void
491: lfinfo (FILE *file, const char *fmt, ...)
492: {
493: va_list arg;
494:
495: va_start (arg, fmt);
496: vfinfo (file, fmt, arg, FALSE);
497: va_end (arg);
498: }
499: ^L
500:
501:
502: void
503: print_space (void)
504: {
505: fprintf (config.map_file, " ");
506: }
507:
508: void
509: print_nl (void)
510: {
511: fprintf (config.map_file, "\n");
512: }
513:
514:
515:
516:
517: void
518: ld_abort (const char *file, int line, const char *fn)
519: {
520: if (fn != NULL)
521: einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
522: file, line, fn);
523: else
524: einfo (_("%P: internal error: aborting at %s line %d\n"),
525: file, line);
526: einfo (_("%P%F: please report this bug\n"));
527: xexit (1);
528: }