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
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
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 2, or (at your option)
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.
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, MA 02110-1301, USA. */
24 Objdump displays information about one or more object files, either on
25 their own, or inside libraries. It is commonly used as a disassembler,
26 but it can also display information about file headers, symbol tables,
27 relocations, debugging directives and more.
29 The flow of execution is as follows:
31 1. Command line arguments are checked for control switches and the
32 information to be displayed is selected.
34 2. Any remaining arguments are assumed to be object files, and they are
35 processed in order by display_bfd(). If the file is an archive each
36 of its elements is processed in turn.
38 3. The file's target architecture and binary file format are determined
39 by bfd_check_format(). If they are recognised, then dump_bfd() is
42 4. dump_bfd() in turn calls separate functions to display the requested
43 item(s) of information(s). For example disassemble_data() is called if
44 a disassembly has been requested.
46 When disassembling the code loops through blocks of instructions bounded
47 by symbols, calling disassemble_bytes() on each block. The actual
48 disassembling is done by the libopcodes library, via a function pointer
49 supplied by the disassembler() function. */
57 #include "safe-ctype.h"
59 #include "libiberty.h"
64 /* Internal headers for the ELF .stab-dump code - sorry. */
65 #define BYTES_IN_WORD 32
66 #include "aout/aout64.h"
69 static int exit_status = 0;
71 static char *default_target = NULL; /* Default at runtime. */
73 /* The following variables are set based on arguments passed on the
75 static int show_version = 0; /* Show the version number. */
76 static int dump_section_contents; /* -s */
77 static int dump_section_headers; /* -h */
78 static bfd_boolean dump_file_header; /* -f */
79 static int dump_symtab; /* -t */
80 static int dump_dynamic_symtab; /* -T */
81 static int dump_reloc_info; /* -r */
82 static int dump_dynamic_reloc_info; /* -R */
83 static int dump_ar_hdrs; /* -a */
84 static int dump_private_headers; /* -p */
85 static int prefix_addresses; /* --prefix-addresses */
86 static int with_line_numbers; /* -l */
87 static bfd_boolean with_source_code; /* -S */
88 static int show_raw_insn; /* --show-raw-insn */
89 static int dump_dwarf_section_info; /* --dwarf */
90 static int dump_stab_section_info; /* --stabs */
91 static int do_demangle; /* -C, --demangle */
92 static bfd_boolean disassemble; /* -d */
93 static bfd_boolean disassemble_all; /* -D */
94 static int disassemble_zeroes; /* --disassemble-zeroes */
95 static bfd_boolean formats_info; /* -i */
96 static int wide_output; /* -w */
97 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
98 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
99 static int dump_debugging; /* --debugging */
100 static int dump_debugging_tags; /* --debugging-tags */
101 static int dump_special_syms = 0; /* --special-syms */
102 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
103 static int file_start_context = 0; /* --file-start-context */
105 /* Pointer to an array of section names provided by
106 one or more "-j secname" command line options. */
108 /* The total number of slots in the only[] array. */
109 static size_t only_size = 0;
110 /* The number of occupied slots in the only[] array. */
111 static size_t only_used = 0;
113 /* Variables for handling include file path table. */
114 static const char **include_paths;
115 static int include_path_count;
117 /* Extra info to pass to the section disassembler and address printing
119 struct objdump_disasm_info
123 bfd_boolean require_sec;
124 arelent ** dynrelbuf;
126 disassembler_ftype disassemble_fn;
130 /* Architecture to disassemble for, or default if NULL. */
131 static char *machine = NULL;
133 /* Target specific options to the disassembler. */
134 static char *disassembler_options = NULL;
136 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
137 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
139 /* The symbol table. */
140 static asymbol **syms;
142 /* Number of symbols in `syms'. */
143 static long symcount = 0;
145 /* The sorted symbol table. */
146 static asymbol **sorted_syms;
148 /* Number of symbols in `sorted_syms'. */
149 static long sorted_symcount = 0;
151 /* The dynamic symbol table. */
152 static asymbol **dynsyms;
154 /* The synthetic symbol table. */
155 static asymbol *synthsyms;
156 static long synthcount = 0;
158 /* Number of symbols in `dynsyms'. */
159 static long dynsymcount = 0;
161 static bfd_byte *stabs;
162 static bfd_size_type stab_size;
165 static bfd_size_type stabstr_size;
168 usage (FILE *stream, int status)
170 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
171 fprintf (stream, _(" Display information from object <file(s)>.\n"));
172 fprintf (stream, _(" At least one of the following switches must be given:\n"));
173 fprintf (stream, _("\
174 -a, --archive-headers Display archive header information\n\
175 -f, --file-headers Display the contents of the overall file header\n\
176 -p, --private-headers Display object format specific file header contents\n\
177 -h, --[section-]headers Display the contents of the section headers\n\
178 -x, --all-headers Display the contents of all headers\n\
179 -d, --disassemble Display assembler contents of executable sections\n\
180 -D, --disassemble-all Display assembler contents of all sections\n\
181 -S, --source Intermix source code with disassembly\n\
182 -s, --full-contents Display the full contents of all sections requested\n\
183 -g, --debugging Display debug information in object file\n\
184 -e, --debugging-tags Display debug information using ctags style\n\
185 -G, --stabs Display (in raw form) any STABS info in the file\n\
186 -W, --dwarf Display DWARF info in the file\n\
187 -t, --syms Display the contents of the symbol table(s)\n\
188 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
189 -r, --reloc Display the relocation entries in the file\n\
190 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
191 @<file> Read options from <file>\n\
192 -v, --version Display this program's version number\n\
193 -i, --info List object formats and architectures supported\n\
194 -H, --help Display this information\n\
198 fprintf (stream, _("\n The following switches are optional:\n"));
199 fprintf (stream, _("\
200 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
201 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
202 -j, --section=NAME Only display information for section NAME\n\
203 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
204 -EB --endian=big Assume big endian format when disassembling\n\
205 -EL --endian=little Assume little endian format when disassembling\n\
206 --file-start-context Include context from start of file (with -S)\n\
207 -I, --include=DIR Add DIR to search list for source files\n\
208 -l, --line-numbers Include line numbers and filenames in output\n\
209 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
210 The STYLE, if specified, can be `auto', `gnu',\n\
211 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
213 -w, --wide Format output for more than 80 columns\n\
214 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
215 --start-address=ADDR Only process data whose address is >= ADDR\n\
216 --stop-address=ADDR Only process data whose address is <= ADDR\n\
217 --prefix-addresses Print complete address alongside disassembly\n\
218 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
219 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
220 --special-syms Include special symbols in symbol dumps\n\
222 list_supported_targets (program_name, stream);
223 list_supported_architectures (program_name, stream);
225 disassembler_usage (stream);
227 if (REPORT_BUGS_TO[0] && status == 0)
228 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
232 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
236 OPTION_START_ADDRESS,
241 static struct option long_options[]=
243 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
244 {"all-headers", no_argument, NULL, 'x'},
245 {"private-headers", no_argument, NULL, 'p'},
246 {"architecture", required_argument, NULL, 'm'},
247 {"archive-headers", no_argument, NULL, 'a'},
248 {"debugging", no_argument, NULL, 'g'},
249 {"debugging-tags", no_argument, NULL, 'e'},
250 {"demangle", optional_argument, NULL, 'C'},
251 {"disassemble", no_argument, NULL, 'd'},
252 {"disassemble-all", no_argument, NULL, 'D'},
253 {"disassembler-options", required_argument, NULL, 'M'},
254 {"disassemble-zeroes", no_argument, NULL, 'z'},
255 {"dynamic-reloc", no_argument, NULL, 'R'},
256 {"dynamic-syms", no_argument, NULL, 'T'},
257 {"endian", required_argument, NULL, OPTION_ENDIAN},
258 {"file-headers", no_argument, NULL, 'f'},
259 {"file-start-context", no_argument, &file_start_context, 1},
260 {"full-contents", no_argument, NULL, 's'},
261 {"headers", no_argument, NULL, 'h'},
262 {"help", no_argument, NULL, 'H'},
263 {"info", no_argument, NULL, 'i'},
264 {"line-numbers", no_argument, NULL, 'l'},
265 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
266 {"prefix-addresses", no_argument, &prefix_addresses, 1},
267 {"reloc", no_argument, NULL, 'r'},
268 {"section", required_argument, NULL, 'j'},
269 {"section-headers", no_argument, NULL, 'h'},
270 {"show-raw-insn", no_argument, &show_raw_insn, 1},
271 {"source", no_argument, NULL, 'S'},
272 {"special-syms", no_argument, &dump_special_syms, 1},
273 {"include", required_argument, NULL, 'I'},
274 {"dwarf", no_argument, NULL, 'W'},
275 {"stabs", no_argument, NULL, 'G'},
276 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
277 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
278 {"syms", no_argument, NULL, 't'},
279 {"target", required_argument, NULL, 'b'},
280 {"version", no_argument, NULL, 'V'},
281 {"wide", no_argument, NULL, 'w'},
282 {0, no_argument, 0, 0}
286 nonfatal (const char *msg)
293 dump_section_header (bfd *abfd, asection *section,
294 void *ignored ATTRIBUTE_UNUSED)
297 unsigned int opb = bfd_octets_per_byte (abfd);
299 /* Ignore linker created section. See elfNN_ia64_object_p in
301 if (section->flags & SEC_LINKER_CREATED)
304 printf ("%3d %-13s %08lx ", section->index,
305 bfd_get_section_name (abfd, section),
306 (unsigned long) bfd_section_size (abfd, section) / opb);
307 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
309 bfd_printf_vma (abfd, section->lma);
310 printf (" %08lx 2**%u", (unsigned long) section->filepos,
311 bfd_get_section_alignment (abfd, section));
317 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
319 PF (SEC_HAS_CONTENTS, "CONTENTS");
320 PF (SEC_ALLOC, "ALLOC");
321 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
322 PF (SEC_LOAD, "LOAD");
323 PF (SEC_RELOC, "RELOC");
324 PF (SEC_READONLY, "READONLY");
325 PF (SEC_CODE, "CODE");
326 PF (SEC_DATA, "DATA");
328 PF (SEC_DEBUGGING, "DEBUGGING");
329 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
330 PF (SEC_EXCLUDE, "EXCLUDE");
331 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
332 if (bfd_get_arch (abfd) == bfd_arch_tic54x)
334 PF (SEC_TIC54X_BLOCK, "BLOCK");
335 PF (SEC_TIC54X_CLINK, "CLINK");
337 PF (SEC_SMALL_DATA, "SMALL_DATA");
338 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
339 PF (SEC_COFF_SHARED, "SHARED");
340 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
341 PF (SEC_GROUP, "GROUP");
343 if ((section->flags & SEC_LINK_ONCE) != 0)
346 struct coff_comdat_info *comdat;
348 switch (section->flags & SEC_LINK_DUPLICATES)
352 case SEC_LINK_DUPLICATES_DISCARD:
353 ls = "LINK_ONCE_DISCARD";
355 case SEC_LINK_DUPLICATES_ONE_ONLY:
356 ls = "LINK_ONCE_ONE_ONLY";
358 case SEC_LINK_DUPLICATES_SAME_SIZE:
359 ls = "LINK_ONCE_SAME_SIZE";
361 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
362 ls = "LINK_ONCE_SAME_CONTENTS";
365 printf ("%s%s", comma, ls);
367 comdat = bfd_coff_get_comdat_section (abfd, section);
369 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
379 dump_headers (bfd *abfd)
381 printf (_("Sections:\n"));
384 printf (_("Idx Name Size VMA LMA File off Algn"));
386 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
387 if (bfd_get_arch_size (abfd) == 32)
388 printf (_("Idx Name Size VMA LMA File off Algn"));
390 printf (_("Idx Name Size VMA LMA File off Algn"));
394 printf (_(" Flags"));
395 if (abfd->flags & HAS_LOAD_PAGE)
399 bfd_map_over_sections (abfd, dump_section_header, NULL);
403 slurp_symtab (bfd *abfd)
408 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
414 storage = bfd_get_symtab_upper_bound (abfd);
416 bfd_fatal (bfd_get_filename (abfd));
418 sy = xmalloc (storage);
420 symcount = bfd_canonicalize_symtab (abfd, sy);
422 bfd_fatal (bfd_get_filename (abfd));
426 /* Read in the dynamic symbols. */
429 slurp_dynamic_symtab (bfd *abfd)
434 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
437 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
439 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
444 bfd_fatal (bfd_get_filename (abfd));
447 sy = xmalloc (storage);
449 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
451 bfd_fatal (bfd_get_filename (abfd));
455 /* Filter out (in place) symbols that are useless for disassembly.
456 COUNT is the number of elements in SYMBOLS.
457 Return the number of useful symbols. */
460 remove_useless_symbols (asymbol **symbols, long count)
462 asymbol **in_ptr = symbols, **out_ptr = symbols;
466 asymbol *sym = *in_ptr++;
468 if (sym->name == NULL || sym->name[0] == '\0')
470 if (sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
472 if (bfd_is_und_section (sym->section)
473 || bfd_is_com_section (sym->section))
478 return out_ptr - symbols;
481 /* Sort symbols into value order. */
484 compare_symbols (const void *ap, const void *bp)
486 const asymbol *a = * (const asymbol **) ap;
487 const asymbol *b = * (const asymbol **) bp;
497 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
499 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
502 if (a->section > b->section)
504 else if (a->section < b->section)
507 an = bfd_asymbol_name (a);
508 bn = bfd_asymbol_name (b);
512 /* The symbols gnu_compiled and gcc2_compiled convey no real
513 information, so put them after other symbols with the same value. */
514 af = (strstr (an, "gnu_compiled") != NULL
515 || strstr (an, "gcc2_compiled") != NULL);
516 bf = (strstr (bn, "gnu_compiled") != NULL
517 || strstr (bn, "gcc2_compiled") != NULL);
524 /* We use a heuristic for the file name, to try to sort it after
525 more useful symbols. It may not work on non Unix systems, but it
526 doesn't really matter; the only difference is precisely which
527 symbol names get printed. */
529 #define file_symbol(s, sn, snl) \
530 (((s)->flags & BSF_FILE) != 0 \
531 || ((sn)[(snl) - 2] == '.' \
532 && ((sn)[(snl) - 1] == 'o' \
533 || (sn)[(snl) - 1] == 'a')))
535 af = file_symbol (a, an, anl);
536 bf = file_symbol (b, bn, bnl);
543 /* Try to sort global symbols before local symbols before function
544 symbols before debugging symbols. */
549 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
551 if ((aflags & BSF_DEBUGGING) != 0)
556 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
558 if ((aflags & BSF_FUNCTION) != 0)
563 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
565 if ((aflags & BSF_LOCAL) != 0)
570 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
572 if ((aflags & BSF_GLOBAL) != 0)
578 /* Symbols that start with '.' might be section names, so sort them
579 after symbols that don't start with '.'. */
580 if (an[0] == '.' && bn[0] != '.')
582 if (an[0] != '.' && bn[0] == '.')
585 /* Finally, if we can't distinguish them in any other way, try to
586 get consistent results by sorting the symbols by name. */
587 return strcmp (an, bn);
590 /* Sort relocs into address order. */
593 compare_relocs (const void *ap, const void *bp)
595 const arelent *a = * (const arelent **) ap;
596 const arelent *b = * (const arelent **) bp;
598 if (a->address > b->address)
600 else if (a->address < b->address)
603 /* So that associated relocations tied to the same address show up
604 in the correct order, we don't do any further sorting. */
613 /* Print an address (VMA) to the output stream in INFO.
614 If SKIP_ZEROES is TRUE, omit leading zeroes. */
617 objdump_print_value (bfd_vma vma, struct disassemble_info *info,
618 bfd_boolean skip_zeroes)
622 struct objdump_disasm_info *aux;
624 aux = (struct objdump_disasm_info *) info->application_data;
625 bfd_sprintf_vma (aux->abfd, buf, vma);
630 for (p = buf; *p == '0'; ++p)
635 (*info->fprintf_func) (info->stream, "%s", p);
638 /* Print the name of a symbol. */
641 objdump_print_symname (bfd *abfd, struct disassemble_info *info,
648 name = bfd_asymbol_name (sym);
649 if (do_demangle && name[0] != '\0')
651 /* Demangle the name. */
652 alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
658 (*info->fprintf_func) (info->stream, "%s", name);
666 /* Locate a symbol given a bfd and a section (from INFO->application_data),
667 and a VMA. If INFO->application_data->require_sec is TRUE, then always
668 require the symbol to be in the section. Returns NULL if there is no
669 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
670 of the symbol in sorted_syms. */
673 find_symbol_for_address (bfd_vma vma,
674 struct disassemble_info *info,
677 /* @@ Would it speed things up to cache the last two symbols returned,
678 and maybe their address ranges? For many processors, only one memory
679 operand can be present at a time, so the 2-entry cache wouldn't be
680 constantly churned by code doing heavy memory accesses. */
682 /* Indices in `sorted_syms'. */
684 long max = sorted_symcount;
686 struct objdump_disasm_info *aux;
690 bfd_boolean want_section;
692 if (sorted_symcount < 1)
695 aux = (struct objdump_disasm_info *) info->application_data;
698 opb = bfd_octets_per_byte (abfd);
700 /* Perform a binary search looking for the closest symbol to the
701 required value. We are searching the range (min, max]. */
702 while (min + 1 < max)
706 thisplace = (max + min) / 2;
707 sym = sorted_syms[thisplace];
709 if (bfd_asymbol_value (sym) > vma)
711 else if (bfd_asymbol_value (sym) < vma)
720 /* The symbol we want is now in min, the low end of the range we
721 were searching. If there are several symbols with the same
722 value, we want the first one. */
725 && (bfd_asymbol_value (sorted_syms[thisplace])
726 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
729 /* If the file is relocatable, and the symbol could be from this
730 section, prefer a symbol from this section over symbols from
731 others, even if the other symbol's value might be closer.
733 Note that this may be wrong for some symbol references if the
734 sections have overlapping memory ranges, but in that case there's
735 no way to tell what's desired without looking at the relocation
738 Also give the target a chance to reject symbols. */
739 want_section = (aux->require_sec
740 || ((abfd->flags & HAS_RELOC) != 0
741 && vma >= bfd_get_section_vma (abfd, sec)
742 && vma < (bfd_get_section_vma (abfd, sec)
743 + bfd_section_size (abfd, sec) / opb)));
744 if ((sorted_syms[thisplace]->section != sec && want_section)
745 || !info->symbol_is_valid (sorted_syms[thisplace], info))
750 for (i = thisplace + 1; i < sorted_symcount; i++)
752 if (bfd_asymbol_value (sorted_syms[i])
753 != bfd_asymbol_value (sorted_syms[thisplace]))
758 newplace = sorted_symcount;
762 if ((sorted_syms[i]->section == sec || !want_section)
763 && info->symbol_is_valid (sorted_syms[i], info))
765 if (newplace == sorted_symcount)
768 if (bfd_asymbol_value (sorted_syms[i])
769 != bfd_asymbol_value (sorted_syms[newplace]))
772 /* Remember this symbol and keep searching until we reach
773 an earlier address. */
778 if (newplace != sorted_symcount)
779 thisplace = newplace;
782 /* We didn't find a good symbol with a smaller value.
783 Look for one with a larger value. */
784 for (i = thisplace + 1; i < sorted_symcount; i++)
786 if ((sorted_syms[i]->section == sec || !want_section)
787 && info->symbol_is_valid (sorted_syms[i], info))
795 if ((sorted_syms[thisplace]->section != sec && want_section)
796 || !info->symbol_is_valid (sorted_syms[thisplace], info))
797 /* There is no suitable symbol. */
804 return sorted_syms[thisplace];
807 /* Print an address and the offset to the nearest symbol. */
810 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
811 bfd_vma vma, struct disassemble_info *info,
812 bfd_boolean skip_zeroes)
814 objdump_print_value (vma, info, skip_zeroes);
820 (*info->fprintf_func) (info->stream, " <%s",
821 bfd_get_section_name (abfd, sec));
822 secaddr = bfd_get_section_vma (abfd, sec);
825 (*info->fprintf_func) (info->stream, "-0x");
826 objdump_print_value (secaddr - vma, info, TRUE);
828 else if (vma > secaddr)
830 (*info->fprintf_func) (info->stream, "+0x");
831 objdump_print_value (vma - secaddr, info, TRUE);
833 (*info->fprintf_func) (info->stream, ">");
837 (*info->fprintf_func) (info->stream, " <");
838 objdump_print_symname (abfd, info, sym);
839 if (bfd_asymbol_value (sym) > vma)
841 (*info->fprintf_func) (info->stream, "-0x");
842 objdump_print_value (bfd_asymbol_value (sym) - vma, info, TRUE);
844 else if (vma > bfd_asymbol_value (sym))
846 (*info->fprintf_func) (info->stream, "+0x");
847 objdump_print_value (vma - bfd_asymbol_value (sym), info, TRUE);
849 (*info->fprintf_func) (info->stream, ">");
853 /* Print an address (VMA), symbolically if possible.
854 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
857 objdump_print_addr (bfd_vma vma,
858 struct disassemble_info *info,
859 bfd_boolean skip_zeroes)
861 struct objdump_disasm_info *aux;
862 asymbol *sym = NULL; /* Initialize to avoid compiler warning. */
863 bfd_boolean skip_find = FALSE;
865 if (sorted_symcount < 1)
867 (*info->fprintf_func) (info->stream, "0x");
868 objdump_print_value (vma, info, skip_zeroes);
872 aux = (struct objdump_disasm_info *) info->application_data;
874 if (aux->reloc != NULL
875 && aux->reloc->sym_ptr_ptr != NULL
876 && * aux->reloc->sym_ptr_ptr != NULL)
878 sym = * aux->reloc->sym_ptr_ptr;
880 /* Adjust the vma to the reloc. */
881 vma += bfd_asymbol_value (sym);
883 if (bfd_is_und_section (bfd_get_section (sym)))
888 sym = find_symbol_for_address (vma, info, NULL);
890 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
894 /* Print VMA to INFO. This function is passed to the disassembler
898 objdump_print_address (bfd_vma vma, struct disassemble_info *info)
900 objdump_print_addr (vma, info, ! prefix_addresses);
903 /* Determine if the given address has a symbol associated with it. */
906 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * info)
910 sym = find_symbol_for_address (vma, info, NULL);
912 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
915 /* Hold the last function name and the last line number we displayed
918 static char *prev_functionname;
919 static unsigned int prev_line;
921 /* We keep a list of all files that we have seen when doing a
922 disassembly with source, so that we know how much of the file to
923 display. This can be important for inlined functions. */
925 struct print_file_list
927 struct print_file_list *next;
928 const char *filename;
934 static struct print_file_list *print_files;
936 /* The number of preceding context lines to show when we start
937 displaying a file for the first time. */
939 #define SHOW_PRECEDING_CONTEXT_LINES (5)
941 /* Tries to open MODNAME, and if successful adds a node to print_files
942 linked list and returns that node. Returns NULL on failure. */
944 static struct print_file_list *
945 try_print_file_open (const char *origname, const char *modname)
947 struct print_file_list *p;
950 f = fopen (modname, "r");
954 if (print_files != NULL && print_files->f != NULL)
956 fclose (print_files->f);
957 print_files->f = NULL;
960 p = xmalloc (sizeof (struct print_file_list));
961 p->filename = origname;
962 p->modname = modname;
965 p->next = print_files;
970 /* If the the source file, as described in the symtab, is not found
971 try to locate it in one of the paths specified with -I
972 If found, add location to print_files linked list. */
974 static struct print_file_list *
975 update_source_path (const char *filename)
977 struct print_file_list *p;
981 if (filename == NULL)
984 p = try_print_file_open (filename, filename);
988 if (include_path_count == 0)
991 /* Get the name of the file. */
992 fname = strrchr (filename, '/');
993 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
995 /* We could have a mixed forward/back slash case. */
996 char *backslash = strrchr (filename, '\\');
997 if (fname == NULL || (backslash != NULL && backslash > fname))
999 if (fname == NULL && filename[0] != '\0' && filename[1] == ':')
1000 fname = filename + 1;
1008 /* If file exists under a new path, we need to add it to the list
1009 so that show_line knows about it. */
1010 for (i = 0; i < include_path_count; i++)
1012 char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1014 p = try_print_file_open (filename, modname);
1024 /* Skip ahead to a given line in a file, optionally printing each
1028 skip_to_line (struct print_file_list *p, unsigned int line,
1031 while (p->line < line)
1035 if (fgets (buf, sizeof buf, p->f) == NULL)
1045 if (strchr (buf, '\n') != NULL)
1050 /* Show the line number, or the source line, in a disassembly
1054 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1056 const char *filename;
1057 const char *functionname;
1060 if (! with_line_numbers && ! with_source_code)
1063 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1064 &functionname, &line))
1067 if (filename != NULL && *filename == '\0')
1069 if (functionname != NULL && *functionname == '\0')
1070 functionname = NULL;
1072 if (with_line_numbers)
1074 if (functionname != NULL
1075 && (prev_functionname == NULL
1076 || strcmp (functionname, prev_functionname) != 0))
1077 printf ("%s():\n", functionname);
1078 if (line > 0 && line != prev_line)
1079 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1082 if (with_source_code
1086 struct print_file_list **pp, *p;
1088 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1089 if (strcmp ((*pp)->filename, filename) == 0)
1095 if (p != print_files)
1099 /* We have reencountered a file name which we saw
1100 earlier. This implies that either we are dumping out
1101 code from an included file, or the same file was
1102 linked in more than once. There are two common cases
1103 of an included file: inline functions in a header
1104 file, and a bison or flex skeleton file. In the
1105 former case we want to just start printing (but we
1106 back up a few lines to give context); in the latter
1107 case we want to continue from where we left off. I
1108 can't think of a good way to distinguish the cases,
1109 so I used a heuristic based on the file name. */
1110 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1114 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1121 p->f = fopen (p->modname, "r");
1125 skip_to_line (p, l, FALSE);
1127 if (print_files->f != NULL)
1129 fclose (print_files->f);
1130 print_files->f = NULL;
1136 skip_to_line (p, line, TRUE);
1138 p->next = print_files;
1144 p = update_source_path (filename);
1150 if (file_start_context)
1153 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1156 skip_to_line (p, l, FALSE);
1158 skip_to_line (p, line, TRUE);
1163 if (functionname != NULL
1164 && (prev_functionname == NULL
1165 || strcmp (functionname, prev_functionname) != 0))
1167 if (prev_functionname != NULL)
1168 free (prev_functionname);
1169 prev_functionname = xmalloc (strlen (functionname) + 1);
1170 strcpy (prev_functionname, functionname);
1173 if (line > 0 && line != prev_line)
1177 /* Pseudo FILE object for strings. */
1185 /* sprintf to a "stream". */
1187 static int ATTRIBUTE_PRINTF_2
1188 objdump_sprintf (SFILE *f, const char *format, ...)
1195 size_t space = f->alloc - f->pos;
1197 va_start (args, format);
1198 n = vsnprintf (f->buffer + f->pos, space, format, args);
1204 f->alloc = (f->alloc + n) * 2;
1205 f->buffer = xrealloc (f->buffer, f->alloc);
1212 /* Returns TRUE if the specified section should be dumped. */
1215 process_section_p (asection * section)
1222 for (i = 0; i < only_used; i++)
1223 if (strcmp (only [i], section->name) == 0)
1230 /* The number of zeroes we want to see before we start skipping them.
1231 The number is arbitrarily chosen. */
1233 #define DEFAULT_SKIP_ZEROES 8
1235 /* The number of zeroes to skip at the end of a section. If the
1236 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1237 SKIP_ZEROES, they will be disassembled. If there are fewer than
1238 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1239 attempt to avoid disassembling zeroes inserted by section
1242 #define DEFAULT_SKIP_ZEROES_AT_END 3
1244 /* Disassemble some data in memory between given values. */
1247 disassemble_bytes (struct disassemble_info * info,
1248 disassembler_ftype disassemble_fn,
1251 bfd_vma start_offset,
1252 bfd_vma stop_offset,
1255 arelent ** relppend)
1257 struct objdump_disasm_info *aux;
1259 int octets_per_line;
1260 bfd_boolean done_dot;
1261 int skip_addr_chars;
1262 bfd_vma addr_offset;
1263 unsigned int opb = info->octets_per_byte;
1264 unsigned int skip_zeroes = info->skip_zeroes;
1265 unsigned int skip_zeroes_at_end = info->skip_zeroes_at_end;
1269 aux = (struct objdump_disasm_info *) info->application_data;
1273 sfile.buffer = xmalloc (sfile.alloc);
1277 octets_per_line = 4;
1279 octets_per_line = 16;
1281 /* Figure out how many characters to skip at the start of an
1282 address, to make the disassembly look nicer. We discard leading
1283 zeroes in chunks of 4, ensuring that there is always a leading
1285 skip_addr_chars = 0;
1286 if (! prefix_addresses)
1294 + bfd_section_size (section->owner, section) / opb));
1296 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1299 skip_addr_chars += 4;
1304 info->insn_info_valid = 0;
1307 addr_offset = start_offset;
1308 while (addr_offset < stop_offset)
1311 bfd_boolean need_nl = FALSE;
1312 int previous_octets;
1314 /* Remember the length of the previous instruction. */
1315 previous_octets = octets;
1318 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1320 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1323 if (! disassemble_zeroes
1324 && (info->insn_info_valid == 0
1325 || info->branch_delay_insns == 0)
1326 && (z - addr_offset * opb >= skip_zeroes
1327 || (z == stop_offset * opb &&
1328 z - addr_offset * opb < skip_zeroes_at_end)))
1332 /* If there are more nonzero octets to follow, we only skip
1333 zeroes in multiples of 4, to try to avoid running over
1334 the start of an instruction which happens to start with
1336 if (z != stop_offset * opb)
1337 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1339 octets = z - addr_offset * opb;
1349 if (with_line_numbers || with_source_code)
1350 show_line (aux->abfd, section, addr_offset);
1352 if (! prefix_addresses)
1356 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1357 for (s = buf + skip_addr_chars; *s == '0'; s++)
1361 printf ("%s:\t", buf + skip_addr_chars);
1365 aux->require_sec = TRUE;
1366 objdump_print_address (section->vma + addr_offset, info);
1367 aux->require_sec = FALSE;
1374 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1375 info->stream = &sfile;
1376 info->bytes_per_line = 0;
1377 info->bytes_per_chunk = 0;
1380 if (info->disassembler_needs_relocs
1381 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1382 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1383 && *relppp < relppend)
1385 bfd_signed_vma distance_to_rel;
1387 distance_to_rel = (**relppp)->address
1388 - (rel_offset + addr_offset);
1390 /* Check to see if the current reloc is associated with
1391 the instruction that we are about to disassemble. */
1392 if (distance_to_rel == 0
1393 /* FIXME: This is wrong. We are trying to catch
1394 relocs that are addressed part way through the
1395 current instruction, as might happen with a packed
1396 VLIW instruction. Unfortunately we do not know the
1397 length of the current instruction since we have not
1398 disassembled it yet. Instead we take a guess based
1399 upon the length of the previous instruction. The
1400 proper solution is to have a new target-specific
1401 disassembler function which just returns the length
1402 of an instruction at a given address without trying
1403 to display its disassembly. */
1404 || (distance_to_rel > 0
1405 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1407 info->flags = INSN_HAS_RELOC;
1408 aux->reloc = **relppp;
1414 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1415 info->fprintf_func = (fprintf_ftype) fprintf;
1416 info->stream = stdout;
1417 if (info->bytes_per_line != 0)
1418 octets_per_line = info->bytes_per_line;
1422 printf ("%s\n", sfile.buffer);
1430 octets = octets_per_line;
1431 if (addr_offset + octets / opb > stop_offset)
1432 octets = (stop_offset - addr_offset) * opb;
1434 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1436 if (ISPRINT (data[j]))
1437 buf[j - addr_offset * opb] = data[j];
1439 buf[j - addr_offset * opb] = '.';
1441 buf[j - addr_offset * opb] = '\0';
1444 if (prefix_addresses
1446 : show_raw_insn >= 0)
1450 /* If ! prefix_addresses and ! wide_output, we print
1451 octets_per_line octets per line. */
1453 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1454 pb = octets_per_line;
1456 if (info->bytes_per_chunk)
1457 bpc = info->bytes_per_chunk;
1461 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1465 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1467 for (k = bpc - 1; k >= 0; k--)
1468 printf ("%02x", (unsigned) data[j + k]);
1473 for (k = 0; k < bpc; k++)
1474 printf ("%02x", (unsigned) data[j + k]);
1479 for (; pb < octets_per_line; pb += bpc)
1483 for (k = 0; k < bpc; k++)
1488 /* Separate raw data from instruction by extra space. */
1498 printf ("%s", sfile.buffer);
1500 if (prefix_addresses
1502 : show_raw_insn >= 0)
1510 j = addr_offset * opb + pb;
1512 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1513 for (s = buf + skip_addr_chars; *s == '0'; s++)
1517 printf ("%s:\t", buf + skip_addr_chars);
1519 pb += octets_per_line;
1522 for (; j < addr_offset * opb + pb; j += bpc)
1526 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1528 for (k = bpc - 1; k >= 0; k--)
1529 printf ("%02x", (unsigned) data[j + k]);
1534 for (k = 0; k < bpc; k++)
1535 printf ("%02x", (unsigned) data[j + k]);
1548 while ((*relppp) < relppend
1549 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1551 if (dump_reloc_info || dump_dynamic_reloc_info)
1562 objdump_print_value (section->vma - rel_offset + q->address,
1565 if (q->howto == NULL)
1566 printf (": *unknown*\t");
1567 else if (q->howto->name)
1568 printf (": %s\t", q->howto->name);
1570 printf (": %d\t", q->howto->type);
1572 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1573 printf ("*unknown*");
1576 const char *sym_name;
1578 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1579 if (sym_name != NULL && *sym_name != '\0')
1580 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1585 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1586 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1587 if (sym_name == NULL || *sym_name == '\0')
1588 sym_name = "*unknown*";
1589 printf ("%s", sym_name);
1596 objdump_print_value (q->addend, info, TRUE);
1608 addr_offset += octets / opb;
1611 free (sfile.buffer);
1615 disassemble_section (bfd *abfd, asection *section, void *info)
1617 struct disassemble_info * pinfo = (struct disassemble_info *) info;
1618 struct objdump_disasm_info * paux;
1619 unsigned int opb = pinfo->octets_per_byte;
1620 bfd_byte * data = NULL;
1621 bfd_size_type datasize = 0;
1622 arelent ** rel_pp = NULL;
1623 arelent ** rel_ppstart = NULL;
1624 arelent ** rel_ppend;
1625 unsigned long stop_offset;
1626 asymbol * sym = NULL;
1630 unsigned long addr_offset;
1632 /* Sections that do not contain machine
1633 code are not normally disassembled. */
1634 if (! disassemble_all
1636 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1637 != (SEC_CODE | SEC_HAS_CONTENTS)))
1640 if (! process_section_p (section))
1643 datasize = bfd_get_section_size (section);
1647 /* Decide which set of relocs to use. Load them if necessary. */
1648 paux = (struct objdump_disasm_info *) pinfo->application_data;
1649 if (paux->dynrelbuf)
1651 rel_pp = paux->dynrelbuf;
1652 rel_count = paux->dynrelcount;
1653 /* Dynamic reloc addresses are absolute, non-dynamic are section
1654 relative. REL_OFFSET specifies the reloc address corresponding
1655 to the start of this section. */
1656 rel_offset = section->vma;
1664 if ((section->flags & SEC_RELOC) != 0
1665 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1669 relsize = bfd_get_reloc_upper_bound (abfd, section);
1671 bfd_fatal (bfd_get_filename (abfd));
1675 rel_ppstart = rel_pp = xmalloc (relsize);
1676 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1678 bfd_fatal (bfd_get_filename (abfd));
1680 /* Sort the relocs by address. */
1681 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1686 rel_ppend = rel_pp + rel_count;
1688 data = xmalloc (datasize);
1690 bfd_get_section_contents (abfd, section, data, 0, datasize);
1692 paux->sec = section;
1693 pinfo->buffer = data;
1694 pinfo->buffer_vma = section->vma;
1695 pinfo->buffer_length = datasize;
1696 pinfo->section = section;
1698 if (start_address == (bfd_vma) -1
1699 || start_address < pinfo->buffer_vma)
1702 addr_offset = start_address - pinfo->buffer_vma;
1704 if (stop_address == (bfd_vma) -1)
1705 stop_offset = datasize / opb;
1708 if (stop_address < pinfo->buffer_vma)
1711 stop_offset = stop_address - pinfo->buffer_vma;
1712 if (stop_offset > pinfo->buffer_length / opb)
1713 stop_offset = pinfo->buffer_length / opb;
1716 /* Skip over the relocs belonging to addresses below the
1718 while (rel_pp < rel_ppend
1719 && (*rel_pp)->address < rel_offset + addr_offset)
1722 printf (_("Disassembly of section %s:\n"), section->name);
1724 /* Find the nearest symbol forwards from our current position. */
1725 paux->require_sec = TRUE;
1726 sym = find_symbol_for_address (section->vma + addr_offset, info, &place);
1727 paux->require_sec = FALSE;
1729 /* Disassemble a block of instructions up to the address associated with
1730 the symbol we have just found. Then print the symbol and find the
1731 next symbol on. Repeat until we have disassembled the entire section
1732 or we have reached the end of the address range we are interested in. */
1733 while (addr_offset < stop_offset)
1737 unsigned long nextstop_offset;
1740 addr = section->vma + addr_offset;
1742 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
1747 (x < sorted_symcount
1748 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
1752 pinfo->symbols = sorted_syms + place;
1753 pinfo->num_symbols = x - place;
1754 pinfo->symtab_pos = place;
1758 pinfo->symbols = NULL;
1759 pinfo->num_symbols = 0;
1760 pinfo->symtab_pos = -1;
1763 if (! prefix_addresses)
1765 pinfo->fprintf_func (pinfo->stream, "\n");
1766 objdump_print_addr_with_sym (abfd, section, sym, addr,
1768 pinfo->fprintf_func (pinfo->stream, ":\n");
1771 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1773 else if (sym == NULL)
1777 #define is_valid_next_sym(SYM) \
1778 ((SYM)->section == section \
1779 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
1780 && pinfo->symbol_is_valid (SYM, pinfo))
1782 /* Search forward for the next appropriate symbol in
1783 SECTION. Note that all the symbols are sorted
1784 together into one big array, and that some sections
1785 may have overlapping addresses. */
1786 while (place < sorted_symcount
1787 && ! is_valid_next_sym (sorted_syms [place]))
1790 if (place >= sorted_symcount)
1793 nextsym = sorted_syms[place];
1796 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1797 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1798 else if (nextsym == NULL)
1799 nextstop_offset = stop_offset;
1801 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1803 if (nextstop_offset > stop_offset)
1804 nextstop_offset = stop_offset;
1806 /* If a symbol is explicitly marked as being an object
1807 rather than a function, just dump the bytes without
1808 disassembling them. */
1811 || bfd_asymbol_value (sym) > addr
1812 || ((sym->flags & BSF_OBJECT) == 0
1813 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1815 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1817 || (sym->flags & BSF_FUNCTION) != 0)
1822 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
1823 addr_offset, nextstop_offset,
1824 rel_offset, &rel_pp, rel_ppend);
1826 addr_offset = nextstop_offset;
1832 if (rel_ppstart != NULL)
1836 /* Disassemble the contents of an object file. */
1839 disassemble_data (bfd *abfd)
1841 struct disassemble_info disasm_info;
1842 struct objdump_disasm_info aux;
1846 prev_functionname = NULL;
1849 /* We make a copy of syms to sort. We don't want to sort syms
1850 because that will screw up the relocs. */
1851 sorted_symcount = symcount ? symcount : dynsymcount;
1852 sorted_syms = xmalloc ((sorted_symcount + synthcount) * sizeof (asymbol *));
1853 memcpy (sorted_syms, symcount ? syms : dynsyms,
1854 sorted_symcount * sizeof (asymbol *));
1856 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
1858 for (i = 0; i < synthcount; ++i)
1860 sorted_syms[sorted_symcount] = synthsyms + i;
1864 /* Sort the symbols into section and symbol order. */
1865 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1867 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
1869 disasm_info.application_data = (void *) &aux;
1871 aux.require_sec = FALSE;
1872 aux.dynrelbuf = NULL;
1873 aux.dynrelcount = 0;
1876 disasm_info.print_address_func = objdump_print_address;
1877 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1879 if (machine != NULL)
1881 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1884 fatal (_("Can't use supplied machine %s"), machine);
1886 abfd->arch_info = info;
1889 if (endian != BFD_ENDIAN_UNKNOWN)
1891 struct bfd_target *xvec;
1893 xvec = xmalloc (sizeof (struct bfd_target));
1894 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1895 xvec->byteorder = endian;
1899 /* Use libopcodes to locate a suitable disassembler. */
1900 aux.disassemble_fn = disassembler (abfd);
1901 if (!aux.disassemble_fn)
1903 non_fatal (_("Can't disassemble for architecture %s\n"),
1904 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1909 disasm_info.flavour = bfd_get_flavour (abfd);
1910 disasm_info.arch = bfd_get_arch (abfd);
1911 disasm_info.mach = bfd_get_mach (abfd);
1912 disasm_info.disassembler_options = disassembler_options;
1913 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
1914 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
1915 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
1916 disasm_info.disassembler_needs_relocs = FALSE;
1918 if (bfd_big_endian (abfd))
1919 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1920 else if (bfd_little_endian (abfd))
1921 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1923 /* ??? Aborting here seems too drastic. We could default to big or little
1925 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1927 /* Allow the target to customize the info structure. */
1928 disassemble_init_for_target (& disasm_info);
1930 /* Pre-load the dynamic relocs if we are going
1931 to be dumping them along with the disassembly. */
1932 if (dump_dynamic_reloc_info)
1934 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
1937 bfd_fatal (bfd_get_filename (abfd));
1941 aux.dynrelbuf = xmalloc (relsize);
1942 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
1945 if (aux.dynrelcount < 0)
1946 bfd_fatal (bfd_get_filename (abfd));
1948 /* Sort the relocs by address. */
1949 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
1953 disasm_info.symtab = sorted_syms;
1954 disasm_info.symtab_size = sorted_symcount;
1956 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
1958 if (aux.dynrelbuf != NULL)
1959 free (aux.dynrelbuf);
1964 load_debug_section (enum dwarf_section_display_enum debug, void *file)
1966 struct dwarf_section *section = &debug_displays [debug].section;
1971 /* If it is already loaded, do nothing. */
1972 if (section->start != NULL)
1975 /* Locate the debug section. */
1976 sec = bfd_get_section_by_name (abfd, section->name);
1980 /* Compute a bias to be added to offsets found within the DWARF debug
1981 information. These offsets are meant to be relative to the start of
1982 the dwarf section, and hence the bias should be 0. For MACH-O however
1983 a dwarf section is really just a region of a much larger section and so
1984 the bias is the address of the start of that area within the larger
1985 section. This test is important for PE and COFF based targets which
1986 use DWARF debug information, since unlike ELF, they do not allow the
1987 dwarf sections to be placed at address 0. */
1988 if (bfd_get_flavour (abfd) == bfd_target_mach_o_flavour)
1989 section->address = bfd_get_section_vma (abfd, sec);
1991 section->address = 0;
1993 section->size = bfd_get_section_size (sec);
1994 section->start = xmalloc (section->size);
1996 if (is_relocatable && debug_displays [debug].relocate)
1997 ret = bfd_simple_get_relocated_section_contents (abfd,
2002 ret = bfd_get_section_contents (abfd, sec, section->start, 0,
2007 free_debug_section (debug);
2008 printf (_("\nCan't get contents for section '%s'.\n"),
2016 free_debug_section (enum dwarf_section_display_enum debug)
2018 struct dwarf_section *section = &debug_displays [debug].section;
2020 if (section->start == NULL)
2023 free ((char *) section->start);
2024 section->start = NULL;
2025 section->address = 0;
2030 dump_dwarf_section (bfd *abfd, asection *section,
2031 void *arg ATTRIBUTE_UNUSED)
2033 const char *name = bfd_get_section_name (abfd, section);
2035 enum dwarf_section_display_enum i;
2037 if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2038 match = ".debug_info";
2042 for (i = 0; i < max; i++)
2043 if (strcmp (debug_displays[i].section.name, match) == 0)
2045 if (!debug_displays[i].eh_frame)
2047 struct dwarf_section *sec = &debug_displays [i].section;
2049 if (load_debug_section (i, abfd))
2051 debug_displays[i].display (sec, abfd);
2053 if (i != info && i != abbrev)
2054 free_debug_section (i);
2061 static const char *mach_o_dwarf_sections [] = {
2062 "LC_SEGMENT.__DWARFA.__debug_abbrev", /* .debug_abbrev */
2063 "LC_SEGMENT.__DWARFA.__debug_aranges", /* .debug_aranges */
2064 "LC_SEGMENT.__DWARFA.__debug_frame", /* .debug_frame */
2065 "LC_SEGMENT.__DWARFA.__debug_info", /* .debug_info */
2066 "LC_SEGMENT.__DWARFA.__debug_line", /* .debug_line */
2067 "LC_SEGMENT.__DWARFA.__debug_pubnames", /* .debug_pubnames */
2068 ".eh_frame", /* .eh_frame */
2069 "LC_SEGMENT.__DWARFA.__debug_macinfo", /* .debug_macinfo */
2070 "LC_SEGMENT.__DWARFA.__debug_str", /* .debug_str */
2071 "LC_SEGMENT.__DWARFA.__debug_loc", /* .debug_loc */
2072 "LC_SEGMENT.__DWARFA.__debug_pubtypes", /* .debug_pubtypes */
2073 "LC_SEGMENT.__DWARFA.__debug_ranges", /* .debug_ranges */
2074 "LC_SEGMENT.__DWARFA.__debug_static_func", /* .debug_static_func */
2075 "LC_SEGMENT.__DWARFA.__debug_static_vars", /* .debug_static_vars */
2076 "LC_SEGMENT.__DWARFA.__debug_types", /* .debug_types */
2077 "LC_SEGMENT.__DWARFA.__debug_weaknames" /* .debug_weaknames */
2080 static const char *generic_dwarf_sections [max];
2083 check_mach_o_dwarf (bfd *abfd)
2085 static enum bfd_flavour old_flavour = bfd_target_unknown_flavour;
2086 enum bfd_flavour current_flavour = bfd_get_flavour (abfd);
2087 enum dwarf_section_display_enum i;
2089 if (generic_dwarf_sections [0] == NULL)
2090 for (i = 0; i < max; i++)
2091 generic_dwarf_sections [i] = debug_displays[i].section.name;
2093 if (old_flavour != current_flavour)
2095 if (current_flavour == bfd_target_mach_o_flavour)
2096 for (i = 0; i < max; i++)
2097 debug_displays[i].section.name = mach_o_dwarf_sections [i];
2098 else if (old_flavour == bfd_target_mach_o_flavour)
2099 for (i = 0; i < max; i++)
2100 debug_displays[i].section.name = generic_dwarf_sections [i];
2102 old_flavour = current_flavour;
2106 /* Dump the dwarf debugging information. */
2109 dump_dwarf (bfd *abfd)
2111 is_relocatable = ((abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC))
2114 /* FIXME: bfd_get_arch_size may return -1. We assume that 64bit
2115 targets will return 64. */
2116 eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
2118 if (bfd_big_endian (abfd))
2119 byte_get = byte_get_big_endian;
2120 else if (bfd_little_endian (abfd))
2121 byte_get = byte_get_little_endian;
2125 check_mach_o_dwarf (abfd);
2127 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2129 free_debug_memory ();
2132 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2133 it. Return NULL on failure. */
2136 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2142 stabsect = bfd_get_section_by_name (abfd, sect_name);
2143 if (stabsect == NULL)
2145 printf (_("No %s section present\n\n"), sect_name);
2149 size = bfd_section_size (abfd, stabsect);
2150 contents = xmalloc (size);
2152 if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2154 non_fatal (_("Reading %s section of %s failed: %s"),
2155 sect_name, bfd_get_filename (abfd),
2156 bfd_errmsg (bfd_get_error ()));
2167 /* Stabs entries use a 12 byte format:
2168 4 byte string table index
2170 1 byte stab other field
2171 2 byte stab desc field
2173 FIXME: This will have to change for a 64 bit object format. */
2175 #define STRDXOFF (0)
2177 #define OTHEROFF (5)
2180 #define STABSIZE (12)
2182 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2183 using string table section STRSECT_NAME (in `strtab'). */
2186 print_section_stabs (bfd *abfd,
2187 const char *stabsect_name,
2188 unsigned *string_offset_ptr)
2191 unsigned file_string_table_offset = 0;
2192 unsigned next_file_string_table_offset = *string_offset_ptr;
2193 bfd_byte *stabp, *stabs_end;
2196 stabs_end = stabp + stab_size;
2198 printf (_("Contents of %s section:\n\n"), stabsect_name);
2199 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
2201 /* Loop through all symbols and print them.
2203 We start the index at -1 because there is a dummy symbol on
2204 the front of stabs-in-{coff,elf} sections that supplies sizes. */
2205 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2209 unsigned char type, other;
2210 unsigned short desc;
2213 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2214 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2215 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2216 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2217 value = bfd_h_get_32 (abfd, stabp + VALOFF);
2219 printf ("\n%-6d ", i);
2220 /* Either print the stab name, or, if unnamed, print its number
2221 again (makes consistent formatting for tools like awk). */
2222 name = bfd_get_stab_name (type);
2224 printf ("%-6s", name);
2225 else if (type == N_UNDF)
2228 printf ("%-6d", type);
2229 printf (" %-6d %-6d ", other, desc);
2230 bfd_printf_vma (abfd, value);
2231 printf (" %-6lu", strx);
2233 /* Symbols with type == 0 (N_UNDF) specify the length of the
2234 string table associated with this file. We use that info
2235 to know how to relocate the *next* file's string table indices. */
2238 file_string_table_offset = next_file_string_table_offset;
2239 next_file_string_table_offset += value;
2243 /* Using the (possibly updated) string table offset, print the
2244 string (if any) associated with this symbol. */
2245 if ((strx + file_string_table_offset) < stabstr_size)
2246 printf (" %s", &strtab[strx + file_string_table_offset]);
2252 *string_offset_ptr = next_file_string_table_offset;
2257 const char * section_name;
2258 const char * string_section_name;
2259 unsigned string_offset;
2264 find_stabs_section (bfd *abfd, asection *section, void *names)
2267 stab_section_names * sought = (stab_section_names *) names;
2269 /* Check for section names for which stabsect_name is a prefix, to
2270 handle .stab.N, etc. */
2271 len = strlen (sought->section_name);
2273 /* If the prefix matches, and the files section name ends with a
2274 nul or a digit, then we match. I.e., we want either an exact
2275 match or a section followed by a number. */
2276 if (strncmp (sought->section_name, section->name, len) == 0
2277 && (section->name[len] == 0
2278 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2281 strtab = read_section_stabs (abfd, sought->string_section_name,
2286 stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2289 print_section_stabs (abfd, section->name, &sought->string_offset);
2295 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2297 stab_section_names s;
2299 s.section_name = stabsect_name;
2300 s.string_section_name = strsect_name;
2301 s.string_offset = 0;
2303 bfd_map_over_sections (abfd, find_stabs_section, & s);
2309 /* Dump the any sections containing stabs debugging information. */
2312 dump_stabs (bfd *abfd)
2314 dump_stabs_section (abfd, ".stab", ".stabstr");
2315 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2316 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2317 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2321 dump_bfd_header (bfd *abfd)
2325 printf (_("architecture: %s, "),
2326 bfd_printable_arch_mach (bfd_get_arch (abfd),
2327 bfd_get_mach (abfd)));
2328 printf (_("flags 0x%08x:\n"), abfd->flags);
2330 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2331 PF (HAS_RELOC, "HAS_RELOC");
2332 PF (EXEC_P, "EXEC_P");
2333 PF (HAS_LINENO, "HAS_LINENO");
2334 PF (HAS_DEBUG, "HAS_DEBUG");
2335 PF (HAS_SYMS, "HAS_SYMS");
2336 PF (HAS_LOCALS, "HAS_LOCALS");
2337 PF (DYNAMIC, "DYNAMIC");
2338 PF (WP_TEXT, "WP_TEXT");
2339 PF (D_PAGED, "D_PAGED");
2340 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2341 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2342 printf (_("\nstart address 0x"));
2343 bfd_printf_vma (abfd, abfd->start_address);
2349 dump_bfd_private_header (bfd *abfd)
2351 bfd_print_private_bfd_data (abfd, stdout);
2355 /* Display a section in hexadecimal format with associated characters.
2356 Each line prefixed by the zero padded address. */
2359 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2362 bfd_size_type datasize;
2363 bfd_size_type addr_offset;
2364 bfd_size_type start_offset;
2365 bfd_size_type stop_offset;
2366 unsigned int opb = bfd_octets_per_byte (abfd);
2367 /* Bytes per line. */
2368 const int onaline = 16;
2373 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2376 if (! process_section_p (section))
2379 if ((datasize = bfd_section_size (abfd, section)) == 0)
2382 printf (_("Contents of section %s:\n"), section->name);
2384 data = xmalloc (datasize);
2386 bfd_get_section_contents (abfd, section, data, 0, datasize);
2388 /* Compute the address range to display. */
2389 if (start_address == (bfd_vma) -1
2390 || start_address < section->vma)
2393 start_offset = start_address - section->vma;
2395 if (stop_address == (bfd_vma) -1)
2396 stop_offset = datasize / opb;
2399 if (stop_address < section->vma)
2402 stop_offset = stop_address - section->vma;
2404 if (stop_offset > datasize / opb)
2405 stop_offset = datasize / opb;
2410 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2411 if (strlen (buf) >= sizeof (buf))
2415 while (buf[count] == '0' && buf[count+1] != '\0')
2417 count = strlen (buf) - count;
2421 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2422 if (strlen (buf) >= sizeof (buf))
2426 while (buf[count] == '0' && buf[count+1] != '\0')
2428 count = strlen (buf) - count;
2432 for (addr_offset = start_offset;
2433 addr_offset < stop_offset; addr_offset += onaline / opb)
2437 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2438 count = strlen (buf);
2439 if ((size_t) count >= sizeof (buf))
2443 while (count < width)
2448 fputs (buf + count - width, stdout);
2451 for (j = addr_offset * opb;
2452 j < addr_offset * opb + onaline; j++)
2454 if (j < stop_offset * opb)
2455 printf ("%02x", (unsigned) (data[j]));
2463 for (j = addr_offset * opb;
2464 j < addr_offset * opb + onaline; j++)
2466 if (j >= stop_offset * opb)
2469 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2476 /* Actually display the various requested regions. */
2479 dump_data (bfd *abfd)
2481 bfd_map_over_sections (abfd, dump_section, NULL);
2484 /* Should perhaps share code and display with nm? */
2487 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2497 printf ("DYNAMIC SYMBOL TABLE:\n");
2503 printf ("SYMBOL TABLE:\n");
2507 printf (_("no symbols\n"));
2509 for (count = 0; count < max; count++)
2513 if (*current == NULL)
2514 printf (_("no information for symbol number %ld\n"), count);
2516 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2517 printf (_("could not determine the type of symbol number %ld\n"),
2520 else if (process_section_p ((* current)->section)
2521 && (dump_special_syms
2522 || !bfd_is_target_special_symbol (cur_bfd, *current)))
2524 const char *name = (*current)->name;
2526 if (do_demangle && name != NULL && *name != '\0')
2530 /* If we want to demangle the name, we demangle it
2531 here, and temporarily clobber it while calling
2532 bfd_print_symbol. FIXME: This is a gross hack. */
2533 alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2535 (*current)->name = alloc;
2536 bfd_print_symbol (cur_bfd, stdout, *current,
2537 bfd_print_symbol_all);
2540 (*current)->name = name;
2545 bfd_print_symbol (cur_bfd, stdout, *current,
2546 bfd_print_symbol_all);
2556 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2559 char *last_filename, *last_functionname;
2560 unsigned int last_line;
2562 /* Get column headers lined up reasonably. */
2570 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2571 width = strlen (buf) - 7;
2573 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2576 last_filename = NULL;
2577 last_functionname = NULL;
2580 for (p = relpp; relcount && *p != NULL; p++, relcount--)
2583 const char *filename, *functionname;
2585 const char *sym_name;
2586 const char *section_name;
2588 if (start_address != (bfd_vma) -1
2589 && q->address < start_address)
2591 if (stop_address != (bfd_vma) -1
2592 && q->address > stop_address)
2595 if (with_line_numbers
2597 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2598 &filename, &functionname, &line))
2600 if (functionname != NULL
2601 && (last_functionname == NULL
2602 || strcmp (functionname, last_functionname) != 0))
2604 printf ("%s():\n", functionname);
2605 if (last_functionname != NULL)
2606 free (last_functionname);
2607 last_functionname = xstrdup (functionname);
2611 && (line != last_line
2612 || (filename != NULL
2613 && last_filename != NULL
2614 && strcmp (filename, last_filename) != 0)))
2616 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2618 if (last_filename != NULL)
2619 free (last_filename);
2620 if (filename == NULL)
2621 last_filename = NULL;
2623 last_filename = xstrdup (filename);
2627 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2629 sym_name = (*(q->sym_ptr_ptr))->name;
2630 section_name = (*(q->sym_ptr_ptr))->section->name;
2635 section_name = NULL;
2638 bfd_printf_vma (abfd, q->address);
2639 if (q->howto == NULL)
2640 printf (" *unknown* ");
2641 else if (q->howto->name)
2642 printf (" %-16s ", q->howto->name);
2644 printf (" %-16d ", q->howto->type);
2646 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
2649 if (section_name == NULL)
2650 section_name = "*unknown*";
2651 printf ("[%s]", section_name);
2657 bfd_printf_vma (abfd, q->addend);
2665 dump_relocs_in_section (bfd *abfd,
2667 void *dummy ATTRIBUTE_UNUSED)
2673 if ( bfd_is_abs_section (section)
2674 || bfd_is_und_section (section)
2675 || bfd_is_com_section (section)
2676 || (! process_section_p (section))
2677 || ((section->flags & SEC_RELOC) == 0))
2680 relsize = bfd_get_reloc_upper_bound (abfd, section);
2682 bfd_fatal (bfd_get_filename (abfd));
2684 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2688 printf (" (none)\n\n");
2692 relpp = xmalloc (relsize);
2693 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2696 bfd_fatal (bfd_get_filename (abfd));
2697 else if (relcount == 0)
2698 printf (" (none)\n\n");
2702 dump_reloc_set (abfd, section, relpp, relcount);
2709 dump_relocs (bfd *abfd)
2711 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2715 dump_dynamic_relocs (bfd *abfd)
2721 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2723 bfd_fatal (bfd_get_filename (abfd));
2725 printf ("DYNAMIC RELOCATION RECORDS");
2728 printf (" (none)\n\n");
2731 relpp = xmalloc (relsize);
2732 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2735 bfd_fatal (bfd_get_filename (abfd));
2736 else if (relcount == 0)
2737 printf (" (none)\n\n");
2741 dump_reloc_set (abfd, NULL, relpp, relcount);
2748 /* Creates a table of paths, to search for source files. */
2751 add_include_path (const char *path)
2755 include_path_count++;
2756 include_paths = xrealloc (include_paths,
2757 include_path_count * sizeof (*include_paths));
2758 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2759 if (path[1] == ':' && path[2] == 0)
2760 path = concat (path, ".", (const char *) 0);
2762 include_paths[include_path_count - 1] = path;
2766 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
2770 if ((section->flags & SEC_DEBUGGING) == 0)
2772 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
2773 section->vma += adjust_section_vma;
2775 section->lma += adjust_section_vma;
2779 /* Dump selected contents of ABFD. */
2782 dump_bfd (bfd *abfd)
2784 /* If we are adjusting section VMA's, change them all now. Changing
2785 the BFD information is a hack. However, we must do it, or
2786 bfd_find_nearest_line will not do the right thing. */
2787 if (adjust_section_vma != 0)
2789 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
2790 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
2793 if (! dump_debugging_tags)
2794 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2797 print_arelt_descr (stdout, abfd, TRUE);
2798 if (dump_file_header)
2799 dump_bfd_header (abfd);
2800 if (dump_private_headers)
2801 dump_bfd_private_header (abfd);
2802 if (! dump_debugging_tags)
2804 if (dump_section_headers)
2805 dump_headers (abfd);
2811 || dump_dwarf_section_info)
2812 syms = slurp_symtab (abfd);
2813 if (dump_dynamic_symtab || dump_dynamic_reloc_info
2814 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
2815 dynsyms = slurp_dynamic_symtab (abfd);
2818 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
2819 dynsymcount, dynsyms, &synthsyms);
2825 dump_symbols (abfd, FALSE);
2826 if (dump_dynamic_symtab)
2827 dump_symbols (abfd, TRUE);
2828 if (dump_dwarf_section_info)
2830 if (dump_stab_section_info)
2832 if (dump_reloc_info && ! disassemble)
2834 if (dump_dynamic_reloc_info && ! disassemble)
2835 dump_dynamic_relocs (abfd);
2836 if (dump_section_contents)
2839 disassemble_data (abfd);
2845 dhandle = read_debugging_info (abfd, syms, symcount);
2846 if (dhandle != NULL)
2848 if (!print_debugging_info (stdout, dhandle, abfd, syms,
2850 dump_debugging_tags ? TRUE : FALSE))
2852 non_fatal (_("%s: printing debugging information failed"),
2853 bfd_get_filename (abfd));
2883 display_bfd (bfd *abfd)
2887 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2893 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2895 nonfatal (bfd_get_filename (abfd));
2896 list_matching_formats (matching);
2901 if (bfd_get_error () != bfd_error_file_not_recognized)
2903 nonfatal (bfd_get_filename (abfd));
2907 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2913 nonfatal (bfd_get_filename (abfd));
2915 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2917 list_matching_formats (matching);
2923 display_file (char *filename, char *target)
2928 if (get_file_size (filename) < 1)
2934 file = bfd_openr (filename, target);
2937 nonfatal (filename);
2941 /* If the file is an archive, process all of its elements. */
2942 if (bfd_check_format (file, bfd_archive))
2944 bfd *last_arfile = NULL;
2946 printf (_("In archive %s:\n"), bfd_get_filename (file));
2949 bfd_set_error (bfd_error_no_error);
2951 arfile = bfd_openr_next_archived_file (file, arfile);
2954 if (bfd_get_error () != bfd_error_no_more_archived_files)
2955 nonfatal (bfd_get_filename (file));
2959 display_bfd (arfile);
2961 if (last_arfile != NULL)
2962 bfd_close (last_arfile);
2963 last_arfile = arfile;
2966 if (last_arfile != NULL)
2967 bfd_close (last_arfile);
2976 main (int argc, char **argv)
2979 char *target = default_target;
2980 bfd_boolean seenflag = FALSE;
2982 #if defined (HAVE_SETLOCALE)
2983 #if defined (HAVE_LC_MESSAGES)
2984 setlocale (LC_MESSAGES, "");
2986 setlocale (LC_CTYPE, "");
2989 bindtextdomain (PACKAGE, LOCALEDIR);
2990 textdomain (PACKAGE);
2992 program_name = *argv;
2993 xmalloc_set_program_name (program_name);
2995 START_PROGRESS (program_name, 0);
2997 expandargv (&argc, &argv);
3000 set_default_bfd_target ();
3002 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSI:j:wE:zgeGW",
3003 long_options, (int *) 0))
3009 break; /* We've been given a long option. */
3014 if (disassembler_options)
3015 /* Ignore potential memory leak for now. */
3016 disassembler_options = concat (disassembler_options, ",",
3019 disassembler_options = optarg;
3022 if (only_used == only_size)
3025 only = xrealloc (only, only_size * sizeof (char *));
3027 only [only_used++] = optarg;
3030 with_line_numbers = TRUE;
3039 enum demangling_styles style;
3041 style = cplus_demangle_name_to_style (optarg);
3042 if (style == unknown_demangling)
3043 fatal (_("unknown demangling style `%s'"),
3046 cplus_demangle_set_style (style);
3052 case OPTION_ADJUST_VMA:
3053 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3055 case OPTION_START_ADDRESS:
3056 start_address = parse_vma (optarg, "--start-address");
3058 case OPTION_STOP_ADDRESS:
3059 stop_address = parse_vma (optarg, "--stop-address");
3062 if (strcmp (optarg, "B") == 0)
3063 endian = BFD_ENDIAN_BIG;
3064 else if (strcmp (optarg, "L") == 0)
3065 endian = BFD_ENDIAN_LITTLE;
3068 non_fatal (_("unrecognized -E option"));
3073 if (strncmp (optarg, "big", strlen (optarg)) == 0)
3074 endian = BFD_ENDIAN_BIG;
3075 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3076 endian = BFD_ENDIAN_LITTLE;
3079 non_fatal (_("unrecognized --endian type `%s'"), optarg);
3085 dump_file_header = TRUE;
3089 formats_info = TRUE;
3093 add_include_path (optarg);
3096 dump_private_headers = TRUE;
3100 dump_private_headers = TRUE;
3102 dump_reloc_info = TRUE;
3103 dump_file_header = TRUE;
3104 dump_ar_hdrs = TRUE;
3105 dump_section_headers = TRUE;
3113 dump_dynamic_symtab = TRUE;
3121 disassemble_zeroes = TRUE;
3125 disassemble_all = TRUE;
3130 with_source_code = TRUE;
3139 dump_debugging_tags = 1;
3144 dump_dwarf_section_info = TRUE;
3147 do_debug_abbrevs = 1;
3149 do_debug_pubnames = 1;
3150 do_debug_aranges = 1;
3151 do_debug_ranges = 1;
3152 do_debug_frames = 1;
3153 do_debug_macinfo = 1;
3158 dump_stab_section_info = TRUE;
3162 dump_section_contents = TRUE;
3166 dump_reloc_info = TRUE;
3170 dump_dynamic_reloc_info = TRUE;
3174 dump_ar_hdrs = TRUE;
3178 dump_section_headers = TRUE;
3186 show_version = TRUE;
3196 print_version ("objdump");
3202 exit_status = display_info ();
3206 display_file ("a.out", target);
3208 for (; optind < argc;)
3209 display_file (argv[optind++], target);
3212 END_PROGRESS (program_name);