1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
27 #include "libiberty.h"
32 /* Internal headers for the ELF .stab-dump code - sorry. */
33 #define BYTES_IN_WORD 32
34 #include "aout/aout64.h"
36 #ifdef NEED_DECLARATION_FPRINTF
37 /* This is needed by INIT_DISASSEMBLE_INFO. */
38 extern int fprintf PARAMS ((FILE *, const char *, ...));
42 static int exit_status = 0;
44 static char *default_target = NULL; /* default at runtime */
46 static int show_version = 0; /* show the version number */
47 static int dump_section_contents; /* -s */
48 static int dump_section_headers; /* -h */
49 static boolean dump_file_header; /* -f */
50 static int dump_symtab; /* -t */
51 static int dump_dynamic_symtab; /* -T */
52 static int dump_reloc_info; /* -r */
53 static int dump_dynamic_reloc_info; /* -R */
54 static int dump_ar_hdrs; /* -a */
55 static int dump_private_headers; /* -p */
56 static int prefix_addresses; /* --prefix-addresses */
57 static int with_line_numbers; /* -l */
58 static boolean with_source_code; /* -S */
59 static int show_raw_insn; /* --show-raw-insn */
60 static int dump_stab_section_info; /* --stabs */
61 static int do_demangle; /* -C, --demangle */
62 static boolean disassemble; /* -d */
63 static boolean disassemble_all; /* -D */
64 static int disassemble_zeroes; /* --disassemble-zeroes */
65 static boolean formats_info; /* -i */
66 static char *only; /* -j secname */
67 static int wide_output; /* -w */
68 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
69 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
70 static int dump_debugging; /* --debugging */
71 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
72 static int file_start_context = 0; /* --file-start-context */
74 /* Extra info to pass to the disassembler address printing function. */
75 struct objdump_disasm_info {
81 /* Architecture to disassemble for, or default if NULL. */
82 static char *machine = (char *) NULL;
84 /* Target specific options to the disassembler. */
85 static char *disassembler_options = (char *) NULL;
87 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
88 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
90 /* The symbol table. */
91 static asymbol **syms;
93 /* Number of symbols in `syms'. */
94 static long symcount = 0;
96 /* The sorted symbol table. */
97 static asymbol **sorted_syms;
99 /* Number of symbols in `sorted_syms'. */
100 static long sorted_symcount = 0;
102 /* The dynamic symbol table. */
103 static asymbol **dynsyms;
105 /* Number of symbols in `dynsyms'. */
106 static long dynsymcount = 0;
108 /* Static declarations. */
111 usage PARAMS ((FILE *, int));
114 nonfatal PARAMS ((const char *));
117 display_file PARAMS ((char *filename, char *target));
120 dump_section_header PARAMS ((bfd *, asection *, PTR));
123 dump_headers PARAMS ((bfd *));
126 dump_data PARAMS ((bfd *abfd));
129 dump_relocs PARAMS ((bfd *abfd));
132 dump_dynamic_relocs PARAMS ((bfd * abfd));
135 dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
138 dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
141 dump_bfd_header PARAMS ((bfd *));
144 dump_bfd_private_header PARAMS ((bfd *));
147 display_bfd PARAMS ((bfd *abfd));
150 display_target_list PARAMS ((void));
153 display_info_table PARAMS ((int, int));
156 display_target_tables PARAMS ((void));
159 display_info PARAMS ((void));
162 objdump_print_value PARAMS ((bfd_vma, struct disassemble_info *, boolean));
165 objdump_print_symname PARAMS ((bfd *, struct disassemble_info *, asymbol *));
168 find_symbol_for_address PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
171 objdump_print_addr_with_sym PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
172 struct disassemble_info *, boolean));
175 objdump_print_addr PARAMS ((bfd_vma, struct disassemble_info *, boolean));
178 objdump_print_address PARAMS ((bfd_vma, struct disassemble_info *));
181 show_line PARAMS ((bfd *, asection *, bfd_vma));
184 disassemble_bytes PARAMS ((struct disassemble_info *, disassembler_ftype,
185 boolean, bfd_byte *, bfd_vma, bfd_vma,
186 arelent ***, arelent **));
189 disassemble_data PARAMS ((bfd *));
192 endian_string PARAMS ((enum bfd_endian));
195 slurp_symtab PARAMS ((bfd *));
198 slurp_dynamic_symtab PARAMS ((bfd *));
201 remove_useless_symbols PARAMS ((asymbol **, long));
204 compare_symbols PARAMS ((const PTR, const PTR));
207 compare_relocs PARAMS ((const PTR, const PTR));
210 dump_stabs PARAMS ((bfd *));
213 read_section_stabs PARAMS ((bfd *, const char *, const char *));
216 print_section_stabs PARAMS ((bfd *, const char *, const char *));
219 usage (stream, status)
223 fprintf (stream, _("Usage: %s <switches> file(s)\n"), program_name);
224 fprintf (stream, _(" At least one of the following switches must be given:\n"));
225 fprintf (stream, _("\
226 -a --archive-headers Display archive header information\n\
227 -f --file-headers Display the contents of the overall file header\n\
228 -p --private-headers Display object format specific file header contents\n\
229 -h --[section-]headers Display the contents of the section headers\n\
230 -x --all-headers Display the contents of all headers\n\
231 -d --disassemble Display assembler contents of executable sections\n\
232 -D --disassemble-all Display assembler contents of all sections\n\
233 -S --source Intermix source code with disassembly\n\
234 -s --full-contents Display the full contents of all sections requested\n\
235 -g --debugging Display debug information in object file\n\
236 -G --stabs Display the STABS contents of an ELF format file\n\
237 -t --syms Display the contents of the symbol table(s)\n\
238 -T --dynamic-syms Display the contents of the dynamic symbol table\n\
239 -r --reloc Display the relocation entries in the file\n\
240 -R --dynamic-reloc Display the dynamic relocation entries in the file\n\
241 -V --version Display this program's version number\n\
242 -i --info List object formats and architectures supported\n\
243 -H --help Display this information\n\
247 fprintf (stream, _("\n The following switches are optional:\n"));
248 fprintf (stream, _("\
249 -b --target <bfdname> Specify the target object format as <bfdname>\n\
250 -m --architecture <machine> Specify the target architecture as <machine>\n\
251 -j --section <name> Only display information for section <name>\n\
252 -M --disassembler-options <o> Pass text <o> on to the disassembler\n\
253 -EB --endian=big Assume big endian format when disassembling\n\
254 -EL --endian=little Assume little endian format when disassembling\n\
255 --file-start-context Include context from start of file (with -S)\n\
256 -l --line-numbers Include line numbers and filenames in output\n\
257 -C --demangle Decode mangled/processed symbol names\n\
258 -w --wide Format output for more than 80 columns\n\
259 -z --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
260 --start-address <addr> Only process data whoes address is >= <addr>\n\
261 --stop-address <addr> Only process data whoes address is <= <addr>\n\
262 --prefix-addresses Print complete address alongside disassembly\n\
263 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
264 --adjust-vma <offset> Add <offset> to all displayed section addresses\n\
266 list_supported_targets (program_name, stream);
268 disassembler_usage (stream);
271 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
275 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
277 #define OPTION_ENDIAN (150)
278 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
279 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
280 #define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
282 static struct option long_options[]=
284 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
285 {"all-headers", no_argument, NULL, 'x'},
286 {"private-headers", no_argument, NULL, 'p'},
287 {"architecture", required_argument, NULL, 'm'},
288 {"archive-headers", no_argument, NULL, 'a'},
289 {"debugging", no_argument, NULL, 'g'},
290 {"demangle", no_argument, NULL, 'C'},
291 {"disassemble", no_argument, NULL, 'd'},
292 {"disassemble-all", no_argument, NULL, 'D'},
293 {"disassembler-options", required_argument, NULL, 'M'},
294 {"disassemble-zeroes", no_argument, NULL, 'z'},
295 {"dynamic-reloc", no_argument, NULL, 'R'},
296 {"dynamic-syms", no_argument, NULL, 'T'},
297 {"endian", required_argument, NULL, OPTION_ENDIAN},
298 {"file-headers", no_argument, NULL, 'f'},
299 {"file-start-context", no_argument, &file_start_context, 1},
300 {"full-contents", no_argument, NULL, 's'},
301 {"headers", no_argument, NULL, 'h'},
302 {"help", no_argument, NULL, 'H'},
303 {"info", no_argument, NULL, 'i'},
304 {"line-numbers", no_argument, NULL, 'l'},
305 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
306 {"prefix-addresses", no_argument, &prefix_addresses, 1},
307 {"reloc", no_argument, NULL, 'r'},
308 {"section", required_argument, NULL, 'j'},
309 {"section-headers", no_argument, NULL, 'h'},
310 {"show-raw-insn", no_argument, &show_raw_insn, 1},
311 {"source", no_argument, NULL, 'S'},
312 {"stabs", no_argument, NULL, 'G'},
313 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
314 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
315 {"syms", no_argument, NULL, 't'},
316 {"target", required_argument, NULL, 'b'},
317 {"version", no_argument, NULL, 'V'},
318 {"wide", no_argument, NULL, 'w'},
319 {0, no_argument, 0, 0}
331 dump_section_header (abfd, section, ignored)
332 bfd *abfd ATTRIBUTE_UNUSED;
334 PTR ignored ATTRIBUTE_UNUSED;
337 unsigned int opb = bfd_octets_per_byte (abfd);
339 printf ("%3d %-13s %08lx ", section->index,
340 bfd_get_section_name (abfd, section),
341 (unsigned long) bfd_section_size (abfd, section) / opb);
342 printf_vma (bfd_get_section_vma (abfd, section));
344 printf_vma (section->lma);
345 printf (" %08lx 2**%u", section->filepos,
346 bfd_get_section_alignment (abfd, section));
352 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
354 PF (SEC_HAS_CONTENTS, "CONTENTS");
355 PF (SEC_ALLOC, "ALLOC");
356 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
357 PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT");
358 PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA");
359 PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS");
360 PF (SEC_LOAD, "LOAD");
361 PF (SEC_RELOC, "RELOC");
363 PF (SEC_BALIGN, "BALIGN");
365 PF (SEC_READONLY, "READONLY");
366 PF (SEC_CODE, "CODE");
367 PF (SEC_DATA, "DATA");
369 PF (SEC_DEBUGGING, "DEBUGGING");
370 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
371 PF (SEC_EXCLUDE, "EXCLUDE");
372 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
373 PF (SEC_BLOCK, "BLOCK");
374 PF (SEC_CLINK, "CLINK");
375 PF (SEC_SMALL_DATA, "SMALL_DATA");
376 PF (SEC_SHARED, "SHARED");
378 if ((section->flags & SEC_LINK_ONCE) != 0)
382 switch (section->flags & SEC_LINK_DUPLICATES)
386 case SEC_LINK_DUPLICATES_DISCARD:
387 ls = "LINK_ONCE_DISCARD";
389 case SEC_LINK_DUPLICATES_ONE_ONLY:
390 ls = "LINK_ONCE_ONE_ONLY";
392 case SEC_LINK_DUPLICATES_SAME_SIZE:
393 ls = "LINK_ONCE_SAME_SIZE";
395 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
396 ls = "LINK_ONCE_SAME_CONTENTS";
399 printf ("%s%s", comma, ls);
401 if (section->comdat != NULL)
402 printf (" (COMDAT %s %ld)", section->comdat->name,
403 section->comdat->symbol);
416 printf (_("Sections:\n"));
419 printf (_("Idx Name Size VMA LMA File off Algn"));
421 printf (_("Idx Name Size VMA LMA File off Algn"));
425 printf (_(" Flags"));
428 bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
435 asymbol **sy = (asymbol **) NULL;
438 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
440 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
445 storage = bfd_get_symtab_upper_bound (abfd);
447 bfd_fatal (bfd_get_filename (abfd));
451 sy = (asymbol **) xmalloc (storage);
453 symcount = bfd_canonicalize_symtab (abfd, sy);
455 bfd_fatal (bfd_get_filename (abfd));
457 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
461 /* Read in the dynamic symbols. */
464 slurp_dynamic_symtab (abfd)
467 asymbol **sy = (asymbol **) NULL;
470 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
473 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
475 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
480 bfd_fatal (bfd_get_filename (abfd));
485 sy = (asymbol **) xmalloc (storage);
487 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
489 bfd_fatal (bfd_get_filename (abfd));
490 if (dynsymcount == 0)
491 non_fatal (_("%s: No dynamic symbols"), bfd_get_filename (abfd));
495 /* Filter out (in place) symbols that are useless for disassembly.
496 COUNT is the number of elements in SYMBOLS.
497 Return the number of useful symbols. */
500 remove_useless_symbols (symbols, count)
504 register asymbol **in_ptr = symbols, **out_ptr = symbols;
508 asymbol *sym = *in_ptr++;
510 if (sym->name == NULL || sym->name[0] == '\0')
512 if (sym->flags & (BSF_DEBUGGING))
514 if (bfd_is_und_section (sym->section)
515 || bfd_is_com_section (sym->section))
520 return out_ptr - symbols;
523 /* Sort symbols into value order. */
526 compare_symbols (ap, bp)
530 const asymbol *a = *(const asymbol **)ap;
531 const asymbol *b = *(const asymbol **)bp;
535 flagword aflags, bflags;
537 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
539 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
542 if (a->section > b->section)
544 else if (a->section < b->section)
547 an = bfd_asymbol_name (a);
548 bn = bfd_asymbol_name (b);
552 /* The symbols gnu_compiled and gcc2_compiled convey no real
553 information, so put them after other symbols with the same value. */
555 af = (strstr (an, "gnu_compiled") != NULL
556 || strstr (an, "gcc2_compiled") != NULL);
557 bf = (strstr (bn, "gnu_compiled") != NULL
558 || strstr (bn, "gcc2_compiled") != NULL);
565 /* We use a heuristic for the file name, to try to sort it after
566 more useful symbols. It may not work on non Unix systems, but it
567 doesn't really matter; the only difference is precisely which
568 symbol names get printed. */
570 #define file_symbol(s, sn, snl) \
571 (((s)->flags & BSF_FILE) != 0 \
572 || ((sn)[(snl) - 2] == '.' \
573 && ((sn)[(snl) - 1] == 'o' \
574 || (sn)[(snl) - 1] == 'a')))
576 af = file_symbol (a, an, anl);
577 bf = file_symbol (b, bn, bnl);
584 /* Try to sort global symbols before local symbols before function
585 symbols before debugging symbols. */
590 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
592 if ((aflags & BSF_DEBUGGING) != 0)
597 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
599 if ((aflags & BSF_FUNCTION) != 0)
604 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
606 if ((aflags & BSF_LOCAL) != 0)
611 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
613 if ((aflags & BSF_GLOBAL) != 0)
619 /* Symbols that start with '.' might be section names, so sort them
620 after symbols that don't start with '.'. */
621 if (an[0] == '.' && bn[0] != '.')
623 if (an[0] != '.' && bn[0] == '.')
626 /* Finally, if we can't distinguish them in any other way, try to
627 get consistent results by sorting the symbols by name. */
628 return strcmp (an, bn);
631 /* Sort relocs into address order. */
634 compare_relocs (ap, bp)
638 const arelent *a = *(const arelent **)ap;
639 const arelent *b = *(const arelent **)bp;
641 if (a->address > b->address)
643 else if (a->address < b->address)
646 /* So that associated relocations tied to the same address show up
647 in the correct order, we don't do any further sorting. */
656 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
659 objdump_print_value (vma, info, skip_zeroes)
661 struct disassemble_info *info;
667 sprintf_vma (buf, vma);
672 for (p = buf; *p == '0'; ++p)
677 (*info->fprintf_func) (info->stream, "%s", p);
680 /* Print the name of a symbol. */
683 objdump_print_symname (abfd, info, sym)
685 struct disassemble_info *info;
693 name = bfd_asymbol_name (sym);
694 if (! do_demangle || name[0] == '\0')
698 /* Demangle the name. */
699 if (bfd_get_symbol_leading_char (abfd) == name[0])
702 alloc = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
710 (*info->fprintf_func) (info->stream, "%s", print);
712 printf ("%s", print);
718 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
719 is true, then always require the symbol to be in the section. This
720 returns NULL if there is no suitable symbol. If PLACE is not NULL,
721 then *PLACE is set to the index of the symbol in sorted_syms. */
724 find_symbol_for_address (abfd, sec, vma, require_sec, place)
731 /* @@ Would it speed things up to cache the last two symbols returned,
732 and maybe their address ranges? For many processors, only one memory
733 operand can be present at a time, so the 2-entry cache wouldn't be
734 constantly churned by code doing heavy memory accesses. */
736 /* Indices in `sorted_syms'. */
738 long max = sorted_symcount;
740 unsigned int opb = bfd_octets_per_byte (abfd);
742 if (sorted_symcount < 1)
745 /* Perform a binary search looking for the closest symbol to the
746 required value. We are searching the range (min, max]. */
747 while (min + 1 < max)
751 thisplace = (max + min) / 2;
752 sym = sorted_syms[thisplace];
754 if (bfd_asymbol_value (sym) > vma)
756 else if (bfd_asymbol_value (sym) < vma)
765 /* The symbol we want is now in min, the low end of the range we
766 were searching. If there are several symbols with the same
767 value, we want the first one. */
770 && (bfd_asymbol_value (sorted_syms[thisplace])
771 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
774 /* If the file is relocateable, and the symbol could be from this
775 section, prefer a symbol from this section over symbols from
776 others, even if the other symbol's value might be closer.
778 Note that this may be wrong for some symbol references if the
779 sections have overlapping memory ranges, but in that case there's
780 no way to tell what's desired without looking at the relocation
783 if (sorted_syms[thisplace]->section != sec
785 || ((abfd->flags & HAS_RELOC) != 0
786 && vma >= bfd_get_section_vma (abfd, sec)
787 && vma < (bfd_get_section_vma (abfd, sec)
788 + bfd_section_size (abfd, sec) / opb))))
792 for (i = thisplace + 1; i < sorted_symcount; i++)
794 if (bfd_asymbol_value (sorted_syms[i])
795 != bfd_asymbol_value (sorted_syms[thisplace]))
801 if (sorted_syms[i]->section == sec
803 || sorted_syms[i - 1]->section != sec
804 || (bfd_asymbol_value (sorted_syms[i])
805 != bfd_asymbol_value (sorted_syms[i - 1]))))
812 if (sorted_syms[thisplace]->section != sec)
814 /* We didn't find a good symbol with a smaller value.
815 Look for one with a larger value. */
816 for (i = thisplace + 1; i < sorted_symcount; i++)
818 if (sorted_syms[i]->section == sec)
826 if (sorted_syms[thisplace]->section != sec
828 || ((abfd->flags & HAS_RELOC) != 0
829 && vma >= bfd_get_section_vma (abfd, sec)
830 && vma < (bfd_get_section_vma (abfd, sec)
831 + bfd_section_size (abfd, sec)))))
833 /* There is no suitable symbol. */
841 return sorted_syms[thisplace];
844 /* Print an address to INFO symbolically. */
847 objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
852 struct disassemble_info *info;
855 objdump_print_value (vma, info, skip_zeroes);
861 (*info->fprintf_func) (info->stream, " <%s",
862 bfd_get_section_name (abfd, sec));
863 secaddr = bfd_get_section_vma (abfd, sec);
866 (*info->fprintf_func) (info->stream, "-0x");
867 objdump_print_value (secaddr - vma, info, true);
869 else if (vma > secaddr)
871 (*info->fprintf_func) (info->stream, "+0x");
872 objdump_print_value (vma - secaddr, info, true);
874 (*info->fprintf_func) (info->stream, ">");
878 (*info->fprintf_func) (info->stream, " <");
879 objdump_print_symname (abfd, info, sym);
880 if (bfd_asymbol_value (sym) > vma)
882 (*info->fprintf_func) (info->stream, "-0x");
883 objdump_print_value (bfd_asymbol_value (sym) - vma, info, true);
885 else if (vma > bfd_asymbol_value (sym))
887 (*info->fprintf_func) (info->stream, "+0x");
888 objdump_print_value (vma - bfd_asymbol_value (sym), info, true);
890 (*info->fprintf_func) (info->stream, ">");
894 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
895 true, don't output leading zeroes. */
898 objdump_print_addr (vma, info, skip_zeroes)
900 struct disassemble_info *info;
903 struct objdump_disasm_info *aux;
906 if (sorted_symcount < 1)
908 (*info->fprintf_func) (info->stream, "0x");
909 objdump_print_value (vma, info, skip_zeroes);
913 aux = (struct objdump_disasm_info *) info->application_data;
914 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
916 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
920 /* Print VMA to INFO. This function is passed to the disassembler
924 objdump_print_address (vma, info)
926 struct disassemble_info *info;
928 objdump_print_addr (vma, info, ! prefix_addresses);
931 /* Determine of the given address has a symbol associated with it. */
934 objdump_symbol_at_address (vma, info)
936 struct disassemble_info * info;
938 struct objdump_disasm_info * aux;
941 /* No symbols - do not bother checking. */
942 if (sorted_symcount < 1)
945 aux = (struct objdump_disasm_info *) info->application_data;
946 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
949 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
952 /* Hold the last function name and the last line number we displayed
955 static char *prev_functionname;
956 static unsigned int prev_line;
958 /* We keep a list of all files that we have seen when doing a
959 dissassembly with source, so that we know how much of the file to
960 display. This can be important for inlined functions. */
962 struct print_file_list
964 struct print_file_list *next;
970 static struct print_file_list *print_files;
972 /* The number of preceding context lines to show when we start
973 displaying a file for the first time. */
975 #define SHOW_PRECEDING_CONTEXT_LINES (5)
977 /* Skip ahead to a given line in a file, optionally printing each
981 skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
984 skip_to_line (p, line, show)
985 struct print_file_list *p;
989 while (p->line < line)
993 if (fgets (buf, sizeof buf, p->f) == NULL)
1003 if (strchr (buf, '\n') != NULL)
1008 /* Show the line number, or the source line, in a dissassembly
1012 show_line (abfd, section, addr_offset)
1015 bfd_vma addr_offset;
1017 CONST char *filename;
1018 CONST char *functionname;
1021 if (! with_line_numbers && ! with_source_code)
1024 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1025 &functionname, &line))
1028 if (filename != NULL && *filename == '\0')
1030 if (functionname != NULL && *functionname == '\0')
1031 functionname = NULL;
1033 if (with_line_numbers)
1035 if (functionname != NULL
1036 && (prev_functionname == NULL
1037 || strcmp (functionname, prev_functionname) != 0))
1038 printf ("%s():\n", functionname);
1039 if (line > 0 && line != prev_line)
1040 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1043 if (with_source_code
1047 struct print_file_list **pp, *p;
1049 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1050 if (strcmp ((*pp)->filename, filename) == 0)
1056 if (p != print_files)
1060 /* We have reencountered a file name which we saw
1061 earlier. This implies that either we are dumping out
1062 code from an included file, or the same file was
1063 linked in more than once. There are two common cases
1064 of an included file: inline functions in a header
1065 file, and a bison or flex skeleton file. In the
1066 former case we want to just start printing (but we
1067 back up a few lines to give context); in the latter
1068 case we want to continue from where we left off. I
1069 can't think of a good way to distinguish the cases,
1070 so I used a heuristic based on the file name. */
1071 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1075 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1082 p->f = fopen (p->filename, "r");
1086 skip_to_line (p, l, false);
1088 if (print_files->f != NULL)
1090 fclose (print_files->f);
1091 print_files->f = NULL;
1097 skip_to_line (p, line, true);
1099 p->next = print_files;
1107 f = fopen (filename, "r");
1112 p = ((struct print_file_list *)
1113 xmalloc (sizeof (struct print_file_list)));
1114 p->filename = xmalloc (strlen (filename) + 1);
1115 strcpy (p->filename, filename);
1119 if (print_files != NULL && print_files->f != NULL)
1121 fclose (print_files->f);
1122 print_files->f = NULL;
1124 p->next = print_files;
1127 if (file_start_context)
1130 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1133 skip_to_line (p, l, false);
1135 skip_to_line (p, line, true);
1140 if (functionname != NULL
1141 && (prev_functionname == NULL
1142 || strcmp (functionname, prev_functionname) != 0))
1144 if (prev_functionname != NULL)
1145 free (prev_functionname);
1146 prev_functionname = xmalloc (strlen (functionname) + 1);
1147 strcpy (prev_functionname, functionname);
1150 if (line > 0 && line != prev_line)
1154 /* Pseudo FILE object for strings. */
1162 /* sprintf to a "stream" */
1165 #ifdef ANSI_PROTOTYPES
1166 objdump_sprintf (SFILE *f, const char *format, ...)
1168 objdump_sprintf (va_alist)
1172 #ifndef ANSI_PROTOTYPES
1180 #ifdef ANSI_PROTOTYPES
1181 va_start (args, format);
1184 f = va_arg (args, SFILE *);
1185 format = va_arg (args, const char *);
1188 vasprintf (&buf, format, args);
1194 fatal (_("Out of virtual memory"));
1199 while ((size_t) ((f->buffer + f->size) - f->current) < n + 1)
1203 curroff = f->current - f->buffer;
1205 f->buffer = xrealloc (f->buffer, f->size);
1206 f->current = f->buffer + curroff;
1209 memcpy (f->current, buf, n);
1211 f->current[0] = '\0';
1218 /* The number of zeroes we want to see before we start skipping them.
1219 The number is arbitrarily chosen. */
1221 #define SKIP_ZEROES (8)
1223 /* The number of zeroes to skip at the end of a section. If the
1224 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1225 SKIP_ZEROES, they will be disassembled. If there are fewer than
1226 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1227 attempt to avoid disassembling zeroes inserted by section
1230 #define SKIP_ZEROES_AT_END (3)
1232 /* Disassemble some data in memory between given values. */
1235 disassemble_bytes (info, disassemble_fn, insns, data,
1236 start_offset, stop_offset, relppp,
1238 struct disassemble_info *info;
1239 disassembler_ftype disassemble_fn;
1242 bfd_vma start_offset;
1243 bfd_vma stop_offset;
1247 struct objdump_disasm_info *aux;
1249 int octets_per_line;
1251 int skip_addr_chars;
1252 bfd_vma addr_offset;
1253 int opb = info->octets_per_byte;
1255 aux = (struct objdump_disasm_info *) info->application_data;
1259 octets_per_line = 4;
1261 octets_per_line = 16;
1263 /* Figure out how many characters to skip at the start of an
1264 address, to make the disassembly look nicer. We discard leading
1265 zeroes in chunks of 4, ensuring that there is always a leading
1267 skip_addr_chars = 0;
1268 if (! prefix_addresses)
1273 sprintf_vma (buf, section->vma +
1274 bfd_section_size (section->owner, section) / opb);
1276 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1279 skip_addr_chars += 4;
1284 info->insn_info_valid = 0;
1287 addr_offset = start_offset;
1288 while (addr_offset < stop_offset)
1292 boolean need_nl = false;
1294 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1296 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1299 if (! disassemble_zeroes
1300 && (info->insn_info_valid == 0
1301 || info->branch_delay_insns == 0)
1302 && (z - addr_offset * opb >= SKIP_ZEROES
1303 || (z == stop_offset * opb &&
1304 z - addr_offset * opb < SKIP_ZEROES_AT_END)))
1308 /* If there are more nonzero octets to follow, we only skip
1309 zeroes in multiples of 4, to try to avoid running over
1310 the start of an instruction which happens to start with
1312 if (z != stop_offset * opb)
1313 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1315 octets = z - addr_offset * opb;
1326 if (with_line_numbers || with_source_code)
1327 show_line (aux->abfd, section, addr_offset);
1329 if (! prefix_addresses)
1333 sprintf_vma (buf, section->vma + addr_offset);
1334 for (s = buf + skip_addr_chars; *s == '0'; s++)
1338 printf ("%s:\t", buf + skip_addr_chars);
1342 aux->require_sec = true;
1343 objdump_print_address (section->vma + addr_offset, info);
1344 aux->require_sec = false;
1351 sfile.buffer = xmalloc (sfile.size);
1352 sfile.current = sfile.buffer;
1353 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1354 info->stream = (FILE *) &sfile;
1355 info->bytes_per_line = 0;
1356 info->bytes_per_chunk = 0;
1358 /* FIXME: This is wrong. It tests the number of octets
1359 in the last instruction, not the current one. */
1360 if (*relppp < relppend
1361 && (**relppp)->address >= addr_offset
1362 && (**relppp)->address < addr_offset + octets / opb)
1363 info->flags = INSN_HAS_RELOC;
1367 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1368 info->fprintf_func = (fprintf_ftype) fprintf;
1369 info->stream = stdout;
1370 if (info->bytes_per_line != 0)
1371 octets_per_line = info->bytes_per_line;
1374 if (sfile.current != sfile.buffer)
1375 printf ("%s\n", sfile.buffer);
1376 free (sfile.buffer);
1384 octets = octets_per_line;
1385 if (addr_offset + octets / opb > stop_offset)
1386 octets = (stop_offset - addr_offset) * opb;
1388 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1390 if (isprint (data[j]))
1391 buf[j - addr_offset * opb] = data[j];
1393 buf[j - addr_offset * opb] = '.';
1395 buf[j - addr_offset * opb] = '\0';
1398 if (prefix_addresses
1400 : show_raw_insn >= 0)
1404 /* If ! prefix_addresses and ! wide_output, we print
1405 octets_per_line octets per line. */
1407 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1408 pb = octets_per_line;
1410 if (info->bytes_per_chunk)
1411 bpc = info->bytes_per_chunk;
1415 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1418 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1420 for (k = bpc - 1; k >= 0; k--)
1421 printf ("%02x", (unsigned) data[j + k]);
1426 for (k = 0; k < bpc; k++)
1427 printf ("%02x", (unsigned) data[j + k]);
1432 for (; pb < octets_per_line; pb += bpc)
1436 for (k = 0; k < bpc; k++)
1441 /* Separate raw data from instruction by extra space. */
1452 printf ("%s", sfile.buffer);
1453 free (sfile.buffer);
1456 if (prefix_addresses
1458 : show_raw_insn >= 0)
1466 j = addr_offset * opb + pb;
1468 sprintf_vma (buf, section->vma + j / opb);
1469 for (s = buf + skip_addr_chars; *s == '0'; s++)
1473 printf ("%s:\t", buf + skip_addr_chars);
1475 pb += octets_per_line;
1478 for (; j < addr_offset * opb + pb; j += bpc)
1482 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1484 for (k = bpc - 1; k >= 0; k--)
1485 printf ("%02x", (unsigned) data[j + k]);
1490 for (k = 0; k < bpc; k++)
1491 printf ("%02x", (unsigned) data[j + k]);
1505 && (section->flags & SEC_RELOC) != 0)
1507 while ((*relppp) < relppend
1508 && ((**relppp)->address >= (bfd_vma) addr_offset
1509 && (**relppp)->address < (bfd_vma) addr_offset + octets / opb))
1520 objdump_print_value (section->vma + q->address, info, true);
1522 printf (": %s\t", q->howto->name);
1524 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1525 printf ("*unknown*");
1528 const char *sym_name;
1530 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1531 if (sym_name != NULL && *sym_name != '\0')
1532 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1537 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1538 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1539 if (sym_name == NULL || *sym_name == '\0')
1540 sym_name = "*unknown*";
1541 printf ("%s", sym_name);
1548 objdump_print_value (q->addend, info, true);
1560 addr_offset += octets / opb;
1564 /* Disassemble the contents of an object file. */
1567 disassemble_data (abfd)
1570 unsigned long addr_offset;
1571 disassembler_ftype disassemble_fn;
1572 struct disassemble_info disasm_info;
1573 struct objdump_disasm_info aux;
1575 unsigned int opb = bfd_octets_per_byte (abfd);
1578 prev_functionname = NULL;
1581 /* We make a copy of syms to sort. We don't want to sort syms
1582 because that will screw up the relocs. */
1583 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1584 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1586 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1588 /* Sort the symbols into section and symbol order */
1589 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1591 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1592 disasm_info.application_data = (PTR) &aux;
1594 aux.require_sec = false;
1595 disasm_info.print_address_func = objdump_print_address;
1596 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1597 disasm_info.octets_per_byte = opb;
1599 if (machine != (char *) NULL)
1601 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1604 fatal (_("Can't use supplied machine %s"), machine);
1606 abfd->arch_info = info;
1609 if (endian != BFD_ENDIAN_UNKNOWN)
1611 struct bfd_target *xvec;
1613 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1614 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1615 xvec->byteorder = endian;
1619 disassemble_fn = disassembler (abfd);
1620 if (!disassemble_fn)
1622 non_fatal (_("Can't disassemble for architecture %s\n"),
1623 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1628 disasm_info.flavour = bfd_get_flavour (abfd);
1629 disasm_info.arch = bfd_get_arch (abfd);
1630 disasm_info.mach = bfd_get_mach (abfd);
1631 disasm_info.disassembler_options = disassembler_options;
1633 if (bfd_big_endian (abfd))
1634 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1635 else if (bfd_little_endian (abfd))
1636 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1638 /* ??? Aborting here seems too drastic. We could default to big or little
1640 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1642 for (section = abfd->sections;
1643 section != (asection *) NULL;
1644 section = section->next)
1646 bfd_byte *data = NULL;
1647 bfd_size_type datasize = 0;
1648 arelent **relbuf = NULL;
1649 arelent **relpp = NULL;
1650 arelent **relppend = NULL;
1651 unsigned long stop_offset;
1652 asymbol *sym = NULL;
1655 if ((section->flags & SEC_LOAD) == 0
1656 || (! disassemble_all
1658 && (section->flags & SEC_CODE) == 0))
1660 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1664 && (section->flags & SEC_RELOC) != 0)
1668 relsize = bfd_get_reloc_upper_bound (abfd, section);
1670 bfd_fatal (bfd_get_filename (abfd));
1676 relbuf = (arelent **) xmalloc (relsize);
1677 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1679 bfd_fatal (bfd_get_filename (abfd));
1681 /* Sort the relocs by address. */
1682 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1685 relppend = relpp + relcount;
1687 /* Skip over the relocs belonging to addresses below the
1689 if (start_address != (bfd_vma) -1)
1691 while (relpp < relppend
1692 && (*relpp)->address < start_address)
1698 printf (_("Disassembly of section %s:\n"), section->name);
1700 datasize = bfd_get_section_size_before_reloc (section);
1704 data = (bfd_byte *) xmalloc ((size_t) datasize);
1706 bfd_get_section_contents (abfd, section, data, 0, datasize);
1709 disasm_info.buffer = data;
1710 disasm_info.buffer_vma = section->vma;
1711 disasm_info.buffer_length = datasize;
1712 if (start_address == (bfd_vma) -1
1713 || start_address < disasm_info.buffer_vma)
1716 addr_offset = start_address - disasm_info.buffer_vma;
1717 if (stop_address == (bfd_vma) -1)
1718 stop_offset = datasize / opb;
1721 if (stop_address < disasm_info.buffer_vma)
1724 stop_offset = stop_address - disasm_info.buffer_vma;
1725 if (stop_offset > disasm_info.buffer_length / opb)
1726 stop_offset = disasm_info.buffer_length / opb;
1729 sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
1732 while (addr_offset < stop_offset)
1735 unsigned long nextstop_offset;
1738 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset)
1743 (x < sorted_symcount
1744 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset);
1747 disasm_info.symbols = & sorted_syms[place];
1748 disasm_info.num_symbols = x - place;
1751 disasm_info.symbols = NULL;
1753 if (! prefix_addresses)
1756 objdump_print_addr_with_sym (abfd, section, sym,
1757 section->vma + addr_offset,
1763 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1765 else if (sym == NULL)
1769 /* Search forward for the next appropriate symbol in
1770 SECTION. Note that all the symbols are sorted
1771 together into one big array, and that some sections
1772 may have overlapping addresses. */
1773 while (place < sorted_symcount
1774 && (sorted_syms[place]->section != section
1775 || (bfd_asymbol_value (sorted_syms[place])
1776 <= bfd_asymbol_value (sym))))
1778 if (place >= sorted_symcount)
1781 nextsym = sorted_syms[place];
1784 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1786 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1787 if (nextstop_offset > stop_offset)
1788 nextstop_offset = stop_offset;
1790 else if (nextsym == NULL)
1791 nextstop_offset = stop_offset;
1794 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1795 if (nextstop_offset > stop_offset)
1796 nextstop_offset = stop_offset;
1799 /* If a symbol is explicitly marked as being an object
1800 rather than a function, just dump the bytes without
1801 disassembling them. */
1804 || bfd_asymbol_value (sym) > section->vma + addr_offset
1805 || ((sym->flags & BSF_OBJECT) == 0
1806 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1808 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1810 || (sym->flags & BSF_FUNCTION) != 0)
1815 disassemble_bytes (&disasm_info, disassemble_fn, insns, data,
1816 addr_offset, nextstop_offset, &relpp, relppend);
1818 addr_offset = nextstop_offset;
1830 /* Define a table of stab values and print-strings. We wish the initializer
1831 could be a direct-mapped table, but instead we build one the first
1834 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1835 char *strsect_name));
1837 /* Dump the stabs sections from an object file that has a section that
1838 uses Sun stabs encoding. */
1844 dump_section_stabs (abfd, ".stab", ".stabstr");
1845 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1846 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1847 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1850 static bfd_byte *stabs;
1851 static bfd_size_type stab_size;
1853 static char *strtab;
1854 static bfd_size_type stabstr_size;
1856 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1857 and string table section STRSECT_NAME into `strtab'.
1858 If the section exists and was read, allocate the space and return true.
1859 Otherwise return false. */
1862 read_section_stabs (abfd, stabsect_name, strsect_name)
1864 const char *stabsect_name;
1865 const char *strsect_name;
1867 asection *stabsect, *stabstrsect;
1869 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1872 printf (_("No %s section present\n\n"), stabsect_name);
1876 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1877 if (0 == stabstrsect)
1879 non_fatal (_("%s has no %s section"),
1880 bfd_get_filename (abfd), strsect_name);
1885 stab_size = bfd_section_size (abfd, stabsect);
1886 stabstr_size = bfd_section_size (abfd, stabstrsect);
1888 stabs = (bfd_byte *) xmalloc (stab_size);
1889 strtab = (char *) xmalloc (stabstr_size);
1891 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1893 non_fatal (_("Reading %s section of %s failed: %s"),
1894 stabsect_name, bfd_get_filename (abfd),
1895 bfd_errmsg (bfd_get_error ()));
1902 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1905 non_fatal (_("Reading %s section of %s failed: %s\n"),
1906 strsect_name, bfd_get_filename (abfd),
1907 bfd_errmsg (bfd_get_error ()));
1917 /* Stabs entries use a 12 byte format:
1918 4 byte string table index
1920 1 byte stab other field
1921 2 byte stab desc field
1923 FIXME: This will have to change for a 64 bit object format. */
1925 #define STRDXOFF (0)
1927 #define OTHEROFF (5)
1930 #define STABSIZE (12)
1932 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1933 using string table section STRSECT_NAME (in `strtab'). */
1936 print_section_stabs (abfd, stabsect_name, strsect_name)
1938 const char *stabsect_name;
1939 const char *strsect_name ATTRIBUTE_UNUSED;
1942 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1943 bfd_byte *stabp, *stabs_end;
1946 stabs_end = stabp + stab_size;
1948 printf (_("Contents of %s section:\n\n"), stabsect_name);
1949 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1951 /* Loop through all symbols and print them.
1953 We start the index at -1 because there is a dummy symbol on
1954 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1956 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1960 unsigned char type, other;
1961 unsigned short desc;
1964 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1965 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1966 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1967 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1968 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1970 printf ("\n%-6d ", i);
1971 /* Either print the stab name, or, if unnamed, print its number
1972 again (makes consistent formatting for tools like awk). */
1973 name = bfd_get_stab_name (type);
1975 printf ("%-6s", name);
1976 else if (type == N_UNDF)
1979 printf ("%-6d", type);
1980 printf (" %-6d %-6d ", other, desc);
1982 printf (" %-6lu", strx);
1984 /* Symbols with type == 0 (N_UNDF) specify the length of the
1985 string table associated with this file. We use that info
1986 to know how to relocate the *next* file's string table indices. */
1990 file_string_table_offset = next_file_string_table_offset;
1991 next_file_string_table_offset += value;
1995 /* Using the (possibly updated) string table offset, print the
1996 string (if any) associated with this symbol. */
1998 if ((strx + file_string_table_offset) < stabstr_size)
1999 printf (" %s", &strtab[strx + file_string_table_offset]);
2008 dump_section_stabs (abfd, stabsect_name, strsect_name)
2010 char *stabsect_name;
2015 /* Check for section names for which stabsect_name is a prefix, to
2016 handle .stab0, etc. */
2017 for (s = abfd->sections;
2023 len = strlen (stabsect_name);
2025 /* If the prefix matches, and the files section name ends with a
2026 nul or a digit, then we match. I.e., we want either an exact
2027 match or a section followed by a number. */
2028 if (strncmp (stabsect_name, s->name, len) == 0
2029 && (s->name[len] == '\000'
2030 || isdigit ((unsigned char) s->name[len])))
2032 if (read_section_stabs (abfd, s->name, strsect_name))
2034 print_section_stabs (abfd, s->name, strsect_name);
2043 dump_bfd_header (abfd)
2048 printf (_("architecture: %s, "),
2049 bfd_printable_arch_mach (bfd_get_arch (abfd),
2050 bfd_get_mach (abfd)));
2051 printf (_("flags 0x%08x:\n"), abfd->flags);
2053 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2054 PF (HAS_RELOC, "HAS_RELOC");
2055 PF (EXEC_P, "EXEC_P");
2056 PF (HAS_LINENO, "HAS_LINENO");
2057 PF (HAS_DEBUG, "HAS_DEBUG");
2058 PF (HAS_SYMS, "HAS_SYMS");
2059 PF (HAS_LOCALS, "HAS_LOCALS");
2060 PF (DYNAMIC, "DYNAMIC");
2061 PF (WP_TEXT, "WP_TEXT");
2062 PF (D_PAGED, "D_PAGED");
2063 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2064 printf (_("\nstart address 0x"));
2065 printf_vma (abfd->start_address);
2070 dump_bfd_private_header (abfd)
2073 bfd_print_private_bfd_data (abfd, stdout);
2076 /* Dump selected contents of ABFD */
2082 /* If we are adjusting section VMA's, change them all now. Changing
2083 the BFD information is a hack. However, we must do it, or
2084 bfd_find_nearest_line will not do the right thing. */
2085 if (adjust_section_vma != 0)
2089 for (s = abfd->sections; s != NULL; s = s->next)
2091 s->vma += adjust_section_vma;
2092 s->lma += adjust_section_vma;
2096 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2099 print_arelt_descr (stdout, abfd, true);
2100 if (dump_file_header)
2101 dump_bfd_header (abfd);
2102 if (dump_private_headers)
2103 dump_bfd_private_header (abfd);
2105 if (dump_section_headers)
2106 dump_headers (abfd);
2107 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2109 syms = slurp_symtab (abfd);
2111 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2113 dynsyms = slurp_dynamic_symtab (abfd);
2116 dump_symbols (abfd, false);
2117 if (dump_dynamic_symtab)
2118 dump_symbols (abfd, true);
2119 if (dump_stab_section_info)
2121 if (dump_reloc_info && ! disassemble)
2123 if (dump_dynamic_reloc_info)
2124 dump_dynamic_relocs (abfd);
2125 if (dump_section_contents)
2128 disassemble_data (abfd);
2133 dhandle = read_debugging_info (abfd, syms, symcount);
2134 if (dhandle != NULL)
2136 if (! print_debugging_info (stdout, dhandle))
2138 non_fatal (_("%s: printing debugging information failed"),
2139 bfd_get_filename (abfd));
2162 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2168 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2170 nonfatal (bfd_get_filename (abfd));
2171 list_matching_formats (matching);
2176 if (bfd_get_error () != bfd_error_file_not_recognized)
2178 nonfatal (bfd_get_filename (abfd));
2182 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2188 nonfatal (bfd_get_filename (abfd));
2190 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2192 list_matching_formats (matching);
2198 display_file (filename, target)
2202 bfd *file, *arfile = (bfd *) NULL;
2204 file = bfd_openr (filename, target);
2207 nonfatal (filename);
2211 if (bfd_check_format (file, bfd_archive) == true)
2213 bfd *last_arfile = NULL;
2215 printf (_("In archive %s:\n"), bfd_get_filename (file));
2218 bfd_set_error (bfd_error_no_error);
2220 arfile = bfd_openr_next_archived_file (file, arfile);
2223 if (bfd_get_error () != bfd_error_no_more_archived_files)
2224 nonfatal (bfd_get_filename (file));
2228 display_bfd (arfile);
2230 if (last_arfile != NULL)
2231 bfd_close (last_arfile);
2232 last_arfile = arfile;
2235 if (last_arfile != NULL)
2236 bfd_close (last_arfile);
2244 /* Actually display the various requested regions */
2252 bfd_size_type datasize = 0;
2253 bfd_size_type addr_offset;
2254 bfd_size_type start_offset, stop_offset;
2255 unsigned int opb = bfd_octets_per_byte (abfd);
2257 for (section = abfd->sections; section != NULL; section =
2262 if (only == (char *) NULL ||
2263 strcmp (only, section->name) == 0)
2265 if (section->flags & SEC_HAS_CONTENTS)
2267 printf (_("Contents of section %s:\n"), section->name);
2269 if (bfd_section_size (abfd, section) == 0)
2271 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2272 datasize = bfd_section_size (abfd, section);
2275 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2277 if (start_address == (bfd_vma) -1
2278 || start_address < section->vma)
2281 start_offset = start_address - section->vma;
2282 if (stop_address == (bfd_vma) -1)
2283 stop_offset = bfd_section_size (abfd, section) / opb;
2286 if (stop_address < section->vma)
2289 stop_offset = stop_address - section->vma;
2290 if (stop_offset > bfd_section_size (abfd, section) / opb)
2291 stop_offset = bfd_section_size (abfd, section) / opb;
2293 for (addr_offset = start_offset;
2294 addr_offset < stop_offset; addr_offset += onaline)
2298 printf (" %04lx ", (unsigned long int)
2299 (addr_offset + section->vma));
2300 for (j = addr_offset * opb;
2301 j < addr_offset * opb + onaline; j++)
2303 if (j < stop_offset * opb)
2304 printf ("%02x", (unsigned) (data[j]));
2312 for (j = addr_offset; j < addr_offset * opb + onaline; j++)
2314 if (j >= stop_offset * opb)
2317 printf ("%c", isprint (data[j]) ? data[j] : '.');
2327 /* Should perhaps share code and display with nm? */
2329 dump_symbols (abfd, dynamic)
2330 bfd *abfd ATTRIBUTE_UNUSED;
2343 printf ("DYNAMIC SYMBOL TABLE:\n");
2351 printf ("SYMBOL TABLE:\n");
2354 for (count = 0; count < max; count++)
2358 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2360 if (cur_bfd != NULL)
2365 name = bfd_asymbol_name (*current);
2367 if (do_demangle && name != NULL && *name != '\0')
2371 /* If we want to demangle the name, we demangle it
2372 here, and temporarily clobber it while calling
2373 bfd_print_symbol. FIXME: This is a gross hack. */
2376 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2378 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2380 (*current)->name = alloc;
2382 (*current)->name = n;
2385 bfd_print_symbol (cur_bfd, stdout, *current,
2386 bfd_print_symbol_all);
2388 (*current)->name = name;
2409 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2413 if (bfd_is_abs_section (a))
2415 if (bfd_is_und_section (a))
2417 if (bfd_is_com_section (a))
2422 if (strcmp (only, a->name))
2425 else if ((a->flags & SEC_RELOC) == 0)
2428 relsize = bfd_get_reloc_upper_bound (abfd, a);
2430 bfd_fatal (bfd_get_filename (abfd));
2432 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2436 printf (" (none)\n\n");
2440 relpp = (arelent **) xmalloc (relsize);
2441 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2443 bfd_fatal (bfd_get_filename (abfd));
2444 else if (relcount == 0)
2446 printf (" (none)\n\n");
2451 dump_reloc_set (abfd, a, relpp, relcount);
2460 dump_dynamic_relocs (abfd)
2467 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2469 bfd_fatal (bfd_get_filename (abfd));
2471 printf ("DYNAMIC RELOCATION RECORDS");
2475 printf (" (none)\n\n");
2479 relpp = (arelent **) xmalloc (relsize);
2480 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2482 bfd_fatal (bfd_get_filename (abfd));
2483 else if (relcount == 0)
2485 printf (" (none)\n\n");
2490 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2498 dump_reloc_set (abfd, sec, relpp, relcount)
2505 char *last_filename, *last_functionname;
2506 unsigned int last_line;
2508 /* Get column headers lined up reasonably. */
2514 sprintf_vma (buf, (bfd_vma) -1);
2515 width = strlen (buf) - 7;
2517 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2520 last_filename = NULL;
2521 last_functionname = NULL;
2524 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2527 const char *filename, *functionname;
2529 const char *sym_name;
2530 const char *section_name;
2532 if (start_address != (bfd_vma) -1
2533 && q->address < start_address)
2535 if (stop_address != (bfd_vma) -1
2536 && q->address > stop_address)
2539 if (with_line_numbers
2541 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2542 &filename, &functionname, &line))
2544 if (functionname != NULL
2545 && (last_functionname == NULL
2546 || strcmp (functionname, last_functionname) != 0))
2548 printf ("%s():\n", functionname);
2549 if (last_functionname != NULL)
2550 free (last_functionname);
2551 last_functionname = xstrdup (functionname);
2554 && (line != last_line
2555 || (filename != NULL
2556 && last_filename != NULL
2557 && strcmp (filename, last_filename) != 0)))
2559 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2561 if (last_filename != NULL)
2562 free (last_filename);
2563 if (filename == NULL)
2564 last_filename = NULL;
2566 last_filename = xstrdup (filename);
2570 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2572 sym_name = (*(q->sym_ptr_ptr))->name;
2573 section_name = (*(q->sym_ptr_ptr))->section->name;
2578 section_name = NULL;
2582 printf_vma (q->address);
2584 printf (" %-16s ", q->howto->name);
2586 printf (" %-16d ", q->howto->type);
2587 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2592 if (section_name == (CONST char *) NULL)
2593 section_name = "*unknown*";
2594 printf_vma (q->address);
2595 printf (" %-16s [%s]",
2602 printf_vma (q->addend);
2608 /* The length of the longest architecture name + 1. */
2609 #define LONGEST_ARCH sizeof("rs6000:6000")
2612 endian_string (endian)
2613 enum bfd_endian endian;
2615 if (endian == BFD_ENDIAN_BIG)
2616 return "big endian";
2617 else if (endian == BFD_ENDIAN_LITTLE)
2618 return "little endian";
2620 return "endianness unknown";
2623 /* List the targets that BFD is configured to support, each followed
2624 by its endianness and the architectures it supports. */
2627 display_target_list ()
2629 extern bfd_target *bfd_target_vector[];
2633 dummy_name = choose_temp_base ();
2634 for (t = 0; bfd_target_vector[t]; t++)
2636 bfd_target *p = bfd_target_vector[t];
2637 bfd *abfd = bfd_openw (dummy_name, p->name);
2640 printf ("%s\n (header %s, data %s)\n", p->name,
2641 endian_string (p->header_byteorder),
2642 endian_string (p->byteorder));
2646 nonfatal (dummy_name);
2650 if (! bfd_set_format (abfd, bfd_object))
2652 if (bfd_get_error () != bfd_error_invalid_operation)
2657 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2658 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2660 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2662 unlink (dummy_name);
2666 /* Print a table showing which architectures are supported for entries
2667 FIRST through LAST-1 of bfd_target_vector (targets across,
2668 architectures down). */
2671 display_info_table (first, last)
2675 extern bfd_target *bfd_target_vector[];
2679 /* Print heading of target names. */
2680 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2681 for (t = first; t < last && bfd_target_vector[t]; t++)
2682 printf ("%s ", bfd_target_vector[t]->name);
2685 dummy_name = choose_temp_base ();
2686 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2687 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2689 printf ("%*s ", (int) LONGEST_ARCH - 1,
2690 bfd_printable_arch_mach (a, 0));
2691 for (t = first; t < last && bfd_target_vector[t]; t++)
2693 bfd_target *p = bfd_target_vector[t];
2695 bfd *abfd = bfd_openw (dummy_name, p->name);
2705 if (! bfd_set_format (abfd, bfd_object))
2707 if (bfd_get_error () != bfd_error_invalid_operation)
2715 if (! bfd_set_arch_mach (abfd, a, 0))
2720 printf ("%s ", p->name);
2723 int l = strlen (p->name);
2731 unlink (dummy_name);
2735 /* Print tables of all the target-architecture combinations that
2736 BFD has been configured to support. */
2739 display_target_tables ()
2742 extern bfd_target *bfd_target_vector[];
2746 colum = getenv ("COLUMNS");
2748 columns = atoi (colum);
2753 while (bfd_target_vector[t] != NULL)
2757 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2759 while (wid < columns && bfd_target_vector[t] != NULL)
2763 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2764 if (newwid >= columns)
2769 display_info_table (oldt, t);
2776 printf (_("BFD header file version %s\n"), BFD_VERSION);
2777 display_target_list ();
2778 display_target_tables ();
2787 char *target = default_target;
2788 boolean seenflag = false;
2790 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2791 setlocale (LC_MESSAGES, "");
2793 bindtextdomain (PACKAGE, LOCALEDIR);
2794 textdomain (PACKAGE);
2796 program_name = *argv;
2797 xmalloc_set_program_name (program_name);
2799 START_PROGRESS (program_name, 0);
2802 set_default_bfd_target ();
2804 while ((c = getopt_long (argc, argv, "pib:m:M:VCdDlfahHrRtTxsSj:wE:zgG",
2805 long_options, (int *) 0))
2811 break; /* we've been given a long option */
2816 disassembler_options = optarg;
2822 with_line_numbers = true;
2833 case OPTION_ADJUST_VMA:
2834 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2836 case OPTION_START_ADDRESS:
2837 start_address = parse_vma (optarg, "--start-address");
2839 case OPTION_STOP_ADDRESS:
2840 stop_address = parse_vma (optarg, "--stop-address");
2843 if (strcmp (optarg, "B") == 0)
2844 endian = BFD_ENDIAN_BIG;
2845 else if (strcmp (optarg, "L") == 0)
2846 endian = BFD_ENDIAN_LITTLE;
2849 non_fatal (_("unrecognized -E option"));
2854 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2855 endian = BFD_ENDIAN_BIG;
2856 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2857 endian = BFD_ENDIAN_LITTLE;
2860 non_fatal (_("unrecognized --endian type `%s'"), optarg);
2866 dump_file_header = true;
2870 formats_info = true;
2874 dump_private_headers = true;
2878 dump_private_headers = true;
2880 dump_reloc_info = true;
2881 dump_file_header = true;
2882 dump_ar_hdrs = true;
2883 dump_section_headers = true;
2891 dump_dynamic_symtab = true;
2899 disassemble_zeroes = true;
2903 disassemble_all = true;
2908 with_source_code = true;
2916 dump_stab_section_info = true;
2920 dump_section_contents = true;
2924 dump_reloc_info = true;
2928 dump_dynamic_reloc_info = true;
2932 dump_ar_hdrs = true;
2936 dump_section_headers = true;
2943 show_version = true;
2953 print_version ("objdump");
2955 if (seenflag == false)
2963 display_file ("a.out", target);
2965 for (; optind < argc;)
2966 display_file (argv[optind++], target);
2969 END_PROGRESS (program_name);