daily update
[deliverable/binutils-gdb.git] / binutils / addr2line.c
CommitLineData
252b5132 1/* addr2line.c -- convert addresses to line number and function name
4b95cf5c 2 Copyright (C) 1997-2014 Free Software Foundation, Inc.
c8c5888e 3 Contributed by Ulrich Lauther <Ulrich.Lauther@mchp.siemens.de>
252b5132
RH
4
5 This file is part of GNU Binutils.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
32866df7 9 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
10 any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
32866df7
NC
19 Foundation, 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
252b5132 22
c8c5888e 23/* Derived from objdump.c and nm.c by Ulrich.Lauther@mchp.siemens.de
252b5132 24
f462a9ea 25 Usage:
252b5132
RH
26 addr2line [options] addr addr ...
27 or
f462a9ea 28 addr2line [options]
252b5132
RH
29
30 both forms write results to stdout, the second form reads addresses
31 to be converted from stdin. */
32
3db64b00 33#include "sysdep.h"
252b5132
RH
34#include "bfd.h"
35#include "getopt.h"
36#include "libiberty.h"
37#include "demangle.h"
38#include "bucomm.h"
877c169d 39#include "elf-bfd.h"
252b5132 40
0c552dc1 41static bfd_boolean unwind_inlines; /* -i, unwind inlined functions. */
be6f6493 42static bfd_boolean with_addresses; /* -a, show addresses. */
b34976b6
AM
43static bfd_boolean with_functions; /* -f, show function names. */
44static bfd_boolean do_demangle; /* -C, demangle names. */
68cdf72f 45static bfd_boolean pretty_print; /* -p, print on one line. */
b34976b6 46static bfd_boolean base_names; /* -s, strip directory names. */
252b5132
RH
47
48static int naddr; /* Number of addresses to process. */
49static char **addr; /* Hex addresses to process. */
50
51static asymbol **syms; /* Symbol table. */
52
53static struct option long_options[] =
54{
be6f6493 55 {"addresses", no_argument, NULL, 'a'},
252b5132 56 {"basenames", no_argument, NULL, 's'},
28c309a2 57 {"demangle", optional_argument, NULL, 'C'},
252b5132
RH
58 {"exe", required_argument, NULL, 'e'},
59 {"functions", no_argument, NULL, 'f'},
0c552dc1 60 {"inlines", no_argument, NULL, 'i'},
68cdf72f 61 {"pretty-print", no_argument, NULL, 'p'},
c5f8c388 62 {"section", required_argument, NULL, 'j'},
252b5132
RH
63 {"target", required_argument, NULL, 'b'},
64 {"help", no_argument, NULL, 'H'},
65 {"version", no_argument, NULL, 'V'},
66 {0, no_argument, 0, 0}
67};
68
2da42df6
AJ
69static void usage (FILE *, int);
70static void slurp_symtab (bfd *);
71static void find_address_in_section (bfd *, asection *, void *);
c5f8c388
EB
72static void find_offset_in_section (bfd *, asection *);
73static void translate_addresses (bfd *, asection *);
252b5132
RH
74\f
75/* Print a usage message to STREAM and exit with STATUS. */
76
77static void
2da42df6 78usage (FILE *stream, int status)
252b5132 79{
8b53311e
NC
80 fprintf (stream, _("Usage: %s [option(s)] [addr(s)]\n"), program_name);
81 fprintf (stream, _(" Convert addresses into line number/file name pairs.\n"));
82 fprintf (stream, _(" If no addresses are specified on the command line, they will be read from stdin\n"));
83 fprintf (stream, _(" The options are:\n\
07012eee 84 @<file> Read options from <file>\n\
be6f6493 85 -a --addresses Show addresses\n\
8b53311e
NC
86 -b --target=<bfdname> Set the binary file format\n\
87 -e --exe=<executable> Set the input file name (default is a.out)\n\
c5f8c388
EB
88 -i --inlines Unwind inlined functions\n\
89 -j --section=<name> Read section-relative offsets instead of addresses\n\
68cdf72f 90 -p --pretty-print Make the output easier to read for humans\n\
8b53311e
NC
91 -s --basenames Strip directory names\n\
92 -f --functions Show function names\n\
93 -C --demangle[=style] Demangle function names\n\
94 -h --help Display this information\n\
95 -v --version Display the program's version\n\
96\n"));
97
252b5132 98 list_supported_targets (program_name, stream);
92f01d61 99 if (REPORT_BUGS_TO[0] && status == 0)
8ad3436c 100 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132
RH
101 exit (status);
102}
103\f
104/* Read in the symbol table. */
105
106static void
2da42df6 107slurp_symtab (bfd *abfd)
252b5132 108{
d5e7ea07 109 long storage;
252b5132 110 long symcount;
d5e7ea07 111 bfd_boolean dynamic = FALSE;
252b5132
RH
112
113 if ((bfd_get_file_flags (abfd) & HAS_SYMS) == 0)
114 return;
115
d5e7ea07
AM
116 storage = bfd_get_symtab_upper_bound (abfd);
117 if (storage == 0)
118 {
119 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
120 dynamic = TRUE;
121 }
122 if (storage < 0)
123 bfd_fatal (bfd_get_filename (abfd));
252b5132 124
d5e7ea07
AM
125 syms = (asymbol **) xmalloc (storage);
126 if (dynamic)
127 symcount = bfd_canonicalize_dynamic_symtab (abfd, syms);
128 else
129 symcount = bfd_canonicalize_symtab (abfd, syms);
252b5132
RH
130 if (symcount < 0)
131 bfd_fatal (bfd_get_filename (abfd));
0d0fb1ba
NC
132
133 /* If there are no symbols left after canonicalization and
134 we have not tried the dynamic symbols then give them a go. */
135 if (symcount == 0
136 && ! dynamic
137 && (storage = bfd_get_dynamic_symtab_upper_bound (abfd)) > 0)
138 {
139 free (syms);
140 syms = xmalloc (storage);
141 symcount = bfd_canonicalize_dynamic_symtab (abfd, syms);
142 }
252b5132
RH
143}
144\f
145/* These global variables are used to pass information between
146 translate_addresses and find_address_in_section. */
147
148static bfd_vma pc;
149static const char *filename;
150static const char *functionname;
151static unsigned int line;
9b8d1a36 152static unsigned int discriminator;
b34976b6 153static bfd_boolean found;
252b5132
RH
154
155/* Look for an address in a section. This is called via
156 bfd_map_over_sections. */
157
158static void
2da42df6
AJ
159find_address_in_section (bfd *abfd, asection *section,
160 void *data ATTRIBUTE_UNUSED)
252b5132
RH
161{
162 bfd_vma vma;
163 bfd_size_type size;
164
165 if (found)
166 return;
167
168 if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0)
169 return;
170
171 vma = bfd_get_section_vma (abfd, section);
172 if (pc < vma)
173 return;
174
135dfb4a 175 size = bfd_get_section_size (section);
252b5132
RH
176 if (pc >= vma + size)
177 return;
178
9b8d1a36
CC
179 found = bfd_find_nearest_line_discriminator (abfd, section, syms, pc - vma,
180 &filename, &functionname,
181 &line, &discriminator);
252b5132
RH
182}
183
c5f8c388
EB
184/* Look for an offset in a section. This is directly called. */
185
186static void
187find_offset_in_section (bfd *abfd, asection *section)
188{
189 bfd_size_type size;
190
191 if (found)
192 return;
193
194 if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0)
195 return;
196
197 size = bfd_get_section_size (section);
198 if (pc >= size)
199 return;
200
9b8d1a36
CC
201 found = bfd_find_nearest_line_discriminator (abfd, section, syms, pc,
202 &filename, &functionname,
203 &line, &discriminator);
c5f8c388
EB
204}
205
252b5132
RH
206/* Read hexadecimal addresses from stdin, translate into
207 file_name:line_number and optionally function name. */
208
209static void
c5f8c388 210translate_addresses (bfd *abfd, asection *section)
252b5132
RH
211{
212 int read_stdin = (naddr == 0);
213
214 for (;;)
215 {
216 if (read_stdin)
217 {
218 char addr_hex[100];
219
220 if (fgets (addr_hex, sizeof addr_hex, stdin) == NULL)
221 break;
222 pc = bfd_scan_vma (addr_hex, NULL, 16);
223 }
224 else
225 {
226 if (naddr <= 0)
227 break;
228 --naddr;
229 pc = bfd_scan_vma (*addr++, NULL, 16);
230 }
231
670b0bad
AM
232 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
233 {
234 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
235 bfd_vma sign = (bfd_vma) 1 << (bed->s->arch_size - 1);
236
237 pc &= (sign << 1) - 1;
238 if (bed->sign_extend_vma)
239 pc = (pc ^ sign) - sign;
240 }
877c169d 241
be6f6493
TG
242 if (with_addresses)
243 {
244 printf ("0x");
245 bfd_printf_vma (abfd, pc);
68cdf72f
TG
246
247 if (pretty_print)
248 printf (": ");
249 else
250 printf ("\n");
be6f6493
TG
251 }
252
b34976b6 253 found = FALSE;
c5f8c388
EB
254 if (section)
255 find_offset_in_section (abfd, section);
256 else
257 bfd_map_over_sections (abfd, find_address_in_section, NULL);
252b5132
RH
258
259 if (! found)
260 {
261 if (with_functions)
a477bfd1
NC
262 {
263 if (pretty_print)
264 printf ("?? ");
265 else
266 printf ("??\n");
267 }
252b5132
RH
268 printf ("??:0\n");
269 }
270 else
271 {
68cdf72f
TG
272 while (1)
273 {
274 if (with_functions)
275 {
276 const char *name;
277 char *alloc = NULL;
278
279 name = functionname;
280 if (name == NULL || *name == '\0')
281 name = "??";
282 else if (do_demangle)
283 {
284 alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
285 if (alloc != NULL)
286 name = alloc;
287 }
288
289 printf ("%s", name);
290 if (pretty_print)
9cf03b7e
NC
291 /* Note for translators: This printf is used to join the
292 function name just printed above to the line number/
293 file name pair that is about to be printed below. Eg:
294
295 foo at 123:bar.c */
68cdf72f
TG
296 printf (_(" at "));
297 else
298 printf ("\n");
299
300 if (alloc != NULL)
301 free (alloc);
302 }
303
304 if (base_names && filename != NULL)
305 {
306 char *h;
307
308 h = strrchr (filename, '/');
309 if (h != NULL)
310 filename = h + 1;
311 }
312
670b0bad
AM
313 printf ("%s:", filename ? filename : "??");
314 if (line != 0)
9b8d1a36
CC
315 {
316 if (discriminator != 0)
317 printf ("%u (discriminator %u)\n", line, discriminator);
318 else
319 printf ("%u\n", line);
320 }
670b0bad
AM
321 else
322 printf ("?\n");
68cdf72f
TG
323 if (!unwind_inlines)
324 found = FALSE;
325 else
9cf03b7e
NC
326 found = bfd_find_inliner_info (abfd, &filename, &functionname,
327 &line);
68cdf72f
TG
328 if (! found)
329 break;
330 if (pretty_print)
9cf03b7e
NC
331 /* Note for translators: This printf is used to join the
332 line number/file name pair that has just been printed with
333 the line number/file name pair that is going to be printed
334 by the next iteration of the while loop. Eg:
335
336 123:bar.c (inlined by) 456:main.c */
68cdf72f
TG
337 printf (_(" (inlined by) "));
338 }
252b5132
RH
339 }
340
341 /* fflush() is essential for using this command as a server
342 child process that reads addresses from a pipe and responds
343 with line number information, processing one address at a
344 time. */
345 fflush (stdout);
346 }
347}
348
d68c385b 349/* Process a file. Returns an exit value for main(). */
252b5132 350
d68c385b 351static int
c5f8c388
EB
352process_file (const char *file_name, const char *section_name,
353 const char *target)
252b5132
RH
354{
355 bfd *abfd;
c5f8c388 356 asection *section;
252b5132
RH
357 char **matching;
358
f24ddbdd 359 if (get_file_size (file_name) < 1)
d68c385b 360 return 1;
f24ddbdd 361
47badb7b 362 abfd = bfd_openr (file_name, target);
252b5132 363 if (abfd == NULL)
47badb7b 364 bfd_fatal (file_name);
252b5132 365
4a114e3e
L
366 /* Decompress sections. */
367 abfd->flags |= BFD_DECOMPRESS;
368
252b5132 369 if (bfd_check_format (abfd, bfd_archive))
c5f8c388 370 fatal (_("%s: cannot get addresses from archive"), file_name);
252b5132
RH
371
372 if (! bfd_check_format_matches (abfd, bfd_object, &matching))
373 {
374 bfd_nonfatal (bfd_get_filename (abfd));
375 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
376 {
377 list_matching_formats (matching);
378 free (matching);
379 }
380 xexit (1);
381 }
382
c5f8c388
EB
383 if (section_name != NULL)
384 {
385 section = bfd_get_section_by_name (abfd, section_name);
386 if (section == NULL)
387 fatal (_("%s: cannot find section %s"), file_name, section_name);
388 }
389 else
390 section = NULL;
391
252b5132
RH
392 slurp_symtab (abfd);
393
c5f8c388 394 translate_addresses (abfd, section);
252b5132
RH
395
396 if (syms != NULL)
397 {
398 free (syms);
399 syms = NULL;
400 }
401
402 bfd_close (abfd);
d68c385b
NC
403
404 return 0;
252b5132
RH
405}
406\f
407int
2da42df6 408main (int argc, char **argv)
252b5132 409{
47badb7b 410 const char *file_name;
c5f8c388 411 const char *section_name;
252b5132
RH
412 char *target;
413 int c;
414
415#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
416 setlocale (LC_MESSAGES, "");
3882b010
L
417#endif
418#if defined (HAVE_SETLOCALE)
419 setlocale (LC_CTYPE, "");
252b5132
RH
420#endif
421 bindtextdomain (PACKAGE, LOCALEDIR);
422 textdomain (PACKAGE);
423
424 program_name = *argv;
425 xmalloc_set_program_name (program_name);
426
869b9d07
MM
427 expandargv (&argc, &argv);
428
252b5132
RH
429 bfd_init ();
430 set_default_bfd_target ();
431
47badb7b 432 file_name = NULL;
c5f8c388 433 section_name = NULL;
252b5132 434 target = NULL;
68cdf72f 435 while ((c = getopt_long (argc, argv, "ab:Ce:sfHhij:pVv", long_options, (int *) 0))
252b5132
RH
436 != EOF)
437 {
438 switch (c)
439 {
440 case 0:
8b53311e 441 break; /* We've been given a long option. */
be6f6493
TG
442 case 'a':
443 with_addresses = TRUE;
444 break;
252b5132
RH
445 case 'b':
446 target = optarg;
447 break;
448 case 'C':
b34976b6 449 do_demangle = TRUE;
28c309a2
NC
450 if (optarg != NULL)
451 {
452 enum demangling_styles style;
f462a9ea 453
28c309a2 454 style = cplus_demangle_name_to_style (optarg);
f462a9ea 455 if (style == unknown_demangling)
28c309a2
NC
456 fatal (_("unknown demangling style `%s'"),
457 optarg);
f462a9ea 458
28c309a2 459 cplus_demangle_set_style (style);
f462a9ea 460 }
252b5132
RH
461 break;
462 case 'e':
47badb7b 463 file_name = optarg;
252b5132
RH
464 break;
465 case 's':
b34976b6 466 base_names = TRUE;
252b5132
RH
467 break;
468 case 'f':
b34976b6 469 with_functions = TRUE;
252b5132 470 break;
68cdf72f
TG
471 case 'p':
472 pretty_print = TRUE;
473 break;
8b53311e 474 case 'v':
252b5132
RH
475 case 'V':
476 print_version ("addr2line");
477 break;
8b53311e 478 case 'h':
252b5132
RH
479 case 'H':
480 usage (stdout, 0);
481 break;
0c552dc1
FF
482 case 'i':
483 unwind_inlines = TRUE;
484 break;
c5f8c388
EB
485 case 'j':
486 section_name = optarg;
487 break;
252b5132
RH
488 default:
489 usage (stderr, 1);
490 break;
491 }
492 }
493
47badb7b
NC
494 if (file_name == NULL)
495 file_name = "a.out";
252b5132
RH
496
497 addr = argv + optind;
498 naddr = argc - optind;
499
d68c385b 500 return process_file (file_name, section_name, target);
252b5132 501}
This page took 0.63856 seconds and 4 git commands to generate.