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