binutils/
[binutils-gdb.git] / binutils / objdump.c
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
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
10 the Free Software Foundation; either version 3, or (at your option)
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
20 Foundation, 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23
24 /* Objdump overview.
25
26 Objdump displays information about one or more object files, either on
27 their own, or inside libraries. It is commonly used as a disassembler,
28 but it can also display information about file headers, symbol tables,
29 relocations, debugging directives and more.
30
31 The flow of execution is as follows:
32
33 1. Command line arguments are checked for control switches and the
34 information to be displayed is selected.
35
36 2. Any remaining arguments are assumed to be object files, and they are
37 processed in order by display_bfd(). If the file is an archive each
38 of its elements is processed in turn.
39
40 3. The file's target architecture and binary file format are determined
41 by bfd_check_format(). If they are recognised, then dump_bfd() is
42 called.
43
44 4. dump_bfd() in turn calls separate functions to display the requested
45 item(s) of information(s). For example disassemble_data() is called if
46 a disassembly has been requested.
47
48 When disassembling the code loops through blocks of instructions bounded
49 by symbols, calling disassemble_bytes() on each block. The actual
50 disassembling is done by the libopcodes library, via a function pointer
51 supplied by the disassembler() function. */
52
53 #include "sysdep.h"
54 #include "bfd.h"
55 #include "elf-bfd.h"
56 #include "progress.h"
57 #include "bucomm.h"
58 #include "dwarf.h"
59 #include "getopt.h"
60 #include "safe-ctype.h"
61 #include "dis-asm.h"
62 #include "libiberty.h"
63 #include "demangle.h"
64 #include "debug.h"
65 #include "budbg.h"
66
67 #ifdef HAVE_MMAP
68 #include <sys/mman.h>
69 #endif
70
71 #include <sys/stat.h>
72
73 /* Internal headers for the ELF .stab-dump code - sorry. */
74 #define BYTES_IN_WORD 32
75 #include "aout/aout64.h"
76
77 /* Exit status. */
78 static int exit_status = 0;
79
80 static char *default_target = NULL; /* Default at runtime. */
81
82 /* The following variables are set based on arguments passed on the
83 command line. */
84 static int show_version = 0; /* Show the version number. */
85 static int dump_section_contents; /* -s */
86 static int dump_section_headers; /* -h */
87 static bfd_boolean dump_file_header; /* -f */
88 static int dump_symtab; /* -t */
89 static int dump_dynamic_symtab; /* -T */
90 static int dump_reloc_info; /* -r */
91 static int dump_dynamic_reloc_info; /* -R */
92 static int dump_ar_hdrs; /* -a */
93 static int dump_private_headers; /* -p */
94 static int prefix_addresses; /* --prefix-addresses */
95 static int with_line_numbers; /* -l */
96 static bfd_boolean with_source_code; /* -S */
97 static int show_raw_insn; /* --show-raw-insn */
98 static int dump_dwarf_section_info; /* --dwarf */
99 static int dump_stab_section_info; /* --stabs */
100 static int do_demangle; /* -C, --demangle */
101 static bfd_boolean disassemble; /* -d */
102 static bfd_boolean disassemble_all; /* -D */
103 static int disassemble_zeroes; /* --disassemble-zeroes */
104 static bfd_boolean formats_info; /* -i */
105 static int wide_output; /* -w */
106 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
107 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
108 static int dump_debugging; /* --debugging */
109 static int dump_debugging_tags; /* --debugging-tags */
110 static int dump_special_syms = 0; /* --special-syms */
111 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
112 static int file_start_context = 0; /* --file-start-context */
113 static bfd_boolean display_file_offsets;/* -F */
114
115 /* Pointer to an array of section names provided by
116 one or more "-j secname" command line options. */
117 static char **only;
118 /* The total number of slots in the only[] array. */
119 static size_t only_size = 0;
120 /* The number of occupied slots in the only[] array. */
121 static size_t only_used = 0;
122
123 /* Variables for handling include file path table. */
124 static const char **include_paths;
125 static int include_path_count;
126
127 /* Extra info to pass to the section disassembler and address printing
128 function. */
129 struct objdump_disasm_info
130 {
131 bfd * abfd;
132 asection * sec;
133 bfd_boolean require_sec;
134 arelent ** dynrelbuf;
135 long dynrelcount;
136 disassembler_ftype disassemble_fn;
137 arelent * reloc;
138 };
139
140 /* Architecture to disassemble for, or default if NULL. */
141 static char *machine = NULL;
142
143 /* Target specific options to the disassembler. */
144 static char *disassembler_options = NULL;
145
146 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
147 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
148
149 /* The symbol table. */
150 static asymbol **syms;
151
152 /* Number of symbols in `syms'. */
153 static long symcount = 0;
154
155 /* The sorted symbol table. */
156 static asymbol **sorted_syms;
157
158 /* Number of symbols in `sorted_syms'. */
159 static long sorted_symcount = 0;
160
161 /* The dynamic symbol table. */
162 static asymbol **dynsyms;
163
164 /* The synthetic symbol table. */
165 static asymbol *synthsyms;
166 static long synthcount = 0;
167
168 /* Number of symbols in `dynsyms'. */
169 static long dynsymcount = 0;
170
171 static bfd_byte *stabs;
172 static bfd_size_type stab_size;
173
174 static char *strtab;
175 static bfd_size_type stabstr_size;
176
177 static bfd_boolean is_relocatable = FALSE;
178 \f
179 static void
180 usage (FILE *stream, int status)
181 {
182 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
183 fprintf (stream, _(" Display information from object <file(s)>.\n"));
184 fprintf (stream, _(" At least one of the following switches must be given:\n"));
185 fprintf (stream, _("\
186 -a, --archive-headers Display archive header information\n\
187 -f, --file-headers Display the contents of the overall file header\n\
188 -p, --private-headers Display object format specific file header contents\n\
189 -h, --[section-]headers Display the contents of the section headers\n\
190 -x, --all-headers Display the contents of all headers\n\
191 -d, --disassemble Display assembler contents of executable sections\n\
192 -D, --disassemble-all Display assembler contents of all sections\n\
193 -S, --source Intermix source code with disassembly\n\
194 -s, --full-contents Display the full contents of all sections requested\n\
195 -g, --debugging Display debug information in object file\n\
196 -e, --debugging-tags Display debug information using ctags style\n\
197 -G, --stabs Display (in raw form) any STABS info in the file\n\
198 -W, --dwarf Display DWARF info in the file\n\
199 -t, --syms Display the contents of the symbol table(s)\n\
200 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
201 -r, --reloc Display the relocation entries in the file\n\
202 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
203 @<file> Read options from <file>\n\
204 -v, --version Display this program's version number\n\
205 -i, --info List object formats and architectures supported\n\
206 -H, --help Display this information\n\
207 "));
208 if (status != 2)
209 {
210 fprintf (stream, _("\n The following switches are optional:\n"));
211 fprintf (stream, _("\
212 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
213 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
214 -j, --section=NAME Only display information for section NAME\n\
215 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
216 -EB --endian=big Assume big endian format when disassembling\n\
217 -EL --endian=little Assume little endian format when disassembling\n\
218 --file-start-context Include context from start of file (with -S)\n\
219 -I, --include=DIR Add DIR to search list for source files\n\
220 -l, --line-numbers Include line numbers and filenames in output\n\
221 -F, --file-offsets Include file offsets when displaying information\n\
222 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
223 The STYLE, if specified, can be `auto', `gnu',\n\
224 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
225 or `gnat'\n\
226 -w, --wide Format output for more than 80 columns\n\
227 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
228 --start-address=ADDR Only process data whose address is >= ADDR\n\
229 --stop-address=ADDR Only process data whose address is <= ADDR\n\
230 --prefix-addresses Print complete address alongside disassembly\n\
231 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
232 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
233 --special-syms Include special symbols in symbol dumps\n\
234 \n"));
235 list_supported_targets (program_name, stream);
236 list_supported_architectures (program_name, stream);
237
238 disassembler_usage (stream);
239 }
240 if (REPORT_BUGS_TO[0] && status == 0)
241 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
242 exit (status);
243 }
244
245 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
246 enum option_values
247 {
248 OPTION_ENDIAN=150,
249 OPTION_START_ADDRESS,
250 OPTION_STOP_ADDRESS,
251 OPTION_ADJUST_VMA
252 };
253
254 static struct option long_options[]=
255 {
256 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
257 {"all-headers", no_argument, NULL, 'x'},
258 {"private-headers", no_argument, NULL, 'p'},
259 {"architecture", required_argument, NULL, 'm'},
260 {"archive-headers", no_argument, NULL, 'a'},
261 {"debugging", no_argument, NULL, 'g'},
262 {"debugging-tags", no_argument, NULL, 'e'},
263 {"demangle", optional_argument, NULL, 'C'},
264 {"disassemble", no_argument, NULL, 'd'},
265 {"disassemble-all", no_argument, NULL, 'D'},
266 {"disassembler-options", required_argument, NULL, 'M'},
267 {"disassemble-zeroes", no_argument, NULL, 'z'},
268 {"dynamic-reloc", no_argument, NULL, 'R'},
269 {"dynamic-syms", no_argument, NULL, 'T'},
270 {"endian", required_argument, NULL, OPTION_ENDIAN},
271 {"file-headers", no_argument, NULL, 'f'},
272 {"file-offsets", no_argument, NULL, 'F'},
273 {"file-start-context", no_argument, &file_start_context, 1},
274 {"full-contents", no_argument, NULL, 's'},
275 {"headers", no_argument, NULL, 'h'},
276 {"help", no_argument, NULL, 'H'},
277 {"info", no_argument, NULL, 'i'},
278 {"line-numbers", no_argument, NULL, 'l'},
279 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
280 {"prefix-addresses", no_argument, &prefix_addresses, 1},
281 {"reloc", no_argument, NULL, 'r'},
282 {"section", required_argument, NULL, 'j'},
283 {"section-headers", no_argument, NULL, 'h'},
284 {"show-raw-insn", no_argument, &show_raw_insn, 1},
285 {"source", no_argument, NULL, 'S'},
286 {"special-syms", no_argument, &dump_special_syms, 1},
287 {"include", required_argument, NULL, 'I'},
288 {"dwarf", no_argument, NULL, 'W'},
289 {"stabs", no_argument, NULL, 'G'},
290 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
291 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
292 {"syms", no_argument, NULL, 't'},
293 {"target", required_argument, NULL, 'b'},
294 {"version", no_argument, NULL, 'V'},
295 {"wide", no_argument, NULL, 'w'},
296 {0, no_argument, 0, 0}
297 };
298 \f
299 static void
300 nonfatal (const char *msg)
301 {
302 bfd_nonfatal (msg);
303 exit_status = 1;
304 }
305 \f
306 static void
307 dump_section_header (bfd *abfd, asection *section,
308 void *ignored ATTRIBUTE_UNUSED)
309 {
310 char *comma = "";
311 unsigned int opb = bfd_octets_per_byte (abfd);
312
313 /* Ignore linker created section. See elfNN_ia64_object_p in
314 bfd/elfxx-ia64.c. */
315 if (section->flags & SEC_LINKER_CREATED)
316 return;
317
318 printf ("%3d %-13s %08lx ", section->index,
319 bfd_get_section_name (abfd, section),
320 (unsigned long) bfd_section_size (abfd, section) / opb);
321 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
322 printf (" ");
323 bfd_printf_vma (abfd, section->lma);
324 printf (" %08lx 2**%u", (unsigned long) section->filepos,
325 bfd_get_section_alignment (abfd, section));
326 if (! wide_output)
327 printf ("\n ");
328 printf (" ");
329
330 #define PF(x, y) \
331 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
332
333 PF (SEC_HAS_CONTENTS, "CONTENTS");
334 PF (SEC_ALLOC, "ALLOC");
335 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
336 PF (SEC_LOAD, "LOAD");
337 PF (SEC_RELOC, "RELOC");
338 PF (SEC_READONLY, "READONLY");
339 PF (SEC_CODE, "CODE");
340 PF (SEC_DATA, "DATA");
341 PF (SEC_ROM, "ROM");
342 PF (SEC_DEBUGGING, "DEBUGGING");
343 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
344 PF (SEC_EXCLUDE, "EXCLUDE");
345 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
346 if (bfd_get_arch (abfd) == bfd_arch_tic54x)
347 {
348 PF (SEC_TIC54X_BLOCK, "BLOCK");
349 PF (SEC_TIC54X_CLINK, "CLINK");
350 }
351 PF (SEC_SMALL_DATA, "SMALL_DATA");
352 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
353 PF (SEC_COFF_SHARED, "SHARED");
354 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
355 PF (SEC_GROUP, "GROUP");
356
357 if ((section->flags & SEC_LINK_ONCE) != 0)
358 {
359 const char *ls;
360 struct coff_comdat_info *comdat;
361
362 switch (section->flags & SEC_LINK_DUPLICATES)
363 {
364 default:
365 abort ();
366 case SEC_LINK_DUPLICATES_DISCARD:
367 ls = "LINK_ONCE_DISCARD";
368 break;
369 case SEC_LINK_DUPLICATES_ONE_ONLY:
370 ls = "LINK_ONCE_ONE_ONLY";
371 break;
372 case SEC_LINK_DUPLICATES_SAME_SIZE:
373 ls = "LINK_ONCE_SAME_SIZE";
374 break;
375 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
376 ls = "LINK_ONCE_SAME_CONTENTS";
377 break;
378 }
379 printf ("%s%s", comma, ls);
380
381 comdat = bfd_coff_get_comdat_section (abfd, section);
382 if (comdat != NULL)
383 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
384
385 comma = ", ";
386 }
387
388 printf ("\n");
389 #undef PF
390 }
391
392 static void
393 dump_headers (bfd *abfd)
394 {
395 printf (_("Sections:\n"));
396
397 #ifndef BFD64
398 printf (_("Idx Name Size VMA LMA File off Algn"));
399 #else
400 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
401 if (bfd_get_arch_size (abfd) == 32)
402 printf (_("Idx Name Size VMA LMA File off Algn"));
403 else
404 printf (_("Idx Name Size VMA LMA File off Algn"));
405 #endif
406
407 if (wide_output)
408 printf (_(" Flags"));
409 if (abfd->flags & HAS_LOAD_PAGE)
410 printf (_(" Pg"));
411 printf ("\n");
412
413 bfd_map_over_sections (abfd, dump_section_header, NULL);
414 }
415 \f
416 static asymbol **
417 slurp_symtab (bfd *abfd)
418 {
419 asymbol **sy = NULL;
420 long storage;
421
422 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
423 {
424 symcount = 0;
425 return NULL;
426 }
427
428 storage = bfd_get_symtab_upper_bound (abfd);
429 if (storage < 0)
430 bfd_fatal (bfd_get_filename (abfd));
431 if (storage)
432 sy = xmalloc (storage);
433
434 symcount = bfd_canonicalize_symtab (abfd, sy);
435 if (symcount < 0)
436 bfd_fatal (bfd_get_filename (abfd));
437 return sy;
438 }
439
440 /* Read in the dynamic symbols. */
441
442 static asymbol **
443 slurp_dynamic_symtab (bfd *abfd)
444 {
445 asymbol **sy = NULL;
446 long storage;
447
448 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
449 if (storage < 0)
450 {
451 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
452 {
453 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
454 dynsymcount = 0;
455 return NULL;
456 }
457
458 bfd_fatal (bfd_get_filename (abfd));
459 }
460 if (storage)
461 sy = xmalloc (storage);
462
463 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
464 if (dynsymcount < 0)
465 bfd_fatal (bfd_get_filename (abfd));
466 return sy;
467 }
468
469 /* Filter out (in place) symbols that are useless for disassembly.
470 COUNT is the number of elements in SYMBOLS.
471 Return the number of useful symbols. */
472
473 static long
474 remove_useless_symbols (asymbol **symbols, long count)
475 {
476 asymbol **in_ptr = symbols, **out_ptr = symbols;
477
478 while (--count >= 0)
479 {
480 asymbol *sym = *in_ptr++;
481
482 if (sym->name == NULL || sym->name[0] == '\0')
483 continue;
484 if (sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
485 continue;
486 if (bfd_is_und_section (sym->section)
487 || bfd_is_com_section (sym->section))
488 continue;
489
490 *out_ptr++ = sym;
491 }
492 return out_ptr - symbols;
493 }
494
495 /* Sort symbols into value order. */
496
497 static int
498 compare_symbols (const void *ap, const void *bp)
499 {
500 const asymbol *a = * (const asymbol **) ap;
501 const asymbol *b = * (const asymbol **) bp;
502 const char *an;
503 const char *bn;
504 size_t anl;
505 size_t bnl;
506 bfd_boolean af;
507 bfd_boolean bf;
508 flagword aflags;
509 flagword bflags;
510
511 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
512 return 1;
513 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
514 return -1;
515
516 if (a->section > b->section)
517 return 1;
518 else if (a->section < b->section)
519 return -1;
520
521 an = bfd_asymbol_name (a);
522 bn = bfd_asymbol_name (b);
523 anl = strlen (an);
524 bnl = strlen (bn);
525
526 /* The symbols gnu_compiled and gcc2_compiled convey no real
527 information, so put them after other symbols with the same value. */
528 af = (strstr (an, "gnu_compiled") != NULL
529 || strstr (an, "gcc2_compiled") != NULL);
530 bf = (strstr (bn, "gnu_compiled") != NULL
531 || strstr (bn, "gcc2_compiled") != NULL);
532
533 if (af && ! bf)
534 return 1;
535 if (! af && bf)
536 return -1;
537
538 /* We use a heuristic for the file name, to try to sort it after
539 more useful symbols. It may not work on non Unix systems, but it
540 doesn't really matter; the only difference is precisely which
541 symbol names get printed. */
542
543 #define file_symbol(s, sn, snl) \
544 (((s)->flags & BSF_FILE) != 0 \
545 || ((sn)[(snl) - 2] == '.' \
546 && ((sn)[(snl) - 1] == 'o' \
547 || (sn)[(snl) - 1] == 'a')))
548
549 af = file_symbol (a, an, anl);
550 bf = file_symbol (b, bn, bnl);
551
552 if (af && ! bf)
553 return 1;
554 if (! af && bf)
555 return -1;
556
557 /* Try to sort global symbols before local symbols before function
558 symbols before debugging symbols. */
559
560 aflags = a->flags;
561 bflags = b->flags;
562
563 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
564 {
565 if ((aflags & BSF_DEBUGGING) != 0)
566 return 1;
567 else
568 return -1;
569 }
570 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
571 {
572 if ((aflags & BSF_FUNCTION) != 0)
573 return -1;
574 else
575 return 1;
576 }
577 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
578 {
579 if ((aflags & BSF_LOCAL) != 0)
580 return 1;
581 else
582 return -1;
583 }
584 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
585 {
586 if ((aflags & BSF_GLOBAL) != 0)
587 return -1;
588 else
589 return 1;
590 }
591
592 /* Symbols that start with '.' might be section names, so sort them
593 after symbols that don't start with '.'. */
594 if (an[0] == '.' && bn[0] != '.')
595 return 1;
596 if (an[0] != '.' && bn[0] == '.')
597 return -1;
598
599 /* Finally, if we can't distinguish them in any other way, try to
600 get consistent results by sorting the symbols by name. */
601 return strcmp (an, bn);
602 }
603
604 /* Sort relocs into address order. */
605
606 static int
607 compare_relocs (const void *ap, const void *bp)
608 {
609 const arelent *a = * (const arelent **) ap;
610 const arelent *b = * (const arelent **) bp;
611
612 if (a->address > b->address)
613 return 1;
614 else if (a->address < b->address)
615 return -1;
616
617 /* So that associated relocations tied to the same address show up
618 in the correct order, we don't do any further sorting. */
619 if (a > b)
620 return 1;
621 else if (a < b)
622 return -1;
623 else
624 return 0;
625 }
626
627 /* Print an address (VMA) to the output stream in INFO.
628 If SKIP_ZEROES is TRUE, omit leading zeroes. */
629
630 static void
631 objdump_print_value (bfd_vma vma, struct disassemble_info *info,
632 bfd_boolean skip_zeroes)
633 {
634 char buf[30];
635 char *p;
636 struct objdump_disasm_info *aux;
637
638 aux = (struct objdump_disasm_info *) info->application_data;
639 bfd_sprintf_vma (aux->abfd, buf, vma);
640 if (! skip_zeroes)
641 p = buf;
642 else
643 {
644 for (p = buf; *p == '0'; ++p)
645 ;
646 if (*p == '\0')
647 --p;
648 }
649 (*info->fprintf_func) (info->stream, "%s", p);
650 }
651
652 /* Print the name of a symbol. */
653
654 static void
655 objdump_print_symname (bfd *abfd, struct disassemble_info *info,
656 asymbol *sym)
657 {
658 char *alloc;
659 const char *name;
660
661 alloc = NULL;
662 name = bfd_asymbol_name (sym);
663 if (do_demangle && name[0] != '\0')
664 {
665 /* Demangle the name. */
666 alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
667 if (alloc != NULL)
668 name = alloc;
669 }
670
671 if (info != NULL)
672 (*info->fprintf_func) (info->stream, "%s", name);
673 else
674 printf ("%s", name);
675
676 if (alloc != NULL)
677 free (alloc);
678 }
679
680 /* Locate a symbol given a bfd and a section (from INFO->application_data),
681 and a VMA. If INFO->application_data->require_sec is TRUE, then always
682 require the symbol to be in the section. Returns NULL if there is no
683 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
684 of the symbol in sorted_syms. */
685
686 static asymbol *
687 find_symbol_for_address (bfd_vma vma,
688 struct disassemble_info *info,
689 long *place)
690 {
691 /* @@ Would it speed things up to cache the last two symbols returned,
692 and maybe their address ranges? For many processors, only one memory
693 operand can be present at a time, so the 2-entry cache wouldn't be
694 constantly churned by code doing heavy memory accesses. */
695
696 /* Indices in `sorted_syms'. */
697 long min = 0;
698 long max = sorted_symcount;
699 long thisplace;
700 struct objdump_disasm_info *aux;
701 bfd *abfd;
702 asection *sec;
703 unsigned int opb;
704 bfd_boolean want_section;
705
706 if (sorted_symcount < 1)
707 return NULL;
708
709 aux = (struct objdump_disasm_info *) info->application_data;
710 abfd = aux->abfd;
711 sec = aux->sec;
712 opb = bfd_octets_per_byte (abfd);
713
714 /* Perform a binary search looking for the closest symbol to the
715 required value. We are searching the range (min, max]. */
716 while (min + 1 < max)
717 {
718 asymbol *sym;
719
720 thisplace = (max + min) / 2;
721 sym = sorted_syms[thisplace];
722
723 if (bfd_asymbol_value (sym) > vma)
724 max = thisplace;
725 else if (bfd_asymbol_value (sym) < vma)
726 min = thisplace;
727 else
728 {
729 min = thisplace;
730 break;
731 }
732 }
733
734 /* The symbol we want is now in min, the low end of the range we
735 were searching. If there are several symbols with the same
736 value, we want the first one. */
737 thisplace = min;
738 while (thisplace > 0
739 && (bfd_asymbol_value (sorted_syms[thisplace])
740 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
741 --thisplace;
742
743 /* Prefer a symbol in the current section if we have multple symbols
744 with the same value, as can occur with overlays or zero size
745 sections. */
746 min = thisplace;
747 while (min < max
748 && (bfd_asymbol_value (sorted_syms[min])
749 == bfd_asymbol_value (sorted_syms[thisplace])))
750 {
751 if (sorted_syms[min]->section == sec
752 && info->symbol_is_valid (sorted_syms[min], info))
753 {
754 thisplace = min;
755
756 if (place != NULL)
757 *place = thisplace;
758
759 return sorted_syms[thisplace];
760 }
761 ++min;
762 }
763
764 /* If the file is relocatable, and the symbol could be from this
765 section, prefer a symbol from this section over symbols from
766 others, even if the other symbol's value might be closer.
767
768 Note that this may be wrong for some symbol references if the
769 sections have overlapping memory ranges, but in that case there's
770 no way to tell what's desired without looking at the relocation
771 table.
772
773 Also give the target a chance to reject symbols. */
774 want_section = (aux->require_sec
775 || ((abfd->flags & HAS_RELOC) != 0
776 && vma >= bfd_get_section_vma (abfd, sec)
777 && vma < (bfd_get_section_vma (abfd, sec)
778 + bfd_section_size (abfd, sec) / opb)));
779 if ((sorted_syms[thisplace]->section != sec && want_section)
780 || !info->symbol_is_valid (sorted_syms[thisplace], info))
781 {
782 long i;
783 long newplace = sorted_symcount;
784
785 for (i = min - 1; i >= 0; i--)
786 {
787 if ((sorted_syms[i]->section == sec || !want_section)
788 && info->symbol_is_valid (sorted_syms[i], info))
789 {
790 if (newplace == sorted_symcount)
791 newplace = i;
792
793 if (bfd_asymbol_value (sorted_syms[i])
794 != bfd_asymbol_value (sorted_syms[newplace]))
795 break;
796
797 /* Remember this symbol and keep searching until we reach
798 an earlier address. */
799 newplace = i;
800 }
801 }
802
803 if (newplace != sorted_symcount)
804 thisplace = newplace;
805 else
806 {
807 /* We didn't find a good symbol with a smaller value.
808 Look for one with a larger value. */
809 for (i = thisplace + 1; i < sorted_symcount; i++)
810 {
811 if ((sorted_syms[i]->section == sec || !want_section)
812 && info->symbol_is_valid (sorted_syms[i], info))
813 {
814 thisplace = i;
815 break;
816 }
817 }
818 }
819
820 if ((sorted_syms[thisplace]->section != sec && want_section)
821 || !info->symbol_is_valid (sorted_syms[thisplace], info))
822 /* There is no suitable symbol. */
823 return NULL;
824 }
825
826 if (place != NULL)
827 *place = thisplace;
828
829 return sorted_syms[thisplace];
830 }
831
832 /* Print an address and the offset to the nearest symbol. */
833
834 static void
835 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
836 bfd_vma vma, struct disassemble_info *info,
837 bfd_boolean skip_zeroes)
838 {
839 objdump_print_value (vma, info, skip_zeroes);
840
841 if (sym == NULL)
842 {
843 bfd_vma secaddr;
844
845 (*info->fprintf_func) (info->stream, " <%s",
846 bfd_get_section_name (abfd, sec));
847 secaddr = bfd_get_section_vma (abfd, sec);
848 if (vma < secaddr)
849 {
850 (*info->fprintf_func) (info->stream, "-0x");
851 objdump_print_value (secaddr - vma, info, TRUE);
852 }
853 else if (vma > secaddr)
854 {
855 (*info->fprintf_func) (info->stream, "+0x");
856 objdump_print_value (vma - secaddr, info, TRUE);
857 }
858 (*info->fprintf_func) (info->stream, ">");
859 }
860 else
861 {
862 (*info->fprintf_func) (info->stream, " <");
863 objdump_print_symname (abfd, info, sym);
864 if (bfd_asymbol_value (sym) > vma)
865 {
866 (*info->fprintf_func) (info->stream, "-0x");
867 objdump_print_value (bfd_asymbol_value (sym) - vma, info, TRUE);
868 }
869 else if (vma > bfd_asymbol_value (sym))
870 {
871 (*info->fprintf_func) (info->stream, "+0x");
872 objdump_print_value (vma - bfd_asymbol_value (sym), info, TRUE);
873 }
874 (*info->fprintf_func) (info->stream, ">");
875 }
876
877 if (display_file_offsets)
878 info->fprintf_func (info->stream, _(" (File Offset: 0x%lx)"),
879 (long int)(sec->filepos + (vma - sec->vma)));
880 }
881
882 /* Print an address (VMA), symbolically if possible.
883 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
884
885 static void
886 objdump_print_addr (bfd_vma vma,
887 struct disassemble_info *info,
888 bfd_boolean skip_zeroes)
889 {
890 struct objdump_disasm_info *aux;
891 asymbol *sym = NULL;
892 bfd_boolean skip_find = FALSE;
893
894 aux = (struct objdump_disasm_info *) info->application_data;
895
896 if (sorted_symcount < 1)
897 {
898 (*info->fprintf_func) (info->stream, "0x");
899 objdump_print_value (vma, info, skip_zeroes);
900
901 if (display_file_offsets)
902 info->fprintf_func (info->stream, _(" (File Offset: 0x%lx)"),
903 (long int)(aux->sec->filepos + (vma - aux->sec->vma)));
904 return;
905 }
906
907 if (aux->reloc != NULL
908 && aux->reloc->sym_ptr_ptr != NULL
909 && * aux->reloc->sym_ptr_ptr != NULL)
910 {
911 sym = * aux->reloc->sym_ptr_ptr;
912
913 /* Adjust the vma to the reloc. */
914 vma += bfd_asymbol_value (sym);
915
916 if (bfd_is_und_section (bfd_get_section (sym)))
917 skip_find = TRUE;
918 }
919
920 if (!skip_find)
921 sym = find_symbol_for_address (vma, info, NULL);
922
923 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
924 skip_zeroes);
925 }
926
927 /* Print VMA to INFO. This function is passed to the disassembler
928 routine. */
929
930 static void
931 objdump_print_address (bfd_vma vma, struct disassemble_info *info)
932 {
933 objdump_print_addr (vma, info, ! prefix_addresses);
934 }
935
936 /* Determine if the given address has a symbol associated with it. */
937
938 static int
939 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * info)
940 {
941 asymbol * sym;
942
943 sym = find_symbol_for_address (vma, info, NULL);
944
945 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
946 }
947
948 /* Hold the last function name and the last line number we displayed
949 in a disassembly. */
950
951 static char *prev_functionname;
952 static unsigned int prev_line;
953
954 /* We keep a list of all files that we have seen when doing a
955 disassembly with source, so that we know how much of the file to
956 display. This can be important for inlined functions. */
957
958 struct print_file_list
959 {
960 struct print_file_list *next;
961 const char *filename;
962 const char *modname;
963 const char *map;
964 size_t mapsize;
965 const char **linemap;
966 unsigned maxline;
967 unsigned last_line;
968 int first;
969 };
970
971 static struct print_file_list *print_files;
972
973 /* The number of preceding context lines to show when we start
974 displaying a file for the first time. */
975
976 #define SHOW_PRECEDING_CONTEXT_LINES (5)
977
978 /* Read a complete file into memory. */
979
980 static const char *
981 slurp_file (const char *fn, size_t *size)
982 {
983 #ifdef HAVE_MMAP
984 int ps = getpagesize ();
985 size_t msize;
986 #endif
987 const char *map;
988 struct stat st;
989 int fd = open (fn, O_RDONLY | O_BINARY);
990
991 if (fd < 0)
992 return NULL;
993 if (fstat (fd, &st) < 0)
994 return NULL;
995 *size = st.st_size;
996 #ifdef HAVE_MMAP
997 msize = (*size + ps - 1) & ~(ps - 1);
998 map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
999 if (map != (char *)-1L)
1000 {
1001 close(fd);
1002 return map;
1003 }
1004 #endif
1005 map = malloc (*size);
1006 if (!map || (size_t) read (fd, (char *)map, *size) != *size)
1007 {
1008 free ((void *)map);
1009 map = NULL;
1010 }
1011 close (fd);
1012 return map;
1013 }
1014
1015 #define line_map_decrease 5
1016
1017 /* Precompute array of lines for a mapped file. */
1018
1019 static const char **
1020 index_file (const char *map, size_t size, unsigned int *maxline)
1021 {
1022 const char *p, *lstart, *end;
1023 int chars_per_line = 45; /* First iteration will use 40. */
1024 unsigned int lineno;
1025 const char **linemap = NULL;
1026 unsigned long line_map_size = 0;
1027
1028 lineno = 0;
1029 lstart = map;
1030 end = map + size;
1031
1032 for (p = map; p < end; p++)
1033 {
1034 if (*p == '\n')
1035 {
1036 if (p + 1 < end && p[1] == '\r')
1037 p++;
1038 }
1039 else if (*p == '\r')
1040 {
1041 if (p + 1 < end && p[1] == '\n')
1042 p++;
1043 }
1044 else
1045 continue;
1046
1047 /* End of line found. */
1048
1049 if (linemap == NULL || line_map_size < lineno + 1)
1050 {
1051 unsigned long newsize;
1052
1053 chars_per_line -= line_map_decrease;
1054 if (chars_per_line <= 1)
1055 chars_per_line = 1;
1056 line_map_size = size / chars_per_line + 1;
1057 if (line_map_size < lineno + 1)
1058 line_map_size = lineno + 1;
1059 newsize = line_map_size * sizeof (char *);
1060 linemap = xrealloc (linemap, newsize);
1061 }
1062
1063 linemap[lineno++] = lstart;
1064 lstart = p + 1;
1065 }
1066
1067 *maxline = lineno;
1068 return linemap;
1069 }
1070
1071 /* Tries to open MODNAME, and if successful adds a node to print_files
1072 linked list and returns that node. Returns NULL on failure. */
1073
1074 static struct print_file_list *
1075 try_print_file_open (const char *origname, const char *modname)
1076 {
1077 struct print_file_list *p;
1078
1079 p = xmalloc (sizeof (struct print_file_list));
1080
1081 p->map = slurp_file (modname, &p->mapsize);
1082 if (p->map == NULL)
1083 {
1084 free (p);
1085 return NULL;
1086 }
1087
1088 p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1089 p->last_line = 0;
1090 p->filename = origname;
1091 p->modname = modname;
1092 p->next = print_files;
1093 p->first = 1;
1094 print_files = p;
1095 return p;
1096 }
1097
1098 /* If the the source file, as described in the symtab, is not found
1099 try to locate it in one of the paths specified with -I
1100 If found, add location to print_files linked list. */
1101
1102 static struct print_file_list *
1103 update_source_path (const char *filename)
1104 {
1105 struct print_file_list *p;
1106 const char *fname;
1107 int i;
1108
1109 if (filename == NULL)
1110 return NULL;
1111
1112 p = try_print_file_open (filename, filename);
1113 if (p != NULL)
1114 return p;
1115
1116 if (include_path_count == 0)
1117 return NULL;
1118
1119 /* Get the name of the file. */
1120 fname = strrchr (filename, '/');
1121 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1122 {
1123 /* We could have a mixed forward/back slash case. */
1124 char *backslash = strrchr (filename, '\\');
1125 if (fname == NULL || (backslash != NULL && backslash > fname))
1126 fname = backslash;
1127 if (fname == NULL && filename[0] != '\0' && filename[1] == ':')
1128 fname = filename + 1;
1129 }
1130 #endif
1131 if (fname == NULL)
1132 fname = filename;
1133 else
1134 ++fname;
1135
1136 /* If file exists under a new path, we need to add it to the list
1137 so that show_line knows about it. */
1138 for (i = 0; i < include_path_count; i++)
1139 {
1140 char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1141
1142 p = try_print_file_open (filename, modname);
1143 if (p)
1144 return p;
1145
1146 free (modname);
1147 }
1148
1149 return NULL;
1150 }
1151
1152 /* Print a source file line. */
1153
1154 static void
1155 print_line (struct print_file_list *p, unsigned int line)
1156 {
1157 const char *l;
1158 size_t len;
1159
1160 --line;
1161 if (line >= p->maxline)
1162 return;
1163 l = p->linemap [line];
1164 /* Test fwrite return value to quiet glibc warning. */
1165 len = strcspn (l, "\n\r");
1166 if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1167 putchar ('\n');
1168 }
1169
1170 /* Print a range of source code lines. */
1171
1172 static void
1173 dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1174 {
1175 if (p->map == NULL)
1176 return;
1177 while (start <= end)
1178 {
1179 print_line (p, start);
1180 start++;
1181 }
1182 }
1183
1184 /* Show the line number, or the source line, in a disassembly
1185 listing. */
1186
1187 static void
1188 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1189 {
1190 const char *filename;
1191 const char *functionname;
1192 unsigned int line;
1193
1194 if (! with_line_numbers && ! with_source_code)
1195 return;
1196
1197 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1198 &functionname, &line))
1199 return;
1200
1201 if (filename != NULL && *filename == '\0')
1202 filename = NULL;
1203 if (functionname != NULL && *functionname == '\0')
1204 functionname = NULL;
1205
1206 if (with_line_numbers)
1207 {
1208 if (functionname != NULL
1209 && (prev_functionname == NULL
1210 || strcmp (functionname, prev_functionname) != 0))
1211 printf ("%s():\n", functionname);
1212 if (line > 0 && line != prev_line)
1213 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1214 }
1215
1216 if (with_source_code
1217 && filename != NULL
1218 && line > 0)
1219 {
1220 struct print_file_list **pp, *p;
1221 unsigned l;
1222
1223 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1224 if (strcmp ((*pp)->filename, filename) == 0)
1225 break;
1226 p = *pp;
1227
1228 if (p == NULL)
1229 p = update_source_path (filename);
1230
1231 if (p != NULL && line != p->last_line)
1232 {
1233 if (file_start_context && p->first)
1234 l = 1;
1235 else
1236 {
1237 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1238 if (l >= line)
1239 l = 1;
1240 if (p->last_line >= l && p->last_line <= line)
1241 l = p->last_line + 1;
1242 }
1243 dump_lines (p, l, line);
1244 p->last_line = line;
1245 p->first = 0;
1246 }
1247 }
1248
1249 if (functionname != NULL
1250 && (prev_functionname == NULL
1251 || strcmp (functionname, prev_functionname) != 0))
1252 {
1253 if (prev_functionname != NULL)
1254 free (prev_functionname);
1255 prev_functionname = xmalloc (strlen (functionname) + 1);
1256 strcpy (prev_functionname, functionname);
1257 }
1258
1259 if (line > 0 && line != prev_line)
1260 prev_line = line;
1261 }
1262
1263 /* Pseudo FILE object for strings. */
1264 typedef struct
1265 {
1266 char *buffer;
1267 size_t pos;
1268 size_t alloc;
1269 } SFILE;
1270
1271 /* sprintf to a "stream". */
1272
1273 static int ATTRIBUTE_PRINTF_2
1274 objdump_sprintf (SFILE *f, const char *format, ...)
1275 {
1276 size_t n;
1277 va_list args;
1278
1279 while (1)
1280 {
1281 size_t space = f->alloc - f->pos;
1282
1283 va_start (args, format);
1284 n = vsnprintf (f->buffer + f->pos, space, format, args);
1285 va_end (args);
1286
1287 if (space > n)
1288 break;
1289
1290 f->alloc = (f->alloc + n) * 2;
1291 f->buffer = xrealloc (f->buffer, f->alloc);
1292 }
1293 f->pos += n;
1294
1295 return n;
1296 }
1297
1298 /* Returns TRUE if the specified section should be dumped. */
1299
1300 static bfd_boolean
1301 process_section_p (asection * section)
1302 {
1303 size_t i;
1304
1305 if (only == NULL)
1306 return TRUE;
1307
1308 for (i = 0; i < only_used; i++)
1309 if (strcmp (only [i], section->name) == 0)
1310 return TRUE;
1311
1312 return FALSE;
1313 }
1314
1315
1316 /* The number of zeroes we want to see before we start skipping them.
1317 The number is arbitrarily chosen. */
1318
1319 #define DEFAULT_SKIP_ZEROES 8
1320
1321 /* The number of zeroes to skip at the end of a section. If the
1322 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1323 SKIP_ZEROES, they will be disassembled. If there are fewer than
1324 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1325 attempt to avoid disassembling zeroes inserted by section
1326 alignment. */
1327
1328 #define DEFAULT_SKIP_ZEROES_AT_END 3
1329
1330 /* Disassemble some data in memory between given values. */
1331
1332 static void
1333 disassemble_bytes (struct disassemble_info * info,
1334 disassembler_ftype disassemble_fn,
1335 bfd_boolean insns,
1336 bfd_byte * data,
1337 bfd_vma start_offset,
1338 bfd_vma stop_offset,
1339 bfd_vma rel_offset,
1340 arelent *** relppp,
1341 arelent ** relppend)
1342 {
1343 struct objdump_disasm_info *aux;
1344 asection *section;
1345 int octets_per_line;
1346 bfd_boolean done_dot;
1347 int skip_addr_chars;
1348 bfd_vma addr_offset;
1349 unsigned int opb = info->octets_per_byte;
1350 unsigned int skip_zeroes = info->skip_zeroes;
1351 unsigned int skip_zeroes_at_end = info->skip_zeroes_at_end;
1352 int octets = opb;
1353 SFILE sfile;
1354
1355 aux = (struct objdump_disasm_info *) info->application_data;
1356 section = aux->sec;
1357
1358 sfile.alloc = 120;
1359 sfile.buffer = xmalloc (sfile.alloc);
1360 sfile.pos = 0;
1361
1362 if (insns)
1363 octets_per_line = 4;
1364 else
1365 octets_per_line = 16;
1366
1367 /* Figure out how many characters to skip at the start of an
1368 address, to make the disassembly look nicer. We discard leading
1369 zeroes in chunks of 4, ensuring that there is always a leading
1370 zero remaining. */
1371 skip_addr_chars = 0;
1372 if (! prefix_addresses)
1373 {
1374 char buf[30];
1375
1376 bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1377
1378 while (buf[skip_addr_chars] == '0')
1379 ++skip_addr_chars;
1380
1381 /* Don't discard zeros on overflow. */
1382 if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1383 skip_addr_chars = 0;
1384
1385 if (skip_addr_chars != 0)
1386 skip_addr_chars = (skip_addr_chars - 1) & -4;
1387 }
1388
1389 info->insn_info_valid = 0;
1390
1391 done_dot = FALSE;
1392 addr_offset = start_offset;
1393 while (addr_offset < stop_offset)
1394 {
1395 bfd_vma z;
1396 bfd_boolean need_nl = FALSE;
1397 int previous_octets;
1398
1399 /* Remember the length of the previous instruction. */
1400 previous_octets = octets;
1401 octets = 0;
1402
1403 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1404 print `...'. */
1405 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1406 if (data[z] != 0)
1407 break;
1408 if (! disassemble_zeroes
1409 && (info->insn_info_valid == 0
1410 || info->branch_delay_insns == 0)
1411 && (z - addr_offset * opb >= skip_zeroes
1412 || (z == stop_offset * opb &&
1413 z - addr_offset * opb < skip_zeroes_at_end)))
1414 {
1415 /* If there are more nonzero octets to follow, we only skip
1416 zeroes in multiples of 4, to try to avoid running over
1417 the start of an instruction which happens to start with
1418 zero. */
1419 if (z != stop_offset * opb)
1420 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1421
1422 octets = z - addr_offset * opb;
1423
1424 /* If we are going to display more data, and we are displaying
1425 file offsets, then tell the user how many zeroes we skip
1426 and the file offset from where we resume dumping. */
1427 if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1428 printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1429 octets / opb,
1430 (unsigned long) (section->filepos
1431 + (addr_offset + (octets / opb))));
1432 else
1433 printf ("\t...\n");
1434 }
1435 else
1436 {
1437 char buf[50];
1438 int bpc = 0;
1439 int pb = 0;
1440
1441 done_dot = FALSE;
1442
1443 if (with_line_numbers || with_source_code)
1444 show_line (aux->abfd, section, addr_offset);
1445
1446 if (! prefix_addresses)
1447 {
1448 char *s;
1449
1450 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1451 for (s = buf + skip_addr_chars; *s == '0'; s++)
1452 *s = ' ';
1453 if (*s == '\0')
1454 *--s = '0';
1455 printf ("%s:\t", buf + skip_addr_chars);
1456 }
1457 else
1458 {
1459 aux->require_sec = TRUE;
1460 objdump_print_address (section->vma + addr_offset, info);
1461 aux->require_sec = FALSE;
1462 putchar (' ');
1463 }
1464
1465 if (insns)
1466 {
1467 sfile.pos = 0;
1468 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1469 info->stream = &sfile;
1470 info->bytes_per_line = 0;
1471 info->bytes_per_chunk = 0;
1472 info->flags = 0;
1473
1474 if (info->disassembler_needs_relocs
1475 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1476 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1477 && *relppp < relppend)
1478 {
1479 bfd_signed_vma distance_to_rel;
1480
1481 distance_to_rel = (**relppp)->address
1482 - (rel_offset + addr_offset);
1483
1484 /* Check to see if the current reloc is associated with
1485 the instruction that we are about to disassemble. */
1486 if (distance_to_rel == 0
1487 /* FIXME: This is wrong. We are trying to catch
1488 relocs that are addressed part way through the
1489 current instruction, as might happen with a packed
1490 VLIW instruction. Unfortunately we do not know the
1491 length of the current instruction since we have not
1492 disassembled it yet. Instead we take a guess based
1493 upon the length of the previous instruction. The
1494 proper solution is to have a new target-specific
1495 disassembler function which just returns the length
1496 of an instruction at a given address without trying
1497 to display its disassembly. */
1498 || (distance_to_rel > 0
1499 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1500 {
1501 info->flags = INSN_HAS_RELOC;
1502 aux->reloc = **relppp;
1503 }
1504 else
1505 aux->reloc = NULL;
1506 }
1507
1508 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1509 info->fprintf_func = (fprintf_ftype) fprintf;
1510 info->stream = stdout;
1511 if (info->bytes_per_line != 0)
1512 octets_per_line = info->bytes_per_line;
1513 if (octets < 0)
1514 {
1515 if (sfile.pos)
1516 printf ("%s\n", sfile.buffer);
1517 break;
1518 }
1519 }
1520 else
1521 {
1522 bfd_vma j;
1523
1524 octets = octets_per_line;
1525 if (addr_offset + octets / opb > stop_offset)
1526 octets = (stop_offset - addr_offset) * opb;
1527
1528 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1529 {
1530 if (ISPRINT (data[j]))
1531 buf[j - addr_offset * opb] = data[j];
1532 else
1533 buf[j - addr_offset * opb] = '.';
1534 }
1535 buf[j - addr_offset * opb] = '\0';
1536 }
1537
1538 if (prefix_addresses
1539 ? show_raw_insn > 0
1540 : show_raw_insn >= 0)
1541 {
1542 bfd_vma j;
1543
1544 /* If ! prefix_addresses and ! wide_output, we print
1545 octets_per_line octets per line. */
1546 pb = octets;
1547 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1548 pb = octets_per_line;
1549
1550 if (info->bytes_per_chunk)
1551 bpc = info->bytes_per_chunk;
1552 else
1553 bpc = 1;
1554
1555 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1556 {
1557 int k;
1558
1559 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1560 {
1561 for (k = bpc - 1; k >= 0; k--)
1562 printf ("%02x", (unsigned) data[j + k]);
1563 putchar (' ');
1564 }
1565 else
1566 {
1567 for (k = 0; k < bpc; k++)
1568 printf ("%02x", (unsigned) data[j + k]);
1569 putchar (' ');
1570 }
1571 }
1572
1573 for (; pb < octets_per_line; pb += bpc)
1574 {
1575 int k;
1576
1577 for (k = 0; k < bpc; k++)
1578 printf (" ");
1579 putchar (' ');
1580 }
1581
1582 /* Separate raw data from instruction by extra space. */
1583 if (insns)
1584 putchar ('\t');
1585 else
1586 printf (" ");
1587 }
1588
1589 if (! insns)
1590 printf ("%s", buf);
1591 else if (sfile.pos)
1592 printf ("%s", sfile.buffer);
1593
1594 if (prefix_addresses
1595 ? show_raw_insn > 0
1596 : show_raw_insn >= 0)
1597 {
1598 while (pb < octets)
1599 {
1600 bfd_vma j;
1601 char *s;
1602
1603 putchar ('\n');
1604 j = addr_offset * opb + pb;
1605
1606 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1607 for (s = buf + skip_addr_chars; *s == '0'; s++)
1608 *s = ' ';
1609 if (*s == '\0')
1610 *--s = '0';
1611 printf ("%s:\t", buf + skip_addr_chars);
1612
1613 pb += octets_per_line;
1614 if (pb > octets)
1615 pb = octets;
1616 for (; j < addr_offset * opb + pb; j += bpc)
1617 {
1618 int k;
1619
1620 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1621 {
1622 for (k = bpc - 1; k >= 0; k--)
1623 printf ("%02x", (unsigned) data[j + k]);
1624 putchar (' ');
1625 }
1626 else
1627 {
1628 for (k = 0; k < bpc; k++)
1629 printf ("%02x", (unsigned) data[j + k]);
1630 putchar (' ');
1631 }
1632 }
1633 }
1634 }
1635
1636 if (!wide_output)
1637 putchar ('\n');
1638 else
1639 need_nl = TRUE;
1640 }
1641
1642 while ((*relppp) < relppend
1643 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1644 {
1645 if (dump_reloc_info || dump_dynamic_reloc_info)
1646 {
1647 arelent *q;
1648
1649 q = **relppp;
1650
1651 if (wide_output)
1652 putchar ('\t');
1653 else
1654 printf ("\t\t\t");
1655
1656 objdump_print_value (section->vma - rel_offset + q->address,
1657 info, TRUE);
1658
1659 if (q->howto == NULL)
1660 printf (": *unknown*\t");
1661 else if (q->howto->name)
1662 printf (": %s\t", q->howto->name);
1663 else
1664 printf (": %d\t", q->howto->type);
1665
1666 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1667 printf ("*unknown*");
1668 else
1669 {
1670 const char *sym_name;
1671
1672 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1673 if (sym_name != NULL && *sym_name != '\0')
1674 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1675 else
1676 {
1677 asection *sym_sec;
1678
1679 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1680 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1681 if (sym_name == NULL || *sym_name == '\0')
1682 sym_name = "*unknown*";
1683 printf ("%s", sym_name);
1684 }
1685 }
1686
1687 if (q->addend)
1688 {
1689 printf ("+0x");
1690 objdump_print_value (q->addend, info, TRUE);
1691 }
1692
1693 printf ("\n");
1694 need_nl = FALSE;
1695 }
1696 ++(*relppp);
1697 }
1698
1699 if (need_nl)
1700 printf ("\n");
1701
1702 addr_offset += octets / opb;
1703 }
1704
1705 free (sfile.buffer);
1706 }
1707
1708 static void
1709 disassemble_section (bfd *abfd, asection *section, void *info)
1710 {
1711 const struct elf_backend_data * bed;
1712 bfd_vma sign_adjust = 0;
1713 struct disassemble_info * pinfo = (struct disassemble_info *) info;
1714 struct objdump_disasm_info * paux;
1715 unsigned int opb = pinfo->octets_per_byte;
1716 bfd_byte * data = NULL;
1717 bfd_size_type datasize = 0;
1718 arelent ** rel_pp = NULL;
1719 arelent ** rel_ppstart = NULL;
1720 arelent ** rel_ppend;
1721 unsigned long stop_offset;
1722 asymbol * sym = NULL;
1723 long place = 0;
1724 long rel_count;
1725 bfd_vma rel_offset;
1726 unsigned long addr_offset;
1727
1728 /* Sections that do not contain machine
1729 code are not normally disassembled. */
1730 if (! disassemble_all
1731 && only == NULL
1732 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1733 != (SEC_CODE | SEC_HAS_CONTENTS)))
1734 return;
1735
1736 if (! process_section_p (section))
1737 return;
1738
1739 datasize = bfd_get_section_size (section);
1740 if (datasize == 0)
1741 return;
1742
1743 /* Decide which set of relocs to use. Load them if necessary. */
1744 paux = (struct objdump_disasm_info *) pinfo->application_data;
1745 if (paux->dynrelbuf)
1746 {
1747 rel_pp = paux->dynrelbuf;
1748 rel_count = paux->dynrelcount;
1749 /* Dynamic reloc addresses are absolute, non-dynamic are section
1750 relative. REL_OFFSET specifies the reloc address corresponding
1751 to the start of this section. */
1752 rel_offset = section->vma;
1753 }
1754 else
1755 {
1756 rel_count = 0;
1757 rel_pp = NULL;
1758 rel_offset = 0;
1759
1760 if ((section->flags & SEC_RELOC) != 0
1761 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1762 {
1763 long relsize;
1764
1765 relsize = bfd_get_reloc_upper_bound (abfd, section);
1766 if (relsize < 0)
1767 bfd_fatal (bfd_get_filename (abfd));
1768
1769 if (relsize > 0)
1770 {
1771 rel_ppstart = rel_pp = xmalloc (relsize);
1772 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1773 if (rel_count < 0)
1774 bfd_fatal (bfd_get_filename (abfd));
1775
1776 /* Sort the relocs by address. */
1777 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1778 }
1779 }
1780 }
1781 rel_ppend = rel_pp + rel_count;
1782
1783 data = xmalloc (datasize);
1784
1785 bfd_get_section_contents (abfd, section, data, 0, datasize);
1786
1787 paux->sec = section;
1788 pinfo->buffer = data;
1789 pinfo->buffer_vma = section->vma;
1790 pinfo->buffer_length = datasize;
1791 pinfo->section = section;
1792
1793 if (start_address == (bfd_vma) -1
1794 || start_address < pinfo->buffer_vma)
1795 addr_offset = 0;
1796 else
1797 addr_offset = start_address - pinfo->buffer_vma;
1798
1799 if (stop_address == (bfd_vma) -1)
1800 stop_offset = datasize / opb;
1801 else
1802 {
1803 if (stop_address < pinfo->buffer_vma)
1804 stop_offset = 0;
1805 else
1806 stop_offset = stop_address - pinfo->buffer_vma;
1807 if (stop_offset > pinfo->buffer_length / opb)
1808 stop_offset = pinfo->buffer_length / opb;
1809 }
1810
1811 /* Skip over the relocs belonging to addresses below the
1812 start address. */
1813 while (rel_pp < rel_ppend
1814 && (*rel_pp)->address < rel_offset + addr_offset)
1815 ++rel_pp;
1816
1817 if (addr_offset < stop_offset)
1818 printf (_("\nDisassembly of section %s:\n"), section->name);
1819
1820 /* Find the nearest symbol forwards from our current position. */
1821 paux->require_sec = TRUE;
1822 sym = find_symbol_for_address (section->vma + addr_offset, info, &place);
1823 paux->require_sec = FALSE;
1824
1825 /* PR 9774: If the target used signed 32-bit addresses then we must make
1826 sure that we sign extend the value that we calculate for 'addr' in the
1827 loop below. */
1828 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
1829 && (bed = get_elf_backend_data (abfd)) != NULL
1830 && bed->sign_extend_vma)
1831 sign_adjust = 0x80000000;
1832
1833 /* Disassemble a block of instructions up to the address associated with
1834 the symbol we have just found. Then print the symbol and find the
1835 next symbol on. Repeat until we have disassembled the entire section
1836 or we have reached the end of the address range we are interested in. */
1837 while (addr_offset < stop_offset)
1838 {
1839 bfd_vma addr;
1840 asymbol *nextsym;
1841 unsigned long nextstop_offset;
1842 bfd_boolean insns;
1843
1844 addr = section->vma + addr_offset;
1845 addr = (addr ^ sign_adjust) - sign_adjust;
1846
1847 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
1848 {
1849 int x;
1850
1851 for (x = place;
1852 (x < sorted_symcount
1853 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
1854 ++x)
1855 continue;
1856
1857 pinfo->symbols = sorted_syms + place;
1858 pinfo->num_symbols = x - place;
1859 pinfo->symtab_pos = place;
1860 }
1861 else
1862 {
1863 pinfo->symbols = NULL;
1864 pinfo->num_symbols = 0;
1865 pinfo->symtab_pos = -1;
1866 }
1867
1868 if (! prefix_addresses)
1869 {
1870 pinfo->fprintf_func (pinfo->stream, "\n");
1871 objdump_print_addr_with_sym (abfd, section, sym, addr,
1872 pinfo, FALSE);
1873 pinfo->fprintf_func (pinfo->stream, ":\n");
1874 }
1875
1876 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1877 nextsym = sym;
1878 else if (sym == NULL)
1879 nextsym = NULL;
1880 else
1881 {
1882 #define is_valid_next_sym(SYM) \
1883 ((SYM)->section == section \
1884 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
1885 && pinfo->symbol_is_valid (SYM, pinfo))
1886
1887 /* Search forward for the next appropriate symbol in
1888 SECTION. Note that all the symbols are sorted
1889 together into one big array, and that some sections
1890 may have overlapping addresses. */
1891 while (place < sorted_symcount
1892 && ! is_valid_next_sym (sorted_syms [place]))
1893 ++place;
1894
1895 if (place >= sorted_symcount)
1896 nextsym = NULL;
1897 else
1898 nextsym = sorted_syms[place];
1899 }
1900
1901 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1902 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1903 else if (nextsym == NULL)
1904 nextstop_offset = stop_offset;
1905 else
1906 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1907
1908 if (nextstop_offset > stop_offset)
1909 nextstop_offset = stop_offset;
1910
1911 /* If a symbol is explicitly marked as being an object
1912 rather than a function, just dump the bytes without
1913 disassembling them. */
1914 if (disassemble_all
1915 || sym == NULL
1916 || sym->section != section
1917 || bfd_asymbol_value (sym) > addr
1918 || ((sym->flags & BSF_OBJECT) == 0
1919 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1920 == NULL)
1921 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1922 == NULL))
1923 || (sym->flags & BSF_FUNCTION) != 0)
1924 insns = TRUE;
1925 else
1926 insns = FALSE;
1927
1928 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
1929 addr_offset, nextstop_offset,
1930 rel_offset, &rel_pp, rel_ppend);
1931
1932 addr_offset = nextstop_offset;
1933 sym = nextsym;
1934 }
1935
1936 free (data);
1937
1938 if (rel_ppstart != NULL)
1939 free (rel_ppstart);
1940 }
1941
1942 /* Disassemble the contents of an object file. */
1943
1944 static void
1945 disassemble_data (bfd *abfd)
1946 {
1947 struct disassemble_info disasm_info;
1948 struct objdump_disasm_info aux;
1949 long i;
1950
1951 print_files = NULL;
1952 prev_functionname = NULL;
1953 prev_line = -1;
1954
1955 /* We make a copy of syms to sort. We don't want to sort syms
1956 because that will screw up the relocs. */
1957 sorted_symcount = symcount ? symcount : dynsymcount;
1958 sorted_syms = xmalloc ((sorted_symcount + synthcount) * sizeof (asymbol *));
1959 memcpy (sorted_syms, symcount ? syms : dynsyms,
1960 sorted_symcount * sizeof (asymbol *));
1961
1962 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
1963
1964 for (i = 0; i < synthcount; ++i)
1965 {
1966 sorted_syms[sorted_symcount] = synthsyms + i;
1967 ++sorted_symcount;
1968 }
1969
1970 /* Sort the symbols into section and symbol order. */
1971 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1972
1973 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
1974
1975 disasm_info.application_data = (void *) &aux;
1976 aux.abfd = abfd;
1977 aux.require_sec = FALSE;
1978 aux.dynrelbuf = NULL;
1979 aux.dynrelcount = 0;
1980 aux.reloc = NULL;
1981
1982 disasm_info.print_address_func = objdump_print_address;
1983 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1984
1985 if (machine != NULL)
1986 {
1987 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1988
1989 if (info == NULL)
1990 fatal (_("Can't use supplied machine %s"), machine);
1991
1992 abfd->arch_info = info;
1993 }
1994
1995 if (endian != BFD_ENDIAN_UNKNOWN)
1996 {
1997 struct bfd_target *xvec;
1998
1999 xvec = xmalloc (sizeof (struct bfd_target));
2000 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2001 xvec->byteorder = endian;
2002 abfd->xvec = xvec;
2003 }
2004
2005 /* Use libopcodes to locate a suitable disassembler. */
2006 aux.disassemble_fn = disassembler (abfd);
2007 if (!aux.disassemble_fn)
2008 {
2009 non_fatal (_("Can't disassemble for architecture %s\n"),
2010 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2011 exit_status = 1;
2012 return;
2013 }
2014
2015 disasm_info.flavour = bfd_get_flavour (abfd);
2016 disasm_info.arch = bfd_get_arch (abfd);
2017 disasm_info.mach = bfd_get_mach (abfd);
2018 disasm_info.disassembler_options = disassembler_options;
2019 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2020 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2021 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2022 disasm_info.disassembler_needs_relocs = FALSE;
2023
2024 if (bfd_big_endian (abfd))
2025 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2026 else if (bfd_little_endian (abfd))
2027 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2028 else
2029 /* ??? Aborting here seems too drastic. We could default to big or little
2030 instead. */
2031 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2032
2033 /* Allow the target to customize the info structure. */
2034 disassemble_init_for_target (& disasm_info);
2035
2036 /* Pre-load the dynamic relocs if we are going
2037 to be dumping them along with the disassembly. */
2038 if (dump_dynamic_reloc_info)
2039 {
2040 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2041
2042 if (relsize < 0)
2043 bfd_fatal (bfd_get_filename (abfd));
2044
2045 if (relsize > 0)
2046 {
2047 aux.dynrelbuf = xmalloc (relsize);
2048 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2049 aux.dynrelbuf,
2050 dynsyms);
2051 if (aux.dynrelcount < 0)
2052 bfd_fatal (bfd_get_filename (abfd));
2053
2054 /* Sort the relocs by address. */
2055 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2056 compare_relocs);
2057 }
2058 }
2059 disasm_info.symtab = sorted_syms;
2060 disasm_info.symtab_size = sorted_symcount;
2061
2062 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2063
2064 if (aux.dynrelbuf != NULL)
2065 free (aux.dynrelbuf);
2066 free (sorted_syms);
2067 }
2068 \f
2069 int
2070 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2071 {
2072 struct dwarf_section *section = &debug_displays [debug].section;
2073 bfd *abfd = file;
2074 asection *sec;
2075 bfd_boolean ret;
2076 int section_is_compressed;
2077
2078 /* If it is already loaded, do nothing. */
2079 if (section->start != NULL)
2080 return 1;
2081
2082 /* Locate the debug section. */
2083 sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2084 if (sec != NULL)
2085 section->name = section->uncompressed_name;
2086 else
2087 {
2088 sec = bfd_get_section_by_name (abfd, section->compressed_name);
2089 if (sec != NULL)
2090 section->name = section->compressed_name;
2091 }
2092 if (sec == NULL)
2093 return 0;
2094 section_is_compressed = section->name == section->compressed_name;
2095
2096 section->address = 0;
2097 section->size = bfd_get_section_size (sec);
2098 section->start = xmalloc (section->size);
2099
2100 if (is_relocatable && debug_displays [debug].relocate)
2101 ret = bfd_simple_get_relocated_section_contents (abfd,
2102 sec,
2103 section->start,
2104 syms) != NULL;
2105 else
2106 ret = bfd_get_section_contents (abfd, sec, section->start, 0,
2107 section->size);
2108
2109 if (! ret)
2110 {
2111 free_debug_section (debug);
2112 printf (_("\nCan't get contents for section '%s'.\n"),
2113 section->name);
2114 return 0;
2115 }
2116
2117 if (section_is_compressed)
2118 {
2119 bfd_size_type size = section->size;
2120 if (! bfd_uncompress_section_contents (&section->start, &size))
2121 {
2122 free_debug_section (debug);
2123 printf (_("\nCan't uncompress section '%s'.\n"), section->name);
2124 return 0;
2125 }
2126 section->size = size;
2127 }
2128
2129 return ret;
2130 }
2131
2132 void
2133 free_debug_section (enum dwarf_section_display_enum debug)
2134 {
2135 struct dwarf_section *section = &debug_displays [debug].section;
2136
2137 if (section->start == NULL)
2138 return;
2139
2140 free ((char *) section->start);
2141 section->start = NULL;
2142 section->address = 0;
2143 section->size = 0;
2144 }
2145
2146 static void
2147 dump_dwarf_section (bfd *abfd, asection *section,
2148 void *arg ATTRIBUTE_UNUSED)
2149 {
2150 const char *name = bfd_get_section_name (abfd, section);
2151 const char *match;
2152 enum dwarf_section_display_enum i;
2153
2154 if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2155 match = ".debug_info";
2156 else
2157 match = name;
2158
2159 for (i = 0; i < max; i++)
2160 if (strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2161 || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2162 {
2163 if (!debug_displays [i].eh_frame)
2164 {
2165 struct dwarf_section *sec = &debug_displays [i].section;
2166
2167 if (load_debug_section (i, abfd))
2168 {
2169 debug_displays [i].display (sec, abfd);
2170
2171 if (i != info && i != abbrev)
2172 free_debug_section (i);
2173 }
2174 }
2175 break;
2176 }
2177 }
2178
2179 /* Dump the dwarf debugging information. */
2180
2181 static void
2182 dump_dwarf (bfd *abfd)
2183 {
2184 is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2185
2186 /* FIXME: bfd_get_arch_size may return -1. We assume that 64bit
2187 targets will return 64. */
2188 eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
2189
2190 if (bfd_big_endian (abfd))
2191 byte_get = byte_get_big_endian;
2192 else if (bfd_little_endian (abfd))
2193 byte_get = byte_get_little_endian;
2194 else
2195 abort ();
2196
2197 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
2198 {
2199 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2200 init_dwarf_regnames (bed->elf_machine_code);
2201 }
2202
2203 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2204
2205 free_debug_memory ();
2206 }
2207 \f
2208 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2209 it. Return NULL on failure. */
2210
2211 static char *
2212 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2213 {
2214 asection *stabsect;
2215 bfd_size_type size;
2216 char *contents;
2217
2218 stabsect = bfd_get_section_by_name (abfd, sect_name);
2219 if (stabsect == NULL)
2220 {
2221 printf (_("No %s section present\n\n"), sect_name);
2222 return FALSE;
2223 }
2224
2225 size = bfd_section_size (abfd, stabsect);
2226 contents = xmalloc (size);
2227
2228 if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2229 {
2230 non_fatal (_("Reading %s section of %s failed: %s"),
2231 sect_name, bfd_get_filename (abfd),
2232 bfd_errmsg (bfd_get_error ()));
2233 free (contents);
2234 exit_status = 1;
2235 return NULL;
2236 }
2237
2238 *size_ptr = size;
2239
2240 return contents;
2241 }
2242
2243 /* Stabs entries use a 12 byte format:
2244 4 byte string table index
2245 1 byte stab type
2246 1 byte stab other field
2247 2 byte stab desc field
2248 4 byte stab value
2249 FIXME: This will have to change for a 64 bit object format. */
2250
2251 #define STRDXOFF (0)
2252 #define TYPEOFF (4)
2253 #define OTHEROFF (5)
2254 #define DESCOFF (6)
2255 #define VALOFF (8)
2256 #define STABSIZE (12)
2257
2258 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2259 using string table section STRSECT_NAME (in `strtab'). */
2260
2261 static void
2262 print_section_stabs (bfd *abfd,
2263 const char *stabsect_name,
2264 unsigned *string_offset_ptr)
2265 {
2266 int i;
2267 unsigned file_string_table_offset = 0;
2268 unsigned next_file_string_table_offset = *string_offset_ptr;
2269 bfd_byte *stabp, *stabs_end;
2270
2271 stabp = stabs;
2272 stabs_end = stabp + stab_size;
2273
2274 printf (_("Contents of %s section:\n\n"), stabsect_name);
2275 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
2276
2277 /* Loop through all symbols and print them.
2278
2279 We start the index at -1 because there is a dummy symbol on
2280 the front of stabs-in-{coff,elf} sections that supplies sizes. */
2281 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2282 {
2283 const char *name;
2284 unsigned long strx;
2285 unsigned char type, other;
2286 unsigned short desc;
2287 bfd_vma value;
2288
2289 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2290 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2291 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2292 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2293 value = bfd_h_get_32 (abfd, stabp + VALOFF);
2294
2295 printf ("\n%-6d ", i);
2296 /* Either print the stab name, or, if unnamed, print its number
2297 again (makes consistent formatting for tools like awk). */
2298 name = bfd_get_stab_name (type);
2299 if (name != NULL)
2300 printf ("%-6s", name);
2301 else if (type == N_UNDF)
2302 printf ("HdrSym");
2303 else
2304 printf ("%-6d", type);
2305 printf (" %-6d %-6d ", other, desc);
2306 bfd_printf_vma (abfd, value);
2307 printf (" %-6lu", strx);
2308
2309 /* Symbols with type == 0 (N_UNDF) specify the length of the
2310 string table associated with this file. We use that info
2311 to know how to relocate the *next* file's string table indices. */
2312 if (type == N_UNDF)
2313 {
2314 file_string_table_offset = next_file_string_table_offset;
2315 next_file_string_table_offset += value;
2316 }
2317 else
2318 {
2319 /* Using the (possibly updated) string table offset, print the
2320 string (if any) associated with this symbol. */
2321 if ((strx + file_string_table_offset) < stabstr_size)
2322 printf (" %s", &strtab[strx + file_string_table_offset]);
2323 else
2324 printf (" *");
2325 }
2326 }
2327 printf ("\n\n");
2328 *string_offset_ptr = next_file_string_table_offset;
2329 }
2330
2331 typedef struct
2332 {
2333 const char * section_name;
2334 const char * string_section_name;
2335 unsigned string_offset;
2336 }
2337 stab_section_names;
2338
2339 static void
2340 find_stabs_section (bfd *abfd, asection *section, void *names)
2341 {
2342 int len;
2343 stab_section_names * sought = (stab_section_names *) names;
2344
2345 /* Check for section names for which stabsect_name is a prefix, to
2346 handle .stab.N, etc. */
2347 len = strlen (sought->section_name);
2348
2349 /* If the prefix matches, and the files section name ends with a
2350 nul or a digit, then we match. I.e., we want either an exact
2351 match or a section followed by a number. */
2352 if (strncmp (sought->section_name, section->name, len) == 0
2353 && (section->name[len] == 0
2354 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2355 {
2356 if (strtab == NULL)
2357 strtab = read_section_stabs (abfd, sought->string_section_name,
2358 &stabstr_size);
2359
2360 if (strtab)
2361 {
2362 stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2363 &stab_size);
2364 if (stabs)
2365 print_section_stabs (abfd, section->name, &sought->string_offset);
2366 }
2367 }
2368 }
2369
2370 static void
2371 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2372 {
2373 stab_section_names s;
2374
2375 s.section_name = stabsect_name;
2376 s.string_section_name = strsect_name;
2377 s.string_offset = 0;
2378
2379 bfd_map_over_sections (abfd, find_stabs_section, & s);
2380
2381 free (strtab);
2382 strtab = NULL;
2383 }
2384
2385 /* Dump the any sections containing stabs debugging information. */
2386
2387 static void
2388 dump_stabs (bfd *abfd)
2389 {
2390 dump_stabs_section (abfd, ".stab", ".stabstr");
2391 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2392 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2393
2394 /* For Darwin. */
2395 dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2396
2397 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2398 }
2399 \f
2400 static void
2401 dump_bfd_header (bfd *abfd)
2402 {
2403 char *comma = "";
2404
2405 printf (_("architecture: %s, "),
2406 bfd_printable_arch_mach (bfd_get_arch (abfd),
2407 bfd_get_mach (abfd)));
2408 printf (_("flags 0x%08x:\n"), abfd->flags);
2409
2410 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2411 PF (HAS_RELOC, "HAS_RELOC");
2412 PF (EXEC_P, "EXEC_P");
2413 PF (HAS_LINENO, "HAS_LINENO");
2414 PF (HAS_DEBUG, "HAS_DEBUG");
2415 PF (HAS_SYMS, "HAS_SYMS");
2416 PF (HAS_LOCALS, "HAS_LOCALS");
2417 PF (DYNAMIC, "DYNAMIC");
2418 PF (WP_TEXT, "WP_TEXT");
2419 PF (D_PAGED, "D_PAGED");
2420 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2421 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2422 printf (_("\nstart address 0x"));
2423 bfd_printf_vma (abfd, abfd->start_address);
2424 printf ("\n");
2425 }
2426
2427 \f
2428 static void
2429 dump_bfd_private_header (bfd *abfd)
2430 {
2431 bfd_print_private_bfd_data (abfd, stdout);
2432 }
2433
2434 \f
2435 /* Display a section in hexadecimal format with associated characters.
2436 Each line prefixed by the zero padded address. */
2437
2438 static void
2439 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2440 {
2441 bfd_byte *data = 0;
2442 bfd_size_type datasize;
2443 bfd_size_type addr_offset;
2444 bfd_size_type start_offset;
2445 bfd_size_type stop_offset;
2446 unsigned int opb = bfd_octets_per_byte (abfd);
2447 /* Bytes per line. */
2448 const int onaline = 16;
2449 char buf[64];
2450 int count;
2451 int width;
2452
2453 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2454 return;
2455
2456 if (! process_section_p (section))
2457 return;
2458
2459 if ((datasize = bfd_section_size (abfd, section)) == 0)
2460 return;
2461
2462 /* Compute the address range to display. */
2463 if (start_address == (bfd_vma) -1
2464 || start_address < section->vma)
2465 start_offset = 0;
2466 else
2467 start_offset = start_address - section->vma;
2468
2469 if (stop_address == (bfd_vma) -1)
2470 stop_offset = datasize / opb;
2471 else
2472 {
2473 if (stop_address < section->vma)
2474 stop_offset = 0;
2475 else
2476 stop_offset = stop_address - section->vma;
2477
2478 if (stop_offset > datasize / opb)
2479 stop_offset = datasize / opb;
2480 }
2481
2482 if (start_offset >= stop_offset)
2483 return;
2484
2485 printf (_("Contents of section %s:"), section->name);
2486 if (display_file_offsets)
2487 printf (_(" (Starting at file offset: 0x%lx)"),
2488 (unsigned long) (section->filepos + start_offset));
2489 printf ("\n");
2490
2491 data = xmalloc (datasize);
2492
2493 bfd_get_section_contents (abfd, section, data, 0, datasize);
2494
2495 width = 4;
2496
2497 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2498 if (strlen (buf) >= sizeof (buf))
2499 abort ();
2500
2501 count = 0;
2502 while (buf[count] == '0' && buf[count+1] != '\0')
2503 count++;
2504 count = strlen (buf) - count;
2505 if (count > width)
2506 width = count;
2507
2508 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2509 if (strlen (buf) >= sizeof (buf))
2510 abort ();
2511
2512 count = 0;
2513 while (buf[count] == '0' && buf[count+1] != '\0')
2514 count++;
2515 count = strlen (buf) - count;
2516 if (count > width)
2517 width = count;
2518
2519 for (addr_offset = start_offset;
2520 addr_offset < stop_offset; addr_offset += onaline / opb)
2521 {
2522 bfd_size_type j;
2523
2524 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2525 count = strlen (buf);
2526 if ((size_t) count >= sizeof (buf))
2527 abort ();
2528
2529 putchar (' ');
2530 while (count < width)
2531 {
2532 putchar ('0');
2533 count++;
2534 }
2535 fputs (buf + count - width, stdout);
2536 putchar (' ');
2537
2538 for (j = addr_offset * opb;
2539 j < addr_offset * opb + onaline; j++)
2540 {
2541 if (j < stop_offset * opb)
2542 printf ("%02x", (unsigned) (data[j]));
2543 else
2544 printf (" ");
2545 if ((j & 3) == 3)
2546 printf (" ");
2547 }
2548
2549 printf (" ");
2550 for (j = addr_offset * opb;
2551 j < addr_offset * opb + onaline; j++)
2552 {
2553 if (j >= stop_offset * opb)
2554 printf (" ");
2555 else
2556 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2557 }
2558 putchar ('\n');
2559 }
2560 free (data);
2561 }
2562
2563 /* Actually display the various requested regions. */
2564
2565 static void
2566 dump_data (bfd *abfd)
2567 {
2568 bfd_map_over_sections (abfd, dump_section, NULL);
2569 }
2570
2571 /* Should perhaps share code and display with nm? */
2572
2573 static void
2574 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2575 {
2576 asymbol **current;
2577 long max;
2578 long count;
2579
2580 if (dynamic)
2581 {
2582 current = dynsyms;
2583 max = dynsymcount;
2584 printf ("DYNAMIC SYMBOL TABLE:\n");
2585 }
2586 else
2587 {
2588 current = syms;
2589 max = symcount;
2590 printf ("SYMBOL TABLE:\n");
2591 }
2592
2593 if (max == 0)
2594 printf (_("no symbols\n"));
2595
2596 for (count = 0; count < max; count++)
2597 {
2598 bfd *cur_bfd;
2599
2600 if (*current == NULL)
2601 printf (_("no information for symbol number %ld\n"), count);
2602
2603 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2604 printf (_("could not determine the type of symbol number %ld\n"),
2605 count);
2606
2607 else if (process_section_p ((* current)->section)
2608 && (dump_special_syms
2609 || !bfd_is_target_special_symbol (cur_bfd, *current)))
2610 {
2611 const char *name = (*current)->name;
2612
2613 if (do_demangle && name != NULL && *name != '\0')
2614 {
2615 char *alloc;
2616
2617 /* If we want to demangle the name, we demangle it
2618 here, and temporarily clobber it while calling
2619 bfd_print_symbol. FIXME: This is a gross hack. */
2620 alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2621 if (alloc != NULL)
2622 (*current)->name = alloc;
2623 bfd_print_symbol (cur_bfd, stdout, *current,
2624 bfd_print_symbol_all);
2625 if (alloc != NULL)
2626 {
2627 (*current)->name = name;
2628 free (alloc);
2629 }
2630 }
2631 else
2632 bfd_print_symbol (cur_bfd, stdout, *current,
2633 bfd_print_symbol_all);
2634 printf ("\n");
2635 }
2636
2637 current++;
2638 }
2639 printf ("\n\n");
2640 }
2641 \f
2642 static void
2643 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2644 {
2645 arelent **p;
2646 char *last_filename, *last_functionname;
2647 unsigned int last_line;
2648
2649 /* Get column headers lined up reasonably. */
2650 {
2651 static int width;
2652
2653 if (width == 0)
2654 {
2655 char buf[30];
2656
2657 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2658 width = strlen (buf) - 7;
2659 }
2660 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2661 }
2662
2663 last_filename = NULL;
2664 last_functionname = NULL;
2665 last_line = 0;
2666
2667 for (p = relpp; relcount && *p != NULL; p++, relcount--)
2668 {
2669 arelent *q = *p;
2670 const char *filename, *functionname;
2671 unsigned int line;
2672 const char *sym_name;
2673 const char *section_name;
2674
2675 if (start_address != (bfd_vma) -1
2676 && q->address < start_address)
2677 continue;
2678 if (stop_address != (bfd_vma) -1
2679 && q->address > stop_address)
2680 continue;
2681
2682 if (with_line_numbers
2683 && sec != NULL
2684 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2685 &filename, &functionname, &line))
2686 {
2687 if (functionname != NULL
2688 && (last_functionname == NULL
2689 || strcmp (functionname, last_functionname) != 0))
2690 {
2691 printf ("%s():\n", functionname);
2692 if (last_functionname != NULL)
2693 free (last_functionname);
2694 last_functionname = xstrdup (functionname);
2695 }
2696
2697 if (line > 0
2698 && (line != last_line
2699 || (filename != NULL
2700 && last_filename != NULL
2701 && strcmp (filename, last_filename) != 0)))
2702 {
2703 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2704 last_line = line;
2705 if (last_filename != NULL)
2706 free (last_filename);
2707 if (filename == NULL)
2708 last_filename = NULL;
2709 else
2710 last_filename = xstrdup (filename);
2711 }
2712 }
2713
2714 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2715 {
2716 sym_name = (*(q->sym_ptr_ptr))->name;
2717 section_name = (*(q->sym_ptr_ptr))->section->name;
2718 }
2719 else
2720 {
2721 sym_name = NULL;
2722 section_name = NULL;
2723 }
2724
2725 bfd_printf_vma (abfd, q->address);
2726 if (q->howto == NULL)
2727 printf (" *unknown* ");
2728 else if (q->howto->name)
2729 printf (" %-16s ", q->howto->name);
2730 else
2731 printf (" %-16d ", q->howto->type);
2732
2733 if (sym_name)
2734 {
2735 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
2736 }
2737 else
2738 {
2739 if (section_name == NULL)
2740 section_name = "*unknown*";
2741 printf ("[%s]", section_name);
2742 }
2743
2744 if (q->addend)
2745 {
2746 printf ("+0x");
2747 bfd_printf_vma (abfd, q->addend);
2748 }
2749
2750 printf ("\n");
2751 }
2752 }
2753
2754 static void
2755 dump_relocs_in_section (bfd *abfd,
2756 asection *section,
2757 void *dummy ATTRIBUTE_UNUSED)
2758 {
2759 arelent **relpp;
2760 long relcount;
2761 long relsize;
2762
2763 if ( bfd_is_abs_section (section)
2764 || bfd_is_und_section (section)
2765 || bfd_is_com_section (section)
2766 || (! process_section_p (section))
2767 || ((section->flags & SEC_RELOC) == 0))
2768 return;
2769
2770 relsize = bfd_get_reloc_upper_bound (abfd, section);
2771 if (relsize < 0)
2772 bfd_fatal (bfd_get_filename (abfd));
2773
2774 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2775
2776 if (relsize == 0)
2777 {
2778 printf (" (none)\n\n");
2779 return;
2780 }
2781
2782 relpp = xmalloc (relsize);
2783 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2784
2785 if (relcount < 0)
2786 bfd_fatal (bfd_get_filename (abfd));
2787 else if (relcount == 0)
2788 printf (" (none)\n\n");
2789 else
2790 {
2791 printf ("\n");
2792 dump_reloc_set (abfd, section, relpp, relcount);
2793 printf ("\n\n");
2794 }
2795 free (relpp);
2796 }
2797
2798 static void
2799 dump_relocs (bfd *abfd)
2800 {
2801 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2802 }
2803
2804 static void
2805 dump_dynamic_relocs (bfd *abfd)
2806 {
2807 long relsize;
2808 arelent **relpp;
2809 long relcount;
2810
2811 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2812 if (relsize < 0)
2813 bfd_fatal (bfd_get_filename (abfd));
2814
2815 printf ("DYNAMIC RELOCATION RECORDS");
2816
2817 if (relsize == 0)
2818 printf (" (none)\n\n");
2819 else
2820 {
2821 relpp = xmalloc (relsize);
2822 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2823
2824 if (relcount < 0)
2825 bfd_fatal (bfd_get_filename (abfd));
2826 else if (relcount == 0)
2827 printf (" (none)\n\n");
2828 else
2829 {
2830 printf ("\n");
2831 dump_reloc_set (abfd, NULL, relpp, relcount);
2832 printf ("\n\n");
2833 }
2834 free (relpp);
2835 }
2836 }
2837
2838 /* Creates a table of paths, to search for source files. */
2839
2840 static void
2841 add_include_path (const char *path)
2842 {
2843 if (path[0] == 0)
2844 return;
2845 include_path_count++;
2846 include_paths = xrealloc (include_paths,
2847 include_path_count * sizeof (*include_paths));
2848 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2849 if (path[1] == ':' && path[2] == 0)
2850 path = concat (path, ".", (const char *) 0);
2851 #endif
2852 include_paths[include_path_count - 1] = path;
2853 }
2854
2855 static void
2856 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
2857 asection *section,
2858 void *arg)
2859 {
2860 if ((section->flags & SEC_DEBUGGING) == 0)
2861 {
2862 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
2863 section->vma += adjust_section_vma;
2864 if (*has_reloc_p)
2865 section->lma += adjust_section_vma;
2866 }
2867 }
2868
2869 /* Dump selected contents of ABFD. */
2870
2871 static void
2872 dump_bfd (bfd *abfd)
2873 {
2874 /* If we are adjusting section VMA's, change them all now. Changing
2875 the BFD information is a hack. However, we must do it, or
2876 bfd_find_nearest_line will not do the right thing. */
2877 if (adjust_section_vma != 0)
2878 {
2879 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
2880 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
2881 }
2882
2883 if (! dump_debugging_tags)
2884 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2885 abfd->xvec->name);
2886 if (dump_ar_hdrs)
2887 print_arelt_descr (stdout, abfd, TRUE);
2888 if (dump_file_header)
2889 dump_bfd_header (abfd);
2890 if (dump_private_headers)
2891 dump_bfd_private_header (abfd);
2892 if (! dump_debugging_tags)
2893 putchar ('\n');
2894 if (dump_section_headers)
2895 dump_headers (abfd);
2896
2897 if (dump_symtab
2898 || dump_reloc_info
2899 || disassemble
2900 || dump_debugging
2901 || dump_dwarf_section_info)
2902 syms = slurp_symtab (abfd);
2903 if (dump_dynamic_symtab || dump_dynamic_reloc_info
2904 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
2905 dynsyms = slurp_dynamic_symtab (abfd);
2906 if (disassemble)
2907 {
2908 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
2909 dynsymcount, dynsyms, &synthsyms);
2910 if (synthcount < 0)
2911 synthcount = 0;
2912 }
2913
2914 if (dump_symtab)
2915 dump_symbols (abfd, FALSE);
2916 if (dump_dynamic_symtab)
2917 dump_symbols (abfd, TRUE);
2918 if (dump_dwarf_section_info)
2919 dump_dwarf (abfd);
2920 if (dump_stab_section_info)
2921 dump_stabs (abfd);
2922 if (dump_reloc_info && ! disassemble)
2923 dump_relocs (abfd);
2924 if (dump_dynamic_reloc_info && ! disassemble)
2925 dump_dynamic_relocs (abfd);
2926 if (dump_section_contents)
2927 dump_data (abfd);
2928 if (disassemble)
2929 disassemble_data (abfd);
2930
2931 if (dump_debugging)
2932 {
2933 void *dhandle;
2934
2935 dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
2936 if (dhandle != NULL)
2937 {
2938 if (!print_debugging_info (stdout, dhandle, abfd, syms,
2939 bfd_demangle,
2940 dump_debugging_tags ? TRUE : FALSE))
2941 {
2942 non_fatal (_("%s: printing debugging information failed"),
2943 bfd_get_filename (abfd));
2944 exit_status = 1;
2945 }
2946 }
2947 /* PR 6483: If there was no STABS or IEEE debug
2948 info in the file, try DWARF instead. */
2949 else if (! dump_dwarf_section_info)
2950 {
2951 dump_dwarf (abfd);
2952 }
2953 }
2954
2955 if (syms)
2956 {
2957 free (syms);
2958 syms = NULL;
2959 }
2960
2961 if (dynsyms)
2962 {
2963 free (dynsyms);
2964 dynsyms = NULL;
2965 }
2966
2967 if (synthsyms)
2968 {
2969 free (synthsyms);
2970 synthsyms = NULL;
2971 }
2972
2973 symcount = 0;
2974 dynsymcount = 0;
2975 synthcount = 0;
2976 }
2977
2978 static void
2979 display_bfd (bfd *abfd)
2980 {
2981 char **matching;
2982
2983 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2984 {
2985 dump_bfd (abfd);
2986 return;
2987 }
2988
2989 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2990 {
2991 nonfatal (bfd_get_filename (abfd));
2992 list_matching_formats (matching);
2993 free (matching);
2994 return;
2995 }
2996
2997 if (bfd_get_error () != bfd_error_file_not_recognized)
2998 {
2999 nonfatal (bfd_get_filename (abfd));
3000 return;
3001 }
3002
3003 if (bfd_check_format_matches (abfd, bfd_core, &matching))
3004 {
3005 dump_bfd (abfd);
3006 return;
3007 }
3008
3009 nonfatal (bfd_get_filename (abfd));
3010
3011 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3012 {
3013 list_matching_formats (matching);
3014 free (matching);
3015 }
3016 }
3017
3018 static void
3019 display_file (char *filename, char *target)
3020 {
3021 bfd *file;
3022 bfd *arfile = NULL;
3023
3024 if (get_file_size (filename) < 1)
3025 {
3026 exit_status = 1;
3027 return;
3028 }
3029
3030 file = bfd_openr (filename, target);
3031 if (file == NULL)
3032 {
3033 nonfatal (filename);
3034 return;
3035 }
3036
3037 /* If the file is an archive, process all of its elements. */
3038 if (bfd_check_format (file, bfd_archive))
3039 {
3040 bfd *last_arfile = NULL;
3041
3042 printf (_("In archive %s:\n"), bfd_get_filename (file));
3043 for (;;)
3044 {
3045 bfd_set_error (bfd_error_no_error);
3046
3047 arfile = bfd_openr_next_archived_file (file, arfile);
3048 if (arfile == NULL)
3049 {
3050 if (bfd_get_error () != bfd_error_no_more_archived_files)
3051 nonfatal (bfd_get_filename (file));
3052 break;
3053 }
3054
3055 display_bfd (arfile);
3056
3057 if (last_arfile != NULL)
3058 bfd_close (last_arfile);
3059 last_arfile = arfile;
3060 }
3061
3062 if (last_arfile != NULL)
3063 bfd_close (last_arfile);
3064 }
3065 else
3066 display_bfd (file);
3067
3068 bfd_close (file);
3069 }
3070 \f
3071 int
3072 main (int argc, char **argv)
3073 {
3074 int c;
3075 char *target = default_target;
3076 bfd_boolean seenflag = FALSE;
3077
3078 #if defined (HAVE_SETLOCALE)
3079 #if defined (HAVE_LC_MESSAGES)
3080 setlocale (LC_MESSAGES, "");
3081 #endif
3082 setlocale (LC_CTYPE, "");
3083 #endif
3084
3085 bindtextdomain (PACKAGE, LOCALEDIR);
3086 textdomain (PACKAGE);
3087
3088 program_name = *argv;
3089 xmalloc_set_program_name (program_name);
3090
3091 START_PROGRESS (program_name, 0);
3092
3093 expandargv (&argc, &argv);
3094
3095 bfd_init ();
3096 set_default_bfd_target ();
3097
3098 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW",
3099 long_options, (int *) 0))
3100 != EOF)
3101 {
3102 switch (c)
3103 {
3104 case 0:
3105 break; /* We've been given a long option. */
3106 case 'm':
3107 machine = optarg;
3108 break;
3109 case 'M':
3110 if (disassembler_options)
3111 /* Ignore potential memory leak for now. */
3112 disassembler_options = concat (disassembler_options, ",",
3113 optarg, (const char *) NULL);
3114 else
3115 disassembler_options = optarg;
3116 break;
3117 case 'j':
3118 if (only_used == only_size)
3119 {
3120 only_size += 8;
3121 only = xrealloc (only, only_size * sizeof (char *));
3122 }
3123 only [only_used++] = optarg;
3124 break;
3125 case 'F':
3126 display_file_offsets = TRUE;
3127 break;
3128 case 'l':
3129 with_line_numbers = TRUE;
3130 break;
3131 case 'b':
3132 target = optarg;
3133 break;
3134 case 'C':
3135 do_demangle = TRUE;
3136 if (optarg != NULL)
3137 {
3138 enum demangling_styles style;
3139
3140 style = cplus_demangle_name_to_style (optarg);
3141 if (style == unknown_demangling)
3142 fatal (_("unknown demangling style `%s'"),
3143 optarg);
3144
3145 cplus_demangle_set_style (style);
3146 }
3147 break;
3148 case 'w':
3149 wide_output = TRUE;
3150 break;
3151 case OPTION_ADJUST_VMA:
3152 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3153 break;
3154 case OPTION_START_ADDRESS:
3155 start_address = parse_vma (optarg, "--start-address");
3156 if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3157 fatal (_("error: the start address should be before the end address"));
3158 break;
3159 case OPTION_STOP_ADDRESS:
3160 stop_address = parse_vma (optarg, "--stop-address");
3161 if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3162 fatal (_("error: the stop address should be after the start address"));
3163 break;
3164 case 'E':
3165 if (strcmp (optarg, "B") == 0)
3166 endian = BFD_ENDIAN_BIG;
3167 else if (strcmp (optarg, "L") == 0)
3168 endian = BFD_ENDIAN_LITTLE;
3169 else
3170 {
3171 non_fatal (_("unrecognized -E option"));
3172 usage (stderr, 1);
3173 }
3174 break;
3175 case OPTION_ENDIAN:
3176 if (strncmp (optarg, "big", strlen (optarg)) == 0)
3177 endian = BFD_ENDIAN_BIG;
3178 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3179 endian = BFD_ENDIAN_LITTLE;
3180 else
3181 {
3182 non_fatal (_("unrecognized --endian type `%s'"), optarg);
3183 usage (stderr, 1);
3184 }
3185 break;
3186
3187 case 'f':
3188 dump_file_header = TRUE;
3189 seenflag = TRUE;
3190 break;
3191 case 'i':
3192 formats_info = TRUE;
3193 seenflag = TRUE;
3194 break;
3195 case 'I':
3196 add_include_path (optarg);
3197 break;
3198 case 'p':
3199 dump_private_headers = TRUE;
3200 seenflag = TRUE;
3201 break;
3202 case 'x':
3203 dump_private_headers = TRUE;
3204 dump_symtab = TRUE;
3205 dump_reloc_info = TRUE;
3206 dump_file_header = TRUE;
3207 dump_ar_hdrs = TRUE;
3208 dump_section_headers = TRUE;
3209 seenflag = TRUE;
3210 break;
3211 case 't':
3212 dump_symtab = TRUE;
3213 seenflag = TRUE;
3214 break;
3215 case 'T':
3216 dump_dynamic_symtab = TRUE;
3217 seenflag = TRUE;
3218 break;
3219 case 'd':
3220 disassemble = TRUE;
3221 seenflag = TRUE;
3222 break;
3223 case 'z':
3224 disassemble_zeroes = TRUE;
3225 break;
3226 case 'D':
3227 disassemble = TRUE;
3228 disassemble_all = TRUE;
3229 seenflag = TRUE;
3230 break;
3231 case 'S':
3232 disassemble = TRUE;
3233 with_source_code = TRUE;
3234 seenflag = TRUE;
3235 break;
3236 case 'g':
3237 dump_debugging = 1;
3238 seenflag = TRUE;
3239 break;
3240 case 'e':
3241 dump_debugging = 1;
3242 dump_debugging_tags = 1;
3243 do_demangle = TRUE;
3244 seenflag = TRUE;
3245 break;
3246 case 'W':
3247 dump_dwarf_section_info = TRUE;
3248 seenflag = TRUE;
3249 do_debug_info = 1;
3250 do_debug_abbrevs = 1;
3251 do_debug_lines = 1;
3252 do_debug_pubnames = 1;
3253 do_debug_aranges = 1;
3254 do_debug_ranges = 1;
3255 do_debug_frames = 1;
3256 do_debug_macinfo = 1;
3257 do_debug_str = 1;
3258 do_debug_loc = 1;
3259 break;
3260 case 'G':
3261 dump_stab_section_info = TRUE;
3262 seenflag = TRUE;
3263 break;
3264 case 's':
3265 dump_section_contents = TRUE;
3266 seenflag = TRUE;
3267 break;
3268 case 'r':
3269 dump_reloc_info = TRUE;
3270 seenflag = TRUE;
3271 break;
3272 case 'R':
3273 dump_dynamic_reloc_info = TRUE;
3274 seenflag = TRUE;
3275 break;
3276 case 'a':
3277 dump_ar_hdrs = TRUE;
3278 seenflag = TRUE;
3279 break;
3280 case 'h':
3281 dump_section_headers = TRUE;
3282 seenflag = TRUE;
3283 break;
3284 case 'H':
3285 usage (stdout, 0);
3286 seenflag = TRUE;
3287 case 'v':
3288 case 'V':
3289 show_version = TRUE;
3290 seenflag = TRUE;
3291 break;
3292
3293 default:
3294 usage (stderr, 1);
3295 }
3296 }
3297
3298 if (show_version)
3299 print_version ("objdump");
3300
3301 if (!seenflag)
3302 usage (stderr, 2);
3303
3304 if (formats_info)
3305 exit_status = display_info ();
3306 else
3307 {
3308 if (optind == argc)
3309 display_file ("a.out", target);
3310 else
3311 for (; optind < argc;)
3312 display_file (argv[optind++], target);
3313 }
3314
3315 END_PROGRESS (program_name);
3316
3317 return exit_status;
3318 }