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