1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
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 #ifdef ANSI_PROTOTYPES
38 /* Internal headers for the ELF .stab-dump code - sorry. */
39 #define BYTES_IN_WORD 32
40 #include "aout/aout64.h"
42 #ifdef NEED_DECLARATION_FPRINTF
43 /* This is needed by INIT_DISASSEMBLE_INFO. */
44 extern int fprintf
PARAMS ((FILE *, const char *, ...));
48 static int exit_status
= 0;
50 static char *default_target
= NULL
; /* default at runtime */
52 static int show_version
= 0; /* show the version number */
53 static int dump_section_contents
; /* -s */
54 static int dump_section_headers
; /* -h */
55 static boolean dump_file_header
; /* -f */
56 static int dump_symtab
; /* -t */
57 static int dump_dynamic_symtab
; /* -T */
58 static int dump_reloc_info
; /* -r */
59 static int dump_dynamic_reloc_info
; /* -R */
60 static int dump_ar_hdrs
; /* -a */
61 static int dump_private_headers
; /* -p */
62 static int prefix_addresses
; /* --prefix-addresses */
63 static int with_line_numbers
; /* -l */
64 static boolean with_source_code
; /* -S */
65 static int show_raw_insn
; /* --show-raw-insn */
66 static int dump_stab_section_info
; /* --stabs */
67 static int do_demangle
; /* -C, --demangle */
68 static boolean disassemble
; /* -d */
69 static boolean disassemble_all
; /* -D */
70 static int disassemble_zeroes
; /* --disassemble-zeroes */
71 static boolean formats_info
; /* -i */
72 static char *only
; /* -j secname */
73 static int wide_output
; /* -w */
74 static bfd_vma start_address
= (bfd_vma
) -1; /* --start-address */
75 static bfd_vma stop_address
= (bfd_vma
) -1; /* --stop-address */
76 static int dump_debugging
; /* --debugging */
77 static bfd_vma adjust_section_vma
= 0; /* --adjust-vma */
78 static int file_start_context
= 0; /* --file-start-context */
80 /* Extra info to pass to the disassembler address printing function. */
81 struct objdump_disasm_info
{
87 /* Architecture to disassemble for, or default if NULL. */
88 static char *machine
= (char *) NULL
;
90 /* Target specific options to the disassembler. */
91 static char *disassembler_options
= (char *) NULL
;
93 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
94 static enum bfd_endian endian
= BFD_ENDIAN_UNKNOWN
;
96 /* The symbol table. */
97 static asymbol
**syms
;
99 /* Number of symbols in `syms'. */
100 static long symcount
= 0;
102 /* The sorted symbol table. */
103 static asymbol
**sorted_syms
;
105 /* Number of symbols in `sorted_syms'. */
106 static long sorted_symcount
= 0;
108 /* The dynamic symbol table. */
109 static asymbol
**dynsyms
;
111 /* Number of symbols in `dynsyms'. */
112 static long dynsymcount
= 0;
114 /* Static declarations. */
117 usage
PARAMS ((FILE *, int));
120 nonfatal
PARAMS ((const char *));
123 display_file
PARAMS ((char *filename
, char *target
));
126 dump_section_header
PARAMS ((bfd
*, asection
*, PTR
));
129 dump_headers
PARAMS ((bfd
*));
132 dump_data
PARAMS ((bfd
*abfd
));
135 dump_relocs
PARAMS ((bfd
*abfd
));
138 dump_dynamic_relocs
PARAMS ((bfd
* abfd
));
141 dump_reloc_set
PARAMS ((bfd
*, asection
*, arelent
**, long));
144 dump_symbols
PARAMS ((bfd
*abfd
, boolean dynamic
));
147 dump_bfd_header
PARAMS ((bfd
*));
150 dump_bfd_private_header
PARAMS ((bfd
*));
153 display_bfd
PARAMS ((bfd
*abfd
));
156 display_target_list
PARAMS ((void));
159 display_info_table
PARAMS ((int, int));
162 display_target_tables
PARAMS ((void));
165 display_info
PARAMS ((void));
168 objdump_print_value
PARAMS ((bfd_vma
, struct disassemble_info
*, boolean
));
171 objdump_print_symname
PARAMS ((bfd
*, struct disassemble_info
*, asymbol
*));
174 find_symbol_for_address
PARAMS ((bfd
*, asection
*, bfd_vma
, boolean
, long *));
177 objdump_print_addr_with_sym
PARAMS ((bfd
*, asection
*, asymbol
*, bfd_vma
,
178 struct disassemble_info
*, boolean
));
181 objdump_print_addr
PARAMS ((bfd_vma
, struct disassemble_info
*, boolean
));
184 objdump_print_address
PARAMS ((bfd_vma
, struct disassemble_info
*));
187 show_line
PARAMS ((bfd
*, asection
*, bfd_vma
));
190 disassemble_bytes
PARAMS ((struct disassemble_info
*, disassembler_ftype
,
191 boolean
, bfd_byte
*, bfd_vma
, bfd_vma
,
192 arelent
***, arelent
**));
195 disassemble_data
PARAMS ((bfd
*));
198 endian_string
PARAMS ((enum bfd_endian
));
201 slurp_symtab
PARAMS ((bfd
*));
204 slurp_dynamic_symtab
PARAMS ((bfd
*));
207 remove_useless_symbols
PARAMS ((asymbol
**, long));
210 compare_symbols
PARAMS ((const PTR
, const PTR
));
213 compare_relocs
PARAMS ((const PTR
, const PTR
));
216 dump_stabs
PARAMS ((bfd
*));
219 read_section_stabs
PARAMS ((bfd
*, const char *, const char *));
222 print_section_stabs
PARAMS ((bfd
*, const char *, const char *));
225 usage (stream
, status
)
229 fprintf (stream
, _("Usage: %s <switches> file(s)\n"), program_name
);
230 fprintf (stream
, _(" At least one of the following switches must be given:\n"));
231 fprintf (stream
, _("\
232 -a --archive-headers Display archive header information\n\
233 -f --file-headers Display the contents of the overall file header\n\
234 -p --private-headers Display object format specific file header contents\n\
235 -h --[section-]headers Display the contents of the section headers\n\
236 -x --all-headers Display the contents of all headers\n\
237 -d --disassemble Display assembler contents of executable sections\n\
238 -D --disassemble-all Display assembler contents of all sections\n\
239 -S --source Intermix source code with disassembly\n\
240 -s --full-contents Display the full contents of all sections requested\n\
241 -g --debugging Display debug information in object file\n\
242 -G --stabs Display the STABS contents of an ELF format file\n\
243 -t --syms Display the contents of the symbol table(s)\n\
244 -T --dynamic-syms Display the contents of the dynamic symbol table\n\
245 -r --reloc Display the relocation entries in the file\n\
246 -R --dynamic-reloc Display the dynamic relocation entries in the file\n\
247 -V --version Display this program's version number\n\
248 -i --info List object formats and architectures supported\n\
249 -H --help Display this information\n\
253 fprintf (stream
, _("\n The following switches are optional:\n"));
254 fprintf (stream
, _("\
255 -b --target <bfdname> Specify the target object format as <bfdname>\n\
256 -m --architecture <machine> Specify the target architecture as <machine>\n\
257 -j --section <name> Only display information for section <name>\n\
258 -M --disassembler-options <o> Pass text <o> on to the disassembler\n\
259 -EB --endian=big Assume big endian format when disassembling\n\
260 -EL --endian=little Assume little endian format when disassembling\n\
261 --file-start-context Include context from start of file (with -S)\n\
262 -l --line-numbers Include line numbers and filenames in output\n\
263 -C --demangle Decode mangled/processed symbol names\n\
264 -w --wide Format output for more than 80 columns\n\
265 -z --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
266 --start-address <addr> Only process data whoes address is >= <addr>\n\
267 --stop-address <addr> Only process data whoes address is <= <addr>\n\
268 --prefix-addresses Print complete address alongside disassembly\n\
269 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
270 --adjust-vma <offset> Add <offset> to all displayed section addresses\n\
272 list_supported_targets (program_name
, stream
);
274 disassembler_usage (stream
);
277 fprintf (stream
, _("Report bugs to bug-gnu-utils@gnu.org\n"));
281 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
283 #define OPTION_ENDIAN (150)
284 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
285 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
286 #define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
288 static struct option long_options
[]=
290 {"adjust-vma", required_argument
, NULL
, OPTION_ADJUST_VMA
},
291 {"all-headers", no_argument
, NULL
, 'x'},
292 {"private-headers", no_argument
, NULL
, 'p'},
293 {"architecture", required_argument
, NULL
, 'm'},
294 {"archive-headers", no_argument
, NULL
, 'a'},
295 {"debugging", no_argument
, NULL
, 'g'},
296 {"demangle", no_argument
, NULL
, 'C'},
297 {"disassemble", no_argument
, NULL
, 'd'},
298 {"disassemble-all", no_argument
, NULL
, 'D'},
299 {"disassembler-options", required_argument
, NULL
, 'M'},
300 {"disassemble-zeroes", no_argument
, NULL
, 'z'},
301 {"dynamic-reloc", no_argument
, NULL
, 'R'},
302 {"dynamic-syms", no_argument
, NULL
, 'T'},
303 {"endian", required_argument
, NULL
, OPTION_ENDIAN
},
304 {"file-headers", no_argument
, NULL
, 'f'},
305 {"file-start-context", no_argument
, &file_start_context
, 1},
306 {"full-contents", no_argument
, NULL
, 's'},
307 {"headers", no_argument
, NULL
, 'h'},
308 {"help", no_argument
, NULL
, 'H'},
309 {"info", no_argument
, NULL
, 'i'},
310 {"line-numbers", no_argument
, NULL
, 'l'},
311 {"no-show-raw-insn", no_argument
, &show_raw_insn
, -1},
312 {"prefix-addresses", no_argument
, &prefix_addresses
, 1},
313 {"reloc", no_argument
, NULL
, 'r'},
314 {"section", required_argument
, NULL
, 'j'},
315 {"section-headers", no_argument
, NULL
, 'h'},
316 {"show-raw-insn", no_argument
, &show_raw_insn
, 1},
317 {"source", no_argument
, NULL
, 'S'},
318 {"stabs", no_argument
, NULL
, 'G'},
319 {"start-address", required_argument
, NULL
, OPTION_START_ADDRESS
},
320 {"stop-address", required_argument
, NULL
, OPTION_STOP_ADDRESS
},
321 {"syms", no_argument
, NULL
, 't'},
322 {"target", required_argument
, NULL
, 'b'},
323 {"version", no_argument
, NULL
, 'V'},
324 {"wide", no_argument
, NULL
, 'w'},
325 {0, no_argument
, 0, 0}
337 dump_section_header (abfd
, section
, ignored
)
338 bfd
*abfd ATTRIBUTE_UNUSED
;
340 PTR ignored ATTRIBUTE_UNUSED
;
343 unsigned int opb
= bfd_octets_per_byte (abfd
);
345 printf ("%3d %-13s %08lx ", section
->index
,
346 bfd_get_section_name (abfd
, section
),
347 (unsigned long) bfd_section_size (abfd
, section
) / opb
);
348 printf_vma (bfd_get_section_vma (abfd
, section
));
350 printf_vma (section
->lma
);
351 printf (" %08lx 2**%u", section
->filepos
,
352 bfd_get_section_alignment (abfd
, section
));
358 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
360 PF (SEC_HAS_CONTENTS
, "CONTENTS");
361 PF (SEC_ALLOC
, "ALLOC");
362 PF (SEC_CONSTRUCTOR
, "CONSTRUCTOR");
363 PF (SEC_CONSTRUCTOR_TEXT
, "CONSTRUCTOR TEXT");
364 PF (SEC_CONSTRUCTOR_DATA
, "CONSTRUCTOR DATA");
365 PF (SEC_CONSTRUCTOR_BSS
, "CONSTRUCTOR BSS");
366 PF (SEC_LOAD
, "LOAD");
367 PF (SEC_RELOC
, "RELOC");
369 PF (SEC_BALIGN
, "BALIGN");
371 PF (SEC_READONLY
, "READONLY");
372 PF (SEC_CODE
, "CODE");
373 PF (SEC_DATA
, "DATA");
375 PF (SEC_DEBUGGING
, "DEBUGGING");
376 PF (SEC_NEVER_LOAD
, "NEVER_LOAD");
377 PF (SEC_EXCLUDE
, "EXCLUDE");
378 PF (SEC_SORT_ENTRIES
, "SORT_ENTRIES");
379 PF (SEC_SMALL_DATA
, "SMALL_DATA");
380 PF (SEC_SHARED
, "SHARED");
382 if ((section
->flags
& SEC_LINK_ONCE
) != 0)
386 switch (section
->flags
& SEC_LINK_DUPLICATES
)
390 case SEC_LINK_DUPLICATES_DISCARD
:
391 ls
= "LINK_ONCE_DISCARD";
393 case SEC_LINK_DUPLICATES_ONE_ONLY
:
394 ls
= "LINK_ONCE_ONE_ONLY";
396 case SEC_LINK_DUPLICATES_SAME_SIZE
:
397 ls
= "LINK_ONCE_SAME_SIZE";
399 case SEC_LINK_DUPLICATES_SAME_CONTENTS
:
400 ls
= "LINK_ONCE_SAME_CONTENTS";
403 printf ("%s%s", comma
, ls
);
405 if (section
->comdat
!= NULL
)
406 printf (" (COMDAT %s %ld)", section
->comdat
->name
,
407 section
->comdat
->symbol
);
420 printf (_("Sections:\n"));
423 printf (_("Idx Name Size VMA LMA File off Algn"));
425 printf (_("Idx Name Size VMA LMA File off Algn"));
429 printf (_(" Flags"));
432 bfd_map_over_sections (abfd
, dump_section_header
, (PTR
) NULL
);
439 asymbol
**sy
= (asymbol
**) NULL
;
442 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
444 fprintf (stderr
, _("%s: no symbols\n"), bfd_get_filename (abfd
));
449 storage
= bfd_get_symtab_upper_bound (abfd
);
451 bfd_fatal (bfd_get_filename (abfd
));
455 sy
= (asymbol
**) xmalloc (storage
);
457 symcount
= bfd_canonicalize_symtab (abfd
, sy
);
459 bfd_fatal (bfd_get_filename (abfd
));
461 fprintf (stderr
, _("%s: no symbols\n"), bfd_get_filename (abfd
));
465 /* Read in the dynamic symbols. */
468 slurp_dynamic_symtab (abfd
)
471 asymbol
**sy
= (asymbol
**) NULL
;
474 storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
477 if (!(bfd_get_file_flags (abfd
) & DYNAMIC
))
479 fprintf (stderr
, _("%s: %s: not a dynamic object\n"),
480 program_name
, bfd_get_filename (abfd
));
485 bfd_fatal (bfd_get_filename (abfd
));
490 sy
= (asymbol
**) xmalloc (storage
);
492 dynsymcount
= bfd_canonicalize_dynamic_symtab (abfd
, sy
);
494 bfd_fatal (bfd_get_filename (abfd
));
495 if (dynsymcount
== 0)
496 fprintf (stderr
, _("%s: %s: No dynamic symbols\n"),
497 program_name
, bfd_get_filename (abfd
));
501 /* Filter out (in place) symbols that are useless for disassembly.
502 COUNT is the number of elements in SYMBOLS.
503 Return the number of useful symbols. */
506 remove_useless_symbols (symbols
, count
)
510 register asymbol
**in_ptr
= symbols
, **out_ptr
= symbols
;
514 asymbol
*sym
= *in_ptr
++;
516 if (sym
->name
== NULL
|| sym
->name
[0] == '\0')
518 if (sym
->flags
& (BSF_DEBUGGING
))
520 if (bfd_is_und_section (sym
->section
)
521 || bfd_is_com_section (sym
->section
))
526 return out_ptr
- symbols
;
529 /* Sort symbols into value order. */
532 compare_symbols (ap
, bp
)
536 const asymbol
*a
= *(const asymbol
**)ap
;
537 const asymbol
*b
= *(const asymbol
**)bp
;
541 flagword aflags
, bflags
;
543 if (bfd_asymbol_value (a
) > bfd_asymbol_value (b
))
545 else if (bfd_asymbol_value (a
) < bfd_asymbol_value (b
))
548 if (a
->section
> b
->section
)
550 else if (a
->section
< b
->section
)
553 an
= bfd_asymbol_name (a
);
554 bn
= bfd_asymbol_name (b
);
558 /* The symbols gnu_compiled and gcc2_compiled convey no real
559 information, so put them after other symbols with the same value. */
561 af
= (strstr (an
, "gnu_compiled") != NULL
562 || strstr (an
, "gcc2_compiled") != NULL
);
563 bf
= (strstr (bn
, "gnu_compiled") != NULL
564 || strstr (bn
, "gcc2_compiled") != NULL
);
571 /* We use a heuristic for the file name, to try to sort it after
572 more useful symbols. It may not work on non Unix systems, but it
573 doesn't really matter; the only difference is precisely which
574 symbol names get printed. */
576 #define file_symbol(s, sn, snl) \
577 (((s)->flags & BSF_FILE) != 0 \
578 || ((sn)[(snl) - 2] == '.' \
579 && ((sn)[(snl) - 1] == 'o' \
580 || (sn)[(snl) - 1] == 'a')))
582 af
= file_symbol (a
, an
, anl
);
583 bf
= file_symbol (b
, bn
, bnl
);
590 /* Try to sort global symbols before local symbols before function
591 symbols before debugging symbols. */
596 if ((aflags
& BSF_DEBUGGING
) != (bflags
& BSF_DEBUGGING
))
598 if ((aflags
& BSF_DEBUGGING
) != 0)
603 if ((aflags
& BSF_FUNCTION
) != (bflags
& BSF_FUNCTION
))
605 if ((aflags
& BSF_FUNCTION
) != 0)
610 if ((aflags
& BSF_LOCAL
) != (bflags
& BSF_LOCAL
))
612 if ((aflags
& BSF_LOCAL
) != 0)
617 if ((aflags
& BSF_GLOBAL
) != (bflags
& BSF_GLOBAL
))
619 if ((aflags
& BSF_GLOBAL
) != 0)
625 /* Symbols that start with '.' might be section names, so sort them
626 after symbols that don't start with '.'. */
627 if (an
[0] == '.' && bn
[0] != '.')
629 if (an
[0] != '.' && bn
[0] == '.')
632 /* Finally, if we can't distinguish them in any other way, try to
633 get consistent results by sorting the symbols by name. */
634 return strcmp (an
, bn
);
637 /* Sort relocs into address order. */
640 compare_relocs (ap
, bp
)
644 const arelent
*a
= *(const arelent
**)ap
;
645 const arelent
*b
= *(const arelent
**)bp
;
647 if (a
->address
> b
->address
)
649 else if (a
->address
< b
->address
)
652 /* So that associated relocations tied to the same address show up
653 in the correct order, we don't do any further sorting. */
662 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
665 objdump_print_value (vma
, info
, skip_zeroes
)
667 struct disassemble_info
*info
;
673 sprintf_vma (buf
, vma
);
678 for (p
= buf
; *p
== '0'; ++p
)
683 (*info
->fprintf_func
) (info
->stream
, "%s", p
);
686 /* Print the name of a symbol. */
689 objdump_print_symname (abfd
, info
, sym
)
691 struct disassemble_info
*info
;
699 name
= bfd_asymbol_name (sym
);
700 if (! do_demangle
|| name
[0] == '\0')
704 /* Demangle the name. */
705 if (bfd_get_symbol_leading_char (abfd
) == name
[0])
708 alloc
= cplus_demangle (name
, DMGL_ANSI
| DMGL_PARAMS
);
716 (*info
->fprintf_func
) (info
->stream
, "%s", print
);
718 printf ("%s", print
);
724 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
725 is true, then always require the symbol to be in the section. This
726 returns NULL if there is no suitable symbol. If PLACE is not NULL,
727 then *PLACE is set to the index of the symbol in sorted_syms. */
730 find_symbol_for_address (abfd
, sec
, vma
, require_sec
, place
)
737 /* @@ Would it speed things up to cache the last two symbols returned,
738 and maybe their address ranges? For many processors, only one memory
739 operand can be present at a time, so the 2-entry cache wouldn't be
740 constantly churned by code doing heavy memory accesses. */
742 /* Indices in `sorted_syms'. */
744 long max
= sorted_symcount
;
746 unsigned int opb
= bfd_octets_per_byte (abfd
);
748 if (sorted_symcount
< 1)
751 /* Perform a binary search looking for the closest symbol to the
752 required value. We are searching the range (min, max]. */
753 while (min
+ 1 < max
)
757 thisplace
= (max
+ min
) / 2;
758 sym
= sorted_syms
[thisplace
];
760 if (bfd_asymbol_value (sym
) > vma
)
762 else if (bfd_asymbol_value (sym
) < vma
)
771 /* The symbol we want is now in min, the low end of the range we
772 were searching. If there are several symbols with the same
773 value, we want the first one. */
776 && (bfd_asymbol_value (sorted_syms
[thisplace
])
777 == bfd_asymbol_value (sorted_syms
[thisplace
- 1])))
780 /* If the file is relocateable, and the symbol could be from this
781 section, prefer a symbol from this section over symbols from
782 others, even if the other symbol's value might be closer.
784 Note that this may be wrong for some symbol references if the
785 sections have overlapping memory ranges, but in that case there's
786 no way to tell what's desired without looking at the relocation
789 if (sorted_syms
[thisplace
]->section
!= sec
791 || ((abfd
->flags
& HAS_RELOC
) != 0
792 && vma
>= bfd_get_section_vma (abfd
, sec
)
793 && vma
< (bfd_get_section_vma (abfd
, sec
)
794 + bfd_section_size (abfd
, sec
) / opb
))))
798 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
800 if (bfd_asymbol_value (sorted_syms
[i
])
801 != bfd_asymbol_value (sorted_syms
[thisplace
]))
807 if (sorted_syms
[i
]->section
== sec
809 || sorted_syms
[i
- 1]->section
!= sec
810 || (bfd_asymbol_value (sorted_syms
[i
])
811 != bfd_asymbol_value (sorted_syms
[i
- 1]))))
818 if (sorted_syms
[thisplace
]->section
!= sec
)
820 /* We didn't find a good symbol with a smaller value.
821 Look for one with a larger value. */
822 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
824 if (sorted_syms
[i
]->section
== sec
)
832 if (sorted_syms
[thisplace
]->section
!= sec
834 || ((abfd
->flags
& HAS_RELOC
) != 0
835 && vma
>= bfd_get_section_vma (abfd
, sec
)
836 && vma
< (bfd_get_section_vma (abfd
, sec
)
837 + bfd_section_size (abfd
, sec
)))))
839 /* There is no suitable symbol. */
847 return sorted_syms
[thisplace
];
850 /* Print an address to INFO symbolically. */
853 objdump_print_addr_with_sym (abfd
, sec
, sym
, vma
, info
, skip_zeroes
)
858 struct disassemble_info
*info
;
861 objdump_print_value (vma
, info
, skip_zeroes
);
867 (*info
->fprintf_func
) (info
->stream
, " <%s",
868 bfd_get_section_name (abfd
, sec
));
869 secaddr
= bfd_get_section_vma (abfd
, sec
);
872 (*info
->fprintf_func
) (info
->stream
, "-0x");
873 objdump_print_value (secaddr
- vma
, info
, true);
875 else if (vma
> secaddr
)
877 (*info
->fprintf_func
) (info
->stream
, "+0x");
878 objdump_print_value (vma
- secaddr
, info
, true);
880 (*info
->fprintf_func
) (info
->stream
, ">");
884 (*info
->fprintf_func
) (info
->stream
, " <");
885 objdump_print_symname (abfd
, info
, sym
);
886 if (bfd_asymbol_value (sym
) > vma
)
888 (*info
->fprintf_func
) (info
->stream
, "-0x");
889 objdump_print_value (bfd_asymbol_value (sym
) - vma
, info
, true);
891 else if (vma
> bfd_asymbol_value (sym
))
893 (*info
->fprintf_func
) (info
->stream
, "+0x");
894 objdump_print_value (vma
- bfd_asymbol_value (sym
), info
, true);
896 (*info
->fprintf_func
) (info
->stream
, ">");
900 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
901 true, don't output leading zeroes. */
904 objdump_print_addr (vma
, info
, skip_zeroes
)
906 struct disassemble_info
*info
;
909 struct objdump_disasm_info
*aux
;
912 if (sorted_symcount
< 1)
914 (*info
->fprintf_func
) (info
->stream
, "0x");
915 objdump_print_value (vma
, info
, skip_zeroes
);
919 aux
= (struct objdump_disasm_info
*) info
->application_data
;
920 sym
= find_symbol_for_address (aux
->abfd
, aux
->sec
, vma
, aux
->require_sec
,
922 objdump_print_addr_with_sym (aux
->abfd
, aux
->sec
, sym
, vma
, info
,
926 /* Print VMA to INFO. This function is passed to the disassembler
930 objdump_print_address (vma
, info
)
932 struct disassemble_info
*info
;
934 objdump_print_addr (vma
, info
, ! prefix_addresses
);
937 /* Determine of the given address has a symbol associated with it. */
940 objdump_symbol_at_address (vma
, info
)
942 struct disassemble_info
* info
;
944 struct objdump_disasm_info
* aux
;
947 /* No symbols - do not bother checking. */
948 if (sorted_symcount
< 1)
951 aux
= (struct objdump_disasm_info
*) info
->application_data
;
952 sym
= find_symbol_for_address (aux
->abfd
, aux
->sec
, vma
, aux
->require_sec
,
955 return (sym
!= NULL
&& (bfd_asymbol_value (sym
) == vma
));
958 /* Hold the last function name and the last line number we displayed
961 static char *prev_functionname
;
962 static unsigned int prev_line
;
964 /* We keep a list of all files that we have seen when doing a
965 dissassembly with source, so that we know how much of the file to
966 display. This can be important for inlined functions. */
968 struct print_file_list
970 struct print_file_list
*next
;
976 static struct print_file_list
*print_files
;
978 /* The number of preceding context lines to show when we start
979 displaying a file for the first time. */
981 #define SHOW_PRECEDING_CONTEXT_LINES (5)
983 /* Skip ahead to a given line in a file, optionally printing each
987 skip_to_line
PARAMS ((struct print_file_list
*, unsigned int, boolean
));
990 skip_to_line (p
, line
, show
)
991 struct print_file_list
*p
;
995 while (p
->line
< line
)
999 if (fgets (buf
, sizeof buf
, p
->f
) == NULL
)
1009 if (strchr (buf
, '\n') != NULL
)
1014 /* Show the line number, or the source line, in a dissassembly
1018 show_line (abfd
, section
, addr_offset
)
1021 bfd_vma addr_offset
;
1023 CONST
char *filename
;
1024 CONST
char *functionname
;
1027 if (! with_line_numbers
&& ! with_source_code
)
1030 if (! bfd_find_nearest_line (abfd
, section
, syms
, addr_offset
, &filename
,
1031 &functionname
, &line
))
1034 if (filename
!= NULL
&& *filename
== '\0')
1036 if (functionname
!= NULL
&& *functionname
== '\0')
1037 functionname
= NULL
;
1039 if (with_line_numbers
)
1041 if (functionname
!= NULL
1042 && (prev_functionname
== NULL
1043 || strcmp (functionname
, prev_functionname
) != 0))
1044 printf ("%s():\n", functionname
);
1045 if (line
> 0 && line
!= prev_line
)
1046 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
1049 if (with_source_code
1053 struct print_file_list
**pp
, *p
;
1055 for (pp
= &print_files
; *pp
!= NULL
; pp
= &(*pp
)->next
)
1056 if (strcmp ((*pp
)->filename
, filename
) == 0)
1062 if (p
!= print_files
)
1066 /* We have reencountered a file name which we saw
1067 earlier. This implies that either we are dumping out
1068 code from an included file, or the same file was
1069 linked in more than once. There are two common cases
1070 of an included file: inline functions in a header
1071 file, and a bison or flex skeleton file. In the
1072 former case we want to just start printing (but we
1073 back up a few lines to give context); in the latter
1074 case we want to continue from where we left off. I
1075 can't think of a good way to distinguish the cases,
1076 so I used a heuristic based on the file name. */
1077 if (strcmp (p
->filename
+ strlen (p
->filename
) - 2, ".h") != 0)
1081 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
1088 p
->f
= fopen (p
->filename
, "r");
1092 skip_to_line (p
, l
, false);
1094 if (print_files
->f
!= NULL
)
1096 fclose (print_files
->f
);
1097 print_files
->f
= NULL
;
1103 skip_to_line (p
, line
, true);
1105 p
->next
= print_files
;
1113 f
= fopen (filename
, "r");
1118 p
= ((struct print_file_list
*)
1119 xmalloc (sizeof (struct print_file_list
)));
1120 p
->filename
= xmalloc (strlen (filename
) + 1);
1121 strcpy (p
->filename
, filename
);
1125 if (print_files
!= NULL
&& print_files
->f
!= NULL
)
1127 fclose (print_files
->f
);
1128 print_files
->f
= NULL
;
1130 p
->next
= print_files
;
1133 if (file_start_context
)
1136 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
1139 skip_to_line (p
, l
, false);
1141 skip_to_line (p
, line
, true);
1146 if (functionname
!= NULL
1147 && (prev_functionname
== NULL
1148 || strcmp (functionname
, prev_functionname
) != 0))
1150 if (prev_functionname
!= NULL
)
1151 free (prev_functionname
);
1152 prev_functionname
= xmalloc (strlen (functionname
) + 1);
1153 strcpy (prev_functionname
, functionname
);
1156 if (line
> 0 && line
!= prev_line
)
1160 /* Pseudo FILE object for strings. */
1168 /* sprintf to a "stream" */
1171 #ifdef ANSI_PROTOTYPES
1172 objdump_sprintf (SFILE
*f
, const char *format
, ...)
1174 objdump_sprintf (va_alist
)
1178 #ifndef ANSI_PROTOTYPES
1186 #ifdef ANSI_PROTOTYPES
1187 va_start (args
, format
);
1190 f
= va_arg (args
, SFILE
*);
1191 format
= va_arg (args
, const char *);
1194 vasprintf (&buf
, format
, args
);
1200 fprintf (stderr
, _("Out of virtual memory\n"));
1206 while ((size_t) ((f
->buffer
+ f
->size
) - f
->current
) < n
+ 1)
1210 curroff
= f
->current
- f
->buffer
;
1212 f
->buffer
= xrealloc (f
->buffer
, f
->size
);
1213 f
->current
= f
->buffer
+ curroff
;
1216 memcpy (f
->current
, buf
, n
);
1218 f
->current
[0] = '\0';
1225 /* The number of zeroes we want to see before we start skipping them.
1226 The number is arbitrarily chosen. */
1228 #define SKIP_ZEROES (8)
1230 /* The number of zeroes to skip at the end of a section. If the
1231 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1232 SKIP_ZEROES, they will be disassembled. If there are fewer than
1233 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1234 attempt to avoid disassembling zeroes inserted by section
1237 #define SKIP_ZEROES_AT_END (3)
1239 /* Disassemble some data in memory between given values. */
1242 disassemble_bytes (info
, disassemble_fn
, insns
, data
,
1243 start_offset
, stop_offset
, relppp
,
1245 struct disassemble_info
*info
;
1246 disassembler_ftype disassemble_fn
;
1249 bfd_vma start_offset
;
1250 bfd_vma stop_offset
;
1254 struct objdump_disasm_info
*aux
;
1256 int octets_per_line
;
1258 int skip_addr_chars
;
1259 bfd_vma addr_offset
;
1260 int opb
= info
->octets_per_byte
;
1262 aux
= (struct objdump_disasm_info
*) info
->application_data
;
1266 octets_per_line
= 4;
1268 octets_per_line
= 16;
1270 /* Figure out how many characters to skip at the start of an
1271 address, to make the disassembly look nicer. We discard leading
1272 zeroes in chunks of 4, ensuring that there is always a leading
1274 skip_addr_chars
= 0;
1275 if (! prefix_addresses
)
1280 sprintf_vma (buf
, section
->vma
+
1281 bfd_section_size (section
->owner
, section
) / opb
);
1283 while (s
[0] == '0' && s
[1] == '0' && s
[2] == '0' && s
[3] == '0'
1286 skip_addr_chars
+= 4;
1291 info
->insn_info_valid
= 0;
1294 addr_offset
= start_offset
;
1295 while (addr_offset
< stop_offset
)
1299 boolean need_nl
= false;
1301 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1303 for (z
= addr_offset
* opb
; z
< stop_offset
* opb
; z
++)
1306 if (! disassemble_zeroes
1307 && (info
->insn_info_valid
== 0
1308 || info
->branch_delay_insns
== 0)
1309 && (z
- addr_offset
* opb
>= SKIP_ZEROES
1310 || (z
== stop_offset
* opb
&&
1311 z
- addr_offset
* opb
< SKIP_ZEROES_AT_END
)))
1315 /* If there are more nonzero octets to follow, we only skip
1316 zeroes in multiples of 4, to try to avoid running over
1317 the start of an instruction which happens to start with
1319 if (z
!= stop_offset
* opb
)
1320 z
= addr_offset
* opb
+ ((z
- addr_offset
* opb
) &~ 3);
1322 octets
= z
- addr_offset
* opb
;
1333 if (with_line_numbers
|| with_source_code
)
1334 show_line (aux
->abfd
, section
, addr_offset
);
1336 if (! prefix_addresses
)
1340 sprintf_vma (buf
, section
->vma
+ addr_offset
);
1341 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1345 printf ("%s:\t", buf
+ skip_addr_chars
);
1349 aux
->require_sec
= true;
1350 objdump_print_address (section
->vma
+ addr_offset
, info
);
1351 aux
->require_sec
= false;
1358 sfile
.buffer
= xmalloc (sfile
.size
);
1359 sfile
.current
= sfile
.buffer
;
1360 info
->fprintf_func
= (fprintf_ftype
) objdump_sprintf
;
1361 info
->stream
= (FILE *) &sfile
;
1362 info
->bytes_per_line
= 0;
1363 info
->bytes_per_chunk
= 0;
1365 /* FIXME: This is wrong. It tests the number of octets
1366 in the last instruction, not the current one. */
1367 if (*relppp
< relppend
1368 && (**relppp
)->address
>= addr_offset
1369 && (**relppp
)->address
< addr_offset
+ octets
/ opb
)
1370 info
->flags
= INSN_HAS_RELOC
;
1374 octets
= (*disassemble_fn
) (section
->vma
+ addr_offset
, info
);
1375 info
->fprintf_func
= (fprintf_ftype
) fprintf
;
1376 info
->stream
= stdout
;
1377 if (info
->bytes_per_line
!= 0)
1378 octets_per_line
= info
->bytes_per_line
;
1381 if (sfile
.current
!= sfile
.buffer
)
1382 printf ("%s\n", sfile
.buffer
);
1383 free (sfile
.buffer
);
1391 octets
= octets_per_line
;
1392 if (addr_offset
+ octets
/ opb
> stop_offset
)
1393 octets
= (stop_offset
- addr_offset
) * opb
;
1395 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ octets
; ++j
)
1397 if (isprint (data
[j
]))
1398 buf
[j
- addr_offset
* opb
] = data
[j
];
1400 buf
[j
- addr_offset
* opb
] = '.';
1402 buf
[j
- addr_offset
* opb
] = '\0';
1405 if (prefix_addresses
1407 : show_raw_insn
>= 0)
1411 /* If ! prefix_addresses and ! wide_output, we print
1412 octets_per_line octets per line. */
1414 if (pb
> octets_per_line
&& ! prefix_addresses
&& ! wide_output
)
1415 pb
= octets_per_line
;
1417 if (info
->bytes_per_chunk
)
1418 bpc
= info
->bytes_per_chunk
;
1422 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
1425 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1427 for (k
= bpc
- 1; k
>= 0; k
--)
1428 printf ("%02x", (unsigned) data
[j
+ k
]);
1433 for (k
= 0; k
< bpc
; k
++)
1434 printf ("%02x", (unsigned) data
[j
+ k
]);
1439 for (; pb
< octets_per_line
; pb
+= bpc
)
1443 for (k
= 0; k
< bpc
; k
++)
1448 /* Separate raw data from instruction by extra space. */
1459 printf ("%s", sfile
.buffer
);
1460 free (sfile
.buffer
);
1463 if (prefix_addresses
1465 : show_raw_insn
>= 0)
1473 j
= addr_offset
* opb
+ pb
;
1475 sprintf_vma (buf
, section
->vma
+ j
/ opb
);
1476 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1480 printf ("%s:\t", buf
+ skip_addr_chars
);
1482 pb
+= octets_per_line
;
1485 for (; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
1489 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1491 for (k
= bpc
- 1; k
>= 0; k
--)
1492 printf ("%02x", (unsigned) data
[j
+ k
]);
1497 for (k
= 0; k
< bpc
; k
++)
1498 printf ("%02x", (unsigned) data
[j
+ k
]);
1512 && (section
->flags
& SEC_RELOC
) != 0)
1514 while ((*relppp
) < relppend
1515 && ((**relppp
)->address
>= (bfd_vma
) addr_offset
1516 && (**relppp
)->address
< (bfd_vma
) addr_offset
+ octets
/ opb
))
1527 objdump_print_value (section
->vma
+ q
->address
, info
, true);
1529 printf (": %s\t", q
->howto
->name
);
1531 if (q
->sym_ptr_ptr
== NULL
|| *q
->sym_ptr_ptr
== NULL
)
1532 printf ("*unknown*");
1535 const char *sym_name
;
1537 sym_name
= bfd_asymbol_name (*q
->sym_ptr_ptr
);
1538 if (sym_name
!= NULL
&& *sym_name
!= '\0')
1539 objdump_print_symname (aux
->abfd
, info
, *q
->sym_ptr_ptr
);
1544 sym_sec
= bfd_get_section (*q
->sym_ptr_ptr
);
1545 sym_name
= bfd_get_section_name (aux
->abfd
, sym_sec
);
1546 if (sym_name
== NULL
|| *sym_name
== '\0')
1547 sym_name
= "*unknown*";
1548 printf ("%s", sym_name
);
1555 objdump_print_value (q
->addend
, info
, true);
1567 addr_offset
+= octets
/ opb
;
1571 /* Disassemble the contents of an object file. */
1574 disassemble_data (abfd
)
1577 unsigned long addr_offset
;
1578 disassembler_ftype disassemble_fn
;
1579 struct disassemble_info disasm_info
;
1580 struct objdump_disasm_info aux
;
1582 unsigned int opb
= bfd_octets_per_byte (abfd
);
1585 prev_functionname
= NULL
;
1588 /* We make a copy of syms to sort. We don't want to sort syms
1589 because that will screw up the relocs. */
1590 sorted_syms
= (asymbol
**) xmalloc (symcount
* sizeof (asymbol
*));
1591 memcpy (sorted_syms
, syms
, symcount
* sizeof (asymbol
*));
1593 sorted_symcount
= remove_useless_symbols (sorted_syms
, symcount
);
1595 /* Sort the symbols into section and symbol order */
1596 qsort (sorted_syms
, sorted_symcount
, sizeof (asymbol
*), compare_symbols
);
1598 INIT_DISASSEMBLE_INFO(disasm_info
, stdout
, fprintf
);
1599 disasm_info
.application_data
= (PTR
) &aux
;
1601 aux
.require_sec
= false;
1602 disasm_info
.print_address_func
= objdump_print_address
;
1603 disasm_info
.symbol_at_address_func
= objdump_symbol_at_address
;
1604 disasm_info
.octets_per_byte
= opb
;
1606 if (machine
!= (char *) NULL
)
1608 const bfd_arch_info_type
*info
= bfd_scan_arch (machine
);
1611 fprintf (stderr
, _("%s: Can't use supplied machine %s\n"),
1616 abfd
->arch_info
= info
;
1619 if (endian
!= BFD_ENDIAN_UNKNOWN
)
1621 struct bfd_target
*xvec
;
1623 xvec
= (struct bfd_target
*) xmalloc (sizeof (struct bfd_target
));
1624 memcpy (xvec
, abfd
->xvec
, sizeof (struct bfd_target
));
1625 xvec
->byteorder
= endian
;
1629 disassemble_fn
= disassembler (abfd
);
1630 if (!disassemble_fn
)
1632 fprintf (stderr
, _("%s: Can't disassemble for architecture %s\n"),
1634 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0));
1639 disasm_info
.flavour
= bfd_get_flavour (abfd
);
1640 disasm_info
.arch
= bfd_get_arch (abfd
);
1641 disasm_info
.mach
= bfd_get_mach (abfd
);
1642 disasm_info
.disassembler_options
= disassembler_options
;
1644 if (bfd_big_endian (abfd
))
1645 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_BIG
;
1646 else if (bfd_little_endian (abfd
))
1647 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_LITTLE
;
1649 /* ??? Aborting here seems too drastic. We could default to big or little
1651 disasm_info
.endian
= BFD_ENDIAN_UNKNOWN
;
1653 for (section
= abfd
->sections
;
1654 section
!= (asection
*) NULL
;
1655 section
= section
->next
)
1657 bfd_byte
*data
= NULL
;
1658 bfd_size_type datasize
= 0;
1659 arelent
**relbuf
= NULL
;
1660 arelent
**relpp
= NULL
;
1661 arelent
**relppend
= NULL
;
1662 unsigned long stop_offset
;
1663 asymbol
*sym
= NULL
;
1666 if ((section
->flags
& SEC_LOAD
) == 0
1667 || (! disassemble_all
1669 && (section
->flags
& SEC_CODE
) == 0))
1671 if (only
!= (char *) NULL
&& strcmp (only
, section
->name
) != 0)
1675 && (section
->flags
& SEC_RELOC
) != 0)
1679 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
1681 bfd_fatal (bfd_get_filename (abfd
));
1687 relbuf
= (arelent
**) xmalloc (relsize
);
1688 relcount
= bfd_canonicalize_reloc (abfd
, section
, relbuf
, syms
);
1690 bfd_fatal (bfd_get_filename (abfd
));
1692 /* Sort the relocs by address. */
1693 qsort (relbuf
, relcount
, sizeof (arelent
*), compare_relocs
);
1696 relppend
= relpp
+ relcount
;
1698 /* Skip over the relocs belonging to addresses below the
1700 if (start_address
!= (bfd_vma
) -1)
1702 while (relpp
< relppend
1703 && (*relpp
)->address
< start_address
)
1709 printf (_("Disassembly of section %s:\n"), section
->name
);
1711 datasize
= bfd_get_section_size_before_reloc (section
);
1715 data
= (bfd_byte
*) xmalloc ((size_t) datasize
);
1717 bfd_get_section_contents (abfd
, section
, data
, 0, datasize
);
1720 disasm_info
.buffer
= data
;
1721 disasm_info
.buffer_vma
= section
->vma
;
1722 disasm_info
.buffer_length
= datasize
;
1723 if (start_address
== (bfd_vma
) -1
1724 || start_address
< disasm_info
.buffer_vma
)
1727 addr_offset
= start_address
- disasm_info
.buffer_vma
;
1728 if (stop_address
== (bfd_vma
) -1)
1729 stop_offset
= datasize
/ opb
;
1732 if (stop_address
< disasm_info
.buffer_vma
)
1735 stop_offset
= stop_address
- disasm_info
.buffer_vma
;
1736 if (stop_offset
> disasm_info
.buffer_length
/ opb
)
1737 stop_offset
= disasm_info
.buffer_length
/ opb
;
1740 sym
= find_symbol_for_address (abfd
, section
, section
->vma
+ addr_offset
,
1743 while (addr_offset
< stop_offset
)
1746 unsigned long nextstop_offset
;
1749 if (sym
!= NULL
&& bfd_asymbol_value (sym
) <= section
->vma
+ addr_offset
)
1754 (x
< sorted_symcount
1755 && bfd_asymbol_value (sorted_syms
[x
]) <= section
->vma
+ addr_offset
);
1758 disasm_info
.symbols
= & sorted_syms
[place
];
1759 disasm_info
.num_symbols
= x
- place
;
1762 disasm_info
.symbols
= NULL
;
1764 if (! prefix_addresses
)
1767 objdump_print_addr_with_sym (abfd
, section
, sym
,
1768 section
->vma
+ addr_offset
,
1774 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > section
->vma
+ addr_offset
)
1776 else if (sym
== NULL
)
1780 /* Search forward for the next appropriate symbol in
1781 SECTION. Note that all the symbols are sorted
1782 together into one big array, and that some sections
1783 may have overlapping addresses. */
1784 while (place
< sorted_symcount
1785 && (sorted_syms
[place
]->section
!= section
1786 || (bfd_asymbol_value (sorted_syms
[place
])
1787 <= bfd_asymbol_value (sym
))))
1789 if (place
>= sorted_symcount
)
1792 nextsym
= sorted_syms
[place
];
1795 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > section
->vma
+ addr_offset
)
1797 nextstop_offset
= bfd_asymbol_value (sym
) - section
->vma
;
1798 if (nextstop_offset
> stop_offset
)
1799 nextstop_offset
= stop_offset
;
1801 else if (nextsym
== NULL
)
1802 nextstop_offset
= stop_offset
;
1805 nextstop_offset
= bfd_asymbol_value (nextsym
) - section
->vma
;
1806 if (nextstop_offset
> stop_offset
)
1807 nextstop_offset
= stop_offset
;
1810 /* If a symbol is explicitly marked as being an object
1811 rather than a function, just dump the bytes without
1812 disassembling them. */
1815 || bfd_asymbol_value (sym
) > section
->vma
+ addr_offset
1816 || ((sym
->flags
& BSF_OBJECT
) == 0
1817 && (strstr (bfd_asymbol_name (sym
), "gnu_compiled")
1819 && (strstr (bfd_asymbol_name (sym
), "gcc2_compiled")
1821 || (sym
->flags
& BSF_FUNCTION
) != 0)
1826 disassemble_bytes (&disasm_info
, disassemble_fn
, insns
, data
,
1827 addr_offset
, nextstop_offset
, &relpp
, relppend
);
1829 addr_offset
= nextstop_offset
;
1841 /* Define a table of stab values and print-strings. We wish the initializer
1842 could be a direct-mapped table, but instead we build one the first
1845 static void dump_section_stabs
PARAMS ((bfd
*abfd
, char *stabsect_name
,
1846 char *strsect_name
));
1848 /* Dump the stabs sections from an object file that has a section that
1849 uses Sun stabs encoding. */
1855 dump_section_stabs (abfd
, ".stab", ".stabstr");
1856 dump_section_stabs (abfd
, ".stab.excl", ".stab.exclstr");
1857 dump_section_stabs (abfd
, ".stab.index", ".stab.indexstr");
1858 dump_section_stabs (abfd
, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1861 static bfd_byte
*stabs
;
1862 static bfd_size_type stab_size
;
1864 static char *strtab
;
1865 static bfd_size_type stabstr_size
;
1867 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1868 and string table section STRSECT_NAME into `strtab'.
1869 If the section exists and was read, allocate the space and return true.
1870 Otherwise return false. */
1873 read_section_stabs (abfd
, stabsect_name
, strsect_name
)
1875 const char *stabsect_name
;
1876 const char *strsect_name
;
1878 asection
*stabsect
, *stabstrsect
;
1880 stabsect
= bfd_get_section_by_name (abfd
, stabsect_name
);
1883 printf (_("No %s section present\n\n"), stabsect_name
);
1887 stabstrsect
= bfd_get_section_by_name (abfd
, strsect_name
);
1888 if (0 == stabstrsect
)
1890 fprintf (stderr
, _("%s: %s has no %s section\n"), program_name
,
1891 bfd_get_filename (abfd
), strsect_name
);
1896 stab_size
= bfd_section_size (abfd
, stabsect
);
1897 stabstr_size
= bfd_section_size (abfd
, stabstrsect
);
1899 stabs
= (bfd_byte
*) xmalloc (stab_size
);
1900 strtab
= (char *) xmalloc (stabstr_size
);
1902 if (! bfd_get_section_contents (abfd
, stabsect
, (PTR
) stabs
, 0, stab_size
))
1904 fprintf (stderr
, _("%s: Reading %s section of %s failed: %s\n"),
1905 program_name
, stabsect_name
, bfd_get_filename (abfd
),
1906 bfd_errmsg (bfd_get_error ()));
1913 if (! bfd_get_section_contents (abfd
, stabstrsect
, (PTR
) strtab
, 0,
1916 fprintf (stderr
, _("%s: Reading %s section of %s failed: %s\n"),
1917 program_name
, strsect_name
, bfd_get_filename (abfd
),
1918 bfd_errmsg (bfd_get_error ()));
1928 /* Stabs entries use a 12 byte format:
1929 4 byte string table index
1931 1 byte stab other field
1932 2 byte stab desc field
1934 FIXME: This will have to change for a 64 bit object format. */
1936 #define STRDXOFF (0)
1938 #define OTHEROFF (5)
1941 #define STABSIZE (12)
1943 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1944 using string table section STRSECT_NAME (in `strtab'). */
1947 print_section_stabs (abfd
, stabsect_name
, strsect_name
)
1949 const char *stabsect_name
;
1950 const char *strsect_name ATTRIBUTE_UNUSED
;
1953 unsigned file_string_table_offset
= 0, next_file_string_table_offset
= 0;
1954 bfd_byte
*stabp
, *stabs_end
;
1957 stabs_end
= stabp
+ stab_size
;
1959 printf (_("Contents of %s section:\n\n"), stabsect_name
);
1960 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1962 /* Loop through all symbols and print them.
1964 We start the index at -1 because there is a dummy symbol on
1965 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1967 for (i
= -1; stabp
< stabs_end
; stabp
+= STABSIZE
, i
++)
1971 unsigned char type
, other
;
1972 unsigned short desc
;
1975 strx
= bfd_h_get_32 (abfd
, stabp
+ STRDXOFF
);
1976 type
= bfd_h_get_8 (abfd
, stabp
+ TYPEOFF
);
1977 other
= bfd_h_get_8 (abfd
, stabp
+ OTHEROFF
);
1978 desc
= bfd_h_get_16 (abfd
, stabp
+ DESCOFF
);
1979 value
= bfd_h_get_32 (abfd
, stabp
+ VALOFF
);
1981 printf ("\n%-6d ", i
);
1982 /* Either print the stab name, or, if unnamed, print its number
1983 again (makes consistent formatting for tools like awk). */
1984 name
= bfd_get_stab_name (type
);
1986 printf ("%-6s", name
);
1987 else if (type
== N_UNDF
)
1990 printf ("%-6d", type
);
1991 printf (" %-6d %-6d ", other
, desc
);
1993 printf (" %-6lu", strx
);
1995 /* Symbols with type == 0 (N_UNDF) specify the length of the
1996 string table associated with this file. We use that info
1997 to know how to relocate the *next* file's string table indices. */
2001 file_string_table_offset
= next_file_string_table_offset
;
2002 next_file_string_table_offset
+= value
;
2006 /* Using the (possibly updated) string table offset, print the
2007 string (if any) associated with this symbol. */
2009 if ((strx
+ file_string_table_offset
) < stabstr_size
)
2010 printf (" %s", &strtab
[strx
+ file_string_table_offset
]);
2019 dump_section_stabs (abfd
, stabsect_name
, strsect_name
)
2021 char *stabsect_name
;
2026 /* Check for section names for which stabsect_name is a prefix, to
2027 handle .stab0, etc. */
2028 for (s
= abfd
->sections
;
2034 len
= strlen (stabsect_name
);
2036 /* If the prefix matches, and the files section name ends with a
2037 nul or a digit, then we match. I.e., we want either an exact
2038 match or a section followed by a number. */
2039 if (strncmp (stabsect_name
, s
->name
, len
) == 0
2040 && (s
->name
[len
] == '\000'
2041 || isdigit ((unsigned char) s
->name
[len
])))
2043 if (read_section_stabs (abfd
, s
->name
, strsect_name
))
2045 print_section_stabs (abfd
, s
->name
, strsect_name
);
2054 dump_bfd_header (abfd
)
2059 printf (_("architecture: %s, "),
2060 bfd_printable_arch_mach (bfd_get_arch (abfd
),
2061 bfd_get_mach (abfd
)));
2062 printf (_("flags 0x%08x:\n"), abfd
->flags
);
2064 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2065 PF (HAS_RELOC
, "HAS_RELOC");
2066 PF (EXEC_P
, "EXEC_P");
2067 PF (HAS_LINENO
, "HAS_LINENO");
2068 PF (HAS_DEBUG
, "HAS_DEBUG");
2069 PF (HAS_SYMS
, "HAS_SYMS");
2070 PF (HAS_LOCALS
, "HAS_LOCALS");
2071 PF (DYNAMIC
, "DYNAMIC");
2072 PF (WP_TEXT
, "WP_TEXT");
2073 PF (D_PAGED
, "D_PAGED");
2074 PF (BFD_IS_RELAXABLE
, "BFD_IS_RELAXABLE");
2075 printf (_("\nstart address 0x"));
2076 printf_vma (abfd
->start_address
);
2081 dump_bfd_private_header (abfd
)
2084 bfd_print_private_bfd_data (abfd
, stdout
);
2087 /* Dump selected contents of ABFD */
2093 /* If we are adjusting section VMA's, change them all now. Changing
2094 the BFD information is a hack. However, we must do it, or
2095 bfd_find_nearest_line will not do the right thing. */
2096 if (adjust_section_vma
!= 0)
2100 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
2102 s
->vma
+= adjust_section_vma
;
2103 s
->lma
+= adjust_section_vma
;
2107 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd
),
2110 print_arelt_descr (stdout
, abfd
, true);
2111 if (dump_file_header
)
2112 dump_bfd_header (abfd
);
2113 if (dump_private_headers
)
2114 dump_bfd_private_header (abfd
);
2116 if (dump_section_headers
)
2117 dump_headers (abfd
);
2118 if (dump_symtab
|| dump_reloc_info
|| disassemble
|| dump_debugging
)
2120 syms
= slurp_symtab (abfd
);
2122 if (dump_dynamic_symtab
|| dump_dynamic_reloc_info
)
2124 dynsyms
= slurp_dynamic_symtab (abfd
);
2127 dump_symbols (abfd
, false);
2128 if (dump_dynamic_symtab
)
2129 dump_symbols (abfd
, true);
2130 if (dump_stab_section_info
)
2132 if (dump_reloc_info
&& ! disassemble
)
2134 if (dump_dynamic_reloc_info
)
2135 dump_dynamic_relocs (abfd
);
2136 if (dump_section_contents
)
2139 disassemble_data (abfd
);
2144 dhandle
= read_debugging_info (abfd
, syms
, symcount
);
2145 if (dhandle
!= NULL
)
2147 if (! print_debugging_info (stdout
, dhandle
))
2150 _("%s: printing debugging information failed\n"),
2151 bfd_get_filename (abfd
));
2174 if (bfd_check_format_matches (abfd
, bfd_object
, &matching
))
2180 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
2182 nonfatal (bfd_get_filename (abfd
));
2183 list_matching_formats (matching
);
2188 if (bfd_get_error () != bfd_error_file_not_recognized
)
2190 nonfatal (bfd_get_filename (abfd
));
2194 if (bfd_check_format_matches (abfd
, bfd_core
, &matching
))
2200 nonfatal (bfd_get_filename (abfd
));
2202 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
2204 list_matching_formats (matching
);
2210 display_file (filename
, target
)
2214 bfd
*file
, *arfile
= (bfd
*) NULL
;
2216 file
= bfd_openr (filename
, target
);
2219 nonfatal (filename
);
2223 if (bfd_check_format (file
, bfd_archive
) == true)
2225 bfd
*last_arfile
= NULL
;
2227 printf (_("In archive %s:\n"), bfd_get_filename (file
));
2230 bfd_set_error (bfd_error_no_error
);
2232 arfile
= bfd_openr_next_archived_file (file
, arfile
);
2235 if (bfd_get_error () != bfd_error_no_more_archived_files
)
2236 nonfatal (bfd_get_filename (file
));
2240 display_bfd (arfile
);
2242 if (last_arfile
!= NULL
)
2243 bfd_close (last_arfile
);
2244 last_arfile
= arfile
;
2247 if (last_arfile
!= NULL
)
2248 bfd_close (last_arfile
);
2256 /* Actually display the various requested regions */
2264 bfd_size_type datasize
= 0;
2265 bfd_size_type addr_offset
;
2266 bfd_size_type start_offset
, stop_offset
;
2267 unsigned int opb
= bfd_octets_per_byte (abfd
);
2269 for (section
= abfd
->sections
; section
!= NULL
; section
=
2274 if (only
== (char *) NULL
||
2275 strcmp (only
, section
->name
) == 0)
2277 if (section
->flags
& SEC_HAS_CONTENTS
)
2279 printf (_("Contents of section %s:\n"), section
->name
);
2281 if (bfd_section_size (abfd
, section
) == 0)
2283 data
= (bfd_byte
*) xmalloc ((size_t) bfd_section_size (abfd
, section
));
2284 datasize
= bfd_section_size (abfd
, section
);
2287 bfd_get_section_contents (abfd
, section
, (PTR
) data
, 0, bfd_section_size (abfd
, section
));
2289 if (start_address
== (bfd_vma
) -1
2290 || start_address
< section
->vma
)
2293 start_offset
= start_address
- section
->vma
;
2294 if (stop_address
== (bfd_vma
) -1)
2295 stop_offset
= bfd_section_size (abfd
, section
) / opb
;
2298 if (stop_address
< section
->vma
)
2301 stop_offset
= stop_address
- section
->vma
;
2302 if (stop_offset
> bfd_section_size (abfd
, section
) / opb
)
2303 stop_offset
= bfd_section_size (abfd
, section
) / opb
;
2305 for (addr_offset
= start_offset
;
2306 addr_offset
< stop_offset
; addr_offset
+= onaline
)
2310 printf (" %04lx ", (unsigned long int)
2311 (addr_offset
+ section
->vma
));
2312 for (j
= addr_offset
* opb
;
2313 j
< addr_offset
* opb
+ onaline
; j
++)
2315 if (j
< stop_offset
* opb
)
2316 printf ("%02x", (unsigned) (data
[j
]));
2324 for (j
= addr_offset
; j
< addr_offset
* opb
+ onaline
; j
++)
2326 if (j
>= stop_offset
* opb
)
2329 printf ("%c", isprint (data
[j
]) ? data
[j
] : '.');
2339 /* Should perhaps share code and display with nm? */
2341 dump_symbols (abfd
, dynamic
)
2342 bfd
*abfd ATTRIBUTE_UNUSED
;
2355 printf ("DYNAMIC SYMBOL TABLE:\n");
2363 printf ("SYMBOL TABLE:\n");
2366 for (count
= 0; count
< max
; count
++)
2370 bfd
*cur_bfd
= bfd_asymbol_bfd (*current
);
2372 if (cur_bfd
!= NULL
)
2377 name
= bfd_asymbol_name (*current
);
2379 if (do_demangle
&& name
!= NULL
&& *name
!= '\0')
2383 /* If we want to demangle the name, we demangle it
2384 here, and temporarily clobber it while calling
2385 bfd_print_symbol. FIXME: This is a gross hack. */
2388 if (bfd_get_symbol_leading_char (cur_bfd
) == *n
)
2390 alloc
= cplus_demangle (n
, DMGL_ANSI
| DMGL_PARAMS
);
2392 (*current
)->name
= alloc
;
2394 (*current
)->name
= n
;
2397 bfd_print_symbol (cur_bfd
, stdout
, *current
,
2398 bfd_print_symbol_all
);
2400 (*current
)->name
= name
;
2421 for (a
= abfd
->sections
; a
!= (asection
*) NULL
; a
= a
->next
)
2425 if (bfd_is_abs_section (a
))
2427 if (bfd_is_und_section (a
))
2429 if (bfd_is_com_section (a
))
2434 if (strcmp (only
, a
->name
))
2437 else if ((a
->flags
& SEC_RELOC
) == 0)
2440 relsize
= bfd_get_reloc_upper_bound (abfd
, a
);
2442 bfd_fatal (bfd_get_filename (abfd
));
2444 printf ("RELOCATION RECORDS FOR [%s]:", a
->name
);
2448 printf (" (none)\n\n");
2452 relpp
= (arelent
**) xmalloc (relsize
);
2453 relcount
= bfd_canonicalize_reloc (abfd
, a
, relpp
, syms
);
2455 bfd_fatal (bfd_get_filename (abfd
));
2456 else if (relcount
== 0)
2458 printf (" (none)\n\n");
2463 dump_reloc_set (abfd
, a
, relpp
, relcount
);
2472 dump_dynamic_relocs (abfd
)
2479 relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
2481 bfd_fatal (bfd_get_filename (abfd
));
2483 printf ("DYNAMIC RELOCATION RECORDS");
2487 printf (" (none)\n\n");
2491 relpp
= (arelent
**) xmalloc (relsize
);
2492 relcount
= bfd_canonicalize_dynamic_reloc (abfd
, relpp
, dynsyms
);
2494 bfd_fatal (bfd_get_filename (abfd
));
2495 else if (relcount
== 0)
2497 printf (" (none)\n\n");
2502 dump_reloc_set (abfd
, (asection
*) NULL
, relpp
, relcount
);
2510 dump_reloc_set (abfd
, sec
, relpp
, relcount
)
2517 char *last_filename
, *last_functionname
;
2518 unsigned int last_line
;
2520 /* Get column headers lined up reasonably. */
2526 sprintf_vma (buf
, (bfd_vma
) -1);
2527 width
= strlen (buf
) - 7;
2529 printf ("OFFSET %*s TYPE %*s VALUE \n", width
, "", 12, "");
2532 last_filename
= NULL
;
2533 last_functionname
= NULL
;
2536 for (p
= relpp
; relcount
&& *p
!= (arelent
*) NULL
; p
++, relcount
--)
2539 const char *filename
, *functionname
;
2541 const char *sym_name
;
2542 const char *section_name
;
2544 if (start_address
!= (bfd_vma
) -1
2545 && q
->address
< start_address
)
2547 if (stop_address
!= (bfd_vma
) -1
2548 && q
->address
> stop_address
)
2551 if (with_line_numbers
2553 && bfd_find_nearest_line (abfd
, sec
, syms
, q
->address
,
2554 &filename
, &functionname
, &line
))
2556 if (functionname
!= NULL
2557 && (last_functionname
== NULL
2558 || strcmp (functionname
, last_functionname
) != 0))
2560 printf ("%s():\n", functionname
);
2561 if (last_functionname
!= NULL
)
2562 free (last_functionname
);
2563 last_functionname
= xstrdup (functionname
);
2566 && (line
!= last_line
2567 || (filename
!= NULL
2568 && last_filename
!= NULL
2569 && strcmp (filename
, last_filename
) != 0)))
2571 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
2573 if (last_filename
!= NULL
)
2574 free (last_filename
);
2575 if (filename
== NULL
)
2576 last_filename
= NULL
;
2578 last_filename
= xstrdup (filename
);
2582 if (q
->sym_ptr_ptr
&& *q
->sym_ptr_ptr
)
2584 sym_name
= (*(q
->sym_ptr_ptr
))->name
;
2585 section_name
= (*(q
->sym_ptr_ptr
))->section
->name
;
2590 section_name
= NULL
;
2594 printf_vma (q
->address
);
2596 printf (" %-16s ", q
->howto
->name
);
2598 printf (" %-16d ", q
->howto
->type
);
2599 objdump_print_symname (abfd
, (struct disassemble_info
*) NULL
,
2604 if (section_name
== (CONST
char *) NULL
)
2605 section_name
= "*unknown*";
2606 printf_vma (q
->address
);
2607 printf (" %-16s [%s]",
2614 printf_vma (q
->addend
);
2620 /* The length of the longest architecture name + 1. */
2621 #define LONGEST_ARCH sizeof("rs6000:6000")
2624 endian_string (endian
)
2625 enum bfd_endian endian
;
2627 if (endian
== BFD_ENDIAN_BIG
)
2628 return "big endian";
2629 else if (endian
== BFD_ENDIAN_LITTLE
)
2630 return "little endian";
2632 return "endianness unknown";
2635 /* List the targets that BFD is configured to support, each followed
2636 by its endianness and the architectures it supports. */
2639 display_target_list ()
2641 extern bfd_target
*bfd_target_vector
[];
2645 dummy_name
= choose_temp_base ();
2646 for (t
= 0; bfd_target_vector
[t
]; t
++)
2648 bfd_target
*p
= bfd_target_vector
[t
];
2649 bfd
*abfd
= bfd_openw (dummy_name
, p
->name
);
2652 printf ("%s\n (header %s, data %s)\n", p
->name
,
2653 endian_string (p
->header_byteorder
),
2654 endian_string (p
->byteorder
));
2658 nonfatal (dummy_name
);
2662 if (! bfd_set_format (abfd
, bfd_object
))
2664 if (bfd_get_error () != bfd_error_invalid_operation
)
2669 for (a
= (int) bfd_arch_obscure
+ 1; a
< (int) bfd_arch_last
; a
++)
2670 if (bfd_set_arch_mach (abfd
, (enum bfd_architecture
) a
, 0))
2672 bfd_printable_arch_mach ((enum bfd_architecture
) a
, 0));
2674 unlink (dummy_name
);
2678 /* Print a table showing which architectures are supported for entries
2679 FIRST through LAST-1 of bfd_target_vector (targets across,
2680 architectures down). */
2683 display_info_table (first
, last
)
2687 extern bfd_target
*bfd_target_vector
[];
2691 /* Print heading of target names. */
2692 printf ("\n%*s", (int) LONGEST_ARCH
, " ");
2693 for (t
= first
; t
< last
&& bfd_target_vector
[t
]; t
++)
2694 printf ("%s ", bfd_target_vector
[t
]->name
);
2697 dummy_name
= choose_temp_base ();
2698 for (a
= (int) bfd_arch_obscure
+ 1; a
< (int) bfd_arch_last
; a
++)
2699 if (strcmp (bfd_printable_arch_mach (a
, 0), "UNKNOWN!") != 0)
2701 printf ("%*s ", (int) LONGEST_ARCH
- 1,
2702 bfd_printable_arch_mach (a
, 0));
2703 for (t
= first
; t
< last
&& bfd_target_vector
[t
]; t
++)
2705 bfd_target
*p
= bfd_target_vector
[t
];
2707 bfd
*abfd
= bfd_openw (dummy_name
, p
->name
);
2717 if (! bfd_set_format (abfd
, bfd_object
))
2719 if (bfd_get_error () != bfd_error_invalid_operation
)
2727 if (! bfd_set_arch_mach (abfd
, a
, 0))
2732 printf ("%s ", p
->name
);
2735 int l
= strlen (p
->name
);
2743 unlink (dummy_name
);
2747 /* Print tables of all the target-architecture combinations that
2748 BFD has been configured to support. */
2751 display_target_tables ()
2754 extern bfd_target
*bfd_target_vector
[];
2758 colum
= getenv ("COLUMNS");
2760 columns
= atoi (colum
);
2765 while (bfd_target_vector
[t
] != NULL
)
2769 wid
= LONGEST_ARCH
+ strlen (bfd_target_vector
[t
]->name
) + 1;
2771 while (wid
< columns
&& bfd_target_vector
[t
] != NULL
)
2775 newwid
= wid
+ strlen (bfd_target_vector
[t
]->name
) + 1;
2776 if (newwid
>= columns
)
2781 display_info_table (oldt
, t
);
2788 printf (_("BFD header file version %s\n"), BFD_VERSION
);
2789 display_target_list ();
2790 display_target_tables ();
2799 char *target
= default_target
;
2800 boolean seenflag
= false;
2802 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2803 setlocale (LC_MESSAGES
, "");
2805 bindtextdomain (PACKAGE
, LOCALEDIR
);
2806 textdomain (PACKAGE
);
2808 program_name
= *argv
;
2809 xmalloc_set_program_name (program_name
);
2811 START_PROGRESS (program_name
, 0);
2814 set_default_bfd_target ();
2816 while ((c
= getopt_long (argc
, argv
, "pib:m:M:VCdDlfahHrRtTxsSj:wE:zgG",
2817 long_options
, (int *) 0))
2823 break; /* we've been given a long option */
2828 disassembler_options
= optarg
;
2834 with_line_numbers
= true;
2845 case OPTION_ADJUST_VMA
:
2846 adjust_section_vma
= parse_vma (optarg
, "--adjust-vma");
2848 case OPTION_START_ADDRESS
:
2849 start_address
= parse_vma (optarg
, "--start-address");
2851 case OPTION_STOP_ADDRESS
:
2852 stop_address
= parse_vma (optarg
, "--stop-address");
2855 if (strcmp (optarg
, "B") == 0)
2856 endian
= BFD_ENDIAN_BIG
;
2857 else if (strcmp (optarg
, "L") == 0)
2858 endian
= BFD_ENDIAN_LITTLE
;
2861 fprintf (stderr
, _("%s: unrecognized -E option\n"),
2867 if (strncmp (optarg
, "big", strlen (optarg
)) == 0)
2868 endian
= BFD_ENDIAN_BIG
;
2869 else if (strncmp (optarg
, "little", strlen (optarg
)) == 0)
2870 endian
= BFD_ENDIAN_LITTLE
;
2873 fprintf (stderr
, _("%s: unrecognized --endian type `%s'\n"),
2874 program_name
, optarg
);
2880 dump_file_header
= true;
2884 formats_info
= true;
2888 dump_private_headers
= true;
2892 dump_private_headers
= true;
2894 dump_reloc_info
= true;
2895 dump_file_header
= true;
2896 dump_ar_hdrs
= true;
2897 dump_section_headers
= true;
2905 dump_dynamic_symtab
= true;
2913 disassemble_zeroes
= true;
2917 disassemble_all
= true;
2922 with_source_code
= true;
2930 dump_stab_section_info
= true;
2934 dump_section_contents
= true;
2938 dump_reloc_info
= true;
2942 dump_dynamic_reloc_info
= true;
2946 dump_ar_hdrs
= true;
2950 dump_section_headers
= true;
2957 show_version
= true;
2967 print_version ("objdump");
2969 if (seenflag
== false)
2977 display_file ("a.out", target
);
2979 for (; optind
< argc
;)
2980 display_file (argv
[optind
++], target
);
2983 END_PROGRESS (program_name
);