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