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