gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / binutils / addr2line.c
CommitLineData
252b5132 1/* addr2line.c -- convert addresses to line number and function name
b3adc24a 2 Copyright (C) 1997-2020 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
fd361982 185 if ((bfd_section_flags (section) & SEC_ALLOC) == 0)
252b5132
RH
186 return;
187
fd361982 188 vma = bfd_section_vma (section);
252b5132
RH
189 if (pc < vma)
190 return;
191
fd361982 192 size = bfd_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
fd361982 211 if ((bfd_section_flags (section) & SEC_ALLOC) == 0)
c5f8c388
EB
212 return;
213
fd361982 214 size = bfd_section_size (section);
c5f8c388
EB
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
9db70fc3 317 free (alloc);
68cdf72f
TG
318 }
319
320 if (base_names && filename != NULL)
321 {
322 char *h;
323
324 h = strrchr (filename, '/');
325 if (h != NULL)
326 filename = h + 1;
327 }
328
670b0bad
AM
329 printf ("%s:", filename ? filename : "??");
330 if (line != 0)
9b8d1a36
CC
331 {
332 if (discriminator != 0)
333 printf ("%u (discriminator %u)\n", line, discriminator);
334 else
335 printf ("%u\n", line);
336 }
670b0bad
AM
337 else
338 printf ("?\n");
68cdf72f
TG
339 if (!unwind_inlines)
340 found = FALSE;
341 else
9cf03b7e
NC
342 found = bfd_find_inliner_info (abfd, &filename, &functionname,
343 &line);
68cdf72f
TG
344 if (! found)
345 break;
346 if (pretty_print)
9cf03b7e
NC
347 /* Note for translators: This printf is used to join the
348 line number/file name pair that has just been printed with
349 the line number/file name pair that is going to be printed
350 by the next iteration of the while loop. Eg:
351
352 123:bar.c (inlined by) 456:main.c */
68cdf72f
TG
353 printf (_(" (inlined by) "));
354 }
252b5132
RH
355 }
356
357 /* fflush() is essential for using this command as a server
358 child process that reads addresses from a pipe and responds
359 with line number information, processing one address at a
360 time. */
361 fflush (stdout);
362 }
363}
364
d68c385b 365/* Process a file. Returns an exit value for main(). */
252b5132 366
d68c385b 367static int
c5f8c388
EB
368process_file (const char *file_name, const char *section_name,
369 const char *target)
252b5132
RH
370{
371 bfd *abfd;
c5f8c388 372 asection *section;
252b5132
RH
373 char **matching;
374
f24ddbdd 375 if (get_file_size (file_name) < 1)
d68c385b 376 return 1;
f24ddbdd 377
47badb7b 378 abfd = bfd_openr (file_name, target);
252b5132 379 if (abfd == NULL)
47badb7b 380 bfd_fatal (file_name);
252b5132 381
4a114e3e
L
382 /* Decompress sections. */
383 abfd->flags |= BFD_DECOMPRESS;
384
252b5132 385 if (bfd_check_format (abfd, bfd_archive))
c5f8c388 386 fatal (_("%s: cannot get addresses from archive"), file_name);
252b5132
RH
387
388 if (! bfd_check_format_matches (abfd, bfd_object, &matching))
389 {
390 bfd_nonfatal (bfd_get_filename (abfd));
391 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
392 {
393 list_matching_formats (matching);
394 free (matching);
395 }
396 xexit (1);
397 }
398
c5f8c388
EB
399 if (section_name != NULL)
400 {
401 section = bfd_get_section_by_name (abfd, section_name);
402 if (section == NULL)
403 fatal (_("%s: cannot find section %s"), file_name, section_name);
404 }
405 else
406 section = NULL;
407
252b5132
RH
408 slurp_symtab (abfd);
409
c5f8c388 410 translate_addresses (abfd, section);
252b5132 411
9db70fc3
AM
412 free (syms);
413 syms = NULL;
252b5132
RH
414
415 bfd_close (abfd);
d68c385b
NC
416
417 return 0;
252b5132
RH
418}
419\f
420int
2da42df6 421main (int argc, char **argv)
252b5132 422{
47badb7b 423 const char *file_name;
c5f8c388 424 const char *section_name;
252b5132
RH
425 char *target;
426 int c;
427
428#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
429 setlocale (LC_MESSAGES, "");
3882b010
L
430#endif
431#if defined (HAVE_SETLOCALE)
432 setlocale (LC_CTYPE, "");
252b5132
RH
433#endif
434 bindtextdomain (PACKAGE, LOCALEDIR);
435 textdomain (PACKAGE);
436
437 program_name = *argv;
438 xmalloc_set_program_name (program_name);
86eafac0 439 bfd_set_error_program_name (program_name);
252b5132 440
869b9d07
MM
441 expandargv (&argc, &argv);
442
bf2dd8d7
AM
443 if (bfd_init () != BFD_INIT_MAGIC)
444 fatal (_("fatal error: libbfd ABI mismatch"));
252b5132
RH
445 set_default_bfd_target ();
446
47badb7b 447 file_name = NULL;
c5f8c388 448 section_name = NULL;
252b5132 449 target = NULL;
af03af8f 450 while ((c = getopt_long (argc, argv, "ab:Ce:rRsfHhij:pVv", long_options, (int *) 0))
252b5132
RH
451 != EOF)
452 {
453 switch (c)
454 {
455 case 0:
8b53311e 456 break; /* We've been given a long option. */
be6f6493
TG
457 case 'a':
458 with_addresses = TRUE;
459 break;
252b5132
RH
460 case 'b':
461 target = optarg;
462 break;
463 case 'C':
b34976b6 464 do_demangle = TRUE;
28c309a2
NC
465 if (optarg != NULL)
466 {
467 enum demangling_styles style;
f462a9ea 468
28c309a2 469 style = cplus_demangle_name_to_style (optarg);
f462a9ea 470 if (style == unknown_demangling)
28c309a2
NC
471 fatal (_("unknown demangling style `%s'"),
472 optarg);
f462a9ea 473
28c309a2 474 cplus_demangle_set_style (style);
f462a9ea 475 }
252b5132 476 break;
af03af8f
NC
477 case 'r':
478 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
479 break;
480 case 'R':
481 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
482 break;
252b5132 483 case 'e':
47badb7b 484 file_name = optarg;
252b5132
RH
485 break;
486 case 's':
b34976b6 487 base_names = TRUE;
252b5132
RH
488 break;
489 case 'f':
b34976b6 490 with_functions = TRUE;
252b5132 491 break;
68cdf72f
TG
492 case 'p':
493 pretty_print = TRUE;
494 break;
8b53311e 495 case 'v':
252b5132
RH
496 case 'V':
497 print_version ("addr2line");
498 break;
8b53311e 499 case 'h':
252b5132
RH
500 case 'H':
501 usage (stdout, 0);
502 break;
0c552dc1
FF
503 case 'i':
504 unwind_inlines = TRUE;
505 break;
c5f8c388
EB
506 case 'j':
507 section_name = optarg;
508 break;
252b5132
RH
509 default:
510 usage (stderr, 1);
511 break;
512 }
513 }
514
47badb7b
NC
515 if (file_name == NULL)
516 file_name = "a.out";
252b5132
RH
517
518 addr = argv + optind;
519 naddr = argc - optind;
520
d68c385b 521 return process_file (file_name, section_name, target);
252b5132 522}
This page took 0.794424 seconds and 4 git commands to generate.