1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
27 #include "safe-ctype.h"
29 #include "libiberty.h"
34 /* Internal headers for the ELF .stab-dump code - sorry. */
35 #define BYTES_IN_WORD 32
36 #include "aout/aout64.h"
38 #ifdef NEED_DECLARATION_FPRINTF
39 /* This is needed by INIT_DISASSEMBLE_INFO. */
40 extern int fprintf
PARAMS ((FILE *, const char *, ...));
44 static int exit_status
= 0;
46 static char *default_target
= NULL
; /* default at runtime */
48 static int show_version
= 0; /* show the version number */
49 static int dump_section_contents
; /* -s */
50 static int dump_section_headers
; /* -h */
51 static boolean dump_file_header
; /* -f */
52 static int dump_symtab
; /* -t */
53 static int dump_dynamic_symtab
; /* -T */
54 static int dump_reloc_info
; /* -r */
55 static int dump_dynamic_reloc_info
; /* -R */
56 static int dump_ar_hdrs
; /* -a */
57 static int dump_private_headers
; /* -p */
58 static int prefix_addresses
; /* --prefix-addresses */
59 static int with_line_numbers
; /* -l */
60 static boolean with_source_code
; /* -S */
61 static int show_raw_insn
; /* --show-raw-insn */
62 static int dump_stab_section_info
; /* --stabs */
63 static int do_demangle
; /* -C, --demangle */
64 static boolean disassemble
; /* -d */
65 static boolean disassemble_all
; /* -D */
66 static int disassemble_zeroes
; /* --disassemble-zeroes */
67 static boolean formats_info
; /* -i */
68 static char *only
; /* -j secname */
69 static int wide_output
; /* -w */
70 static bfd_vma start_address
= (bfd_vma
) -1; /* --start-address */
71 static bfd_vma stop_address
= (bfd_vma
) -1; /* --stop-address */
72 static int dump_debugging
; /* --debugging */
73 static bfd_vma adjust_section_vma
= 0; /* --adjust-vma */
74 static int file_start_context
= 0; /* --file-start-context */
76 /* Extra info to pass to the disassembler address printing function. */
77 struct objdump_disasm_info
{
83 /* Architecture to disassemble for, or default if NULL. */
84 static char *machine
= (char *) NULL
;
86 /* Target specific options to the disassembler. */
87 static char *disassembler_options
= (char *) NULL
;
89 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
90 static enum bfd_endian endian
= BFD_ENDIAN_UNKNOWN
;
92 /* The symbol table. */
93 static asymbol
**syms
;
95 /* Number of symbols in `syms'. */
96 static long symcount
= 0;
98 /* The sorted symbol table. */
99 static asymbol
**sorted_syms
;
101 /* Number of symbols in `sorted_syms'. */
102 static long sorted_symcount
= 0;
104 /* The dynamic symbol table. */
105 static asymbol
**dynsyms
;
107 /* Number of symbols in `dynsyms'. */
108 static long dynsymcount
= 0;
110 /* Static declarations. */
112 static void usage
PARAMS ((FILE *, int));
113 static void nonfatal
PARAMS ((const char *));
114 static void display_file
PARAMS ((char *filename
, char *target
));
115 static void dump_section_header
PARAMS ((bfd
*, asection
*, PTR
));
116 static void dump_headers
PARAMS ((bfd
*));
117 static void dump_data
PARAMS ((bfd
*abfd
));
118 static void dump_relocs
PARAMS ((bfd
*abfd
));
119 static void dump_dynamic_relocs
PARAMS ((bfd
* abfd
));
120 static void dump_reloc_set
PARAMS ((bfd
*, asection
*, arelent
**, long));
121 static void dump_symbols
PARAMS ((bfd
*abfd
, boolean dynamic
));
122 static void dump_bfd_header
PARAMS ((bfd
*));
123 static void dump_bfd_private_header
PARAMS ((bfd
*));
124 static void dump_bfd
PARAMS ((bfd
*));
125 static void display_bfd
PARAMS ((bfd
*abfd
));
126 static void display_target_list
PARAMS ((void));
127 static void display_info_table
PARAMS ((int, int));
128 static void display_target_tables
PARAMS ((void));
129 static void display_info
PARAMS ((void));
130 static void objdump_print_value
131 PARAMS ((bfd_vma
, struct disassemble_info
*, boolean
));
132 static void objdump_print_symname
133 PARAMS ((bfd
*, struct disassemble_info
*, asymbol
*));
134 static asymbol
*find_symbol_for_address
135 PARAMS ((bfd
*, asection
*, bfd_vma
, boolean
, long *));
136 static void objdump_print_addr_with_sym
137 PARAMS ((bfd
*, asection
*, asymbol
*, bfd_vma
,
138 struct disassemble_info
*, boolean
));
139 static void objdump_print_addr
140 PARAMS ((bfd_vma
, struct disassemble_info
*, boolean
));
141 static void objdump_print_address
142 PARAMS ((bfd_vma
, struct disassemble_info
*));
143 static int objdump_symbol_at_address
144 PARAMS ((bfd_vma
, struct disassemble_info
*));
145 static void show_line
PARAMS ((bfd
*, asection
*, bfd_vma
));
146 static void disassemble_bytes
147 PARAMS ((struct disassemble_info
*, disassembler_ftype
, boolean
,
148 bfd_byte
*, bfd_vma
, bfd_vma
, arelent
***, arelent
**));
149 static void disassemble_data
PARAMS ((bfd
*));
150 static const char *endian_string
PARAMS ((enum bfd_endian
));
151 static asymbol
** slurp_symtab
PARAMS ((bfd
*));
152 static asymbol
** slurp_dynamic_symtab
PARAMS ((bfd
*));
153 static long remove_useless_symbols
PARAMS ((asymbol
**, long));
154 static int compare_symbols
PARAMS ((const PTR
, const PTR
));
155 static int compare_relocs
PARAMS ((const PTR
, const PTR
));
156 static void dump_stabs
PARAMS ((bfd
*));
157 static boolean read_section_stabs
PARAMS ((bfd
*, const char *, const char *));
158 static void print_section_stabs
PARAMS ((bfd
*, const char *, const char *));
161 usage (stream
, status
)
165 fprintf (stream
, _("Usage: %s <option(s)> <file(s)>\n"), program_name
);
166 fprintf (stream
, _(" Display information from object <file(s)>.\n"));
167 fprintf (stream
, _(" At least one of the following switches must be given:\n"));
168 fprintf (stream
, _("\
169 -a, --archive-headers Display archive header information\n\
170 -f, --file-headers Display the contents of the overall file header\n\
171 -p, --private-headers Display object format specific file header contents\n\
172 -h, --[section-]headers Display the contents of the section headers\n\
173 -x, --all-headers Display the contents of all headers\n\
174 -d, --disassemble Display assembler contents of executable sections\n\
175 -D, --disassemble-all Display assembler contents of all sections\n\
176 -S, --source Intermix source code with disassembly\n\
177 -s, --full-contents Display the full contents of all sections requested\n\
178 -g, --debugging Display debug information in object file\n\
179 -G, --stabs Display (in raw form) any STABS info in the file\n\
180 -t, --syms Display the contents of the symbol table(s)\n\
181 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
182 -r, --reloc Display the relocation entries in the file\n\
183 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
184 -v, --version Display this program's version number\n\
185 -i, --info List object formats and architectures supported\n\
186 -H, --help Display this information\n\
190 fprintf (stream
, _("\n The following switches are optional:\n"));
191 fprintf (stream
, _("\
192 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
193 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
194 -j, --section=NAME Only display information for section NAME\n\
195 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
196 -EB --endian=big Assume big endian format when disassembling\n\
197 -EL --endian=little Assume little endian format when disassembling\n\
198 --file-start-context Include context from start of file (with -S)\n\
199 -l, --line-numbers Include line numbers and filenames in output\n\
200 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
201 The STYLE, if specified, can be `auto', 'gnu',\n\
202 'lucid', 'arm', 'hp', 'edg', or 'gnu-new-abi'\n\
203 -w, --wide Format output for more than 80 columns\n\
204 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
205 --start-address=ADDR Only process data whoes address is >= ADDR\n\
206 --stop-address=ADDR Only process data whoes address is <= ADDR\n\
207 --prefix-addresses Print complete address alongside disassembly\n\
208 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
209 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
211 list_supported_targets (program_name
, stream
);
212 list_supported_architectures (program_name
, stream
);
214 disassembler_usage (stream
);
217 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
221 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
223 #define OPTION_ENDIAN (150)
224 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
225 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
226 #define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
228 static struct option long_options
[]=
230 {"adjust-vma", required_argument
, NULL
, OPTION_ADJUST_VMA
},
231 {"all-headers", no_argument
, NULL
, 'x'},
232 {"private-headers", no_argument
, NULL
, 'p'},
233 {"architecture", required_argument
, NULL
, 'm'},
234 {"archive-headers", no_argument
, NULL
, 'a'},
235 {"debugging", no_argument
, NULL
, 'g'},
236 {"demangle", optional_argument
, NULL
, 'C'},
237 {"disassemble", no_argument
, NULL
, 'd'},
238 {"disassemble-all", no_argument
, NULL
, 'D'},
239 {"disassembler-options", required_argument
, NULL
, 'M'},
240 {"disassemble-zeroes", no_argument
, NULL
, 'z'},
241 {"dynamic-reloc", no_argument
, NULL
, 'R'},
242 {"dynamic-syms", no_argument
, NULL
, 'T'},
243 {"endian", required_argument
, NULL
, OPTION_ENDIAN
},
244 {"file-headers", no_argument
, NULL
, 'f'},
245 {"file-start-context", no_argument
, &file_start_context
, 1},
246 {"full-contents", no_argument
, NULL
, 's'},
247 {"headers", no_argument
, NULL
, 'h'},
248 {"help", no_argument
, NULL
, 'H'},
249 {"info", no_argument
, NULL
, 'i'},
250 {"line-numbers", no_argument
, NULL
, 'l'},
251 {"no-show-raw-insn", no_argument
, &show_raw_insn
, -1},
252 {"prefix-addresses", no_argument
, &prefix_addresses
, 1},
253 {"reloc", no_argument
, NULL
, 'r'},
254 {"section", required_argument
, NULL
, 'j'},
255 {"section-headers", no_argument
, NULL
, 'h'},
256 {"show-raw-insn", no_argument
, &show_raw_insn
, 1},
257 {"source", no_argument
, NULL
, 'S'},
258 {"stabs", no_argument
, NULL
, 'G'},
259 {"start-address", required_argument
, NULL
, OPTION_START_ADDRESS
},
260 {"stop-address", required_argument
, NULL
, OPTION_STOP_ADDRESS
},
261 {"syms", no_argument
, NULL
, 't'},
262 {"target", required_argument
, NULL
, 'b'},
263 {"version", no_argument
, NULL
, 'V'},
264 {"wide", no_argument
, NULL
, 'w'},
265 {0, no_argument
, 0, 0}
277 dump_section_header (abfd
, section
, ignored
)
278 bfd
*abfd ATTRIBUTE_UNUSED
;
280 PTR ignored ATTRIBUTE_UNUSED
;
283 unsigned int opb
= bfd_octets_per_byte (abfd
);
285 printf ("%3d %-13s %08lx ", section
->index
,
286 bfd_get_section_name (abfd
, section
),
287 (unsigned long) bfd_section_size (abfd
, section
) / opb
);
288 bfd_printf_vma (abfd
, bfd_get_section_vma (abfd
, section
));
290 bfd_printf_vma (abfd
, section
->lma
);
291 printf (" %08lx 2**%u", (unsigned long) section
->filepos
,
292 bfd_get_section_alignment (abfd
, section
));
298 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
300 PF (SEC_HAS_CONTENTS
, "CONTENTS");
301 PF (SEC_ALLOC
, "ALLOC");
302 PF (SEC_CONSTRUCTOR
, "CONSTRUCTOR");
303 PF (SEC_LOAD
, "LOAD");
304 PF (SEC_RELOC
, "RELOC");
305 PF (SEC_READONLY
, "READONLY");
306 PF (SEC_CODE
, "CODE");
307 PF (SEC_DATA
, "DATA");
309 PF (SEC_DEBUGGING
, "DEBUGGING");
310 PF (SEC_NEVER_LOAD
, "NEVER_LOAD");
311 PF (SEC_EXCLUDE
, "EXCLUDE");
312 PF (SEC_SORT_ENTRIES
, "SORT_ENTRIES");
313 PF (SEC_BLOCK
, "BLOCK");
314 PF (SEC_CLINK
, "CLINK");
315 PF (SEC_SMALL_DATA
, "SMALL_DATA");
316 PF (SEC_SHARED
, "SHARED");
317 PF (SEC_ARCH_BIT_0
, "ARCH_BIT_0");
318 PF (SEC_THREAD_LOCAL
, "THREAD_LOCAL");
320 if ((section
->flags
& SEC_LINK_ONCE
) != 0)
324 switch (section
->flags
& SEC_LINK_DUPLICATES
)
328 case SEC_LINK_DUPLICATES_DISCARD
:
329 ls
= "LINK_ONCE_DISCARD";
331 case SEC_LINK_DUPLICATES_ONE_ONLY
:
332 ls
= "LINK_ONCE_ONE_ONLY";
334 case SEC_LINK_DUPLICATES_SAME_SIZE
:
335 ls
= "LINK_ONCE_SAME_SIZE";
337 case SEC_LINK_DUPLICATES_SAME_CONTENTS
:
338 ls
= "LINK_ONCE_SAME_CONTENTS";
341 printf ("%s%s", comma
, ls
);
343 if (section
->comdat
!= NULL
)
344 printf (" (COMDAT %s %ld)", section
->comdat
->name
,
345 section
->comdat
->symbol
);
358 printf (_("Sections:\n"));
361 printf (_("Idx Name Size VMA LMA File off Algn"));
363 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
364 if (bfd_get_arch_size (abfd
) == 32)
365 printf (_("Idx Name Size VMA LMA File off Algn"));
367 printf (_("Idx Name Size VMA LMA File off Algn"));
371 printf (_(" Flags"));
374 bfd_map_over_sections (abfd
, dump_section_header
, (PTR
) NULL
);
381 asymbol
**sy
= (asymbol
**) NULL
;
384 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
386 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
391 storage
= bfd_get_symtab_upper_bound (abfd
);
393 bfd_fatal (bfd_get_filename (abfd
));
395 sy
= (asymbol
**) xmalloc (storage
);
397 symcount
= bfd_canonicalize_symtab (abfd
, sy
);
399 bfd_fatal (bfd_get_filename (abfd
));
401 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
405 /* Read in the dynamic symbols. */
408 slurp_dynamic_symtab (abfd
)
411 asymbol
**sy
= (asymbol
**) NULL
;
414 storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
417 if (!(bfd_get_file_flags (abfd
) & DYNAMIC
))
419 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd
));
424 bfd_fatal (bfd_get_filename (abfd
));
427 sy
= (asymbol
**) xmalloc (storage
);
429 dynsymcount
= bfd_canonicalize_dynamic_symtab (abfd
, sy
);
431 bfd_fatal (bfd_get_filename (abfd
));
432 if (dynsymcount
== 0)
433 non_fatal (_("%s: No dynamic symbols"), bfd_get_filename (abfd
));
437 /* Filter out (in place) symbols that are useless for disassembly.
438 COUNT is the number of elements in SYMBOLS.
439 Return the number of useful symbols. */
442 remove_useless_symbols (symbols
, count
)
446 register asymbol
**in_ptr
= symbols
, **out_ptr
= symbols
;
450 asymbol
*sym
= *in_ptr
++;
452 if (sym
->name
== NULL
|| sym
->name
[0] == '\0')
454 if (sym
->flags
& (BSF_DEBUGGING
))
456 if (bfd_is_und_section (sym
->section
)
457 || bfd_is_com_section (sym
->section
))
462 return out_ptr
- symbols
;
465 /* Sort symbols into value order. */
468 compare_symbols (ap
, bp
)
472 const asymbol
*a
= *(const asymbol
**)ap
;
473 const asymbol
*b
= *(const asymbol
**)bp
;
477 flagword aflags
, bflags
;
479 if (bfd_asymbol_value (a
) > bfd_asymbol_value (b
))
481 else if (bfd_asymbol_value (a
) < bfd_asymbol_value (b
))
484 if (a
->section
> b
->section
)
486 else if (a
->section
< b
->section
)
489 an
= bfd_asymbol_name (a
);
490 bn
= bfd_asymbol_name (b
);
494 /* The symbols gnu_compiled and gcc2_compiled convey no real
495 information, so put them after other symbols with the same value. */
497 af
= (strstr (an
, "gnu_compiled") != NULL
498 || strstr (an
, "gcc2_compiled") != NULL
);
499 bf
= (strstr (bn
, "gnu_compiled") != NULL
500 || strstr (bn
, "gcc2_compiled") != NULL
);
507 /* We use a heuristic for the file name, to try to sort it after
508 more useful symbols. It may not work on non Unix systems, but it
509 doesn't really matter; the only difference is precisely which
510 symbol names get printed. */
512 #define file_symbol(s, sn, snl) \
513 (((s)->flags & BSF_FILE) != 0 \
514 || ((sn)[(snl) - 2] == '.' \
515 && ((sn)[(snl) - 1] == 'o' \
516 || (sn)[(snl) - 1] == 'a')))
518 af
= file_symbol (a
, an
, anl
);
519 bf
= file_symbol (b
, bn
, bnl
);
526 /* Try to sort global symbols before local symbols before function
527 symbols before debugging symbols. */
532 if ((aflags
& BSF_DEBUGGING
) != (bflags
& BSF_DEBUGGING
))
534 if ((aflags
& BSF_DEBUGGING
) != 0)
539 if ((aflags
& BSF_FUNCTION
) != (bflags
& BSF_FUNCTION
))
541 if ((aflags
& BSF_FUNCTION
) != 0)
546 if ((aflags
& BSF_LOCAL
) != (bflags
& BSF_LOCAL
))
548 if ((aflags
& BSF_LOCAL
) != 0)
553 if ((aflags
& BSF_GLOBAL
) != (bflags
& BSF_GLOBAL
))
555 if ((aflags
& BSF_GLOBAL
) != 0)
561 /* Symbols that start with '.' might be section names, so sort them
562 after symbols that don't start with '.'. */
563 if (an
[0] == '.' && bn
[0] != '.')
565 if (an
[0] != '.' && bn
[0] == '.')
568 /* Finally, if we can't distinguish them in any other way, try to
569 get consistent results by sorting the symbols by name. */
570 return strcmp (an
, bn
);
573 /* Sort relocs into address order. */
576 compare_relocs (ap
, bp
)
580 const arelent
*a
= *(const arelent
**)ap
;
581 const arelent
*b
= *(const arelent
**)bp
;
583 if (a
->address
> b
->address
)
585 else if (a
->address
< b
->address
)
588 /* So that associated relocations tied to the same address show up
589 in the correct order, we don't do any further sorting. */
598 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
601 objdump_print_value (vma
, info
, skip_zeroes
)
603 struct disassemble_info
*info
;
608 struct objdump_disasm_info
*aux
609 = (struct objdump_disasm_info
*) info
->application_data
;
611 bfd_sprintf_vma (aux
->abfd
, buf
, vma
);
616 for (p
= buf
; *p
== '0'; ++p
)
621 (*info
->fprintf_func
) (info
->stream
, "%s", p
);
624 /* Print the name of a symbol. */
627 objdump_print_symname (abfd
, info
, sym
)
629 struct disassemble_info
*info
;
636 name
= bfd_asymbol_name (sym
);
637 if (do_demangle
&& name
[0] != '\0')
639 /* Demangle the name. */
640 alloc
= demangle (abfd
, name
);
645 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
653 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
654 is true, then always require the symbol to be in the section. This
655 returns NULL if there is no suitable symbol. If PLACE is not NULL,
656 then *PLACE is set to the index of the symbol in sorted_syms. */
659 find_symbol_for_address (abfd
, sec
, vma
, require_sec
, place
)
666 /* @@ Would it speed things up to cache the last two symbols returned,
667 and maybe their address ranges? For many processors, only one memory
668 operand can be present at a time, so the 2-entry cache wouldn't be
669 constantly churned by code doing heavy memory accesses. */
671 /* Indices in `sorted_syms'. */
673 long max
= sorted_symcount
;
675 unsigned int opb
= bfd_octets_per_byte (abfd
);
677 if (sorted_symcount
< 1)
680 /* Perform a binary search looking for the closest symbol to the
681 required value. We are searching the range (min, max]. */
682 while (min
+ 1 < max
)
686 thisplace
= (max
+ min
) / 2;
687 sym
= sorted_syms
[thisplace
];
689 if (bfd_asymbol_value (sym
) > vma
)
691 else if (bfd_asymbol_value (sym
) < vma
)
700 /* The symbol we want is now in min, the low end of the range we
701 were searching. If there are several symbols with the same
702 value, we want the first one. */
705 && (bfd_asymbol_value (sorted_syms
[thisplace
])
706 == bfd_asymbol_value (sorted_syms
[thisplace
- 1])))
709 /* If the file is relocateable, and the symbol could be from this
710 section, prefer a symbol from this section over symbols from
711 others, even if the other symbol's value might be closer.
713 Note that this may be wrong for some symbol references if the
714 sections have overlapping memory ranges, but in that case there's
715 no way to tell what's desired without looking at the relocation
718 if (sorted_syms
[thisplace
]->section
!= sec
720 || ((abfd
->flags
& HAS_RELOC
) != 0
721 && vma
>= bfd_get_section_vma (abfd
, sec
)
722 && vma
< (bfd_get_section_vma (abfd
, sec
)
723 + bfd_section_size (abfd
, sec
) / opb
))))
727 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
729 if (bfd_asymbol_value (sorted_syms
[i
])
730 != bfd_asymbol_value (sorted_syms
[thisplace
]))
736 if (sorted_syms
[i
]->section
== sec
738 || sorted_syms
[i
- 1]->section
!= sec
739 || (bfd_asymbol_value (sorted_syms
[i
])
740 != bfd_asymbol_value (sorted_syms
[i
- 1]))))
747 if (sorted_syms
[thisplace
]->section
!= sec
)
749 /* We didn't find a good symbol with a smaller value.
750 Look for one with a larger value. */
751 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
753 if (sorted_syms
[i
]->section
== sec
)
761 if (sorted_syms
[thisplace
]->section
!= sec
763 || ((abfd
->flags
& HAS_RELOC
) != 0
764 && vma
>= bfd_get_section_vma (abfd
, sec
)
765 && vma
< (bfd_get_section_vma (abfd
, sec
)
766 + bfd_section_size (abfd
, sec
)))))
768 /* There is no suitable symbol. */
776 return sorted_syms
[thisplace
];
779 /* Print an address to INFO symbolically. */
782 objdump_print_addr_with_sym (abfd
, sec
, sym
, vma
, info
, skip_zeroes
)
787 struct disassemble_info
*info
;
790 objdump_print_value (vma
, info
, skip_zeroes
);
796 (*info
->fprintf_func
) (info
->stream
, " <%s",
797 bfd_get_section_name (abfd
, sec
));
798 secaddr
= bfd_get_section_vma (abfd
, sec
);
801 (*info
->fprintf_func
) (info
->stream
, "-0x");
802 objdump_print_value (secaddr
- vma
, info
, true);
804 else if (vma
> secaddr
)
806 (*info
->fprintf_func
) (info
->stream
, "+0x");
807 objdump_print_value (vma
- secaddr
, info
, true);
809 (*info
->fprintf_func
) (info
->stream
, ">");
813 (*info
->fprintf_func
) (info
->stream
, " <");
814 objdump_print_symname (abfd
, info
, sym
);
815 if (bfd_asymbol_value (sym
) > vma
)
817 (*info
->fprintf_func
) (info
->stream
, "-0x");
818 objdump_print_value (bfd_asymbol_value (sym
) - vma
, info
, true);
820 else if (vma
> bfd_asymbol_value (sym
))
822 (*info
->fprintf_func
) (info
->stream
, "+0x");
823 objdump_print_value (vma
- bfd_asymbol_value (sym
), info
, true);
825 (*info
->fprintf_func
) (info
->stream
, ">");
829 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
830 true, don't output leading zeroes. */
833 objdump_print_addr (vma
, info
, skip_zeroes
)
835 struct disassemble_info
*info
;
838 struct objdump_disasm_info
*aux
;
841 if (sorted_symcount
< 1)
843 (*info
->fprintf_func
) (info
->stream
, "0x");
844 objdump_print_value (vma
, info
, skip_zeroes
);
848 aux
= (struct objdump_disasm_info
*) info
->application_data
;
849 sym
= find_symbol_for_address (aux
->abfd
, aux
->sec
, vma
, aux
->require_sec
,
851 objdump_print_addr_with_sym (aux
->abfd
, aux
->sec
, sym
, vma
, info
,
855 /* Print VMA to INFO. This function is passed to the disassembler
859 objdump_print_address (vma
, info
)
861 struct disassemble_info
*info
;
863 objdump_print_addr (vma
, info
, ! prefix_addresses
);
866 /* Determine of the given address has a symbol associated with it. */
869 objdump_symbol_at_address (vma
, info
)
871 struct disassemble_info
* info
;
873 struct objdump_disasm_info
* aux
;
876 /* No symbols - do not bother checking. */
877 if (sorted_symcount
< 1)
880 aux
= (struct objdump_disasm_info
*) info
->application_data
;
881 sym
= find_symbol_for_address (aux
->abfd
, aux
->sec
, vma
, aux
->require_sec
,
884 return (sym
!= NULL
&& (bfd_asymbol_value (sym
) == vma
));
887 /* Hold the last function name and the last line number we displayed
890 static char *prev_functionname
;
891 static unsigned int prev_line
;
893 /* We keep a list of all files that we have seen when doing a
894 dissassembly with source, so that we know how much of the file to
895 display. This can be important for inlined functions. */
897 struct print_file_list
899 struct print_file_list
*next
;
905 static struct print_file_list
*print_files
;
907 /* The number of preceding context lines to show when we start
908 displaying a file for the first time. */
910 #define SHOW_PRECEDING_CONTEXT_LINES (5)
912 /* Skip ahead to a given line in a file, optionally printing each
916 skip_to_line
PARAMS ((struct print_file_list
*, unsigned int, boolean
));
919 skip_to_line (p
, line
, show
)
920 struct print_file_list
*p
;
924 while (p
->line
< line
)
928 if (fgets (buf
, sizeof buf
, p
->f
) == NULL
)
938 if (strchr (buf
, '\n') != NULL
)
943 /* Show the line number, or the source line, in a dissassembly
947 show_line (abfd
, section
, addr_offset
)
952 const char *filename
;
953 const char *functionname
;
956 if (! with_line_numbers
&& ! with_source_code
)
959 if (! bfd_find_nearest_line (abfd
, section
, syms
, addr_offset
, &filename
,
960 &functionname
, &line
))
963 if (filename
!= NULL
&& *filename
== '\0')
965 if (functionname
!= NULL
&& *functionname
== '\0')
968 if (with_line_numbers
)
970 if (functionname
!= NULL
971 && (prev_functionname
== NULL
972 || strcmp (functionname
, prev_functionname
) != 0))
973 printf ("%s():\n", functionname
);
974 if (line
> 0 && line
!= prev_line
)
975 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
982 struct print_file_list
**pp
, *p
;
984 for (pp
= &print_files
; *pp
!= NULL
; pp
= &(*pp
)->next
)
985 if (strcmp ((*pp
)->filename
, filename
) == 0)
991 if (p
!= print_files
)
995 /* We have reencountered a file name which we saw
996 earlier. This implies that either we are dumping out
997 code from an included file, or the same file was
998 linked in more than once. There are two common cases
999 of an included file: inline functions in a header
1000 file, and a bison or flex skeleton file. In the
1001 former case we want to just start printing (but we
1002 back up a few lines to give context); in the latter
1003 case we want to continue from where we left off. I
1004 can't think of a good way to distinguish the cases,
1005 so I used a heuristic based on the file name. */
1006 if (strcmp (p
->filename
+ strlen (p
->filename
) - 2, ".h") != 0)
1010 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
1017 p
->f
= fopen (p
->filename
, "r");
1021 skip_to_line (p
, l
, false);
1023 if (print_files
->f
!= NULL
)
1025 fclose (print_files
->f
);
1026 print_files
->f
= NULL
;
1032 skip_to_line (p
, line
, true);
1034 p
->next
= print_files
;
1042 f
= fopen (filename
, "r");
1047 p
= ((struct print_file_list
*)
1048 xmalloc (sizeof (struct print_file_list
)));
1049 p
->filename
= xmalloc (strlen (filename
) + 1);
1050 strcpy (p
->filename
, filename
);
1054 if (print_files
!= NULL
&& print_files
->f
!= NULL
)
1056 fclose (print_files
->f
);
1057 print_files
->f
= NULL
;
1059 p
->next
= print_files
;
1062 if (file_start_context
)
1065 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
1068 skip_to_line (p
, l
, false);
1070 skip_to_line (p
, line
, true);
1075 if (functionname
!= NULL
1076 && (prev_functionname
== NULL
1077 || strcmp (functionname
, prev_functionname
) != 0))
1079 if (prev_functionname
!= NULL
)
1080 free (prev_functionname
);
1081 prev_functionname
= xmalloc (strlen (functionname
) + 1);
1082 strcpy (prev_functionname
, functionname
);
1085 if (line
> 0 && line
!= prev_line
)
1089 /* Pseudo FILE object for strings. */
1097 /* sprintf to a "stream" */
1100 objdump_sprintf
VPARAMS ((SFILE
*f
, const char *format
, ...))
1105 VA_OPEN (args
, format
);
1106 VA_FIXEDARG (args
, SFILE
*, f
);
1107 VA_FIXEDARG (args
, const char *, format
);
1109 vasprintf (&buf
, format
, args
);
1114 fatal (_("Out of virtual memory"));
1119 while ((size_t) ((f
->buffer
+ f
->size
) - f
->current
) < n
+ 1)
1123 curroff
= f
->current
- f
->buffer
;
1125 f
->buffer
= xrealloc (f
->buffer
, f
->size
);
1126 f
->current
= f
->buffer
+ curroff
;
1129 memcpy (f
->current
, buf
, n
);
1131 f
->current
[0] = '\0';
1139 /* The number of zeroes we want to see before we start skipping them.
1140 The number is arbitrarily chosen. */
1143 #define SKIP_ZEROES (8)
1146 /* The number of zeroes to skip at the end of a section. If the
1147 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1148 SKIP_ZEROES, they will be disassembled. If there are fewer than
1149 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1150 attempt to avoid disassembling zeroes inserted by section
1153 #ifndef SKIP_ZEROES_AT_END
1154 #define SKIP_ZEROES_AT_END (3)
1157 /* Disassemble some data in memory between given values. */
1160 disassemble_bytes (info
, disassemble_fn
, insns
, data
,
1161 start_offset
, stop_offset
, relppp
,
1163 struct disassemble_info
*info
;
1164 disassembler_ftype disassemble_fn
;
1167 bfd_vma start_offset
;
1168 bfd_vma stop_offset
;
1172 struct objdump_disasm_info
*aux
;
1174 int octets_per_line
;
1176 int skip_addr_chars
;
1177 bfd_vma addr_offset
;
1178 int opb
= info
->octets_per_byte
;
1180 aux
= (struct objdump_disasm_info
*) info
->application_data
;
1184 octets_per_line
= 4;
1186 octets_per_line
= 16;
1188 /* Figure out how many characters to skip at the start of an
1189 address, to make the disassembly look nicer. We discard leading
1190 zeroes in chunks of 4, ensuring that there is always a leading
1192 skip_addr_chars
= 0;
1193 if (! prefix_addresses
)
1201 + bfd_section_size (section
->owner
, section
) / opb
));
1203 while (s
[0] == '0' && s
[1] == '0' && s
[2] == '0' && s
[3] == '0'
1206 skip_addr_chars
+= 4;
1211 info
->insn_info_valid
= 0;
1214 addr_offset
= start_offset
;
1215 while (addr_offset
< stop_offset
)
1219 boolean need_nl
= false;
1221 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1223 for (z
= addr_offset
* opb
; z
< stop_offset
* opb
; z
++)
1226 if (! disassemble_zeroes
1227 && (info
->insn_info_valid
== 0
1228 || info
->branch_delay_insns
== 0)
1229 && (z
- addr_offset
* opb
>= SKIP_ZEROES
1230 || (z
== stop_offset
* opb
&&
1231 z
- addr_offset
* opb
< SKIP_ZEROES_AT_END
)))
1235 /* If there are more nonzero octets to follow, we only skip
1236 zeroes in multiples of 4, to try to avoid running over
1237 the start of an instruction which happens to start with
1239 if (z
!= stop_offset
* opb
)
1240 z
= addr_offset
* opb
+ ((z
- addr_offset
* opb
) &~ 3);
1242 octets
= z
- addr_offset
* opb
;
1253 if (with_line_numbers
|| with_source_code
)
1254 /* The line number tables will refer to unadjusted
1255 section VMAs, so we must undo any VMA modifications
1256 when calling show_line. */
1257 show_line (aux
->abfd
, section
, addr_offset
- adjust_section_vma
);
1259 if (! prefix_addresses
)
1263 bfd_sprintf_vma (aux
->abfd
, buf
, section
->vma
+ addr_offset
);
1264 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1268 printf ("%s:\t", buf
+ skip_addr_chars
);
1272 aux
->require_sec
= true;
1273 objdump_print_address (section
->vma
+ addr_offset
, info
);
1274 aux
->require_sec
= false;
1281 sfile
.buffer
= xmalloc (sfile
.size
);
1282 sfile
.current
= sfile
.buffer
;
1283 info
->fprintf_func
= (fprintf_ftype
) objdump_sprintf
;
1284 info
->stream
= (FILE *) &sfile
;
1285 info
->bytes_per_line
= 0;
1286 info
->bytes_per_chunk
= 0;
1288 #ifdef DISASSEMBLER_NEEDS_RELOCS
1289 /* FIXME: This is wrong. It tests the number of octets
1290 in the last instruction, not the current one. */
1291 if (*relppp
< relppend
1292 && (**relppp
)->address
>= addr_offset
1293 && (**relppp
)->address
<= addr_offset
+ octets
/ opb
)
1294 info
->flags
= INSN_HAS_RELOC
;
1299 octets
= (*disassemble_fn
) (section
->vma
+ addr_offset
, info
);
1300 info
->fprintf_func
= (fprintf_ftype
) fprintf
;
1301 info
->stream
= stdout
;
1302 if (info
->bytes_per_line
!= 0)
1303 octets_per_line
= info
->bytes_per_line
;
1306 if (sfile
.current
!= sfile
.buffer
)
1307 printf ("%s\n", sfile
.buffer
);
1308 free (sfile
.buffer
);
1316 octets
= octets_per_line
;
1317 if (addr_offset
+ octets
/ opb
> stop_offset
)
1318 octets
= (stop_offset
- addr_offset
) * opb
;
1320 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ octets
; ++j
)
1322 if (ISPRINT (data
[j
]))
1323 buf
[j
- addr_offset
* opb
] = data
[j
];
1325 buf
[j
- addr_offset
* opb
] = '.';
1327 buf
[j
- addr_offset
* opb
] = '\0';
1330 if (prefix_addresses
1332 : show_raw_insn
>= 0)
1336 /* If ! prefix_addresses and ! wide_output, we print
1337 octets_per_line octets per line. */
1339 if (pb
> octets_per_line
&& ! prefix_addresses
&& ! wide_output
)
1340 pb
= octets_per_line
;
1342 if (info
->bytes_per_chunk
)
1343 bpc
= info
->bytes_per_chunk
;
1347 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
1350 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1352 for (k
= bpc
- 1; k
>= 0; k
--)
1353 printf ("%02x", (unsigned) data
[j
+ k
]);
1358 for (k
= 0; k
< bpc
; k
++)
1359 printf ("%02x", (unsigned) data
[j
+ k
]);
1364 for (; pb
< octets_per_line
; pb
+= bpc
)
1368 for (k
= 0; k
< bpc
; k
++)
1373 /* Separate raw data from instruction by extra space. */
1384 printf ("%s", sfile
.buffer
);
1385 free (sfile
.buffer
);
1388 if (prefix_addresses
1390 : show_raw_insn
>= 0)
1398 j
= addr_offset
* opb
+ pb
;
1400 bfd_sprintf_vma (aux
->abfd
, buf
, section
->vma
+ j
/ opb
);
1401 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1405 printf ("%s:\t", buf
+ skip_addr_chars
);
1407 pb
+= octets_per_line
;
1410 for (; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
1414 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1416 for (k
= bpc
- 1; k
>= 0; k
--)
1417 printf ("%02x", (unsigned) data
[j
+ k
]);
1422 for (k
= 0; k
< bpc
; k
++)
1423 printf ("%02x", (unsigned) data
[j
+ k
]);
1436 if ((section
->flags
& SEC_RELOC
) != 0
1437 #ifndef DISASSEMBLER_NEEDS_RELOCS
1442 while ((*relppp
) < relppend
1443 && ((**relppp
)->address
>= (bfd_vma
) addr_offset
1444 && (**relppp
)->address
< (bfd_vma
) addr_offset
+ octets
/ opb
))
1445 #ifdef DISASSEMBLER_NEEDS_RELOCS
1446 if (! dump_reloc_info
)
1460 objdump_print_value (section
->vma
+ q
->address
, info
, true);
1462 printf (": %s\t", q
->howto
->name
);
1464 if (q
->sym_ptr_ptr
== NULL
|| *q
->sym_ptr_ptr
== NULL
)
1465 printf ("*unknown*");
1468 const char *sym_name
;
1470 sym_name
= bfd_asymbol_name (*q
->sym_ptr_ptr
);
1471 if (sym_name
!= NULL
&& *sym_name
!= '\0')
1472 objdump_print_symname (aux
->abfd
, info
, *q
->sym_ptr_ptr
);
1477 sym_sec
= bfd_get_section (*q
->sym_ptr_ptr
);
1478 sym_name
= bfd_get_section_name (aux
->abfd
, sym_sec
);
1479 if (sym_name
== NULL
|| *sym_name
== '\0')
1480 sym_name
= "*unknown*";
1481 printf ("%s", sym_name
);
1488 objdump_print_value (q
->addend
, info
, true);
1500 addr_offset
+= octets
/ opb
;
1504 /* Disassemble the contents of an object file. */
1507 disassemble_data (abfd
)
1510 unsigned long addr_offset
;
1511 disassembler_ftype disassemble_fn
;
1512 struct disassemble_info disasm_info
;
1513 struct objdump_disasm_info aux
;
1518 prev_functionname
= NULL
;
1521 /* We make a copy of syms to sort. We don't want to sort syms
1522 because that will screw up the relocs. */
1523 sorted_syms
= (asymbol
**) xmalloc (symcount
* sizeof (asymbol
*));
1524 memcpy (sorted_syms
, syms
, symcount
* sizeof (asymbol
*));
1526 sorted_symcount
= remove_useless_symbols (sorted_syms
, symcount
);
1528 /* Sort the symbols into section and symbol order */
1529 qsort (sorted_syms
, sorted_symcount
, sizeof (asymbol
*), compare_symbols
);
1531 INIT_DISASSEMBLE_INFO(disasm_info
, stdout
, fprintf
);
1532 disasm_info
.application_data
= (PTR
) &aux
;
1534 aux
.require_sec
= false;
1535 disasm_info
.print_address_func
= objdump_print_address
;
1536 disasm_info
.symbol_at_address_func
= objdump_symbol_at_address
;
1538 if (machine
!= (char *) NULL
)
1540 const bfd_arch_info_type
*info
= bfd_scan_arch (machine
);
1543 fatal (_("Can't use supplied machine %s"), machine
);
1545 abfd
->arch_info
= info
;
1548 if (endian
!= BFD_ENDIAN_UNKNOWN
)
1550 struct bfd_target
*xvec
;
1552 xvec
= (struct bfd_target
*) xmalloc (sizeof (struct bfd_target
));
1553 memcpy (xvec
, abfd
->xvec
, sizeof (struct bfd_target
));
1554 xvec
->byteorder
= endian
;
1558 disassemble_fn
= disassembler (abfd
);
1559 if (!disassemble_fn
)
1561 non_fatal (_("Can't disassemble for architecture %s\n"),
1562 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0));
1567 opb
= bfd_octets_per_byte (abfd
);
1569 disasm_info
.flavour
= bfd_get_flavour (abfd
);
1570 disasm_info
.arch
= bfd_get_arch (abfd
);
1571 disasm_info
.mach
= bfd_get_mach (abfd
);
1572 disasm_info
.disassembler_options
= disassembler_options
;
1573 disasm_info
.octets_per_byte
= opb
;
1575 if (bfd_big_endian (abfd
))
1576 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_BIG
;
1577 else if (bfd_little_endian (abfd
))
1578 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_LITTLE
;
1580 /* ??? Aborting here seems too drastic. We could default to big or little
1582 disasm_info
.endian
= BFD_ENDIAN_UNKNOWN
;
1584 for (section
= abfd
->sections
;
1585 section
!= (asection
*) NULL
;
1586 section
= section
->next
)
1588 bfd_byte
*data
= NULL
;
1589 bfd_size_type datasize
= 0;
1590 arelent
**relbuf
= NULL
;
1591 arelent
**relpp
= NULL
;
1592 arelent
**relppend
= NULL
;
1593 unsigned long stop_offset
;
1594 asymbol
*sym
= NULL
;
1597 if ((section
->flags
& SEC_LOAD
) == 0
1598 || (! disassemble_all
1600 && (section
->flags
& SEC_CODE
) == 0))
1602 if (only
!= (char *) NULL
&& strcmp (only
, section
->name
) != 0)
1605 if ((section
->flags
& SEC_RELOC
) != 0
1606 #ifndef DISASSEMBLER_NEEDS_RELOCS
1613 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
1615 bfd_fatal (bfd_get_filename (abfd
));
1621 relbuf
= (arelent
**) xmalloc (relsize
);
1622 relcount
= bfd_canonicalize_reloc (abfd
, section
, relbuf
, syms
);
1624 bfd_fatal (bfd_get_filename (abfd
));
1626 /* Sort the relocs by address. */
1627 qsort (relbuf
, relcount
, sizeof (arelent
*), compare_relocs
);
1630 relppend
= relpp
+ relcount
;
1632 /* Skip over the relocs belonging to addresses below the
1634 if (start_address
!= (bfd_vma
) -1)
1636 while (relpp
< relppend
1637 && (*relpp
)->address
< start_address
)
1643 printf (_("Disassembly of section %s:\n"), section
->name
);
1645 datasize
= bfd_get_section_size_before_reloc (section
);
1649 data
= (bfd_byte
*) xmalloc ((size_t) datasize
);
1651 bfd_get_section_contents (abfd
, section
, data
, 0, datasize
);
1654 disasm_info
.buffer
= data
;
1655 disasm_info
.buffer_vma
= section
->vma
;
1656 disasm_info
.buffer_length
= datasize
;
1657 disasm_info
.section
= section
;
1658 if (start_address
== (bfd_vma
) -1
1659 || start_address
< disasm_info
.buffer_vma
)
1662 addr_offset
= start_address
- disasm_info
.buffer_vma
;
1663 if (stop_address
== (bfd_vma
) -1)
1664 stop_offset
= datasize
/ opb
;
1667 if (stop_address
< disasm_info
.buffer_vma
)
1670 stop_offset
= stop_address
- disasm_info
.buffer_vma
;
1671 if (stop_offset
> disasm_info
.buffer_length
/ opb
)
1672 stop_offset
= disasm_info
.buffer_length
/ opb
;
1675 sym
= find_symbol_for_address (abfd
, section
, section
->vma
+ addr_offset
,
1678 while (addr_offset
< stop_offset
)
1681 unsigned long nextstop_offset
;
1684 if (sym
!= NULL
&& bfd_asymbol_value (sym
) <= section
->vma
+ addr_offset
)
1689 (x
< sorted_symcount
1690 && bfd_asymbol_value (sorted_syms
[x
]) <= section
->vma
+ addr_offset
);
1693 disasm_info
.symbols
= & sorted_syms
[place
];
1694 disasm_info
.num_symbols
= x
- place
;
1697 disasm_info
.symbols
= NULL
;
1699 if (! prefix_addresses
)
1702 objdump_print_addr_with_sym (abfd
, section
, sym
,
1703 section
->vma
+ addr_offset
,
1709 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > section
->vma
+ addr_offset
)
1711 else if (sym
== NULL
)
1715 /* Search forward for the next appropriate symbol in
1716 SECTION. Note that all the symbols are sorted
1717 together into one big array, and that some sections
1718 may have overlapping addresses. */
1719 while (place
< sorted_symcount
1720 && (sorted_syms
[place
]->section
!= section
1721 || (bfd_asymbol_value (sorted_syms
[place
])
1722 <= bfd_asymbol_value (sym
))))
1724 if (place
>= sorted_symcount
)
1727 nextsym
= sorted_syms
[place
];
1730 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > section
->vma
+ addr_offset
)
1732 nextstop_offset
= bfd_asymbol_value (sym
) - section
->vma
;
1733 if (nextstop_offset
> stop_offset
)
1734 nextstop_offset
= stop_offset
;
1736 else if (nextsym
== NULL
)
1737 nextstop_offset
= stop_offset
;
1740 nextstop_offset
= bfd_asymbol_value (nextsym
) - section
->vma
;
1741 if (nextstop_offset
> stop_offset
)
1742 nextstop_offset
= stop_offset
;
1745 /* If a symbol is explicitly marked as being an object
1746 rather than a function, just dump the bytes without
1747 disassembling them. */
1750 || bfd_asymbol_value (sym
) > section
->vma
+ addr_offset
1751 || ((sym
->flags
& BSF_OBJECT
) == 0
1752 && (strstr (bfd_asymbol_name (sym
), "gnu_compiled")
1754 && (strstr (bfd_asymbol_name (sym
), "gcc2_compiled")
1756 || (sym
->flags
& BSF_FUNCTION
) != 0)
1761 disassemble_bytes (&disasm_info
, disassemble_fn
, insns
, data
,
1762 addr_offset
, nextstop_offset
, &relpp
, relppend
);
1764 addr_offset
= nextstop_offset
;
1776 /* Define a table of stab values and print-strings. We wish the initializer
1777 could be a direct-mapped table, but instead we build one the first
1780 static void dump_section_stabs
PARAMS ((bfd
*abfd
, char *stabsect_name
,
1781 char *strsect_name
));
1783 /* Dump the stabs sections from an object file that has a section that
1784 uses Sun stabs encoding. */
1790 dump_section_stabs (abfd
, ".stab", ".stabstr");
1791 dump_section_stabs (abfd
, ".stab.excl", ".stab.exclstr");
1792 dump_section_stabs (abfd
, ".stab.index", ".stab.indexstr");
1793 dump_section_stabs (abfd
, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1796 static bfd_byte
*stabs
;
1797 static bfd_size_type stab_size
;
1799 static char *strtab
;
1800 static bfd_size_type stabstr_size
;
1802 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1803 and string table section STRSECT_NAME into `strtab'.
1804 If the section exists and was read, allocate the space and return true.
1805 Otherwise return false. */
1808 read_section_stabs (abfd
, stabsect_name
, strsect_name
)
1810 const char *stabsect_name
;
1811 const char *strsect_name
;
1813 asection
*stabsect
, *stabstrsect
;
1815 stabsect
= bfd_get_section_by_name (abfd
, stabsect_name
);
1818 printf (_("No %s section present\n\n"), stabsect_name
);
1822 stabstrsect
= bfd_get_section_by_name (abfd
, strsect_name
);
1823 if (0 == stabstrsect
)
1825 non_fatal (_("%s has no %s section"),
1826 bfd_get_filename (abfd
), strsect_name
);
1831 stab_size
= bfd_section_size (abfd
, stabsect
);
1832 stabstr_size
= bfd_section_size (abfd
, stabstrsect
);
1834 stabs
= (bfd_byte
*) xmalloc (stab_size
);
1835 strtab
= (char *) xmalloc (stabstr_size
);
1837 if (! bfd_get_section_contents (abfd
, stabsect
, (PTR
) stabs
, 0, stab_size
))
1839 non_fatal (_("Reading %s section of %s failed: %s"),
1840 stabsect_name
, bfd_get_filename (abfd
),
1841 bfd_errmsg (bfd_get_error ()));
1848 if (! bfd_get_section_contents (abfd
, stabstrsect
, (PTR
) strtab
, 0,
1851 non_fatal (_("Reading %s section of %s failed: %s\n"),
1852 strsect_name
, bfd_get_filename (abfd
),
1853 bfd_errmsg (bfd_get_error ()));
1863 /* Stabs entries use a 12 byte format:
1864 4 byte string table index
1866 1 byte stab other field
1867 2 byte stab desc field
1869 FIXME: This will have to change for a 64 bit object format. */
1871 #define STRDXOFF (0)
1873 #define OTHEROFF (5)
1876 #define STABSIZE (12)
1878 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1879 using string table section STRSECT_NAME (in `strtab'). */
1882 print_section_stabs (abfd
, stabsect_name
, strsect_name
)
1884 const char *stabsect_name
;
1885 const char *strsect_name ATTRIBUTE_UNUSED
;
1888 unsigned file_string_table_offset
= 0, next_file_string_table_offset
= 0;
1889 bfd_byte
*stabp
, *stabs_end
;
1892 stabs_end
= stabp
+ stab_size
;
1894 printf (_("Contents of %s section:\n\n"), stabsect_name
);
1895 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1897 /* Loop through all symbols and print them.
1899 We start the index at -1 because there is a dummy symbol on
1900 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1902 for (i
= -1; stabp
< stabs_end
; stabp
+= STABSIZE
, i
++)
1906 unsigned char type
, other
;
1907 unsigned short desc
;
1910 strx
= bfd_h_get_32 (abfd
, stabp
+ STRDXOFF
);
1911 type
= bfd_h_get_8 (abfd
, stabp
+ TYPEOFF
);
1912 other
= bfd_h_get_8 (abfd
, stabp
+ OTHEROFF
);
1913 desc
= bfd_h_get_16 (abfd
, stabp
+ DESCOFF
);
1914 value
= bfd_h_get_32 (abfd
, stabp
+ VALOFF
);
1916 printf ("\n%-6d ", i
);
1917 /* Either print the stab name, or, if unnamed, print its number
1918 again (makes consistent formatting for tools like awk). */
1919 name
= bfd_get_stab_name (type
);
1921 printf ("%-6s", name
);
1922 else if (type
== N_UNDF
)
1925 printf ("%-6d", type
);
1926 printf (" %-6d %-6d ", other
, desc
);
1927 bfd_printf_vma (abfd
, value
);
1928 printf (" %-6lu", strx
);
1930 /* Symbols with type == 0 (N_UNDF) specify the length of the
1931 string table associated with this file. We use that info
1932 to know how to relocate the *next* file's string table indices. */
1936 file_string_table_offset
= next_file_string_table_offset
;
1937 next_file_string_table_offset
+= value
;
1941 /* Using the (possibly updated) string table offset, print the
1942 string (if any) associated with this symbol. */
1944 if ((strx
+ file_string_table_offset
) < stabstr_size
)
1945 printf (" %s", &strtab
[strx
+ file_string_table_offset
]);
1954 dump_section_stabs (abfd
, stabsect_name
, strsect_name
)
1956 char *stabsect_name
;
1961 /* Check for section names for which stabsect_name is a prefix, to
1962 handle .stab0, etc. */
1963 for (s
= abfd
->sections
;
1969 len
= strlen (stabsect_name
);
1971 /* If the prefix matches, and the files section name ends with a
1972 nul or a digit, then we match. I.e., we want either an exact
1973 match or a section followed by a number. */
1974 if (strncmp (stabsect_name
, s
->name
, len
) == 0
1975 && (s
->name
[len
] == '\000'
1976 || ISDIGIT (s
->name
[len
])))
1978 if (read_section_stabs (abfd
, s
->name
, strsect_name
))
1980 print_section_stabs (abfd
, s
->name
, strsect_name
);
1989 dump_bfd_header (abfd
)
1994 printf (_("architecture: %s, "),
1995 bfd_printable_arch_mach (bfd_get_arch (abfd
),
1996 bfd_get_mach (abfd
)));
1997 printf (_("flags 0x%08x:\n"), abfd
->flags
);
1999 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2000 PF (HAS_RELOC
, "HAS_RELOC");
2001 PF (EXEC_P
, "EXEC_P");
2002 PF (HAS_LINENO
, "HAS_LINENO");
2003 PF (HAS_DEBUG
, "HAS_DEBUG");
2004 PF (HAS_SYMS
, "HAS_SYMS");
2005 PF (HAS_LOCALS
, "HAS_LOCALS");
2006 PF (DYNAMIC
, "DYNAMIC");
2007 PF (WP_TEXT
, "WP_TEXT");
2008 PF (D_PAGED
, "D_PAGED");
2009 PF (BFD_IS_RELAXABLE
, "BFD_IS_RELAXABLE");
2010 printf (_("\nstart address 0x"));
2011 bfd_printf_vma (abfd
, abfd
->start_address
);
2016 dump_bfd_private_header (abfd
)
2019 bfd_print_private_bfd_data (abfd
, stdout
);
2022 /* Dump selected contents of ABFD */
2028 /* If we are adjusting section VMA's, change them all now. Changing
2029 the BFD information is a hack. However, we must do it, or
2030 bfd_find_nearest_line will not do the right thing. */
2031 if (adjust_section_vma
!= 0)
2035 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
2037 s
->vma
+= adjust_section_vma
;
2038 s
->lma
+= adjust_section_vma
;
2042 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd
),
2045 print_arelt_descr (stdout
, abfd
, true);
2046 if (dump_file_header
)
2047 dump_bfd_header (abfd
);
2048 if (dump_private_headers
)
2049 dump_bfd_private_header (abfd
);
2051 if (dump_section_headers
)
2052 dump_headers (abfd
);
2053 if (dump_symtab
|| dump_reloc_info
|| disassemble
|| dump_debugging
)
2055 syms
= slurp_symtab (abfd
);
2057 if (dump_dynamic_symtab
|| dump_dynamic_reloc_info
)
2059 dynsyms
= slurp_dynamic_symtab (abfd
);
2062 dump_symbols (abfd
, false);
2063 if (dump_dynamic_symtab
)
2064 dump_symbols (abfd
, true);
2065 if (dump_stab_section_info
)
2067 if (dump_reloc_info
&& ! disassemble
)
2069 if (dump_dynamic_reloc_info
)
2070 dump_dynamic_relocs (abfd
);
2071 if (dump_section_contents
)
2074 disassemble_data (abfd
);
2079 dhandle
= read_debugging_info (abfd
, syms
, symcount
);
2080 if (dhandle
!= NULL
)
2082 if (! print_debugging_info (stdout
, dhandle
))
2084 non_fatal (_("%s: printing debugging information failed"),
2085 bfd_get_filename (abfd
));
2108 if (bfd_check_format_matches (abfd
, bfd_object
, &matching
))
2114 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
2116 nonfatal (bfd_get_filename (abfd
));
2117 list_matching_formats (matching
);
2122 if (bfd_get_error () != bfd_error_file_not_recognized
)
2124 nonfatal (bfd_get_filename (abfd
));
2128 if (bfd_check_format_matches (abfd
, bfd_core
, &matching
))
2134 nonfatal (bfd_get_filename (abfd
));
2136 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
2138 list_matching_formats (matching
);
2144 display_file (filename
, target
)
2148 bfd
*file
, *arfile
= (bfd
*) NULL
;
2150 file
= bfd_openr (filename
, target
);
2153 nonfatal (filename
);
2157 if (bfd_check_format (file
, bfd_archive
) == true)
2159 bfd
*last_arfile
= NULL
;
2161 printf (_("In archive %s:\n"), bfd_get_filename (file
));
2164 bfd_set_error (bfd_error_no_error
);
2166 arfile
= bfd_openr_next_archived_file (file
, arfile
);
2169 if (bfd_get_error () != bfd_error_no_more_archived_files
)
2170 nonfatal (bfd_get_filename (file
));
2174 display_bfd (arfile
);
2176 if (last_arfile
!= NULL
)
2177 bfd_close (last_arfile
);
2178 last_arfile
= arfile
;
2181 if (last_arfile
!= NULL
)
2182 bfd_close (last_arfile
);
2190 /* Actually display the various requested regions */
2198 bfd_size_type datasize
= 0;
2199 bfd_size_type addr_offset
;
2200 bfd_size_type start_offset
, stop_offset
;
2201 unsigned int opb
= bfd_octets_per_byte (abfd
);
2203 for (section
= abfd
->sections
; section
!= NULL
; section
=
2208 if (only
== (char *) NULL
||
2209 strcmp (only
, section
->name
) == 0)
2211 if (section
->flags
& SEC_HAS_CONTENTS
)
2213 printf (_("Contents of section %s:\n"), section
->name
);
2215 if (bfd_section_size (abfd
, section
) == 0)
2217 data
= (bfd_byte
*) xmalloc ((size_t) bfd_section_size (abfd
, section
));
2218 datasize
= bfd_section_size (abfd
, section
);
2221 bfd_get_section_contents (abfd
, section
, (PTR
) data
, 0, bfd_section_size (abfd
, section
));
2223 if (start_address
== (bfd_vma
) -1
2224 || start_address
< section
->vma
)
2227 start_offset
= start_address
- section
->vma
;
2228 if (stop_address
== (bfd_vma
) -1)
2229 stop_offset
= bfd_section_size (abfd
, section
) / opb
;
2232 if (stop_address
< section
->vma
)
2235 stop_offset
= stop_address
- section
->vma
;
2236 if (stop_offset
> bfd_section_size (abfd
, section
) / opb
)
2237 stop_offset
= bfd_section_size (abfd
, section
) / opb
;
2239 for (addr_offset
= start_offset
;
2240 addr_offset
< stop_offset
; addr_offset
+= onaline
)
2244 printf (" %04lx ", (unsigned long int)
2245 (addr_offset
+ section
->vma
));
2246 for (j
= addr_offset
* opb
;
2247 j
< addr_offset
* opb
+ onaline
; j
++)
2249 if (j
< stop_offset
* opb
)
2250 printf ("%02x", (unsigned) (data
[j
]));
2258 for (j
= addr_offset
; j
< addr_offset
* opb
+ onaline
; j
++)
2260 if (j
>= stop_offset
* opb
)
2263 printf ("%c", ISPRINT (data
[j
]) ? data
[j
] : '.');
2273 /* Should perhaps share code and display with nm? */
2275 dump_symbols (abfd
, dynamic
)
2276 bfd
*abfd ATTRIBUTE_UNUSED
;
2289 printf ("DYNAMIC SYMBOL TABLE:\n");
2297 printf ("SYMBOL TABLE:\n");
2300 for (count
= 0; count
< max
; count
++)
2304 bfd
*cur_bfd
= bfd_asymbol_bfd (*current
);
2306 if (cur_bfd
!= NULL
)
2311 name
= (*current
)->name
;
2313 if (do_demangle
&& name
!= NULL
&& *name
!= '\0')
2315 /* If we want to demangle the name, we demangle it
2316 here, and temporarily clobber it while calling
2317 bfd_print_symbol. FIXME: This is a gross hack. */
2319 alloc
= demangle (cur_bfd
, name
);
2320 (*current
)->name
= alloc
;
2323 bfd_print_symbol (cur_bfd
, stdout
, *current
,
2324 bfd_print_symbol_all
);
2326 (*current
)->name
= name
;
2347 for (a
= abfd
->sections
; a
!= (asection
*) NULL
; a
= a
->next
)
2351 if (bfd_is_abs_section (a
))
2353 if (bfd_is_und_section (a
))
2355 if (bfd_is_com_section (a
))
2360 if (strcmp (only
, a
->name
))
2363 else if ((a
->flags
& SEC_RELOC
) == 0)
2366 relsize
= bfd_get_reloc_upper_bound (abfd
, a
);
2368 bfd_fatal (bfd_get_filename (abfd
));
2370 printf ("RELOCATION RECORDS FOR [%s]:", a
->name
);
2374 printf (" (none)\n\n");
2378 relpp
= (arelent
**) xmalloc (relsize
);
2379 relcount
= bfd_canonicalize_reloc (abfd
, a
, relpp
, syms
);
2381 bfd_fatal (bfd_get_filename (abfd
));
2382 else if (relcount
== 0)
2384 printf (" (none)\n\n");
2389 dump_reloc_set (abfd
, a
, relpp
, relcount
);
2398 dump_dynamic_relocs (abfd
)
2405 relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
2407 bfd_fatal (bfd_get_filename (abfd
));
2409 printf ("DYNAMIC RELOCATION RECORDS");
2413 printf (" (none)\n\n");
2417 relpp
= (arelent
**) xmalloc (relsize
);
2418 relcount
= bfd_canonicalize_dynamic_reloc (abfd
, relpp
, dynsyms
);
2420 bfd_fatal (bfd_get_filename (abfd
));
2421 else if (relcount
== 0)
2423 printf (" (none)\n\n");
2428 dump_reloc_set (abfd
, (asection
*) NULL
, relpp
, relcount
);
2436 dump_reloc_set (abfd
, sec
, relpp
, relcount
)
2443 char *last_filename
, *last_functionname
;
2444 unsigned int last_line
;
2446 /* Get column headers lined up reasonably. */
2452 bfd_sprintf_vma (abfd
, buf
, (bfd_vma
) -1);
2453 width
= strlen (buf
) - 7;
2455 printf ("OFFSET %*s TYPE %*s VALUE \n", width
, "", 12, "");
2458 last_filename
= NULL
;
2459 last_functionname
= NULL
;
2462 for (p
= relpp
; relcount
&& *p
!= (arelent
*) NULL
; p
++, relcount
--)
2465 const char *filename
, *functionname
;
2467 const char *sym_name
;
2468 const char *section_name
;
2470 if (start_address
!= (bfd_vma
) -1
2471 && q
->address
< start_address
)
2473 if (stop_address
!= (bfd_vma
) -1
2474 && q
->address
> stop_address
)
2477 if (with_line_numbers
2479 && bfd_find_nearest_line (abfd
, sec
, syms
, q
->address
,
2480 &filename
, &functionname
, &line
))
2482 if (functionname
!= NULL
2483 && (last_functionname
== NULL
2484 || strcmp (functionname
, last_functionname
) != 0))
2486 printf ("%s():\n", functionname
);
2487 if (last_functionname
!= NULL
)
2488 free (last_functionname
);
2489 last_functionname
= xstrdup (functionname
);
2492 && (line
!= last_line
2493 || (filename
!= NULL
2494 && last_filename
!= NULL
2495 && strcmp (filename
, last_filename
) != 0)))
2497 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
2499 if (last_filename
!= NULL
)
2500 free (last_filename
);
2501 if (filename
== NULL
)
2502 last_filename
= NULL
;
2504 last_filename
= xstrdup (filename
);
2508 if (q
->sym_ptr_ptr
&& *q
->sym_ptr_ptr
)
2510 sym_name
= (*(q
->sym_ptr_ptr
))->name
;
2511 section_name
= (*(q
->sym_ptr_ptr
))->section
->name
;
2516 section_name
= NULL
;
2520 bfd_printf_vma (abfd
, q
->address
);
2522 printf (" %-16s ", q
->howto
->name
);
2524 printf (" %-16d ", q
->howto
->type
);
2525 objdump_print_symname (abfd
, (struct disassemble_info
*) NULL
,
2530 if (section_name
== (const char *) NULL
)
2531 section_name
= "*unknown*";
2532 bfd_printf_vma (abfd
, q
->address
);
2533 printf (" %-16s [%s]",
2540 bfd_printf_vma (abfd
, q
->addend
);
2546 /* The length of the longest architecture name + 1. */
2547 #define LONGEST_ARCH sizeof("powerpc:common")
2550 endian_string (endian
)
2551 enum bfd_endian endian
;
2553 if (endian
== BFD_ENDIAN_BIG
)
2554 return "big endian";
2555 else if (endian
== BFD_ENDIAN_LITTLE
)
2556 return "little endian";
2558 return "endianness unknown";
2561 /* List the targets that BFD is configured to support, each followed
2562 by its endianness and the architectures it supports. */
2565 display_target_list ()
2567 extern const bfd_target
*const *bfd_target_vector
;
2571 dummy_name
= make_temp_file (NULL
);
2572 for (t
= 0; bfd_target_vector
[t
]; t
++)
2574 const bfd_target
*p
= bfd_target_vector
[t
];
2575 bfd
*abfd
= bfd_openw (dummy_name
, p
->name
);
2578 printf ("%s\n (header %s, data %s)\n", p
->name
,
2579 endian_string (p
->header_byteorder
),
2580 endian_string (p
->byteorder
));
2584 nonfatal (dummy_name
);
2588 if (! bfd_set_format (abfd
, bfd_object
))
2590 if (bfd_get_error () != bfd_error_invalid_operation
)
2592 bfd_close_all_done (abfd
);
2596 for (a
= (int) bfd_arch_obscure
+ 1; a
< (int) bfd_arch_last
; a
++)
2597 if (bfd_set_arch_mach (abfd
, (enum bfd_architecture
) a
, 0))
2599 bfd_printable_arch_mach ((enum bfd_architecture
) a
, 0));
2600 bfd_close_all_done (abfd
);
2602 unlink (dummy_name
);
2606 /* Print a table showing which architectures are supported for entries
2607 FIRST through LAST-1 of bfd_target_vector (targets across,
2608 architectures down). */
2611 display_info_table (first
, last
)
2615 extern const bfd_target
*const *bfd_target_vector
;
2619 /* Print heading of target names. */
2620 printf ("\n%*s", (int) LONGEST_ARCH
, " ");
2621 for (t
= first
; t
< last
&& bfd_target_vector
[t
]; t
++)
2622 printf ("%s ", bfd_target_vector
[t
]->name
);
2625 dummy_name
= make_temp_file (NULL
);
2626 for (a
= (int) bfd_arch_obscure
+ 1; a
< (int) bfd_arch_last
; a
++)
2627 if (strcmp (bfd_printable_arch_mach (a
, 0), "UNKNOWN!") != 0)
2629 printf ("%*s ", (int) LONGEST_ARCH
- 1,
2630 bfd_printable_arch_mach (a
, 0));
2631 for (t
= first
; t
< last
&& bfd_target_vector
[t
]; t
++)
2633 const bfd_target
*p
= bfd_target_vector
[t
];
2635 bfd
*abfd
= bfd_openw (dummy_name
, p
->name
);
2645 if (! bfd_set_format (abfd
, bfd_object
))
2647 if (bfd_get_error () != bfd_error_invalid_operation
)
2655 if (! bfd_set_arch_mach (abfd
, a
, 0))
2660 printf ("%s ", p
->name
);
2663 int l
= strlen (p
->name
);
2669 bfd_close_all_done (abfd
);
2673 unlink (dummy_name
);
2677 /* Print tables of all the target-architecture combinations that
2678 BFD has been configured to support. */
2681 display_target_tables ()
2684 extern const bfd_target
*const *bfd_target_vector
;
2688 colum
= getenv ("COLUMNS");
2690 columns
= atoi (colum
);
2695 while (bfd_target_vector
[t
] != NULL
)
2699 wid
= LONGEST_ARCH
+ strlen (bfd_target_vector
[t
]->name
) + 1;
2701 while (wid
< columns
&& bfd_target_vector
[t
] != NULL
)
2705 newwid
= wid
+ strlen (bfd_target_vector
[t
]->name
) + 1;
2706 if (newwid
>= columns
)
2711 display_info_table (oldt
, t
);
2718 printf (_("BFD header file version %s\n"), BFD_VERSION_STRING
);
2719 display_target_list ();
2720 display_target_tables ();
2723 int main
PARAMS ((int, char **));
2731 char *target
= default_target
;
2732 boolean seenflag
= false;
2734 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2735 setlocale (LC_MESSAGES
, "");
2737 #if defined (HAVE_SETLOCALE)
2738 setlocale (LC_CTYPE
, "");
2740 bindtextdomain (PACKAGE
, LOCALEDIR
);
2741 textdomain (PACKAGE
);
2743 program_name
= *argv
;
2744 xmalloc_set_program_name (program_name
);
2746 START_PROGRESS (program_name
, 0);
2749 set_default_bfd_target ();
2751 while ((c
= getopt_long (argc
, argv
, "pib:m:M:VvCdDlfaHhrRtTxsSj:wE:zgG",
2752 long_options
, (int *) 0))
2758 break; /* We've been given a long option. */
2763 disassembler_options
= optarg
;
2769 with_line_numbers
= true;
2778 enum demangling_styles style
;
2780 style
= cplus_demangle_name_to_style (optarg
);
2781 if (style
== unknown_demangling
)
2782 fatal (_("unknown demangling style `%s'"),
2785 cplus_demangle_set_style (style
);
2791 case OPTION_ADJUST_VMA
:
2792 adjust_section_vma
= parse_vma (optarg
, "--adjust-vma");
2794 case OPTION_START_ADDRESS
:
2795 start_address
= parse_vma (optarg
, "--start-address");
2797 case OPTION_STOP_ADDRESS
:
2798 stop_address
= parse_vma (optarg
, "--stop-address");
2801 if (strcmp (optarg
, "B") == 0)
2802 endian
= BFD_ENDIAN_BIG
;
2803 else if (strcmp (optarg
, "L") == 0)
2804 endian
= BFD_ENDIAN_LITTLE
;
2807 non_fatal (_("unrecognized -E option"));
2812 if (strncmp (optarg
, "big", strlen (optarg
)) == 0)
2813 endian
= BFD_ENDIAN_BIG
;
2814 else if (strncmp (optarg
, "little", strlen (optarg
)) == 0)
2815 endian
= BFD_ENDIAN_LITTLE
;
2818 non_fatal (_("unrecognized --endian type `%s'"), optarg
);
2824 dump_file_header
= true;
2828 formats_info
= true;
2832 dump_private_headers
= true;
2836 dump_private_headers
= true;
2838 dump_reloc_info
= true;
2839 dump_file_header
= true;
2840 dump_ar_hdrs
= true;
2841 dump_section_headers
= true;
2849 dump_dynamic_symtab
= true;
2857 disassemble_zeroes
= true;
2861 disassemble_all
= true;
2866 with_source_code
= true;
2874 dump_stab_section_info
= true;
2878 dump_section_contents
= true;
2882 dump_reloc_info
= true;
2886 dump_dynamic_reloc_info
= true;
2890 dump_ar_hdrs
= true;
2894 dump_section_headers
= true;
2902 show_version
= true;
2912 print_version ("objdump");
2914 if (seenflag
== false)
2922 display_file ("a.out", target
);
2924 for (; optind
< argc
;)
2925 display_file (argv
[optind
++], target
);
2928 END_PROGRESS (program_name
);