* elf.c (_bfd_elf_get_synthetic_symtab): Set BSF_GLOBAL on
[binutils.git] / binutils / objdump.c
blobe5db6615741e76204b0e7cefa7572d893912d28c
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005
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)
11 any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
22 /* Objdump overview.
24 Objdump displays information about one or more object files, either on
25 their own, or inside libraries. It is commonly used as a disassembler,
26 but it can also display information about file headers, symbol tables,
27 relocations, debugging directives and more.
29 The flow of execution is as follows:
31 1. Command line arguments are checked for control switches and the
32 information to be displayed is selected.
34 2. Any remaining arguments are assumed to be object files, and they are
35 processed in order by display_bfd(). If the file is an archive each
36 of its elements is processed in turn.
38 3. The file's target architecture and binary file format are determined
39 by bfd_check_format(). If they are recognised, then dump_bfd() is
40 called.
42 4. dump_bfd() in turn calls separate functions to display the requested
43 item(s) of information(s). For example disassemble_data() is called if
44 a disassembly has been requested.
46 When disassembling the code loops through blocks of instructions bounded
47 by symbols, calling disassemble_bytes() on each block. The actual
48 disassembling is done by the libopcodes library, via a function pointer
49 supplied by the disassembler() function. */
51 #include "bfd.h"
52 #include "bfdver.h"
53 #include "progress.h"
54 #include "bucomm.h"
55 #include "dwarf.h"
56 #include "budemang.h"
57 #include "getopt.h"
58 #include "safe-ctype.h"
59 #include "dis-asm.h"
60 #include "libiberty.h"
61 #include "demangle.h"
62 #include "debug.h"
63 #include "budbg.h"
65 /* Internal headers for the ELF .stab-dump code - sorry. */
66 #define BYTES_IN_WORD 32
67 #include "aout/aout64.h"
69 #if !HAVE_DECL_FPRINTF
70 /* This is needed by init_disassemble_info(). */
71 extern int fprintf (FILE *, const char *, ...);
72 #endif
74 /* Exit status. */
75 static int exit_status = 0;
77 static char *default_target = NULL; /* Default at runtime. */
79 /* The following variables are set based on arguments passed on the
80 command line. */
81 static int show_version = 0; /* Show the version number. */
82 static int dump_section_contents; /* -s */
83 static int dump_section_headers; /* -h */
84 static bfd_boolean dump_file_header; /* -f */
85 static int dump_symtab; /* -t */
86 static int dump_dynamic_symtab; /* -T */
87 static int dump_reloc_info; /* -r */
88 static int dump_dynamic_reloc_info; /* -R */
89 static int dump_ar_hdrs; /* -a */
90 static int dump_private_headers; /* -p */
91 static int prefix_addresses; /* --prefix-addresses */
92 static int with_line_numbers; /* -l */
93 static bfd_boolean with_source_code; /* -S */
94 static int show_raw_insn; /* --show-raw-insn */
95 static int dump_dwarf_section_info; /* --dwarf */
96 static int dump_stab_section_info; /* --stabs */
97 static int do_demangle; /* -C, --demangle */
98 static bfd_boolean disassemble; /* -d */
99 static bfd_boolean disassemble_all; /* -D */
100 static int disassemble_zeroes; /* --disassemble-zeroes */
101 static bfd_boolean formats_info; /* -i */
102 static int wide_output; /* -w */
103 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
104 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
105 static int dump_debugging; /* --debugging */
106 static int dump_debugging_tags; /* --debugging-tags */
107 static int dump_special_syms = 0; /* --special-syms */
108 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
109 static int file_start_context = 0; /* --file-start-context */
111 /* Pointer to an array of section names provided by
112 one or more "-j secname" command line options. */
113 static char **only;
114 /* The total number of slots in the only[] array. */
115 static size_t only_size = 0;
116 /* The number of occupied slots in the only[] array. */
117 static size_t only_used = 0;
119 /* Variables for handling include file path table. */
120 static const char **include_paths;
121 static int include_path_count;
123 /* Extra info to pass to the section disassembler and address printing
124 function. */
125 struct objdump_disasm_info
127 bfd * abfd;
128 asection * sec;
129 bfd_boolean require_sec;
130 arelent ** dynrelbuf;
131 long dynrelcount;
132 disassembler_ftype disassemble_fn;
133 #ifdef DISASSEMBLER_NEEDS_RELOCS
134 arelent * reloc;
135 #endif
138 /* Architecture to disassemble for, or default if NULL. */
139 static char *machine = NULL;
141 /* Target specific options to the disassembler. */
142 static char *disassembler_options = NULL;
144 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
145 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
147 /* The symbol table. */
148 static asymbol **syms;
150 /* Number of symbols in `syms'. */
151 static long symcount = 0;
153 /* The sorted symbol table. */
154 static asymbol **sorted_syms;
156 /* Number of symbols in `sorted_syms'. */
157 static long sorted_symcount = 0;
159 /* The dynamic symbol table. */
160 static asymbol **dynsyms;
162 /* The synthetic symbol table. */
163 static asymbol *synthsyms;
164 static long synthcount = 0;
166 /* Number of symbols in `dynsyms'. */
167 static long dynsymcount = 0;
169 static bfd_byte *stabs;
170 static bfd_size_type stab_size;
172 static char *strtab;
173 static bfd_size_type stabstr_size;
175 static void
176 usage (FILE *stream, int status)
178 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
179 fprintf (stream, _(" Display information from object <file(s)>.\n"));
180 fprintf (stream, _(" At least one of the following switches must be given:\n"));
181 fprintf (stream, _("\
182 -a, --archive-headers Display archive header information\n\
183 -f, --file-headers Display the contents of the overall file header\n\
184 -p, --private-headers Display object format specific file header contents\n\
185 -h, --[section-]headers Display the contents of the section headers\n\
186 -x, --all-headers Display the contents of all headers\n\
187 -d, --disassemble Display assembler contents of executable sections\n\
188 -D, --disassemble-all Display assembler contents of all sections\n\
189 -S, --source Intermix source code with disassembly\n\
190 -s, --full-contents Display the full contents of all sections requested\n\
191 -g, --debugging Display debug information in object file\n\
192 -e, --debugging-tags Display debug information using ctags style\n\
193 -G, --stabs Display (in raw form) any STABS info in the file\n\
194 -W, --dwarf Display DWARF info in the file\n\
195 -t, --syms Display the contents of the symbol table(s)\n\
196 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
197 -r, --reloc Display the relocation entries in the file\n\
198 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
199 -v, --version Display this program's version number\n\
200 -i, --info List object formats and architectures supported\n\
201 -H, --help Display this information\n\
202 "));
203 if (status != 2)
205 fprintf (stream, _("\n The following switches are optional:\n"));
206 fprintf (stream, _("\
207 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
208 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
209 -j, --section=NAME Only display information for section NAME\n\
210 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
211 -EB --endian=big Assume big endian format when disassembling\n\
212 -EL --endian=little Assume little endian format when disassembling\n\
213 --file-start-context Include context from start of file (with -S)\n\
214 -I, --include=DIR Add DIR to search list for source files\n\
215 -l, --line-numbers Include line numbers and filenames in output\n\
216 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
217 The STYLE, if specified, can be `auto', `gnu',\n\
218 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
219 or `gnat'\n\
220 -w, --wide Format output for more than 80 columns\n\
221 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
222 --start-address=ADDR Only process data whose address is >= ADDR\n\
223 --stop-address=ADDR Only process data whose address is <= ADDR\n\
224 --prefix-addresses Print complete address alongside disassembly\n\
225 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
226 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
227 --special-syms Include special symbols in symbol dumps\n\
228 \n"));
229 list_supported_targets (program_name, stream);
230 list_supported_architectures (program_name, stream);
232 disassembler_usage (stream);
234 if (status == 0)
235 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
236 exit (status);
239 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
240 enum option_values
242 OPTION_ENDIAN=150,
243 OPTION_START_ADDRESS,
244 OPTION_STOP_ADDRESS,
245 OPTION_ADJUST_VMA
248 static struct option long_options[]=
250 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
251 {"all-headers", no_argument, NULL, 'x'},
252 {"private-headers", no_argument, NULL, 'p'},
253 {"architecture", required_argument, NULL, 'm'},
254 {"archive-headers", no_argument, NULL, 'a'},
255 {"debugging", no_argument, NULL, 'g'},
256 {"debugging-tags", no_argument, NULL, 'e'},
257 {"demangle", optional_argument, NULL, 'C'},
258 {"disassemble", no_argument, NULL, 'd'},
259 {"disassemble-all", no_argument, NULL, 'D'},
260 {"disassembler-options", required_argument, NULL, 'M'},
261 {"disassemble-zeroes", no_argument, NULL, 'z'},
262 {"dynamic-reloc", no_argument, NULL, 'R'},
263 {"dynamic-syms", no_argument, NULL, 'T'},
264 {"endian", required_argument, NULL, OPTION_ENDIAN},
265 {"file-headers", no_argument, NULL, 'f'},
266 {"file-start-context", no_argument, &file_start_context, 1},
267 {"full-contents", no_argument, NULL, 's'},
268 {"headers", no_argument, NULL, 'h'},
269 {"help", no_argument, NULL, 'H'},
270 {"info", no_argument, NULL, 'i'},
271 {"line-numbers", no_argument, NULL, 'l'},
272 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
273 {"prefix-addresses", no_argument, &prefix_addresses, 1},
274 {"reloc", no_argument, NULL, 'r'},
275 {"section", required_argument, NULL, 'j'},
276 {"section-headers", no_argument, NULL, 'h'},
277 {"show-raw-insn", no_argument, &show_raw_insn, 1},
278 {"source", no_argument, NULL, 'S'},
279 {"special-syms", no_argument, &dump_special_syms, 1},
280 {"include", required_argument, NULL, 'I'},
281 {"dwarf", no_argument, NULL, 'W'},
282 {"stabs", no_argument, NULL, 'G'},
283 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
284 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
285 {"syms", no_argument, NULL, 't'},
286 {"target", required_argument, NULL, 'b'},
287 {"version", no_argument, NULL, 'V'},
288 {"wide", no_argument, NULL, 'w'},
289 {0, no_argument, 0, 0}
292 static void
293 nonfatal (const char *msg)
295 bfd_nonfatal (msg);
296 exit_status = 1;
299 static void
300 dump_section_header (bfd *abfd, asection *section,
301 void *ignored ATTRIBUTE_UNUSED)
303 char *comma = "";
304 unsigned int opb = bfd_octets_per_byte (abfd);
306 /* Ignore linker created section. See elfNN_ia64_object_p in
307 bfd/elfxx-ia64.c. */
308 if (section->flags & SEC_LINKER_CREATED)
309 return;
311 printf ("%3d %-13s %08lx ", section->index,
312 bfd_get_section_name (abfd, section),
313 (unsigned long) bfd_section_size (abfd, section) / opb);
314 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
315 printf (" ");
316 bfd_printf_vma (abfd, section->lma);
317 printf (" %08lx 2**%u", (unsigned long) section->filepos,
318 bfd_get_section_alignment (abfd, section));
319 if (! wide_output)
320 printf ("\n ");
321 printf (" ");
323 #define PF(x, y) \
324 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
326 PF (SEC_HAS_CONTENTS, "CONTENTS");
327 PF (SEC_ALLOC, "ALLOC");
328 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
329 PF (SEC_LOAD, "LOAD");
330 PF (SEC_RELOC, "RELOC");
331 PF (SEC_READONLY, "READONLY");
332 PF (SEC_CODE, "CODE");
333 PF (SEC_DATA, "DATA");
334 PF (SEC_ROM, "ROM");
335 PF (SEC_DEBUGGING, "DEBUGGING");
336 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
337 PF (SEC_EXCLUDE, "EXCLUDE");
338 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
339 if (bfd_get_arch (abfd) == bfd_arch_tic54x)
341 PF (SEC_TIC54X_BLOCK, "BLOCK");
342 PF (SEC_TIC54X_CLINK, "CLINK");
344 PF (SEC_SMALL_DATA, "SMALL_DATA");
345 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
346 PF (SEC_COFF_SHARED, "SHARED");
347 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
348 PF (SEC_GROUP, "GROUP");
350 if ((section->flags & SEC_LINK_ONCE) != 0)
352 const char *ls;
353 struct coff_comdat_info *comdat;
355 switch (section->flags & SEC_LINK_DUPLICATES)
357 default:
358 abort ();
359 case SEC_LINK_DUPLICATES_DISCARD:
360 ls = "LINK_ONCE_DISCARD";
361 break;
362 case SEC_LINK_DUPLICATES_ONE_ONLY:
363 ls = "LINK_ONCE_ONE_ONLY";
364 break;
365 case SEC_LINK_DUPLICATES_SAME_SIZE:
366 ls = "LINK_ONCE_SAME_SIZE";
367 break;
368 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
369 ls = "LINK_ONCE_SAME_CONTENTS";
370 break;
372 printf ("%s%s", comma, ls);
374 comdat = bfd_coff_get_comdat_section (abfd, section);
375 if (comdat != NULL)
376 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
378 comma = ", ";
381 printf ("\n");
382 #undef PF
385 static void
386 dump_headers (bfd *abfd)
388 printf (_("Sections:\n"));
390 #ifndef BFD64
391 printf (_("Idx Name Size VMA LMA File off Algn"));
392 #else
393 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
394 if (bfd_get_arch_size (abfd) == 32)
395 printf (_("Idx Name Size VMA LMA File off Algn"));
396 else
397 printf (_("Idx Name Size VMA LMA File off Algn"));
398 #endif
400 if (wide_output)
401 printf (_(" Flags"));
402 if (abfd->flags & HAS_LOAD_PAGE)
403 printf (_(" Pg"));
404 printf ("\n");
406 bfd_map_over_sections (abfd, dump_section_header, NULL);
409 static asymbol **
410 slurp_symtab (bfd *abfd)
412 asymbol **sy = NULL;
413 long storage;
415 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
417 symcount = 0;
418 return NULL;
421 storage = bfd_get_symtab_upper_bound (abfd);
422 if (storage < 0)
423 bfd_fatal (bfd_get_filename (abfd));
424 if (storage)
425 sy = xmalloc (storage);
427 symcount = bfd_canonicalize_symtab (abfd, sy);
428 if (symcount < 0)
429 bfd_fatal (bfd_get_filename (abfd));
430 return sy;
433 /* Read in the dynamic symbols. */
435 static asymbol **
436 slurp_dynamic_symtab (bfd *abfd)
438 asymbol **sy = NULL;
439 long storage;
441 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
442 if (storage < 0)
444 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
446 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
447 dynsymcount = 0;
448 return NULL;
451 bfd_fatal (bfd_get_filename (abfd));
453 if (storage)
454 sy = xmalloc (storage);
456 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
457 if (dynsymcount < 0)
458 bfd_fatal (bfd_get_filename (abfd));
459 return sy;
462 /* Filter out (in place) symbols that are useless for disassembly.
463 COUNT is the number of elements in SYMBOLS.
464 Return the number of useful symbols. */
466 static long
467 remove_useless_symbols (asymbol **symbols, long count)
469 asymbol **in_ptr = symbols, **out_ptr = symbols;
471 while (--count >= 0)
473 asymbol *sym = *in_ptr++;
475 if (sym->name == NULL || sym->name[0] == '\0')
476 continue;
477 if (sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
478 continue;
479 if (bfd_is_und_section (sym->section)
480 || bfd_is_com_section (sym->section))
481 continue;
483 *out_ptr++ = sym;
485 return out_ptr - symbols;
488 /* Sort symbols into value order. */
490 static int
491 compare_symbols (const void *ap, const void *bp)
493 const asymbol *a = * (const asymbol **) ap;
494 const asymbol *b = * (const asymbol **) bp;
495 const char *an;
496 const char *bn;
497 size_t anl;
498 size_t bnl;
499 bfd_boolean af;
500 bfd_boolean bf;
501 flagword aflags;
502 flagword bflags;
504 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
505 return 1;
506 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
507 return -1;
509 if (a->section > b->section)
510 return 1;
511 else if (a->section < b->section)
512 return -1;
514 an = bfd_asymbol_name (a);
515 bn = bfd_asymbol_name (b);
516 anl = strlen (an);
517 bnl = strlen (bn);
519 /* The symbols gnu_compiled and gcc2_compiled convey no real
520 information, so put them after other symbols with the same value. */
521 af = (strstr (an, "gnu_compiled") != NULL
522 || strstr (an, "gcc2_compiled") != NULL);
523 bf = (strstr (bn, "gnu_compiled") != NULL
524 || strstr (bn, "gcc2_compiled") != NULL);
526 if (af && ! bf)
527 return 1;
528 if (! af && bf)
529 return -1;
531 /* We use a heuristic for the file name, to try to sort it after
532 more useful symbols. It may not work on non Unix systems, but it
533 doesn't really matter; the only difference is precisely which
534 symbol names get printed. */
536 #define file_symbol(s, sn, snl) \
537 (((s)->flags & BSF_FILE) != 0 \
538 || ((sn)[(snl) - 2] == '.' \
539 && ((sn)[(snl) - 1] == 'o' \
540 || (sn)[(snl) - 1] == 'a')))
542 af = file_symbol (a, an, anl);
543 bf = file_symbol (b, bn, bnl);
545 if (af && ! bf)
546 return 1;
547 if (! af && bf)
548 return -1;
550 /* Try to sort global symbols before local symbols before function
551 symbols before debugging symbols. */
553 aflags = a->flags;
554 bflags = b->flags;
556 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
558 if ((aflags & BSF_DEBUGGING) != 0)
559 return 1;
560 else
561 return -1;
563 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
565 if ((aflags & BSF_FUNCTION) != 0)
566 return -1;
567 else
568 return 1;
570 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
572 if ((aflags & BSF_LOCAL) != 0)
573 return 1;
574 else
575 return -1;
577 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
579 if ((aflags & BSF_GLOBAL) != 0)
580 return -1;
581 else
582 return 1;
585 /* Symbols that start with '.' might be section names, so sort them
586 after symbols that don't start with '.'. */
587 if (an[0] == '.' && bn[0] != '.')
588 return 1;
589 if (an[0] != '.' && bn[0] == '.')
590 return -1;
592 /* Finally, if we can't distinguish them in any other way, try to
593 get consistent results by sorting the symbols by name. */
594 return strcmp (an, bn);
597 /* Sort relocs into address order. */
599 static int
600 compare_relocs (const void *ap, const void *bp)
602 const arelent *a = * (const arelent **) ap;
603 const arelent *b = * (const arelent **) bp;
605 if (a->address > b->address)
606 return 1;
607 else if (a->address < b->address)
608 return -1;
610 /* So that associated relocations tied to the same address show up
611 in the correct order, we don't do any further sorting. */
612 if (a > b)
613 return 1;
614 else if (a < b)
615 return -1;
616 else
617 return 0;
620 /* Print an address (VMA) to the output stream in INFO.
621 If SKIP_ZEROES is TRUE, omit leading zeroes. */
623 static void
624 objdump_print_value (bfd_vma vma, struct disassemble_info *info,
625 bfd_boolean skip_zeroes)
627 char buf[30];
628 char *p;
629 struct objdump_disasm_info *aux;
631 aux = (struct objdump_disasm_info *) info->application_data;
632 bfd_sprintf_vma (aux->abfd, buf, vma);
633 if (! skip_zeroes)
634 p = buf;
635 else
637 for (p = buf; *p == '0'; ++p)
639 if (*p == '\0')
640 --p;
642 (*info->fprintf_func) (info->stream, "%s", p);
645 /* Print the name of a symbol. */
647 static void
648 objdump_print_symname (bfd *abfd, struct disassemble_info *info,
649 asymbol *sym)
651 char *alloc;
652 const char *name;
654 alloc = NULL;
655 name = bfd_asymbol_name (sym);
656 if (do_demangle && name[0] != '\0')
658 /* Demangle the name. */
659 alloc = demangle (abfd, name);
660 name = alloc;
663 if (info != NULL)
664 (*info->fprintf_func) (info->stream, "%s", name);
665 else
666 printf ("%s", name);
668 if (alloc != NULL)
669 free (alloc);
672 /* Locate a symbol given a bfd and a section (from INFO->application_data),
673 and a VMA. If INFO->application_data->require_sec is TRUE, then always
674 require the symbol to be in the section. Returns NULL if there is no
675 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
676 of the symbol in sorted_syms. */
678 static asymbol *
679 find_symbol_for_address (bfd_vma vma,
680 struct disassemble_info *info,
681 long *place)
683 /* @@ Would it speed things up to cache the last two symbols returned,
684 and maybe their address ranges? For many processors, only one memory
685 operand can be present at a time, so the 2-entry cache wouldn't be
686 constantly churned by code doing heavy memory accesses. */
688 /* Indices in `sorted_syms'. */
689 long min = 0;
690 long max = sorted_symcount;
691 long thisplace;
692 struct objdump_disasm_info *aux;
693 bfd *abfd;
694 asection *sec;
695 unsigned int opb;
697 if (sorted_symcount < 1)
698 return NULL;
700 aux = (struct objdump_disasm_info *) info->application_data;
701 abfd = aux->abfd;
702 sec = aux->sec;
703 opb = bfd_octets_per_byte (abfd);
705 /* Perform a binary search looking for the closest symbol to the
706 required value. We are searching the range (min, max]. */
707 while (min + 1 < max)
709 asymbol *sym;
711 thisplace = (max + min) / 2;
712 sym = sorted_syms[thisplace];
714 if (bfd_asymbol_value (sym) > vma)
715 max = thisplace;
716 else if (bfd_asymbol_value (sym) < vma)
717 min = thisplace;
718 else
720 min = thisplace;
721 break;
725 /* The symbol we want is now in min, the low end of the range we
726 were searching. If there are several symbols with the same
727 value, we want the first one. */
728 thisplace = min;
729 while (thisplace > 0
730 && (bfd_asymbol_value (sorted_syms[thisplace])
731 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
732 --thisplace;
734 /* If the file is relocatable, and the symbol could be from this
735 section, prefer a symbol from this section over symbols from
736 others, even if the other symbol's value might be closer.
738 Note that this may be wrong for some symbol references if the
739 sections have overlapping memory ranges, but in that case there's
740 no way to tell what's desired without looking at the relocation
741 table. */
742 if (sorted_syms[thisplace]->section != sec
743 && (aux->require_sec
744 || ((abfd->flags & HAS_RELOC) != 0
745 && vma >= bfd_get_section_vma (abfd, sec)
746 && vma < (bfd_get_section_vma (abfd, sec)
747 + bfd_section_size (abfd, sec) / opb))))
749 long i;
751 for (i = thisplace + 1; i < sorted_symcount; i++)
753 if (bfd_asymbol_value (sorted_syms[i])
754 != bfd_asymbol_value (sorted_syms[thisplace]))
755 break;
758 --i;
760 for (; i >= 0; i--)
762 if (sorted_syms[i]->section == sec
763 && (i == 0
764 || sorted_syms[i - 1]->section != sec
765 || (bfd_asymbol_value (sorted_syms[i])
766 != bfd_asymbol_value (sorted_syms[i - 1]))))
768 thisplace = i;
769 break;
773 if (sorted_syms[thisplace]->section != sec)
775 /* We didn't find a good symbol with a smaller value.
776 Look for one with a larger value. */
777 for (i = thisplace + 1; i < sorted_symcount; i++)
779 if (sorted_syms[i]->section == sec)
781 thisplace = i;
782 break;
787 if (sorted_syms[thisplace]->section != sec
788 && (aux->require_sec
789 || ((abfd->flags & HAS_RELOC) != 0
790 && vma >= bfd_get_section_vma (abfd, sec)
791 && vma < (bfd_get_section_vma (abfd, sec)
792 + bfd_section_size (abfd, sec)))))
793 /* There is no suitable symbol. */
794 return NULL;
797 /* Give the target a chance to reject the symbol. */
798 while (! info->symbol_is_valid (sorted_syms [thisplace], info))
800 ++ thisplace;
801 if (thisplace >= sorted_symcount
802 || bfd_asymbol_value (sorted_syms [thisplace]) > vma)
803 return NULL;
806 if (place != NULL)
807 *place = thisplace;
809 return sorted_syms[thisplace];
812 /* Print an address and the offset to the nearest symbol. */
814 static void
815 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
816 bfd_vma vma, struct disassemble_info *info,
817 bfd_boolean skip_zeroes)
819 objdump_print_value (vma, info, skip_zeroes);
821 if (sym == NULL)
823 bfd_vma secaddr;
825 (*info->fprintf_func) (info->stream, " <%s",
826 bfd_get_section_name (abfd, sec));
827 secaddr = bfd_get_section_vma (abfd, sec);
828 if (vma < secaddr)
830 (*info->fprintf_func) (info->stream, "-0x");
831 objdump_print_value (secaddr - vma, info, TRUE);
833 else if (vma > secaddr)
835 (*info->fprintf_func) (info->stream, "+0x");
836 objdump_print_value (vma - secaddr, info, TRUE);
838 (*info->fprintf_func) (info->stream, ">");
840 else
842 (*info->fprintf_func) (info->stream, " <");
843 objdump_print_symname (abfd, info, sym);
844 if (bfd_asymbol_value (sym) > vma)
846 (*info->fprintf_func) (info->stream, "-0x");
847 objdump_print_value (bfd_asymbol_value (sym) - vma, info, TRUE);
849 else if (vma > bfd_asymbol_value (sym))
851 (*info->fprintf_func) (info->stream, "+0x");
852 objdump_print_value (vma - bfd_asymbol_value (sym), info, TRUE);
854 (*info->fprintf_func) (info->stream, ">");
858 /* Print an address (VMA), symbolically if possible.
859 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
861 static void
862 objdump_print_addr (bfd_vma vma,
863 struct disassemble_info *info,
864 bfd_boolean skip_zeroes)
866 struct objdump_disasm_info *aux;
867 asymbol *sym = NULL; /* Initialize to avoid compiler warning. */
868 #ifdef DISASSEMBLER_NEEDS_RELOCS
869 bfd_boolean skip_find = FALSE;
870 #endif
872 if (sorted_symcount < 1)
874 (*info->fprintf_func) (info->stream, "0x");
875 objdump_print_value (vma, info, skip_zeroes);
876 return;
879 aux = (struct objdump_disasm_info *) info->application_data;
881 #ifdef DISASSEMBLER_NEEDS_RELOCS
882 if (aux->reloc != NULL
883 && aux->reloc->sym_ptr_ptr != NULL
884 && * aux->reloc->sym_ptr_ptr != NULL)
886 sym = * aux->reloc->sym_ptr_ptr;
888 /* Adjust the vma to the reloc. */
889 vma += bfd_asymbol_value (sym);
891 if (bfd_is_und_section (bfd_get_section (sym)))
892 skip_find = TRUE;
895 if (!skip_find)
896 #endif
897 sym = find_symbol_for_address (vma, info, NULL);
899 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
900 skip_zeroes);
903 /* Print VMA to INFO. This function is passed to the disassembler
904 routine. */
906 static void
907 objdump_print_address (bfd_vma vma, struct disassemble_info *info)
909 objdump_print_addr (vma, info, ! prefix_addresses);
912 /* Determine of the given address has a symbol associated with it. */
914 static int
915 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * info)
917 asymbol * sym;
919 sym = find_symbol_for_address (vma, info, NULL);
921 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
924 /* Hold the last function name and the last line number we displayed
925 in a disassembly. */
927 static char *prev_functionname;
928 static unsigned int prev_line;
930 /* We keep a list of all files that we have seen when doing a
931 disassembly with source, so that we know how much of the file to
932 display. This can be important for inlined functions. */
934 struct print_file_list
936 struct print_file_list *next;
937 const char *filename;
938 const char *modname;
939 unsigned int line;
940 FILE *f;
943 static struct print_file_list *print_files;
945 /* The number of preceding context lines to show when we start
946 displaying a file for the first time. */
948 #define SHOW_PRECEDING_CONTEXT_LINES (5)
950 /* Tries to open MODNAME, and if successful adds a node to print_files
951 linked list and returns that node. Returns NULL on failure. */
953 static struct print_file_list *
954 try_print_file_open (const char *origname, const char *modname)
956 struct print_file_list *p;
957 FILE *f;
959 f = fopen (modname, "r");
960 if (f == NULL)
961 return NULL;
963 if (print_files != NULL && print_files->f != NULL)
965 fclose (print_files->f);
966 print_files->f = NULL;
969 p = xmalloc (sizeof (struct print_file_list));
970 p->filename = origname;
971 p->modname = modname;
972 p->line = 0;
973 p->f = f;
974 p->next = print_files;
975 print_files = p;
976 return p;
979 /* If the the source file, as described in the symtab, is not found
980 try to locate it in one of the paths specified with -I
981 If found, add location to print_files linked list. */
983 static struct print_file_list *
984 update_source_path (const char *filename)
986 struct print_file_list *p;
987 const char *fname;
988 int i;
990 if (filename == NULL)
991 return NULL;
993 p = try_print_file_open (filename, filename);
994 if (p != NULL)
995 return p;
997 if (include_path_count == 0)
998 return NULL;
1000 /* Get the name of the file. */
1001 fname = strrchr (filename, '/');
1002 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1004 /* We could have a mixed forward/back slash case. */
1005 char *backslash = strrchr (filename, '\\');
1006 if (fname == NULL || (backslash != NULL && backslash > fname))
1007 fname = backslash;
1008 if (fname == NULL && filename[0] != '\0' && filename[1] == ':')
1009 fname = filename + 1;
1011 #endif
1012 if (fname == NULL)
1013 fname = filename;
1014 else
1015 ++fname;
1017 /* If file exists under a new path, we need to add it to the list
1018 so that show_line knows about it. */
1019 for (i = 0; i < include_path_count; i++)
1021 char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1023 p = try_print_file_open (filename, modname);
1024 if (p)
1025 return p;
1027 free (modname);
1030 return NULL;
1033 /* Skip ahead to a given line in a file, optionally printing each
1034 line. */
1036 static void
1037 skip_to_line (struct print_file_list *p, unsigned int line,
1038 bfd_boolean show)
1040 while (p->line < line)
1042 char buf[100];
1044 if (fgets (buf, sizeof buf, p->f) == NULL)
1046 fclose (p->f);
1047 p->f = NULL;
1048 break;
1051 if (show)
1052 printf ("%s", buf);
1054 if (strchr (buf, '\n') != NULL)
1055 ++p->line;
1059 /* Show the line number, or the source line, in a disassembly
1060 listing. */
1062 static void
1063 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1065 const char *filename;
1066 const char *functionname;
1067 unsigned int line;
1069 if (! with_line_numbers && ! with_source_code)
1070 return;
1072 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1073 &functionname, &line))
1074 return;
1076 if (filename != NULL && *filename == '\0')
1077 filename = NULL;
1078 if (functionname != NULL && *functionname == '\0')
1079 functionname = NULL;
1081 if (with_line_numbers)
1083 if (functionname != NULL
1084 && (prev_functionname == NULL
1085 || strcmp (functionname, prev_functionname) != 0))
1086 printf ("%s():\n", functionname);
1087 if (line > 0 && line != prev_line)
1088 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1091 if (with_source_code
1092 && filename != NULL
1093 && line > 0)
1095 struct print_file_list **pp, *p;
1097 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1098 if (strcmp ((*pp)->filename, filename) == 0)
1099 break;
1100 p = *pp;
1102 if (p != NULL)
1104 if (p != print_files)
1106 int l;
1108 /* We have reencountered a file name which we saw
1109 earlier. This implies that either we are dumping out
1110 code from an included file, or the same file was
1111 linked in more than once. There are two common cases
1112 of an included file: inline functions in a header
1113 file, and a bison or flex skeleton file. In the
1114 former case we want to just start printing (but we
1115 back up a few lines to give context); in the latter
1116 case we want to continue from where we left off. I
1117 can't think of a good way to distinguish the cases,
1118 so I used a heuristic based on the file name. */
1119 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1120 l = p->line;
1121 else
1123 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1124 if (l < 0)
1125 l = 0;
1128 if (p->f == NULL)
1130 p->f = fopen (p->modname, "r");
1131 p->line = 0;
1133 if (p->f != NULL)
1134 skip_to_line (p, l, FALSE);
1136 if (print_files->f != NULL)
1138 fclose (print_files->f);
1139 print_files->f = NULL;
1143 if (p->f != NULL)
1145 skip_to_line (p, line, TRUE);
1146 *pp = p->next;
1147 p->next = print_files;
1148 print_files = p;
1151 else
1153 p = update_source_path (filename);
1155 if (p != NULL)
1157 int l;
1159 if (file_start_context)
1160 l = 0;
1161 else
1162 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1163 if (l < 0)
1164 l = 0;
1165 skip_to_line (p, l, FALSE);
1166 if (p->f != NULL)
1167 skip_to_line (p, line, TRUE);
1172 if (functionname != NULL
1173 && (prev_functionname == NULL
1174 || strcmp (functionname, prev_functionname) != 0))
1176 if (prev_functionname != NULL)
1177 free (prev_functionname);
1178 prev_functionname = xmalloc (strlen (functionname) + 1);
1179 strcpy (prev_functionname, functionname);
1182 if (line > 0 && line != prev_line)
1183 prev_line = line;
1186 /* Pseudo FILE object for strings. */
1187 typedef struct
1189 char *buffer;
1190 size_t pos;
1191 size_t alloc;
1192 } SFILE;
1194 /* sprintf to a "stream". */
1196 static int ATTRIBUTE_PRINTF_2
1197 objdump_sprintf (SFILE *f, const char *format, ...)
1199 size_t n;
1200 va_list args;
1202 while (1)
1204 size_t space = f->alloc - f->pos;
1206 va_start (args, format);
1207 n = vsnprintf (f->buffer + f->pos, space, format, args);
1208 va_end (args);
1210 if (space > n)
1211 break;
1213 f->alloc = (f->alloc + n) * 2;
1214 f->buffer = xrealloc (f->buffer, f->alloc);
1216 f->pos += n;
1218 return n;
1221 /* Returns TRUE if the specified section should be dumped. */
1223 static bfd_boolean
1224 process_section_p (asection * section)
1226 size_t i;
1228 if (only == NULL)
1229 return TRUE;
1231 for (i = 0; i < only_used; i++)
1232 if (strcmp (only [i], section->name) == 0)
1233 return TRUE;
1235 return FALSE;
1239 /* The number of zeroes we want to see before we start skipping them.
1240 The number is arbitrarily chosen. */
1242 #define DEFAULT_SKIP_ZEROES 8
1244 /* The number of zeroes to skip at the end of a section. If the
1245 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1246 SKIP_ZEROES, they will be disassembled. If there are fewer than
1247 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1248 attempt to avoid disassembling zeroes inserted by section
1249 alignment. */
1251 #define DEFAULT_SKIP_ZEROES_AT_END 3
1253 /* Disassemble some data in memory between given values. */
1255 static void
1256 disassemble_bytes (struct disassemble_info * info,
1257 disassembler_ftype disassemble_fn,
1258 bfd_boolean insns,
1259 bfd_byte * data,
1260 bfd_vma start_offset,
1261 bfd_vma stop_offset,
1262 bfd_vma rel_offset,
1263 arelent *** relppp,
1264 arelent ** relppend)
1266 struct objdump_disasm_info *aux;
1267 asection *section;
1268 int octets_per_line;
1269 bfd_boolean done_dot;
1270 int skip_addr_chars;
1271 bfd_vma addr_offset;
1272 unsigned int opb = info->octets_per_byte;
1273 unsigned int skip_zeroes = info->skip_zeroes;
1274 unsigned int skip_zeroes_at_end = info->skip_zeroes_at_end;
1275 int octets = opb;
1276 SFILE sfile;
1278 aux = (struct objdump_disasm_info *) info->application_data;
1279 section = aux->sec;
1281 sfile.alloc = 120;
1282 sfile.buffer = xmalloc (sfile.alloc);
1283 sfile.pos = 0;
1285 if (insns)
1286 octets_per_line = 4;
1287 else
1288 octets_per_line = 16;
1290 /* Figure out how many characters to skip at the start of an
1291 address, to make the disassembly look nicer. We discard leading
1292 zeroes in chunks of 4, ensuring that there is always a leading
1293 zero remaining. */
1294 skip_addr_chars = 0;
1295 if (! prefix_addresses)
1297 char buf[30];
1298 char *s;
1300 bfd_sprintf_vma
1301 (aux->abfd, buf,
1302 (section->vma
1303 + bfd_section_size (section->owner, section) / opb));
1304 s = buf;
1305 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1306 && s[4] == '0')
1308 skip_addr_chars += 4;
1309 s += 4;
1313 info->insn_info_valid = 0;
1315 done_dot = FALSE;
1316 addr_offset = start_offset;
1317 while (addr_offset < stop_offset)
1319 bfd_vma z;
1320 bfd_boolean need_nl = FALSE;
1321 #ifdef DISASSEMBLER_NEEDS_RELOCS
1322 int previous_octets;
1324 /* Remember the length of the previous instruction. */
1325 previous_octets = octets;
1326 #endif
1327 octets = 0;
1329 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1330 print `...'. */
1331 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1332 if (data[z] != 0)
1333 break;
1334 if (! disassemble_zeroes
1335 && (info->insn_info_valid == 0
1336 || info->branch_delay_insns == 0)
1337 && (z - addr_offset * opb >= skip_zeroes
1338 || (z == stop_offset * opb &&
1339 z - addr_offset * opb < skip_zeroes_at_end)))
1341 printf ("\t...\n");
1343 /* If there are more nonzero octets to follow, we only skip
1344 zeroes in multiples of 4, to try to avoid running over
1345 the start of an instruction which happens to start with
1346 zero. */
1347 if (z != stop_offset * opb)
1348 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1350 octets = z - addr_offset * opb;
1352 else
1354 char buf[50];
1355 int bpc = 0;
1356 int pb = 0;
1358 done_dot = FALSE;
1360 if (with_line_numbers || with_source_code)
1361 show_line (aux->abfd, section, addr_offset);
1363 if (! prefix_addresses)
1365 char *s;
1367 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1368 for (s = buf + skip_addr_chars; *s == '0'; s++)
1369 *s = ' ';
1370 if (*s == '\0')
1371 *--s = '0';
1372 printf ("%s:\t", buf + skip_addr_chars);
1374 else
1376 aux->require_sec = TRUE;
1377 objdump_print_address (section->vma + addr_offset, info);
1378 aux->require_sec = FALSE;
1379 putchar (' ');
1382 if (insns)
1384 sfile.pos = 0;
1385 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1386 info->stream = &sfile;
1387 info->bytes_per_line = 0;
1388 info->bytes_per_chunk = 0;
1389 info->flags = 0;
1391 #ifdef DISASSEMBLER_NEEDS_RELOCS
1392 if (*relppp < relppend)
1394 bfd_signed_vma distance_to_rel;
1396 distance_to_rel = (**relppp)->address
1397 - (rel_offset + addr_offset);
1399 /* Check to see if the current reloc is associated with
1400 the instruction that we are about to disassemble. */
1401 if (distance_to_rel == 0
1402 /* FIXME: This is wrong. We are trying to catch
1403 relocs that are addressed part way through the
1404 current instruction, as might happen with a packed
1405 VLIW instruction. Unfortunately we do not know the
1406 length of the current instruction since we have not
1407 disassembled it yet. Instead we take a guess based
1408 upon the length of the previous instruction. The
1409 proper solution is to have a new target-specific
1410 disassembler function which just returns the length
1411 of an instruction at a given address without trying
1412 to display its disassembly. */
1413 || (distance_to_rel > 0
1414 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1416 info->flags = INSN_HAS_RELOC;
1417 aux->reloc = **relppp;
1419 else
1420 aux->reloc = NULL;
1422 #endif
1423 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1424 info->fprintf_func = (fprintf_ftype) fprintf;
1425 info->stream = stdout;
1426 if (info->bytes_per_line != 0)
1427 octets_per_line = info->bytes_per_line;
1428 if (octets < 0)
1430 if (sfile.pos)
1431 printf ("%s\n", sfile.buffer);
1432 break;
1435 else
1437 bfd_vma j;
1439 octets = octets_per_line;
1440 if (addr_offset + octets / opb > stop_offset)
1441 octets = (stop_offset - addr_offset) * opb;
1443 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1445 if (ISPRINT (data[j]))
1446 buf[j - addr_offset * opb] = data[j];
1447 else
1448 buf[j - addr_offset * opb] = '.';
1450 buf[j - addr_offset * opb] = '\0';
1453 if (prefix_addresses
1454 ? show_raw_insn > 0
1455 : show_raw_insn >= 0)
1457 bfd_vma j;
1459 /* If ! prefix_addresses and ! wide_output, we print
1460 octets_per_line octets per line. */
1461 pb = octets;
1462 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1463 pb = octets_per_line;
1465 if (info->bytes_per_chunk)
1466 bpc = info->bytes_per_chunk;
1467 else
1468 bpc = 1;
1470 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1472 int k;
1474 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1476 for (k = bpc - 1; k >= 0; k--)
1477 printf ("%02x", (unsigned) data[j + k]);
1478 putchar (' ');
1480 else
1482 for (k = 0; k < bpc; k++)
1483 printf ("%02x", (unsigned) data[j + k]);
1484 putchar (' ');
1488 for (; pb < octets_per_line; pb += bpc)
1490 int k;
1492 for (k = 0; k < bpc; k++)
1493 printf (" ");
1494 putchar (' ');
1497 /* Separate raw data from instruction by extra space. */
1498 if (insns)
1499 putchar ('\t');
1500 else
1501 printf (" ");
1504 if (! insns)
1505 printf ("%s", buf);
1506 else if (sfile.pos)
1507 printf ("%s", sfile.buffer);
1509 if (prefix_addresses
1510 ? show_raw_insn > 0
1511 : show_raw_insn >= 0)
1513 while (pb < octets)
1515 bfd_vma j;
1516 char *s;
1518 putchar ('\n');
1519 j = addr_offset * opb + pb;
1521 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1522 for (s = buf + skip_addr_chars; *s == '0'; s++)
1523 *s = ' ';
1524 if (*s == '\0')
1525 *--s = '0';
1526 printf ("%s:\t", buf + skip_addr_chars);
1528 pb += octets_per_line;
1529 if (pb > octets)
1530 pb = octets;
1531 for (; j < addr_offset * opb + pb; j += bpc)
1533 int k;
1535 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1537 for (k = bpc - 1; k >= 0; k--)
1538 printf ("%02x", (unsigned) data[j + k]);
1539 putchar (' ');
1541 else
1543 for (k = 0; k < bpc; k++)
1544 printf ("%02x", (unsigned) data[j + k]);
1545 putchar (' ');
1551 if (!wide_output)
1552 putchar ('\n');
1553 else
1554 need_nl = TRUE;
1557 while ((*relppp) < relppend
1558 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1560 if (dump_reloc_info || dump_dynamic_reloc_info)
1562 arelent *q;
1564 q = **relppp;
1566 if (wide_output)
1567 putchar ('\t');
1568 else
1569 printf ("\t\t\t");
1571 objdump_print_value (section->vma - rel_offset + q->address,
1572 info, TRUE);
1574 if (q->howto == NULL)
1575 printf (": *unknown*\t");
1576 else if (q->howto->name)
1577 printf (": %s\t", q->howto->name);
1578 else
1579 printf (": %d\t", q->howto->type);
1581 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1582 printf ("*unknown*");
1583 else
1585 const char *sym_name;
1587 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1588 if (sym_name != NULL && *sym_name != '\0')
1589 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1590 else
1592 asection *sym_sec;
1594 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1595 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1596 if (sym_name == NULL || *sym_name == '\0')
1597 sym_name = "*unknown*";
1598 printf ("%s", sym_name);
1602 if (q->addend)
1604 printf ("+0x");
1605 objdump_print_value (q->addend, info, TRUE);
1608 printf ("\n");
1609 need_nl = FALSE;
1611 ++(*relppp);
1614 if (need_nl)
1615 printf ("\n");
1617 addr_offset += octets / opb;
1620 free (sfile.buffer);
1623 static void
1624 disassemble_section (bfd *abfd, asection *section, void *info)
1626 struct disassemble_info * pinfo = (struct disassemble_info *) info;
1627 struct objdump_disasm_info * paux;
1628 unsigned int opb = pinfo->octets_per_byte;
1629 bfd_byte * data = NULL;
1630 bfd_size_type datasize = 0;
1631 arelent ** rel_pp = NULL;
1632 arelent ** rel_ppstart = NULL;
1633 arelent ** rel_ppend;
1634 unsigned long stop_offset;
1635 asymbol * sym = NULL;
1636 long place = 0;
1637 long rel_count;
1638 bfd_vma rel_offset;
1639 unsigned long addr_offset;
1641 /* Sections that do not contain machine
1642 code are not normally disassembled. */
1643 if (! disassemble_all
1644 && only == NULL
1645 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1646 != (SEC_CODE | SEC_HAS_CONTENTS)))
1647 return;
1649 if (! process_section_p (section))
1650 return;
1652 datasize = bfd_get_section_size (section);
1653 if (datasize == 0)
1654 return;
1656 /* Decide which set of relocs to use. Load them if necessary. */
1657 paux = (struct objdump_disasm_info *) pinfo->application_data;
1658 if (paux->dynrelbuf)
1660 rel_pp = paux->dynrelbuf;
1661 rel_count = paux->dynrelcount;
1662 /* Dynamic reloc addresses are absolute, non-dynamic are section
1663 relative. REL_OFFSET specifies the reloc address corresponding
1664 to the start of this section. */
1665 rel_offset = section->vma;
1667 else
1669 rel_count = 0;
1670 rel_pp = NULL;
1671 rel_offset = 0;
1673 if ((section->flags & SEC_RELOC) != 0
1674 #ifndef DISASSEMBLER_NEEDS_RELOCS
1675 && dump_reloc_info
1676 #endif
1679 long relsize;
1681 relsize = bfd_get_reloc_upper_bound (abfd, section);
1682 if (relsize < 0)
1683 bfd_fatal (bfd_get_filename (abfd));
1685 if (relsize > 0)
1687 rel_ppstart = rel_pp = xmalloc (relsize);
1688 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1689 if (rel_count < 0)
1690 bfd_fatal (bfd_get_filename (abfd));
1692 /* Sort the relocs by address. */
1693 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1698 rel_ppend = rel_pp + rel_count;
1700 data = xmalloc (datasize);
1702 bfd_get_section_contents (abfd, section, data, 0, datasize);
1704 paux->sec = section;
1705 pinfo->buffer = data;
1706 pinfo->buffer_vma = section->vma;
1707 pinfo->buffer_length = datasize;
1708 pinfo->section = section;
1710 if (start_address == (bfd_vma) -1
1711 || start_address < pinfo->buffer_vma)
1712 addr_offset = 0;
1713 else
1714 addr_offset = start_address - pinfo->buffer_vma;
1716 if (stop_address == (bfd_vma) -1)
1717 stop_offset = datasize / opb;
1718 else
1720 if (stop_address < pinfo->buffer_vma)
1721 stop_offset = 0;
1722 else
1723 stop_offset = stop_address - pinfo->buffer_vma;
1724 if (stop_offset > pinfo->buffer_length / opb)
1725 stop_offset = pinfo->buffer_length / opb;
1728 /* Skip over the relocs belonging to addresses below the
1729 start address. */
1730 while (rel_pp < rel_ppend
1731 && (*rel_pp)->address < rel_offset + addr_offset)
1732 ++rel_pp;
1734 printf (_("Disassembly of section %s:\n"), section->name);
1736 /* Find the nearest symbol forwards from our current position. */
1737 paux->require_sec = TRUE;
1738 sym = find_symbol_for_address (section->vma + addr_offset, info, &place);
1739 paux->require_sec = FALSE;
1741 /* Disassemble a block of instructions up to the address associated with
1742 the symbol we have just found. Then print the symbol and find the
1743 next symbol on. Repeat until we have disassembled the entire section
1744 or we have reached the end of the address range we are interested in. */
1745 while (addr_offset < stop_offset)
1747 bfd_vma addr;
1748 asymbol *nextsym;
1749 unsigned long nextstop_offset;
1750 bfd_boolean insns;
1752 addr = section->vma + addr_offset;
1754 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
1756 int x;
1758 for (x = place;
1759 (x < sorted_symcount
1760 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
1761 ++x)
1762 continue;
1764 pinfo->symbols = sorted_syms + place;
1765 pinfo->num_symbols = x - place;
1767 else
1769 pinfo->symbols = NULL;
1770 pinfo->num_symbols = 0;
1773 if (! prefix_addresses)
1775 pinfo->fprintf_func (pinfo->stream, "\n");
1776 objdump_print_addr_with_sym (abfd, section, sym, addr,
1777 pinfo, FALSE);
1778 pinfo->fprintf_func (pinfo->stream, ":\n");
1781 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1782 nextsym = sym;
1783 else if (sym == NULL)
1784 nextsym = NULL;
1785 else
1787 #define is_valid_next_sym(SYM) \
1788 ((SYM)->section == section \
1789 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
1790 && pinfo->symbol_is_valid (SYM, pinfo))
1792 /* Search forward for the next appropriate symbol in
1793 SECTION. Note that all the symbols are sorted
1794 together into one big array, and that some sections
1795 may have overlapping addresses. */
1796 while (place < sorted_symcount
1797 && ! is_valid_next_sym (sorted_syms [place]))
1798 ++place;
1800 if (place >= sorted_symcount)
1801 nextsym = NULL;
1802 else
1803 nextsym = sorted_syms[place];
1806 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1807 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1808 else if (nextsym == NULL)
1809 nextstop_offset = stop_offset;
1810 else
1811 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1813 if (nextstop_offset > stop_offset)
1814 nextstop_offset = stop_offset;
1816 /* If a symbol is explicitly marked as being an object
1817 rather than a function, just dump the bytes without
1818 disassembling them. */
1819 if (disassemble_all
1820 || sym == NULL
1821 || bfd_asymbol_value (sym) > addr
1822 || ((sym->flags & BSF_OBJECT) == 0
1823 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1824 == NULL)
1825 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1826 == NULL))
1827 || (sym->flags & BSF_FUNCTION) != 0)
1828 insns = TRUE;
1829 else
1830 insns = FALSE;
1832 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
1833 addr_offset, nextstop_offset,
1834 rel_offset, &rel_pp, rel_ppend);
1836 addr_offset = nextstop_offset;
1837 sym = nextsym;
1840 free (data);
1842 if (rel_ppstart != NULL)
1843 free (rel_ppstart);
1846 /* Disassemble the contents of an object file. */
1848 static void
1849 disassemble_data (bfd *abfd)
1851 struct disassemble_info disasm_info;
1852 struct objdump_disasm_info aux;
1853 long i;
1855 print_files = NULL;
1856 prev_functionname = NULL;
1857 prev_line = -1;
1859 /* We make a copy of syms to sort. We don't want to sort syms
1860 because that will screw up the relocs. */
1861 sorted_symcount = symcount ? symcount : dynsymcount;
1862 sorted_syms = xmalloc ((sorted_symcount + synthcount) * sizeof (asymbol *));
1863 memcpy (sorted_syms, symcount ? syms : dynsyms,
1864 sorted_symcount * sizeof (asymbol *));
1866 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
1868 for (i = 0; i < synthcount; ++i)
1870 sorted_syms[sorted_symcount] = synthsyms + i;
1871 ++sorted_symcount;
1874 /* Sort the symbols into section and symbol order. */
1875 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1877 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
1879 disasm_info.application_data = (void *) &aux;
1880 aux.abfd = abfd;
1881 aux.require_sec = FALSE;
1882 aux.dynrelbuf = NULL;
1883 aux.dynrelcount = 0;
1884 #ifdef DISASSEMBLER_NEEDS_RELOCS
1885 aux.reloc = NULL;
1886 #endif
1888 disasm_info.print_address_func = objdump_print_address;
1889 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1891 if (machine != NULL)
1893 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1895 if (info == NULL)
1896 fatal (_("Can't use supplied machine %s"), machine);
1898 abfd->arch_info = info;
1901 if (endian != BFD_ENDIAN_UNKNOWN)
1903 struct bfd_target *xvec;
1905 xvec = xmalloc (sizeof (struct bfd_target));
1906 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1907 xvec->byteorder = endian;
1908 abfd->xvec = xvec;
1911 /* Use libopcodes to locate a suitable disassembler. */
1912 aux.disassemble_fn = disassembler (abfd);
1913 if (!aux.disassemble_fn)
1915 non_fatal (_("Can't disassemble for architecture %s\n"),
1916 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1917 exit_status = 1;
1918 return;
1921 disasm_info.flavour = bfd_get_flavour (abfd);
1922 disasm_info.arch = bfd_get_arch (abfd);
1923 disasm_info.mach = bfd_get_mach (abfd);
1924 disasm_info.disassembler_options = disassembler_options;
1925 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
1926 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
1927 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
1929 if (bfd_big_endian (abfd))
1930 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1931 else if (bfd_little_endian (abfd))
1932 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1933 else
1934 /* ??? Aborting here seems too drastic. We could default to big or little
1935 instead. */
1936 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1938 /* Allow the target to customize the info structure. */
1939 disassemble_init_for_target (& disasm_info);
1941 /* Pre-load the dynamic relocs if we are going
1942 to be dumping them along with the disassembly. */
1943 if (dump_dynamic_reloc_info)
1945 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
1947 if (relsize < 0)
1948 bfd_fatal (bfd_get_filename (abfd));
1950 if (relsize > 0)
1952 aux.dynrelbuf = xmalloc (relsize);
1953 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
1954 aux.dynrelbuf,
1955 dynsyms);
1956 if (aux.dynrelcount < 0)
1957 bfd_fatal (bfd_get_filename (abfd));
1959 /* Sort the relocs by address. */
1960 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
1961 compare_relocs);
1965 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
1967 if (aux.dynrelbuf != NULL)
1968 free (aux.dynrelbuf);
1969 free (sorted_syms);
1973 load_debug_section (enum dwarf_section_display_enum debug, void *file)
1975 struct dwarf_section *section = &debug_displays [debug].section;
1976 bfd *abfd = file;
1977 asection *sec;
1978 bfd_boolean ret;
1980 /* If it is already loaded, do nothing. */
1981 if (section->start != NULL)
1982 return 1;
1984 /* Locate the debug section. */
1985 sec = bfd_get_section_by_name (abfd, section->name);
1986 if (sec == NULL)
1987 return 0;
1989 section->address = bfd_get_section_vma (abfd, sec);
1990 section->size = bfd_get_section_size (sec);
1991 section->start = xmalloc (section->size);
1993 if (is_relocatable && debug_displays [debug].relocate)
1994 ret = bfd_simple_get_relocated_section_contents (abfd,
1995 sec,
1996 section->start,
1997 syms) != NULL;
1998 else
1999 ret = bfd_get_section_contents (abfd, sec, section->start, 0,
2000 section->size);
2002 if (!ret)
2004 free_debug_section (debug);
2005 printf (_("\nCan't get contents for section '%s'.\n"),
2006 section->name);
2009 return ret;
2012 void
2013 free_debug_section (enum dwarf_section_display_enum debug)
2015 struct dwarf_section *section = &debug_displays [debug].section;
2017 if (section->start == NULL)
2018 return;
2020 free ((char *) section->start);
2021 section->start = NULL;
2022 section->address = 0;
2023 section->size = 0;
2026 static void
2027 dump_dwarf_section (bfd *abfd, asection *section,
2028 void *arg ATTRIBUTE_UNUSED)
2030 const char *name = bfd_get_section_name (abfd, section);
2031 const char *match;
2032 enum dwarf_section_display_enum i;
2034 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
2035 match = ".debug_info";
2036 else
2037 match = name;
2039 for (i = 0; i < max; i++)
2040 if (strcmp (debug_displays[i].section.name, match) == 0)
2042 if (!debug_displays[i].eh_frame)
2044 struct dwarf_section *sec = &debug_displays [i].section;
2046 if (load_debug_section (i, abfd))
2048 debug_displays[i].display (sec, abfd);
2050 if (i != info && i != abbrev)
2051 free_debug_section (i);
2054 break;
2058 static const char *mach_o_dwarf_sections [] = {
2059 "LC_SEGMENT.__DWARFA.__debug_abbrev", /* .debug_abbrev */
2060 "LC_SEGMENT.__DWARFA.__debug_aranges", /* .debug_aranges */
2061 "LC_SEGMENT.__DWARFA.__debug_frame", /* .debug_frame */
2062 "LC_SEGMENT.__DWARFA.__debug_info", /* .debug_info */
2063 "LC_SEGMENT.__DWARFA.__debug_line", /* .debug_line */
2064 "LC_SEGMENT.__DWARFA.__debug_pubnames", /* .debug_pubnames */
2065 ".eh_frame", /* .eh_frame */
2066 "LC_SEGMENT.__DWARFA.__debug_macinfo", /* .debug_macinfo */
2067 "LC_SEGMENT.__DWARFA.__debug_str", /* .debug_str */
2068 "LC_SEGMENT.__DWARFA.__debug_loc", /* .debug_loc */
2069 "LC_SEGMENT.__DWARFA.__debug_pubtypes", /* .debug_pubtypes */
2070 "LC_SEGMENT.__DWARFA.__debug_ranges", /* .debug_ranges */
2071 "LC_SEGMENT.__DWARFA.__debug_static_func", /* .debug_static_func */
2072 "LC_SEGMENT.__DWARFA.__debug_static_vars", /* .debug_static_vars */
2073 "LC_SEGMENT.__DWARFA.__debug_types", /* .debug_types */
2074 "LC_SEGMENT.__DWARFA.__debug_weaknames" /* .debug_weaknames */
2077 static const char *generic_dwarf_sections [max];
2079 static void
2080 check_mach_o_dwarf (bfd *abfd)
2082 static enum bfd_flavour old_flavour = bfd_target_unknown_flavour;
2083 enum bfd_flavour current_flavour = bfd_get_flavour (abfd);
2084 enum dwarf_section_display_enum i;
2086 if (generic_dwarf_sections [0] == NULL)
2087 for (i = 0; i < max; i++)
2088 generic_dwarf_sections [i] = debug_displays[i].section.name;
2090 if (old_flavour != current_flavour)
2092 if (current_flavour == bfd_target_mach_o_flavour)
2093 for (i = 0; i < max; i++)
2094 debug_displays[i].section.name = mach_o_dwarf_sections [i];
2095 else if (old_flavour == bfd_target_mach_o_flavour)
2096 for (i = 0; i < max; i++)
2097 debug_displays[i].section.name = generic_dwarf_sections [i];
2099 old_flavour = current_flavour;
2103 /* Dump the dwarf debugging information. */
2105 static void
2106 dump_dwarf (bfd *abfd)
2108 is_relocatable = ((abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC))
2109 == HAS_RELOC);
2111 /* FIXME: bfd_get_arch_size may return -1. We assume that 64bit
2112 targets will return 64. */
2113 eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
2115 if (bfd_big_endian (abfd))
2116 byte_get = byte_get_big_endian;
2117 else if (bfd_little_endian (abfd))
2118 byte_get = byte_get_little_endian;
2119 else
2120 abort ();
2122 check_mach_o_dwarf (abfd);
2124 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2126 free_debug_memory ();
2129 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2130 it. Return NULL on failure. */
2132 static char *
2133 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2135 asection *stabsect;
2136 bfd_size_type size;
2137 char *contents;
2139 stabsect = bfd_get_section_by_name (abfd, sect_name);
2140 if (stabsect == NULL)
2142 printf (_("No %s section present\n\n"), sect_name);
2143 return FALSE;
2146 size = bfd_section_size (abfd, stabsect);
2147 contents = xmalloc (size);
2149 if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2151 non_fatal (_("Reading %s section of %s failed: %s"),
2152 sect_name, bfd_get_filename (abfd),
2153 bfd_errmsg (bfd_get_error ()));
2154 free (contents);
2155 exit_status = 1;
2156 return NULL;
2159 *size_ptr = size;
2161 return contents;
2164 /* Stabs entries use a 12 byte format:
2165 4 byte string table index
2166 1 byte stab type
2167 1 byte stab other field
2168 2 byte stab desc field
2169 4 byte stab value
2170 FIXME: This will have to change for a 64 bit object format. */
2172 #define STRDXOFF (0)
2173 #define TYPEOFF (4)
2174 #define OTHEROFF (5)
2175 #define DESCOFF (6)
2176 #define VALOFF (8)
2177 #define STABSIZE (12)
2179 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2180 using string table section STRSECT_NAME (in `strtab'). */
2182 static void
2183 print_section_stabs (bfd *abfd,
2184 const char *stabsect_name,
2185 unsigned *string_offset_ptr)
2187 int i;
2188 unsigned file_string_table_offset = 0;
2189 unsigned next_file_string_table_offset = *string_offset_ptr;
2190 bfd_byte *stabp, *stabs_end;
2192 stabp = stabs;
2193 stabs_end = stabp + stab_size;
2195 printf (_("Contents of %s section:\n\n"), stabsect_name);
2196 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
2198 /* Loop through all symbols and print them.
2200 We start the index at -1 because there is a dummy symbol on
2201 the front of stabs-in-{coff,elf} sections that supplies sizes. */
2202 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2204 const char *name;
2205 unsigned long strx;
2206 unsigned char type, other;
2207 unsigned short desc;
2208 bfd_vma value;
2210 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2211 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2212 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2213 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2214 value = bfd_h_get_32 (abfd, stabp + VALOFF);
2216 printf ("\n%-6d ", i);
2217 /* Either print the stab name, or, if unnamed, print its number
2218 again (makes consistent formatting for tools like awk). */
2219 name = bfd_get_stab_name (type);
2220 if (name != NULL)
2221 printf ("%-6s", name);
2222 else if (type == N_UNDF)
2223 printf ("HdrSym");
2224 else
2225 printf ("%-6d", type);
2226 printf (" %-6d %-6d ", other, desc);
2227 bfd_printf_vma (abfd, value);
2228 printf (" %-6lu", strx);
2230 /* Symbols with type == 0 (N_UNDF) specify the length of the
2231 string table associated with this file. We use that info
2232 to know how to relocate the *next* file's string table indices. */
2233 if (type == N_UNDF)
2235 file_string_table_offset = next_file_string_table_offset;
2236 next_file_string_table_offset += value;
2238 else
2240 /* Using the (possibly updated) string table offset, print the
2241 string (if any) associated with this symbol. */
2242 if ((strx + file_string_table_offset) < stabstr_size)
2243 printf (" %s", &strtab[strx + file_string_table_offset]);
2244 else
2245 printf (" *");
2248 printf ("\n\n");
2249 *string_offset_ptr = next_file_string_table_offset;
2252 typedef struct
2254 const char * section_name;
2255 const char * string_section_name;
2256 unsigned string_offset;
2258 stab_section_names;
2260 static void
2261 find_stabs_section (bfd *abfd, asection *section, void *names)
2263 int len;
2264 stab_section_names * sought = (stab_section_names *) names;
2266 /* Check for section names for which stabsect_name is a prefix, to
2267 handle .stab.N, etc. */
2268 len = strlen (sought->section_name);
2270 /* If the prefix matches, and the files section name ends with a
2271 nul or a digit, then we match. I.e., we want either an exact
2272 match or a section followed by a number. */
2273 if (strncmp (sought->section_name, section->name, len) == 0
2274 && (section->name[len] == 0
2275 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2277 if (strtab == NULL)
2278 strtab = read_section_stabs (abfd, sought->string_section_name,
2279 &stabstr_size);
2281 if (strtab)
2283 stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2284 &stab_size);
2285 if (stabs)
2286 print_section_stabs (abfd, section->name, &sought->string_offset);
2291 static void
2292 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2294 stab_section_names s;
2296 s.section_name = stabsect_name;
2297 s.string_section_name = strsect_name;
2298 s.string_offset = 0;
2300 bfd_map_over_sections (abfd, find_stabs_section, & s);
2302 free (strtab);
2303 strtab = NULL;
2306 /* Dump the any sections containing stabs debugging information. */
2308 static void
2309 dump_stabs (bfd *abfd)
2311 dump_stabs_section (abfd, ".stab", ".stabstr");
2312 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2313 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2314 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2317 static void
2318 dump_bfd_header (bfd *abfd)
2320 char *comma = "";
2322 printf (_("architecture: %s, "),
2323 bfd_printable_arch_mach (bfd_get_arch (abfd),
2324 bfd_get_mach (abfd)));
2325 printf (_("flags 0x%08x:\n"), abfd->flags);
2327 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2328 PF (HAS_RELOC, "HAS_RELOC");
2329 PF (EXEC_P, "EXEC_P");
2330 PF (HAS_LINENO, "HAS_LINENO");
2331 PF (HAS_DEBUG, "HAS_DEBUG");
2332 PF (HAS_SYMS, "HAS_SYMS");
2333 PF (HAS_LOCALS, "HAS_LOCALS");
2334 PF (DYNAMIC, "DYNAMIC");
2335 PF (WP_TEXT, "WP_TEXT");
2336 PF (D_PAGED, "D_PAGED");
2337 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2338 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2339 printf (_("\nstart address 0x"));
2340 bfd_printf_vma (abfd, abfd->start_address);
2341 printf ("\n");
2345 static void
2346 dump_bfd_private_header (bfd *abfd)
2348 bfd_print_private_bfd_data (abfd, stdout);
2352 /* Display a section in hexadecimal format with associated characters.
2353 Each line prefixed by the zero padded address. */
2355 static void
2356 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2358 bfd_byte *data = 0;
2359 bfd_size_type datasize;
2360 bfd_size_type addr_offset;
2361 bfd_size_type start_offset;
2362 bfd_size_type stop_offset;
2363 unsigned int opb = bfd_octets_per_byte (abfd);
2364 /* Bytes per line. */
2365 const int onaline = 16;
2366 char buf[64];
2367 int count;
2368 int width;
2370 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2371 return;
2373 if (! process_section_p (section))
2374 return;
2376 if ((datasize = bfd_section_size (abfd, section)) == 0)
2377 return;
2379 printf (_("Contents of section %s:\n"), section->name);
2381 data = xmalloc (datasize);
2383 bfd_get_section_contents (abfd, section, data, 0, datasize);
2385 /* Compute the address range to display. */
2386 if (start_address == (bfd_vma) -1
2387 || start_address < section->vma)
2388 start_offset = 0;
2389 else
2390 start_offset = start_address - section->vma;
2392 if (stop_address == (bfd_vma) -1)
2393 stop_offset = datasize / opb;
2394 else
2396 if (stop_address < section->vma)
2397 stop_offset = 0;
2398 else
2399 stop_offset = stop_address - section->vma;
2401 if (stop_offset > datasize / opb)
2402 stop_offset = datasize / opb;
2405 width = 4;
2407 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2408 if (strlen (buf) >= sizeof (buf))
2409 abort ();
2411 count = 0;
2412 while (buf[count] == '0' && buf[count+1] != '\0')
2413 count++;
2414 count = strlen (buf) - count;
2415 if (count > width)
2416 width = count;
2418 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2419 if (strlen (buf) >= sizeof (buf))
2420 abort ();
2422 count = 0;
2423 while (buf[count] == '0' && buf[count+1] != '\0')
2424 count++;
2425 count = strlen (buf) - count;
2426 if (count > width)
2427 width = count;
2429 for (addr_offset = start_offset;
2430 addr_offset < stop_offset; addr_offset += onaline / opb)
2432 bfd_size_type j;
2434 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2435 count = strlen (buf);
2436 if ((size_t) count >= sizeof (buf))
2437 abort ();
2439 putchar (' ');
2440 while (count < width)
2442 putchar ('0');
2443 count++;
2445 fputs (buf + count - width, stdout);
2446 putchar (' ');
2448 for (j = addr_offset * opb;
2449 j < addr_offset * opb + onaline; j++)
2451 if (j < stop_offset * opb)
2452 printf ("%02x", (unsigned) (data[j]));
2453 else
2454 printf (" ");
2455 if ((j & 3) == 3)
2456 printf (" ");
2459 printf (" ");
2460 for (j = addr_offset * opb;
2461 j < addr_offset * opb + onaline; j++)
2463 if (j >= stop_offset * opb)
2464 printf (" ");
2465 else
2466 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2468 putchar ('\n');
2470 free (data);
2473 /* Actually display the various requested regions. */
2475 static void
2476 dump_data (bfd *abfd)
2478 bfd_map_over_sections (abfd, dump_section, NULL);
2481 /* Should perhaps share code and display with nm? */
2483 static void
2484 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2486 asymbol **current;
2487 long max;
2488 long count;
2490 if (dynamic)
2492 current = dynsyms;
2493 max = dynsymcount;
2494 printf ("DYNAMIC SYMBOL TABLE:\n");
2496 else
2498 current = syms;
2499 max = symcount;
2500 printf ("SYMBOL TABLE:\n");
2503 if (max == 0)
2504 printf (_("no symbols\n"));
2506 for (count = 0; count < max; count++)
2508 bfd *cur_bfd;
2510 if (*current == NULL)
2511 printf (_("no information for symbol number %ld\n"), count);
2513 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2514 printf (_("could not determine the type of symbol number %ld\n"),
2515 count);
2517 else if (process_section_p ((* current)->section)
2518 && (dump_special_syms
2519 || !bfd_is_target_special_symbol (cur_bfd, *current)))
2521 const char *name = (*current)->name;
2523 if (do_demangle && name != NULL && *name != '\0')
2525 char *alloc;
2527 /* If we want to demangle the name, we demangle it
2528 here, and temporarily clobber it while calling
2529 bfd_print_symbol. FIXME: This is a gross hack. */
2530 alloc = demangle (cur_bfd, name);
2531 (*current)->name = alloc;
2532 bfd_print_symbol (cur_bfd, stdout, *current,
2533 bfd_print_symbol_all);
2534 (*current)->name = name;
2535 free (alloc);
2537 else
2538 bfd_print_symbol (cur_bfd, stdout, *current,
2539 bfd_print_symbol_all);
2540 printf ("\n");
2543 current++;
2545 printf ("\n\n");
2548 static void
2549 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2551 arelent **p;
2552 char *last_filename, *last_functionname;
2553 unsigned int last_line;
2555 /* Get column headers lined up reasonably. */
2557 static int width;
2559 if (width == 0)
2561 char buf[30];
2563 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2564 width = strlen (buf) - 7;
2566 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2569 last_filename = NULL;
2570 last_functionname = NULL;
2571 last_line = 0;
2573 for (p = relpp; relcount && *p != NULL; p++, relcount--)
2575 arelent *q = *p;
2576 const char *filename, *functionname;
2577 unsigned int line;
2578 const char *sym_name;
2579 const char *section_name;
2581 if (start_address != (bfd_vma) -1
2582 && q->address < start_address)
2583 continue;
2584 if (stop_address != (bfd_vma) -1
2585 && q->address > stop_address)
2586 continue;
2588 if (with_line_numbers
2589 && sec != NULL
2590 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2591 &filename, &functionname, &line))
2593 if (functionname != NULL
2594 && (last_functionname == NULL
2595 || strcmp (functionname, last_functionname) != 0))
2597 printf ("%s():\n", functionname);
2598 if (last_functionname != NULL)
2599 free (last_functionname);
2600 last_functionname = xstrdup (functionname);
2603 if (line > 0
2604 && (line != last_line
2605 || (filename != NULL
2606 && last_filename != NULL
2607 && strcmp (filename, last_filename) != 0)))
2609 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2610 last_line = line;
2611 if (last_filename != NULL)
2612 free (last_filename);
2613 if (filename == NULL)
2614 last_filename = NULL;
2615 else
2616 last_filename = xstrdup (filename);
2620 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2622 sym_name = (*(q->sym_ptr_ptr))->name;
2623 section_name = (*(q->sym_ptr_ptr))->section->name;
2625 else
2627 sym_name = NULL;
2628 section_name = NULL;
2631 bfd_printf_vma (abfd, q->address);
2632 if (q->howto == NULL)
2633 printf (" *unknown* ");
2634 else if (q->howto->name)
2635 printf (" %-16s ", q->howto->name);
2636 else
2637 printf (" %-16d ", q->howto->type);
2638 if (sym_name)
2639 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
2640 else
2642 if (section_name == NULL)
2643 section_name = "*unknown*";
2644 printf ("[%s]", section_name);
2647 if (q->addend)
2649 printf ("+0x");
2650 bfd_printf_vma (abfd, q->addend);
2653 printf ("\n");
2657 static void
2658 dump_relocs_in_section (bfd *abfd,
2659 asection *section,
2660 void *dummy ATTRIBUTE_UNUSED)
2662 arelent **relpp;
2663 long relcount;
2664 long relsize;
2666 if ( bfd_is_abs_section (section)
2667 || bfd_is_und_section (section)
2668 || bfd_is_com_section (section)
2669 || (! process_section_p (section))
2670 || ((section->flags & SEC_RELOC) == 0))
2671 return;
2673 relsize = bfd_get_reloc_upper_bound (abfd, section);
2674 if (relsize < 0)
2675 bfd_fatal (bfd_get_filename (abfd));
2677 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2679 if (relsize == 0)
2681 printf (" (none)\n\n");
2682 return;
2685 relpp = xmalloc (relsize);
2686 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2688 if (relcount < 0)
2689 bfd_fatal (bfd_get_filename (abfd));
2690 else if (relcount == 0)
2691 printf (" (none)\n\n");
2692 else
2694 printf ("\n");
2695 dump_reloc_set (abfd, section, relpp, relcount);
2696 printf ("\n\n");
2698 free (relpp);
2701 static void
2702 dump_relocs (bfd *abfd)
2704 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2707 static void
2708 dump_dynamic_relocs (bfd *abfd)
2710 long relsize;
2711 arelent **relpp;
2712 long relcount;
2714 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2715 if (relsize < 0)
2716 bfd_fatal (bfd_get_filename (abfd));
2718 printf ("DYNAMIC RELOCATION RECORDS");
2720 if (relsize == 0)
2721 printf (" (none)\n\n");
2722 else
2724 relpp = xmalloc (relsize);
2725 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2727 if (relcount < 0)
2728 bfd_fatal (bfd_get_filename (abfd));
2729 else if (relcount == 0)
2730 printf (" (none)\n\n");
2731 else
2733 printf ("\n");
2734 dump_reloc_set (abfd, NULL, relpp, relcount);
2735 printf ("\n\n");
2737 free (relpp);
2741 /* Creates a table of paths, to search for source files. */
2743 static void
2744 add_include_path (const char *path)
2746 if (path[0] == 0)
2747 return;
2748 include_path_count++;
2749 include_paths = xrealloc (include_paths,
2750 include_path_count * sizeof (*include_paths));
2751 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2752 if (path[1] == ':' && path[2] == 0)
2753 path = concat (path, ".", (const char *) 0);
2754 #endif
2755 include_paths[include_path_count - 1] = path;
2758 static void
2759 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
2760 asection *section,
2761 void *arg)
2763 if ((section->flags & SEC_DEBUGGING) == 0)
2765 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
2766 section->vma += adjust_section_vma;
2767 if (*has_reloc_p)
2768 section->lma += adjust_section_vma;
2772 /* Dump selected contents of ABFD. */
2774 static void
2775 dump_bfd (bfd *abfd)
2777 /* If we are adjusting section VMA's, change them all now. Changing
2778 the BFD information is a hack. However, we must do it, or
2779 bfd_find_nearest_line will not do the right thing. */
2780 if (adjust_section_vma != 0)
2782 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
2783 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
2786 if (! dump_debugging_tags)
2787 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2788 abfd->xvec->name);
2789 if (dump_ar_hdrs)
2790 print_arelt_descr (stdout, abfd, TRUE);
2791 if (dump_file_header)
2792 dump_bfd_header (abfd);
2793 if (dump_private_headers)
2794 dump_bfd_private_header (abfd);
2795 if (! dump_debugging_tags)
2796 putchar ('\n');
2797 if (dump_section_headers)
2798 dump_headers (abfd);
2800 if (dump_symtab
2801 || dump_reloc_info
2802 || disassemble
2803 || dump_debugging
2804 || dump_dwarf_section_info)
2805 syms = slurp_symtab (abfd);
2806 if (dump_dynamic_symtab || dump_dynamic_reloc_info
2807 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
2808 dynsyms = slurp_dynamic_symtab (abfd);
2809 if (disassemble)
2811 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
2812 dynsymcount, dynsyms, &synthsyms);
2813 if (synthcount < 0)
2814 synthcount = 0;
2817 if (dump_symtab)
2818 dump_symbols (abfd, FALSE);
2819 if (dump_dynamic_symtab)
2820 dump_symbols (abfd, TRUE);
2821 if (dump_dwarf_section_info)
2822 dump_dwarf (abfd);
2823 if (dump_stab_section_info)
2824 dump_stabs (abfd);
2825 if (dump_reloc_info && ! disassemble)
2826 dump_relocs (abfd);
2827 if (dump_dynamic_reloc_info && ! disassemble)
2828 dump_dynamic_relocs (abfd);
2829 if (dump_section_contents)
2830 dump_data (abfd);
2831 if (disassemble)
2832 disassemble_data (abfd);
2834 if (dump_debugging)
2836 void *dhandle;
2838 dhandle = read_debugging_info (abfd, syms, symcount);
2839 if (dhandle != NULL)
2841 if (! print_debugging_info (stdout, dhandle, abfd, syms, demangle,
2842 dump_debugging_tags ? TRUE : FALSE))
2844 non_fatal (_("%s: printing debugging information failed"),
2845 bfd_get_filename (abfd));
2846 exit_status = 1;
2851 if (syms)
2853 free (syms);
2854 syms = NULL;
2857 if (dynsyms)
2859 free (dynsyms);
2860 dynsyms = NULL;
2863 if (synthsyms)
2865 free (synthsyms);
2866 synthsyms = NULL;
2869 symcount = 0;
2870 dynsymcount = 0;
2871 synthcount = 0;
2874 static void
2875 display_bfd (bfd *abfd)
2877 char **matching;
2879 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2881 dump_bfd (abfd);
2882 return;
2885 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2887 nonfatal (bfd_get_filename (abfd));
2888 list_matching_formats (matching);
2889 free (matching);
2890 return;
2893 if (bfd_get_error () != bfd_error_file_not_recognized)
2895 nonfatal (bfd_get_filename (abfd));
2896 return;
2899 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2901 dump_bfd (abfd);
2902 return;
2905 nonfatal (bfd_get_filename (abfd));
2907 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2909 list_matching_formats (matching);
2910 free (matching);
2914 static void
2915 display_file (char *filename, char *target)
2917 bfd *file;
2918 bfd *arfile = NULL;
2920 if (get_file_size (filename) < 1)
2921 return;
2923 file = bfd_openr (filename, target);
2924 if (file == NULL)
2926 nonfatal (filename);
2927 return;
2930 /* If the file is an archive, process all of its elements. */
2931 if (bfd_check_format (file, bfd_archive))
2933 bfd *last_arfile = NULL;
2935 printf (_("In archive %s:\n"), bfd_get_filename (file));
2936 for (;;)
2938 bfd_set_error (bfd_error_no_error);
2940 arfile = bfd_openr_next_archived_file (file, arfile);
2941 if (arfile == NULL)
2943 if (bfd_get_error () != bfd_error_no_more_archived_files)
2944 nonfatal (bfd_get_filename (file));
2945 break;
2948 display_bfd (arfile);
2950 if (last_arfile != NULL)
2951 bfd_close (last_arfile);
2952 last_arfile = arfile;
2955 if (last_arfile != NULL)
2956 bfd_close (last_arfile);
2958 else
2959 display_bfd (file);
2961 bfd_close (file);
2965 main (int argc, char **argv)
2967 int c;
2968 char *target = default_target;
2969 bfd_boolean seenflag = FALSE;
2971 #if defined (HAVE_SETLOCALE)
2972 #if defined (HAVE_LC_MESSAGES)
2973 setlocale (LC_MESSAGES, "");
2974 #endif
2975 setlocale (LC_CTYPE, "");
2976 #endif
2978 bindtextdomain (PACKAGE, LOCALEDIR);
2979 textdomain (PACKAGE);
2981 program_name = *argv;
2982 xmalloc_set_program_name (program_name);
2984 START_PROGRESS (program_name, 0);
2986 expandargv (&argc, &argv);
2988 bfd_init ();
2989 set_default_bfd_target ();
2991 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSI:j:wE:zgeGW",
2992 long_options, (int *) 0))
2993 != EOF)
2995 switch (c)
2997 case 0:
2998 break; /* We've been given a long option. */
2999 case 'm':
3000 machine = optarg;
3001 break;
3002 case 'M':
3003 if (disassembler_options)
3004 /* Ignore potential memory leak for now. */
3005 disassembler_options = concat (disassembler_options, ",",
3006 optarg, NULL);
3007 else
3008 disassembler_options = optarg;
3009 break;
3010 case 'j':
3011 if (only_used == only_size)
3013 only_size += 8;
3014 only = xrealloc (only, only_size * sizeof (char *));
3016 only [only_used++] = optarg;
3017 break;
3018 case 'l':
3019 with_line_numbers = TRUE;
3020 break;
3021 case 'b':
3022 target = optarg;
3023 break;
3024 case 'C':
3025 do_demangle = TRUE;
3026 if (optarg != NULL)
3028 enum demangling_styles style;
3030 style = cplus_demangle_name_to_style (optarg);
3031 if (style == unknown_demangling)
3032 fatal (_("unknown demangling style `%s'"),
3033 optarg);
3035 cplus_demangle_set_style (style);
3037 break;
3038 case 'w':
3039 wide_output = TRUE;
3040 break;
3041 case OPTION_ADJUST_VMA:
3042 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3043 break;
3044 case OPTION_START_ADDRESS:
3045 start_address = parse_vma (optarg, "--start-address");
3046 break;
3047 case OPTION_STOP_ADDRESS:
3048 stop_address = parse_vma (optarg, "--stop-address");
3049 break;
3050 case 'E':
3051 if (strcmp (optarg, "B") == 0)
3052 endian = BFD_ENDIAN_BIG;
3053 else if (strcmp (optarg, "L") == 0)
3054 endian = BFD_ENDIAN_LITTLE;
3055 else
3057 non_fatal (_("unrecognized -E option"));
3058 usage (stderr, 1);
3060 break;
3061 case OPTION_ENDIAN:
3062 if (strncmp (optarg, "big", strlen (optarg)) == 0)
3063 endian = BFD_ENDIAN_BIG;
3064 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3065 endian = BFD_ENDIAN_LITTLE;
3066 else
3068 non_fatal (_("unrecognized --endian type `%s'"), optarg);
3069 usage (stderr, 1);
3071 break;
3073 case 'f':
3074 dump_file_header = TRUE;
3075 seenflag = TRUE;
3076 break;
3077 case 'i':
3078 formats_info = TRUE;
3079 seenflag = TRUE;
3080 break;
3081 case 'I':
3082 add_include_path (optarg);
3083 break;
3084 case 'p':
3085 dump_private_headers = TRUE;
3086 seenflag = TRUE;
3087 break;
3088 case 'x':
3089 dump_private_headers = TRUE;
3090 dump_symtab = TRUE;
3091 dump_reloc_info = TRUE;
3092 dump_file_header = TRUE;
3093 dump_ar_hdrs = TRUE;
3094 dump_section_headers = TRUE;
3095 seenflag = TRUE;
3096 break;
3097 case 't':
3098 dump_symtab = TRUE;
3099 seenflag = TRUE;
3100 break;
3101 case 'T':
3102 dump_dynamic_symtab = TRUE;
3103 seenflag = TRUE;
3104 break;
3105 case 'd':
3106 disassemble = TRUE;
3107 seenflag = TRUE;
3108 break;
3109 case 'z':
3110 disassemble_zeroes = TRUE;
3111 break;
3112 case 'D':
3113 disassemble = TRUE;
3114 disassemble_all = TRUE;
3115 seenflag = TRUE;
3116 break;
3117 case 'S':
3118 disassemble = TRUE;
3119 with_source_code = TRUE;
3120 seenflag = TRUE;
3121 break;
3122 case 'g':
3123 dump_debugging = 1;
3124 seenflag = TRUE;
3125 break;
3126 case 'e':
3127 dump_debugging = 1;
3128 dump_debugging_tags = 1;
3129 do_demangle = TRUE;
3130 seenflag = TRUE;
3131 break;
3132 case 'W':
3133 dump_dwarf_section_info = TRUE;
3134 seenflag = TRUE;
3135 do_debug_info = 1;
3136 do_debug_abbrevs = 1;
3137 do_debug_lines = 1;
3138 do_debug_pubnames = 1;
3139 do_debug_aranges = 1;
3140 do_debug_ranges = 1;
3141 do_debug_frames = 1;
3142 do_debug_macinfo = 1;
3143 do_debug_str = 1;
3144 do_debug_loc = 1;
3145 break;
3146 case 'G':
3147 dump_stab_section_info = TRUE;
3148 seenflag = TRUE;
3149 break;
3150 case 's':
3151 dump_section_contents = TRUE;
3152 seenflag = TRUE;
3153 break;
3154 case 'r':
3155 dump_reloc_info = TRUE;
3156 seenflag = TRUE;
3157 break;
3158 case 'R':
3159 dump_dynamic_reloc_info = TRUE;
3160 seenflag = TRUE;
3161 break;
3162 case 'a':
3163 dump_ar_hdrs = TRUE;
3164 seenflag = TRUE;
3165 break;
3166 case 'h':
3167 dump_section_headers = TRUE;
3168 seenflag = TRUE;
3169 break;
3170 case 'H':
3171 usage (stdout, 0);
3172 seenflag = TRUE;
3173 case 'v':
3174 case 'V':
3175 show_version = TRUE;
3176 seenflag = TRUE;
3177 break;
3179 default:
3180 usage (stderr, 1);
3184 if (show_version)
3185 print_version ("objdump");
3187 if (!seenflag)
3188 usage (stderr, 2);
3190 if (formats_info)
3191 exit_status = display_info ();
3192 else
3194 if (optind == argc)
3195 display_file ("a.out", target);
3196 else
3197 for (; optind < argc;)
3198 display_file (argv[optind++], target);
3201 END_PROGRESS (program_name);
3203 return exit_status;