Automatic date update in version.in
[deliverable/binutils-gdb.git] / binutils / addr2line.c
CommitLineData
252b5132 1/* addr2line.c -- convert addresses to line number and function name
219d1afa 2 Copyright (C) 1997-2018 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 }
877a8638
NC
143
144 /* PR 17512: file: 2a1d3b5b.
145 Do not pretend that we have some symbols when we don't. */
146 if (symcount <= 0)
147 {
148 free (syms);
149 syms = NULL;
150 }
252b5132
RH
151}
152\f
153/* These global variables are used to pass information between
154 translate_addresses and find_address_in_section. */
155
156static bfd_vma pc;
157static const char *filename;
158static const char *functionname;
159static unsigned int line;
9b8d1a36 160static unsigned int discriminator;
b34976b6 161static bfd_boolean found;
252b5132
RH
162
163/* Look for an address in a section. This is called via
164 bfd_map_over_sections. */
165
166static void
2da42df6
AJ
167find_address_in_section (bfd *abfd, asection *section,
168 void *data ATTRIBUTE_UNUSED)
252b5132
RH
169{
170 bfd_vma vma;
171 bfd_size_type size;
172
173 if (found)
174 return;
175
176 if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0)
177 return;
178
179 vma = bfd_get_section_vma (abfd, section);
180 if (pc < vma)
181 return;
182
135dfb4a 183 size = bfd_get_section_size (section);
252b5132
RH
184 if (pc >= vma + size)
185 return;
186
9b8d1a36
CC
187 found = bfd_find_nearest_line_discriminator (abfd, section, syms, pc - vma,
188 &filename, &functionname,
189 &line, &discriminator);
252b5132
RH
190}
191
c5f8c388
EB
192/* Look for an offset in a section. This is directly called. */
193
194static void
195find_offset_in_section (bfd *abfd, asection *section)
196{
197 bfd_size_type size;
198
199 if (found)
200 return;
201
202 if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0)
203 return;
204
205 size = bfd_get_section_size (section);
206 if (pc >= size)
207 return;
208
9b8d1a36
CC
209 found = bfd_find_nearest_line_discriminator (abfd, section, syms, pc,
210 &filename, &functionname,
211 &line, &discriminator);
c5f8c388
EB
212}
213
252b5132
RH
214/* Read hexadecimal addresses from stdin, translate into
215 file_name:line_number and optionally function name. */
216
217static void
c5f8c388 218translate_addresses (bfd *abfd, asection *section)
252b5132
RH
219{
220 int read_stdin = (naddr == 0);
221
222 for (;;)
223 {
224 if (read_stdin)
225 {
226 char addr_hex[100];
227
228 if (fgets (addr_hex, sizeof addr_hex, stdin) == NULL)
229 break;
230 pc = bfd_scan_vma (addr_hex, NULL, 16);
231 }
232 else
233 {
234 if (naddr <= 0)
235 break;
236 --naddr;
237 pc = bfd_scan_vma (*addr++, NULL, 16);
238 }
239
670b0bad
AM
240 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
241 {
242 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
243 bfd_vma sign = (bfd_vma) 1 << (bed->s->arch_size - 1);
244
245 pc &= (sign << 1) - 1;
246 if (bed->sign_extend_vma)
247 pc = (pc ^ sign) - sign;
248 }
877c169d 249
be6f6493
TG
250 if (with_addresses)
251 {
252 printf ("0x");
253 bfd_printf_vma (abfd, pc);
68cdf72f
TG
254
255 if (pretty_print)
256 printf (": ");
257 else
258 printf ("\n");
be6f6493
TG
259 }
260
b34976b6 261 found = FALSE;
c5f8c388
EB
262 if (section)
263 find_offset_in_section (abfd, section);
264 else
265 bfd_map_over_sections (abfd, find_address_in_section, NULL);
252b5132
RH
266
267 if (! found)
268 {
269 if (with_functions)
a477bfd1
NC
270 {
271 if (pretty_print)
272 printf ("?? ");
273 else
274 printf ("??\n");
275 }
252b5132
RH
276 printf ("??:0\n");
277 }
278 else
279 {
68cdf72f
TG
280 while (1)
281 {
282 if (with_functions)
283 {
284 const char *name;
285 char *alloc = NULL;
286
287 name = functionname;
288 if (name == NULL || *name == '\0')
289 name = "??";
290 else if (do_demangle)
291 {
292 alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
293 if (alloc != NULL)
294 name = alloc;
295 }
296
297 printf ("%s", name);
298 if (pretty_print)
9cf03b7e
NC
299 /* Note for translators: This printf is used to join the
300 function name just printed above to the line number/
301 file name pair that is about to be printed below. Eg:
302
303 foo at 123:bar.c */
68cdf72f
TG
304 printf (_(" at "));
305 else
306 printf ("\n");
307
308 if (alloc != NULL)
309 free (alloc);
310 }
311
312 if (base_names && filename != NULL)
313 {
314 char *h;
315
316 h = strrchr (filename, '/');
317 if (h != NULL)
318 filename = h + 1;
319 }
320
670b0bad
AM
321 printf ("%s:", filename ? filename : "??");
322 if (line != 0)
9b8d1a36
CC
323 {
324 if (discriminator != 0)
325 printf ("%u (discriminator %u)\n", line, discriminator);
326 else
327 printf ("%u\n", line);
328 }
670b0bad
AM
329 else
330 printf ("?\n");
68cdf72f
TG
331 if (!unwind_inlines)
332 found = FALSE;
333 else
9cf03b7e
NC
334 found = bfd_find_inliner_info (abfd, &filename, &functionname,
335 &line);
68cdf72f
TG
336 if (! found)
337 break;
338 if (pretty_print)
9cf03b7e
NC
339 /* Note for translators: This printf is used to join the
340 line number/file name pair that has just been printed with
341 the line number/file name pair that is going to be printed
342 by the next iteration of the while loop. Eg:
343
344 123:bar.c (inlined by) 456:main.c */
68cdf72f
TG
345 printf (_(" (inlined by) "));
346 }
252b5132
RH
347 }
348
349 /* fflush() is essential for using this command as a server
350 child process that reads addresses from a pipe and responds
351 with line number information, processing one address at a
352 time. */
353 fflush (stdout);
354 }
355}
356
d68c385b 357/* Process a file. Returns an exit value for main(). */
252b5132 358
d68c385b 359static int
c5f8c388
EB
360process_file (const char *file_name, const char *section_name,
361 const char *target)
252b5132
RH
362{
363 bfd *abfd;
c5f8c388 364 asection *section;
252b5132
RH
365 char **matching;
366
f24ddbdd 367 if (get_file_size (file_name) < 1)
d68c385b 368 return 1;
f24ddbdd 369
47badb7b 370 abfd = bfd_openr (file_name, target);
252b5132 371 if (abfd == NULL)
47badb7b 372 bfd_fatal (file_name);
252b5132 373
4a114e3e
L
374 /* Decompress sections. */
375 abfd->flags |= BFD_DECOMPRESS;
376
252b5132 377 if (bfd_check_format (abfd, bfd_archive))
c5f8c388 378 fatal (_("%s: cannot get addresses from archive"), file_name);
252b5132
RH
379
380 if (! bfd_check_format_matches (abfd, bfd_object, &matching))
381 {
382 bfd_nonfatal (bfd_get_filename (abfd));
383 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
384 {
385 list_matching_formats (matching);
386 free (matching);
387 }
388 xexit (1);
389 }
390
c5f8c388
EB
391 if (section_name != NULL)
392 {
393 section = bfd_get_section_by_name (abfd, section_name);
394 if (section == NULL)
395 fatal (_("%s: cannot find section %s"), file_name, section_name);
396 }
397 else
398 section = NULL;
399
252b5132
RH
400 slurp_symtab (abfd);
401
c5f8c388 402 translate_addresses (abfd, section);
252b5132
RH
403
404 if (syms != NULL)
405 {
406 free (syms);
407 syms = NULL;
408 }
409
410 bfd_close (abfd);
d68c385b
NC
411
412 return 0;
252b5132
RH
413}
414\f
415int
2da42df6 416main (int argc, char **argv)
252b5132 417{
47badb7b 418 const char *file_name;
c5f8c388 419 const char *section_name;
252b5132
RH
420 char *target;
421 int c;
422
423#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
424 setlocale (LC_MESSAGES, "");
3882b010
L
425#endif
426#if defined (HAVE_SETLOCALE)
427 setlocale (LC_CTYPE, "");
252b5132
RH
428#endif
429 bindtextdomain (PACKAGE, LOCALEDIR);
430 textdomain (PACKAGE);
431
432 program_name = *argv;
433 xmalloc_set_program_name (program_name);
86eafac0 434 bfd_set_error_program_name (program_name);
252b5132 435
869b9d07
MM
436 expandargv (&argc, &argv);
437
bf2dd8d7
AM
438 if (bfd_init () != BFD_INIT_MAGIC)
439 fatal (_("fatal error: libbfd ABI mismatch"));
252b5132
RH
440 set_default_bfd_target ();
441
47badb7b 442 file_name = NULL;
c5f8c388 443 section_name = NULL;
252b5132 444 target = NULL;
68cdf72f 445 while ((c = getopt_long (argc, argv, "ab:Ce:sfHhij:pVv", long_options, (int *) 0))
252b5132
RH
446 != EOF)
447 {
448 switch (c)
449 {
450 case 0:
8b53311e 451 break; /* We've been given a long option. */
be6f6493
TG
452 case 'a':
453 with_addresses = TRUE;
454 break;
252b5132
RH
455 case 'b':
456 target = optarg;
457 break;
458 case 'C':
b34976b6 459 do_demangle = TRUE;
28c309a2
NC
460 if (optarg != NULL)
461 {
462 enum demangling_styles style;
f462a9ea 463
28c309a2 464 style = cplus_demangle_name_to_style (optarg);
f462a9ea 465 if (style == unknown_demangling)
28c309a2
NC
466 fatal (_("unknown demangling style `%s'"),
467 optarg);
f462a9ea 468
28c309a2 469 cplus_demangle_set_style (style);
f462a9ea 470 }
252b5132
RH
471 break;
472 case 'e':
47badb7b 473 file_name = optarg;
252b5132
RH
474 break;
475 case 's':
b34976b6 476 base_names = TRUE;
252b5132
RH
477 break;
478 case 'f':
b34976b6 479 with_functions = TRUE;
252b5132 480 break;
68cdf72f
TG
481 case 'p':
482 pretty_print = TRUE;
483 break;
8b53311e 484 case 'v':
252b5132
RH
485 case 'V':
486 print_version ("addr2line");
487 break;
8b53311e 488 case 'h':
252b5132
RH
489 case 'H':
490 usage (stdout, 0);
491 break;
0c552dc1
FF
492 case 'i':
493 unwind_inlines = TRUE;
494 break;
c5f8c388
EB
495 case 'j':
496 section_name = optarg;
497 break;
252b5132
RH
498 default:
499 usage (stderr, 1);
500 break;
501 }
502 }
503
47badb7b
NC
504 if (file_name == NULL)
505 file_name = "a.out";
252b5132
RH
506
507 addr = argv + optind;
508 naddr = argc - optind;
509
d68c385b 510 return process_file (file_name, section_name, target);
252b5132 511}
This page took 1.08155 seconds and 4 git commands to generate.