Harmonize and improve auxiliary entries support for XCOFF
[deliverable/binutils-gdb.git] / binutils / addr2line.c
CommitLineData
252b5132 1/* addr2line.c -- convert addresses to line number and function name
250d07de 2 Copyright (C) 1997-2021 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
015dc7e1
AM
41static bool unwind_inlines; /* -i, unwind inlined functions. */
42static bool with_addresses; /* -a, show addresses. */
43static bool with_functions; /* -f, show function names. */
44static bool do_demangle; /* -C, demangle names. */
45static bool pretty_print; /* -p, print on one line. */
46static bool 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;
015dc7e1 120 bool 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);
015dc7e1 129 dynamic = true;
d5e7ea07
AM
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;
015dc7e1 170static bool 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
015dc7e1 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 339 if (!unwind_inlines)
015dc7e1 340 found = false;
68cdf72f 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
87b9f255 428#ifdef HAVE_LC_MESSAGES
252b5132 429 setlocale (LC_MESSAGES, "");
3882b010 430#endif
3882b010 431 setlocale (LC_CTYPE, "");
252b5132
RH
432 bindtextdomain (PACKAGE, LOCALEDIR);
433 textdomain (PACKAGE);
434
435 program_name = *argv;
436 xmalloc_set_program_name (program_name);
86eafac0 437 bfd_set_error_program_name (program_name);
252b5132 438
869b9d07
MM
439 expandargv (&argc, &argv);
440
bf2dd8d7
AM
441 if (bfd_init () != BFD_INIT_MAGIC)
442 fatal (_("fatal error: libbfd ABI mismatch"));
252b5132
RH
443 set_default_bfd_target ();
444
47badb7b 445 file_name = NULL;
c5f8c388 446 section_name = NULL;
252b5132 447 target = NULL;
af03af8f 448 while ((c = getopt_long (argc, argv, "ab:Ce:rRsfHhij:pVv", long_options, (int *) 0))
252b5132
RH
449 != EOF)
450 {
451 switch (c)
452 {
453 case 0:
8b53311e 454 break; /* We've been given a long option. */
be6f6493 455 case 'a':
015dc7e1 456 with_addresses = true;
be6f6493 457 break;
252b5132
RH
458 case 'b':
459 target = optarg;
460 break;
461 case 'C':
015dc7e1 462 do_demangle = true;
28c309a2
NC
463 if (optarg != NULL)
464 {
465 enum demangling_styles style;
f462a9ea 466
28c309a2 467 style = cplus_demangle_name_to_style (optarg);
f462a9ea 468 if (style == unknown_demangling)
28c309a2
NC
469 fatal (_("unknown demangling style `%s'"),
470 optarg);
f462a9ea 471
28c309a2 472 cplus_demangle_set_style (style);
f462a9ea 473 }
252b5132 474 break;
af03af8f
NC
475 case 'r':
476 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
477 break;
478 case 'R':
479 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
480 break;
252b5132 481 case 'e':
47badb7b 482 file_name = optarg;
252b5132
RH
483 break;
484 case 's':
015dc7e1 485 base_names = true;
252b5132
RH
486 break;
487 case 'f':
015dc7e1 488 with_functions = true;
252b5132 489 break;
68cdf72f 490 case 'p':
015dc7e1 491 pretty_print = true;
68cdf72f 492 break;
8b53311e 493 case 'v':
252b5132
RH
494 case 'V':
495 print_version ("addr2line");
496 break;
8b53311e 497 case 'h':
252b5132
RH
498 case 'H':
499 usage (stdout, 0);
500 break;
0c552dc1 501 case 'i':
015dc7e1 502 unwind_inlines = true;
0c552dc1 503 break;
c5f8c388
EB
504 case 'j':
505 section_name = optarg;
506 break;
252b5132
RH
507 default:
508 usage (stderr, 1);
509 break;
510 }
511 }
512
47badb7b
NC
513 if (file_name == NULL)
514 file_name = "a.out";
252b5132
RH
515
516 addr = argv + optind;
517 naddr = argc - optind;
518
d68c385b 519 return process_file (file_name, section_name, target);
252b5132 520}
This page took 1.021174 seconds and 4 git commands to generate.