2008-07-07 Stan Shebs <stan@codesourcery.com>
[binutils.git] / binutils / objdump.c
blob58947245ee46c88d100159135f4a2a71ae9e02c2
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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 3, 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,
21 MA 02110-1301, USA. */
24 /* Objdump overview.
26 Objdump displays information about one or more object files, either on
27 their own, or inside libraries. It is commonly used as a disassembler,
28 but it can also display information about file headers, symbol tables,
29 relocations, debugging directives and more.
31 The flow of execution is as follows:
33 1. Command line arguments are checked for control switches and the
34 information to be displayed is selected.
36 2. Any remaining arguments are assumed to be object files, and they are
37 processed in order by display_bfd(). If the file is an archive each
38 of its elements is processed in turn.
40 3. The file's target architecture and binary file format are determined
41 by bfd_check_format(). If they are recognised, then dump_bfd() is
42 called.
44 4. dump_bfd() in turn calls separate functions to display the requested
45 item(s) of information(s). For example disassemble_data() is called if
46 a disassembly has been requested.
48 When disassembling the code loops through blocks of instructions bounded
49 by symbols, calling disassemble_bytes() on each block. The actual
50 disassembling is done by the libopcodes library, via a function pointer
51 supplied by the disassembler() function. */
53 #include "sysdep.h"
54 #include "bfd.h"
55 #include "elf-bfd.h"
56 #include "progress.h"
57 #include "bucomm.h"
58 #include "dwarf.h"
59 #include "getopt.h"
60 #include "safe-ctype.h"
61 #include "dis-asm.h"
62 #include "libiberty.h"
63 #include "demangle.h"
64 #include "debug.h"
65 #include "budbg.h"
67 #ifdef HAVE_MMAP
68 #include <sys/mman.h>
69 #endif
71 #include <sys/stat.h>
73 /* Internal headers for the ELF .stab-dump code - sorry. */
74 #define BYTES_IN_WORD 32
75 #include "aout/aout64.h"
77 /* Exit status. */
78 static int exit_status = 0;
80 static char *default_target = NULL; /* Default at runtime. */
82 /* The following variables are set based on arguments passed on the
83 command line. */
84 static int show_version = 0; /* Show the version number. */
85 static int dump_section_contents; /* -s */
86 static int dump_section_headers; /* -h */
87 static bfd_boolean dump_file_header; /* -f */
88 static int dump_symtab; /* -t */
89 static int dump_dynamic_symtab; /* -T */
90 static int dump_reloc_info; /* -r */
91 static int dump_dynamic_reloc_info; /* -R */
92 static int dump_ar_hdrs; /* -a */
93 static int dump_private_headers; /* -p */
94 static int prefix_addresses; /* --prefix-addresses */
95 static int with_line_numbers; /* -l */
96 static bfd_boolean with_source_code; /* -S */
97 static int show_raw_insn; /* --show-raw-insn */
98 static int dump_dwarf_section_info; /* --dwarf */
99 static int dump_stab_section_info; /* --stabs */
100 static int do_demangle; /* -C, --demangle */
101 static bfd_boolean disassemble; /* -d */
102 static bfd_boolean disassemble_all; /* -D */
103 static int disassemble_zeroes; /* --disassemble-zeroes */
104 static bfd_boolean formats_info; /* -i */
105 static int wide_output; /* -w */
106 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
107 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
108 static int dump_debugging; /* --debugging */
109 static int dump_debugging_tags; /* --debugging-tags */
110 static int dump_special_syms = 0; /* --special-syms */
111 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
112 static int file_start_context = 0; /* --file-start-context */
113 static bfd_boolean display_file_offsets;/* -F */
115 /* Pointer to an array of section names provided by
116 one or more "-j secname" command line options. */
117 static char **only;
118 /* The total number of slots in the only[] array. */
119 static size_t only_size = 0;
120 /* The number of occupied slots in the only[] array. */
121 static size_t only_used = 0;
123 /* Variables for handling include file path table. */
124 static const char **include_paths;
125 static int include_path_count;
127 /* Extra info to pass to the section disassembler and address printing
128 function. */
129 struct objdump_disasm_info
131 bfd * abfd;
132 asection * sec;
133 bfd_boolean require_sec;
134 arelent ** dynrelbuf;
135 long dynrelcount;
136 disassembler_ftype disassemble_fn;
137 arelent * reloc;
140 /* Architecture to disassemble for, or default if NULL. */
141 static char *machine = NULL;
143 /* Target specific options to the disassembler. */
144 static char *disassembler_options = NULL;
146 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
147 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
149 /* The symbol table. */
150 static asymbol **syms;
152 /* Number of symbols in `syms'. */
153 static long symcount = 0;
155 /* The sorted symbol table. */
156 static asymbol **sorted_syms;
158 /* Number of symbols in `sorted_syms'. */
159 static long sorted_symcount = 0;
161 /* The dynamic symbol table. */
162 static asymbol **dynsyms;
164 /* The synthetic symbol table. */
165 static asymbol *synthsyms;
166 static long synthcount = 0;
168 /* Number of symbols in `dynsyms'. */
169 static long dynsymcount = 0;
171 static bfd_byte *stabs;
172 static bfd_size_type stab_size;
174 static char *strtab;
175 static bfd_size_type stabstr_size;
177 static bfd_boolean is_relocatable = FALSE;
179 static void
180 usage (FILE *stream, int status)
182 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
183 fprintf (stream, _(" Display information from object <file(s)>.\n"));
184 fprintf (stream, _(" At least one of the following switches must be given:\n"));
185 fprintf (stream, _("\
186 -a, --archive-headers Display archive header information\n\
187 -f, --file-headers Display the contents of the overall file header\n\
188 -p, --private-headers Display object format specific file header contents\n\
189 -h, --[section-]headers Display the contents of the section headers\n\
190 -x, --all-headers Display the contents of all headers\n\
191 -d, --disassemble Display assembler contents of executable sections\n\
192 -D, --disassemble-all Display assembler contents of all sections\n\
193 -S, --source Intermix source code with disassembly\n\
194 -s, --full-contents Display the full contents of all sections requested\n\
195 -g, --debugging Display debug information in object file\n\
196 -e, --debugging-tags Display debug information using ctags style\n\
197 -G, --stabs Display (in raw form) any STABS info in the file\n\
198 -W, --dwarf Display DWARF info in the file\n\
199 -t, --syms Display the contents of the symbol table(s)\n\
200 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
201 -r, --reloc Display the relocation entries in the file\n\
202 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
203 @<file> Read options from <file>\n\
204 -v, --version Display this program's version number\n\
205 -i, --info List object formats and architectures supported\n\
206 -H, --help Display this information\n\
207 "));
208 if (status != 2)
210 fprintf (stream, _("\n The following switches are optional:\n"));
211 fprintf (stream, _("\
212 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
213 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
214 -j, --section=NAME Only display information for section NAME\n\
215 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
216 -EB --endian=big Assume big endian format when disassembling\n\
217 -EL --endian=little Assume little endian format when disassembling\n\
218 --file-start-context Include context from start of file (with -S)\n\
219 -I, --include=DIR Add DIR to search list for source files\n\
220 -l, --line-numbers Include line numbers and filenames in output\n\
221 -F, --file-offsets Include file offsets when displaying information\n\
222 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
223 The STYLE, if specified, can be `auto', `gnu',\n\
224 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
225 or `gnat'\n\
226 -w, --wide Format output for more than 80 columns\n\
227 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
228 --start-address=ADDR Only process data whose address is >= ADDR\n\
229 --stop-address=ADDR Only process data whose address is <= ADDR\n\
230 --prefix-addresses Print complete address alongside disassembly\n\
231 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
232 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
233 --special-syms Include special symbols in symbol dumps\n\
234 \n"));
235 list_supported_targets (program_name, stream);
236 list_supported_architectures (program_name, stream);
238 disassembler_usage (stream);
240 if (REPORT_BUGS_TO[0] && status == 0)
241 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
242 exit (status);
245 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
246 enum option_values
248 OPTION_ENDIAN=150,
249 OPTION_START_ADDRESS,
250 OPTION_STOP_ADDRESS,
251 OPTION_ADJUST_VMA
254 static struct option long_options[]=
256 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
257 {"all-headers", no_argument, NULL, 'x'},
258 {"private-headers", no_argument, NULL, 'p'},
259 {"architecture", required_argument, NULL, 'm'},
260 {"archive-headers", no_argument, NULL, 'a'},
261 {"debugging", no_argument, NULL, 'g'},
262 {"debugging-tags", no_argument, NULL, 'e'},
263 {"demangle", optional_argument, NULL, 'C'},
264 {"disassemble", no_argument, NULL, 'd'},
265 {"disassemble-all", no_argument, NULL, 'D'},
266 {"disassembler-options", required_argument, NULL, 'M'},
267 {"disassemble-zeroes", no_argument, NULL, 'z'},
268 {"dynamic-reloc", no_argument, NULL, 'R'},
269 {"dynamic-syms", no_argument, NULL, 'T'},
270 {"endian", required_argument, NULL, OPTION_ENDIAN},
271 {"file-headers", no_argument, NULL, 'f'},
272 {"file-offsets", no_argument, NULL, 'F'},
273 {"file-start-context", no_argument, &file_start_context, 1},
274 {"full-contents", no_argument, NULL, 's'},
275 {"headers", no_argument, NULL, 'h'},
276 {"help", no_argument, NULL, 'H'},
277 {"info", no_argument, NULL, 'i'},
278 {"line-numbers", no_argument, NULL, 'l'},
279 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
280 {"prefix-addresses", no_argument, &prefix_addresses, 1},
281 {"reloc", no_argument, NULL, 'r'},
282 {"section", required_argument, NULL, 'j'},
283 {"section-headers", no_argument, NULL, 'h'},
284 {"show-raw-insn", no_argument, &show_raw_insn, 1},
285 {"source", no_argument, NULL, 'S'},
286 {"special-syms", no_argument, &dump_special_syms, 1},
287 {"include", required_argument, NULL, 'I'},
288 {"dwarf", no_argument, NULL, 'W'},
289 {"stabs", no_argument, NULL, 'G'},
290 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
291 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
292 {"syms", no_argument, NULL, 't'},
293 {"target", required_argument, NULL, 'b'},
294 {"version", no_argument, NULL, 'V'},
295 {"wide", no_argument, NULL, 'w'},
296 {0, no_argument, 0, 0}
299 static void
300 nonfatal (const char *msg)
302 bfd_nonfatal (msg);
303 exit_status = 1;
306 static void
307 dump_section_header (bfd *abfd, asection *section,
308 void *ignored ATTRIBUTE_UNUSED)
310 char *comma = "";
311 unsigned int opb = bfd_octets_per_byte (abfd);
313 /* Ignore linker created section. See elfNN_ia64_object_p in
314 bfd/elfxx-ia64.c. */
315 if (section->flags & SEC_LINKER_CREATED)
316 return;
318 printf ("%3d %-13s %08lx ", section->index,
319 bfd_get_section_name (abfd, section),
320 (unsigned long) bfd_section_size (abfd, section) / opb);
321 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
322 printf (" ");
323 bfd_printf_vma (abfd, section->lma);
324 printf (" %08lx 2**%u", (unsigned long) section->filepos,
325 bfd_get_section_alignment (abfd, section));
326 if (! wide_output)
327 printf ("\n ");
328 printf (" ");
330 #define PF(x, y) \
331 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
333 PF (SEC_HAS_CONTENTS, "CONTENTS");
334 PF (SEC_ALLOC, "ALLOC");
335 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
336 PF (SEC_LOAD, "LOAD");
337 PF (SEC_RELOC, "RELOC");
338 PF (SEC_READONLY, "READONLY");
339 PF (SEC_CODE, "CODE");
340 PF (SEC_DATA, "DATA");
341 PF (SEC_ROM, "ROM");
342 PF (SEC_DEBUGGING, "DEBUGGING");
343 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
344 PF (SEC_EXCLUDE, "EXCLUDE");
345 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
346 if (bfd_get_arch (abfd) == bfd_arch_tic54x)
348 PF (SEC_TIC54X_BLOCK, "BLOCK");
349 PF (SEC_TIC54X_CLINK, "CLINK");
351 PF (SEC_SMALL_DATA, "SMALL_DATA");
352 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
353 PF (SEC_COFF_SHARED, "SHARED");
354 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
355 PF (SEC_GROUP, "GROUP");
357 if ((section->flags & SEC_LINK_ONCE) != 0)
359 const char *ls;
360 struct coff_comdat_info *comdat;
362 switch (section->flags & SEC_LINK_DUPLICATES)
364 default:
365 abort ();
366 case SEC_LINK_DUPLICATES_DISCARD:
367 ls = "LINK_ONCE_DISCARD";
368 break;
369 case SEC_LINK_DUPLICATES_ONE_ONLY:
370 ls = "LINK_ONCE_ONE_ONLY";
371 break;
372 case SEC_LINK_DUPLICATES_SAME_SIZE:
373 ls = "LINK_ONCE_SAME_SIZE";
374 break;
375 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
376 ls = "LINK_ONCE_SAME_CONTENTS";
377 break;
379 printf ("%s%s", comma, ls);
381 comdat = bfd_coff_get_comdat_section (abfd, section);
382 if (comdat != NULL)
383 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
385 comma = ", ";
388 printf ("\n");
389 #undef PF
392 static void
393 dump_headers (bfd *abfd)
395 printf (_("Sections:\n"));
397 #ifndef BFD64
398 printf (_("Idx Name Size VMA LMA File off Algn"));
399 #else
400 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
401 if (bfd_get_arch_size (abfd) == 32)
402 printf (_("Idx Name Size VMA LMA File off Algn"));
403 else
404 printf (_("Idx Name Size VMA LMA File off Algn"));
405 #endif
407 if (wide_output)
408 printf (_(" Flags"));
409 if (abfd->flags & HAS_LOAD_PAGE)
410 printf (_(" Pg"));
411 printf ("\n");
413 bfd_map_over_sections (abfd, dump_section_header, NULL);
416 static asymbol **
417 slurp_symtab (bfd *abfd)
419 asymbol **sy = NULL;
420 long storage;
422 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
424 symcount = 0;
425 return NULL;
428 storage = bfd_get_symtab_upper_bound (abfd);
429 if (storage < 0)
430 bfd_fatal (bfd_get_filename (abfd));
431 if (storage)
432 sy = xmalloc (storage);
434 symcount = bfd_canonicalize_symtab (abfd, sy);
435 if (symcount < 0)
436 bfd_fatal (bfd_get_filename (abfd));
437 return sy;
440 /* Read in the dynamic symbols. */
442 static asymbol **
443 slurp_dynamic_symtab (bfd *abfd)
445 asymbol **sy = NULL;
446 long storage;
448 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
449 if (storage < 0)
451 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
453 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
454 dynsymcount = 0;
455 return NULL;
458 bfd_fatal (bfd_get_filename (abfd));
460 if (storage)
461 sy = xmalloc (storage);
463 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
464 if (dynsymcount < 0)
465 bfd_fatal (bfd_get_filename (abfd));
466 return sy;
469 /* Filter out (in place) symbols that are useless for disassembly.
470 COUNT is the number of elements in SYMBOLS.
471 Return the number of useful symbols. */
473 static long
474 remove_useless_symbols (asymbol **symbols, long count)
476 asymbol **in_ptr = symbols, **out_ptr = symbols;
478 while (--count >= 0)
480 asymbol *sym = *in_ptr++;
482 if (sym->name == NULL || sym->name[0] == '\0')
483 continue;
484 if (sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
485 continue;
486 if (bfd_is_und_section (sym->section)
487 || bfd_is_com_section (sym->section))
488 continue;
490 *out_ptr++ = sym;
492 return out_ptr - symbols;
495 /* Sort symbols into value order. */
497 static int
498 compare_symbols (const void *ap, const void *bp)
500 const asymbol *a = * (const asymbol **) ap;
501 const asymbol *b = * (const asymbol **) bp;
502 const char *an;
503 const char *bn;
504 size_t anl;
505 size_t bnl;
506 bfd_boolean af;
507 bfd_boolean bf;
508 flagword aflags;
509 flagword bflags;
511 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
512 return 1;
513 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
514 return -1;
516 if (a->section > b->section)
517 return 1;
518 else if (a->section < b->section)
519 return -1;
521 an = bfd_asymbol_name (a);
522 bn = bfd_asymbol_name (b);
523 anl = strlen (an);
524 bnl = strlen (bn);
526 /* The symbols gnu_compiled and gcc2_compiled convey no real
527 information, so put them after other symbols with the same value. */
528 af = (strstr (an, "gnu_compiled") != NULL
529 || strstr (an, "gcc2_compiled") != NULL);
530 bf = (strstr (bn, "gnu_compiled") != NULL
531 || strstr (bn, "gcc2_compiled") != NULL);
533 if (af && ! bf)
534 return 1;
535 if (! af && bf)
536 return -1;
538 /* We use a heuristic for the file name, to try to sort it after
539 more useful symbols. It may not work on non Unix systems, but it
540 doesn't really matter; the only difference is precisely which
541 symbol names get printed. */
543 #define file_symbol(s, sn, snl) \
544 (((s)->flags & BSF_FILE) != 0 \
545 || ((sn)[(snl) - 2] == '.' \
546 && ((sn)[(snl) - 1] == 'o' \
547 || (sn)[(snl) - 1] == 'a')))
549 af = file_symbol (a, an, anl);
550 bf = file_symbol (b, bn, bnl);
552 if (af && ! bf)
553 return 1;
554 if (! af && bf)
555 return -1;
557 /* Try to sort global symbols before local symbols before function
558 symbols before debugging symbols. */
560 aflags = a->flags;
561 bflags = b->flags;
563 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
565 if ((aflags & BSF_DEBUGGING) != 0)
566 return 1;
567 else
568 return -1;
570 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
572 if ((aflags & BSF_FUNCTION) != 0)
573 return -1;
574 else
575 return 1;
577 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
579 if ((aflags & BSF_LOCAL) != 0)
580 return 1;
581 else
582 return -1;
584 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
586 if ((aflags & BSF_GLOBAL) != 0)
587 return -1;
588 else
589 return 1;
592 /* Symbols that start with '.' might be section names, so sort them
593 after symbols that don't start with '.'. */
594 if (an[0] == '.' && bn[0] != '.')
595 return 1;
596 if (an[0] != '.' && bn[0] == '.')
597 return -1;
599 /* Finally, if we can't distinguish them in any other way, try to
600 get consistent results by sorting the symbols by name. */
601 return strcmp (an, bn);
604 /* Sort relocs into address order. */
606 static int
607 compare_relocs (const void *ap, const void *bp)
609 const arelent *a = * (const arelent **) ap;
610 const arelent *b = * (const arelent **) bp;
612 if (a->address > b->address)
613 return 1;
614 else if (a->address < b->address)
615 return -1;
617 /* So that associated relocations tied to the same address show up
618 in the correct order, we don't do any further sorting. */
619 if (a > b)
620 return 1;
621 else if (a < b)
622 return -1;
623 else
624 return 0;
627 /* Print an address (VMA) to the output stream in INFO.
628 If SKIP_ZEROES is TRUE, omit leading zeroes. */
630 static void
631 objdump_print_value (bfd_vma vma, struct disassemble_info *info,
632 bfd_boolean skip_zeroes)
634 char buf[30];
635 char *p;
636 struct objdump_disasm_info *aux;
638 aux = (struct objdump_disasm_info *) info->application_data;
639 bfd_sprintf_vma (aux->abfd, buf, vma);
640 if (! skip_zeroes)
641 p = buf;
642 else
644 for (p = buf; *p == '0'; ++p)
646 if (*p == '\0')
647 --p;
649 (*info->fprintf_func) (info->stream, "%s", p);
652 /* Print the name of a symbol. */
654 static void
655 objdump_print_symname (bfd *abfd, struct disassemble_info *info,
656 asymbol *sym)
658 char *alloc;
659 const char *name;
661 alloc = NULL;
662 name = bfd_asymbol_name (sym);
663 if (do_demangle && name[0] != '\0')
665 /* Demangle the name. */
666 alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
667 if (alloc != NULL)
668 name = alloc;
671 if (info != NULL)
672 (*info->fprintf_func) (info->stream, "%s", name);
673 else
674 printf ("%s", name);
676 if (alloc != NULL)
677 free (alloc);
680 /* Locate a symbol given a bfd and a section (from INFO->application_data),
681 and a VMA. If INFO->application_data->require_sec is TRUE, then always
682 require the symbol to be in the section. Returns NULL if there is no
683 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
684 of the symbol in sorted_syms. */
686 static asymbol *
687 find_symbol_for_address (bfd_vma vma,
688 struct disassemble_info *info,
689 long *place)
691 /* @@ Would it speed things up to cache the last two symbols returned,
692 and maybe their address ranges? For many processors, only one memory
693 operand can be present at a time, so the 2-entry cache wouldn't be
694 constantly churned by code doing heavy memory accesses. */
696 /* Indices in `sorted_syms'. */
697 long min = 0;
698 long max = sorted_symcount;
699 long thisplace;
700 struct objdump_disasm_info *aux;
701 bfd *abfd;
702 asection *sec;
703 unsigned int opb;
704 bfd_boolean want_section;
706 if (sorted_symcount < 1)
707 return NULL;
709 aux = (struct objdump_disasm_info *) info->application_data;
710 abfd = aux->abfd;
711 sec = aux->sec;
712 opb = bfd_octets_per_byte (abfd);
714 /* Perform a binary search looking for the closest symbol to the
715 required value. We are searching the range (min, max]. */
716 while (min + 1 < max)
718 asymbol *sym;
720 thisplace = (max + min) / 2;
721 sym = sorted_syms[thisplace];
723 if (bfd_asymbol_value (sym) > vma)
724 max = thisplace;
725 else if (bfd_asymbol_value (sym) < vma)
726 min = thisplace;
727 else
729 min = thisplace;
730 break;
734 /* The symbol we want is now in min, the low end of the range we
735 were searching. If there are several symbols with the same
736 value, we want the first one. */
737 thisplace = min;
738 while (thisplace > 0
739 && (bfd_asymbol_value (sorted_syms[thisplace])
740 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
741 --thisplace;
743 /* Prefer a symbol in the current section if we have multple symbols
744 with the same value, as can occur with overlays or zero size
745 sections. */
746 min = thisplace;
747 while (min < max
748 && (bfd_asymbol_value (sorted_syms[min])
749 == bfd_asymbol_value (sorted_syms[thisplace])))
751 if (sorted_syms[min]->section == sec
752 && info->symbol_is_valid (sorted_syms[min], info))
754 thisplace = min;
756 if (place != NULL)
757 *place = thisplace;
759 return sorted_syms[thisplace];
761 ++min;
764 /* If the file is relocatable, and the symbol could be from this
765 section, prefer a symbol from this section over symbols from
766 others, even if the other symbol's value might be closer.
768 Note that this may be wrong for some symbol references if the
769 sections have overlapping memory ranges, but in that case there's
770 no way to tell what's desired without looking at the relocation
771 table.
773 Also give the target a chance to reject symbols. */
774 want_section = (aux->require_sec
775 || ((abfd->flags & HAS_RELOC) != 0
776 && vma >= bfd_get_section_vma (abfd, sec)
777 && vma < (bfd_get_section_vma (abfd, sec)
778 + bfd_section_size (abfd, sec) / opb)));
779 if ((sorted_syms[thisplace]->section != sec && want_section)
780 || !info->symbol_is_valid (sorted_syms[thisplace], info))
782 long i;
783 long newplace = sorted_symcount;
785 for (i = min - 1; i >= 0; i--)
787 if ((sorted_syms[i]->section == sec || !want_section)
788 && info->symbol_is_valid (sorted_syms[i], info))
790 if (newplace == sorted_symcount)
791 newplace = i;
793 if (bfd_asymbol_value (sorted_syms[i])
794 != bfd_asymbol_value (sorted_syms[newplace]))
795 break;
797 /* Remember this symbol and keep searching until we reach
798 an earlier address. */
799 newplace = i;
803 if (newplace != sorted_symcount)
804 thisplace = newplace;
805 else
807 /* We didn't find a good symbol with a smaller value.
808 Look for one with a larger value. */
809 for (i = thisplace + 1; i < sorted_symcount; i++)
811 if ((sorted_syms[i]->section == sec || !want_section)
812 && info->symbol_is_valid (sorted_syms[i], info))
814 thisplace = i;
815 break;
820 if ((sorted_syms[thisplace]->section != sec && want_section)
821 || !info->symbol_is_valid (sorted_syms[thisplace], info))
822 /* There is no suitable symbol. */
823 return NULL;
826 if (place != NULL)
827 *place = thisplace;
829 return sorted_syms[thisplace];
832 /* Print an address and the offset to the nearest symbol. */
834 static void
835 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
836 bfd_vma vma, struct disassemble_info *info,
837 bfd_boolean skip_zeroes)
839 objdump_print_value (vma, info, skip_zeroes);
841 if (sym == NULL)
843 bfd_vma secaddr;
845 (*info->fprintf_func) (info->stream, " <%s",
846 bfd_get_section_name (abfd, sec));
847 secaddr = bfd_get_section_vma (abfd, sec);
848 if (vma < secaddr)
850 (*info->fprintf_func) (info->stream, "-0x");
851 objdump_print_value (secaddr - vma, info, TRUE);
853 else if (vma > secaddr)
855 (*info->fprintf_func) (info->stream, "+0x");
856 objdump_print_value (vma - secaddr, info, TRUE);
858 (*info->fprintf_func) (info->stream, ">");
860 else
862 (*info->fprintf_func) (info->stream, " <");
863 objdump_print_symname (abfd, info, sym);
864 if (bfd_asymbol_value (sym) > vma)
866 (*info->fprintf_func) (info->stream, "-0x");
867 objdump_print_value (bfd_asymbol_value (sym) - vma, info, TRUE);
869 else if (vma > bfd_asymbol_value (sym))
871 (*info->fprintf_func) (info->stream, "+0x");
872 objdump_print_value (vma - bfd_asymbol_value (sym), info, TRUE);
874 (*info->fprintf_func) (info->stream, ">");
877 if (display_file_offsets)
878 info->fprintf_func (info->stream, _(" (File Offset: 0x%lx)"),
879 (long int)(sec->filepos + (vma - sec->vma)));
882 /* Print an address (VMA), symbolically if possible.
883 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
885 static void
886 objdump_print_addr (bfd_vma vma,
887 struct disassemble_info *info,
888 bfd_boolean skip_zeroes)
890 struct objdump_disasm_info *aux;
891 asymbol *sym = NULL;
892 bfd_boolean skip_find = FALSE;
894 aux = (struct objdump_disasm_info *) info->application_data;
896 if (sorted_symcount < 1)
898 (*info->fprintf_func) (info->stream, "0x");
899 objdump_print_value (vma, info, skip_zeroes);
901 if (display_file_offsets)
902 info->fprintf_func (info->stream, _(" (File Offset: 0x%lx)"),
903 (long int)(aux->sec->filepos + (vma - aux->sec->vma)));
904 return;
907 if (aux->reloc != NULL
908 && aux->reloc->sym_ptr_ptr != NULL
909 && * aux->reloc->sym_ptr_ptr != NULL)
911 sym = * aux->reloc->sym_ptr_ptr;
913 /* Adjust the vma to the reloc. */
914 vma += bfd_asymbol_value (sym);
916 if (bfd_is_und_section (bfd_get_section (sym)))
917 skip_find = TRUE;
920 if (!skip_find)
921 sym = find_symbol_for_address (vma, info, NULL);
923 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
924 skip_zeroes);
927 /* Print VMA to INFO. This function is passed to the disassembler
928 routine. */
930 static void
931 objdump_print_address (bfd_vma vma, struct disassemble_info *info)
933 objdump_print_addr (vma, info, ! prefix_addresses);
936 /* Determine if the given address has a symbol associated with it. */
938 static int
939 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * info)
941 asymbol * sym;
943 sym = find_symbol_for_address (vma, info, NULL);
945 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
948 /* Hold the last function name and the last line number we displayed
949 in a disassembly. */
951 static char *prev_functionname;
952 static unsigned int prev_line;
954 /* We keep a list of all files that we have seen when doing a
955 disassembly with source, so that we know how much of the file to
956 display. This can be important for inlined functions. */
958 struct print_file_list
960 struct print_file_list *next;
961 const char *filename;
962 const char *modname;
963 const char *map;
964 size_t mapsize;
965 const char **linemap;
966 unsigned maxline;
967 unsigned last_line;
968 int first;
971 static struct print_file_list *print_files;
973 /* The number of preceding context lines to show when we start
974 displaying a file for the first time. */
976 #define SHOW_PRECEDING_CONTEXT_LINES (5)
978 /* Read a complete file into memory. */
980 static const char *
981 slurp_file (const char *fn, size_t *size)
983 #ifdef HAVE_MMAP
984 int ps = getpagesize ();
985 size_t msize;
986 #endif
987 const char *map;
988 struct stat st;
989 int fd = open (fn, O_RDONLY | O_BINARY);
991 if (fd < 0)
992 return NULL;
993 if (fstat (fd, &st) < 0)
994 return NULL;
995 *size = st.st_size;
996 #ifdef HAVE_MMAP
997 msize = (*size + ps - 1) & ~(ps - 1);
998 map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
999 if (map != (char *)-1L)
1001 close(fd);
1002 return map;
1004 #endif
1005 map = malloc (*size);
1006 if (!map || (size_t) read (fd, (char *)map, *size) != *size)
1008 free ((void *)map);
1009 map = NULL;
1011 close (fd);
1012 return map;
1015 #define line_map_decrease 5
1017 /* Precompute array of lines for a mapped file. */
1019 static const char **
1020 index_file (const char *map, size_t size, unsigned int *maxline)
1022 const char *p, *lstart, *end;
1023 int chars_per_line = 45; /* First iteration will use 40. */
1024 unsigned int lineno;
1025 const char **linemap = NULL;
1026 unsigned long line_map_size = 0;
1028 lineno = 0;
1029 lstart = map;
1030 end = map + size;
1032 for (p = map; p < end; p++)
1034 if (*p == '\n')
1036 if (p + 1 < end && p[1] == '\r')
1037 p++;
1039 else if (*p == '\r')
1041 if (p + 1 < end && p[1] == '\n')
1042 p++;
1044 else
1045 continue;
1047 /* End of line found. */
1049 if (linemap == NULL || line_map_size < lineno + 1)
1051 unsigned long newsize;
1053 chars_per_line -= line_map_decrease;
1054 if (chars_per_line <= 1)
1055 chars_per_line = 1;
1056 line_map_size = size / chars_per_line + 1;
1057 if (line_map_size < lineno + 1)
1058 line_map_size = lineno + 1;
1059 newsize = line_map_size * sizeof (char *);
1060 linemap = xrealloc (linemap, newsize);
1063 linemap[lineno++] = lstart;
1064 lstart = p + 1;
1067 *maxline = lineno;
1068 return linemap;
1071 /* Tries to open MODNAME, and if successful adds a node to print_files
1072 linked list and returns that node. Returns NULL on failure. */
1074 static struct print_file_list *
1075 try_print_file_open (const char *origname, const char *modname)
1077 struct print_file_list *p;
1079 p = xmalloc (sizeof (struct print_file_list));
1081 p->map = slurp_file (modname, &p->mapsize);
1082 if (p->map == NULL)
1084 free (p);
1085 return NULL;
1088 p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1089 p->last_line = 0;
1090 p->filename = origname;
1091 p->modname = modname;
1092 p->next = print_files;
1093 p->first = 1;
1094 print_files = p;
1095 return p;
1098 /* If the the source file, as described in the symtab, is not found
1099 try to locate it in one of the paths specified with -I
1100 If found, add location to print_files linked list. */
1102 static struct print_file_list *
1103 update_source_path (const char *filename)
1105 struct print_file_list *p;
1106 const char *fname;
1107 int i;
1109 if (filename == NULL)
1110 return NULL;
1112 p = try_print_file_open (filename, filename);
1113 if (p != NULL)
1114 return p;
1116 if (include_path_count == 0)
1117 return NULL;
1119 /* Get the name of the file. */
1120 fname = strrchr (filename, '/');
1121 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1123 /* We could have a mixed forward/back slash case. */
1124 char *backslash = strrchr (filename, '\\');
1125 if (fname == NULL || (backslash != NULL && backslash > fname))
1126 fname = backslash;
1127 if (fname == NULL && filename[0] != '\0' && filename[1] == ':')
1128 fname = filename + 1;
1130 #endif
1131 if (fname == NULL)
1132 fname = filename;
1133 else
1134 ++fname;
1136 /* If file exists under a new path, we need to add it to the list
1137 so that show_line knows about it. */
1138 for (i = 0; i < include_path_count; i++)
1140 char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1142 p = try_print_file_open (filename, modname);
1143 if (p)
1144 return p;
1146 free (modname);
1149 return NULL;
1152 /* Print a source file line. */
1154 static void
1155 print_line (struct print_file_list *p, unsigned int line)
1157 const char *l;
1158 size_t len;
1160 --line;
1161 if (line >= p->maxline)
1162 return;
1163 l = p->linemap [line];
1164 /* Test fwrite return value to quiet glibc warning. */
1165 len = strcspn (l, "\n\r");
1166 if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1167 putchar ('\n');
1170 /* Print a range of source code lines. */
1172 static void
1173 dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1175 if (p->map == NULL)
1176 return;
1177 while (start <= end)
1179 print_line (p, start);
1180 start++;
1184 /* Show the line number, or the source line, in a disassembly
1185 listing. */
1187 static void
1188 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1190 const char *filename;
1191 const char *functionname;
1192 unsigned int line;
1194 if (! with_line_numbers && ! with_source_code)
1195 return;
1197 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1198 &functionname, &line))
1199 return;
1201 if (filename != NULL && *filename == '\0')
1202 filename = NULL;
1203 if (functionname != NULL && *functionname == '\0')
1204 functionname = NULL;
1206 if (with_line_numbers)
1208 if (functionname != NULL
1209 && (prev_functionname == NULL
1210 || strcmp (functionname, prev_functionname) != 0))
1211 printf ("%s():\n", functionname);
1212 if (line > 0 && line != prev_line)
1213 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1216 if (with_source_code
1217 && filename != NULL
1218 && line > 0)
1220 struct print_file_list **pp, *p;
1221 unsigned l;
1223 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1224 if (strcmp ((*pp)->filename, filename) == 0)
1225 break;
1226 p = *pp;
1228 if (p == NULL)
1229 p = update_source_path (filename);
1231 if (p != NULL && line != p->last_line)
1233 if (file_start_context && p->first)
1234 l = 1;
1235 else
1237 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1238 if (l >= line)
1239 l = 1;
1240 if (p->last_line >= l && p->last_line <= line)
1241 l = p->last_line + 1;
1243 dump_lines (p, l, line);
1244 p->last_line = line;
1245 p->first = 0;
1249 if (functionname != NULL
1250 && (prev_functionname == NULL
1251 || strcmp (functionname, prev_functionname) != 0))
1253 if (prev_functionname != NULL)
1254 free (prev_functionname);
1255 prev_functionname = xmalloc (strlen (functionname) + 1);
1256 strcpy (prev_functionname, functionname);
1259 if (line > 0 && line != prev_line)
1260 prev_line = line;
1263 /* Pseudo FILE object for strings. */
1264 typedef struct
1266 char *buffer;
1267 size_t pos;
1268 size_t alloc;
1269 } SFILE;
1271 /* sprintf to a "stream". */
1273 static int ATTRIBUTE_PRINTF_2
1274 objdump_sprintf (SFILE *f, const char *format, ...)
1276 size_t n;
1277 va_list args;
1279 while (1)
1281 size_t space = f->alloc - f->pos;
1283 va_start (args, format);
1284 n = vsnprintf (f->buffer + f->pos, space, format, args);
1285 va_end (args);
1287 if (space > n)
1288 break;
1290 f->alloc = (f->alloc + n) * 2;
1291 f->buffer = xrealloc (f->buffer, f->alloc);
1293 f->pos += n;
1295 return n;
1298 /* Returns TRUE if the specified section should be dumped. */
1300 static bfd_boolean
1301 process_section_p (asection * section)
1303 size_t i;
1305 if (only == NULL)
1306 return TRUE;
1308 for (i = 0; i < only_used; i++)
1309 if (strcmp (only [i], section->name) == 0)
1310 return TRUE;
1312 return FALSE;
1316 /* The number of zeroes we want to see before we start skipping them.
1317 The number is arbitrarily chosen. */
1319 #define DEFAULT_SKIP_ZEROES 8
1321 /* The number of zeroes to skip at the end of a section. If the
1322 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1323 SKIP_ZEROES, they will be disassembled. If there are fewer than
1324 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1325 attempt to avoid disassembling zeroes inserted by section
1326 alignment. */
1328 #define DEFAULT_SKIP_ZEROES_AT_END 3
1330 /* Disassemble some data in memory between given values. */
1332 static void
1333 disassemble_bytes (struct disassemble_info * info,
1334 disassembler_ftype disassemble_fn,
1335 bfd_boolean insns,
1336 bfd_byte * data,
1337 bfd_vma start_offset,
1338 bfd_vma stop_offset,
1339 bfd_vma rel_offset,
1340 arelent *** relppp,
1341 arelent ** relppend)
1343 struct objdump_disasm_info *aux;
1344 asection *section;
1345 int octets_per_line;
1346 bfd_boolean done_dot;
1347 int skip_addr_chars;
1348 bfd_vma addr_offset;
1349 unsigned int opb = info->octets_per_byte;
1350 unsigned int skip_zeroes = info->skip_zeroes;
1351 unsigned int skip_zeroes_at_end = info->skip_zeroes_at_end;
1352 int octets = opb;
1353 SFILE sfile;
1355 aux = (struct objdump_disasm_info *) info->application_data;
1356 section = aux->sec;
1358 sfile.alloc = 120;
1359 sfile.buffer = xmalloc (sfile.alloc);
1360 sfile.pos = 0;
1362 if (insns)
1363 octets_per_line = 4;
1364 else
1365 octets_per_line = 16;
1367 /* Figure out how many characters to skip at the start of an
1368 address, to make the disassembly look nicer. We discard leading
1369 zeroes in chunks of 4, ensuring that there is always a leading
1370 zero remaining. */
1371 skip_addr_chars = 0;
1372 if (! prefix_addresses)
1374 char buf[30];
1375 char *s;
1377 bfd_sprintf_vma
1378 (aux->abfd, buf,
1379 (section->vma
1380 + bfd_section_size (section->owner, section) / opb));
1381 s = buf;
1382 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1383 && s[4] == '0')
1385 skip_addr_chars += 4;
1386 s += 4;
1390 info->insn_info_valid = 0;
1392 done_dot = FALSE;
1393 addr_offset = start_offset;
1394 while (addr_offset < stop_offset)
1396 bfd_vma z;
1397 bfd_boolean need_nl = FALSE;
1398 int previous_octets;
1400 /* Remember the length of the previous instruction. */
1401 previous_octets = octets;
1402 octets = 0;
1404 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1405 print `...'. */
1406 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1407 if (data[z] != 0)
1408 break;
1409 if (! disassemble_zeroes
1410 && (info->insn_info_valid == 0
1411 || info->branch_delay_insns == 0)
1412 && (z - addr_offset * opb >= skip_zeroes
1413 || (z == stop_offset * opb &&
1414 z - addr_offset * opb < skip_zeroes_at_end)))
1416 /* If there are more nonzero octets to follow, we only skip
1417 zeroes in multiples of 4, to try to avoid running over
1418 the start of an instruction which happens to start with
1419 zero. */
1420 if (z != stop_offset * opb)
1421 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1423 octets = z - addr_offset * opb;
1425 /* If we are going to display more data, and we are displaying
1426 file offsets, then tell the user how many zeroes we skip
1427 and the file offset from where we resume dumping. */
1428 if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1429 printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1430 octets / opb,
1431 (long int)(section->filepos + (addr_offset + (octets / opb))));
1432 else
1433 printf ("\t...\n");
1435 else
1437 char buf[50];
1438 int bpc = 0;
1439 int pb = 0;
1441 done_dot = FALSE;
1443 if (with_line_numbers || with_source_code)
1444 show_line (aux->abfd, section, addr_offset);
1446 if (! prefix_addresses)
1448 char *s;
1450 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1451 for (s = buf + skip_addr_chars; *s == '0'; s++)
1452 *s = ' ';
1453 if (*s == '\0')
1454 *--s = '0';
1455 printf ("%s:\t", buf + skip_addr_chars);
1457 else
1459 aux->require_sec = TRUE;
1460 objdump_print_address (section->vma + addr_offset, info);
1461 aux->require_sec = FALSE;
1462 putchar (' ');
1465 if (insns)
1467 sfile.pos = 0;
1468 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1469 info->stream = &sfile;
1470 info->bytes_per_line = 0;
1471 info->bytes_per_chunk = 0;
1472 info->flags = 0;
1474 if (info->disassembler_needs_relocs
1475 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1476 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1477 && *relppp < relppend)
1479 bfd_signed_vma distance_to_rel;
1481 distance_to_rel = (**relppp)->address
1482 - (rel_offset + addr_offset);
1484 /* Check to see if the current reloc is associated with
1485 the instruction that we are about to disassemble. */
1486 if (distance_to_rel == 0
1487 /* FIXME: This is wrong. We are trying to catch
1488 relocs that are addressed part way through the
1489 current instruction, as might happen with a packed
1490 VLIW instruction. Unfortunately we do not know the
1491 length of the current instruction since we have not
1492 disassembled it yet. Instead we take a guess based
1493 upon the length of the previous instruction. The
1494 proper solution is to have a new target-specific
1495 disassembler function which just returns the length
1496 of an instruction at a given address without trying
1497 to display its disassembly. */
1498 || (distance_to_rel > 0
1499 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1501 info->flags = INSN_HAS_RELOC;
1502 aux->reloc = **relppp;
1504 else
1505 aux->reloc = NULL;
1508 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1509 info->fprintf_func = (fprintf_ftype) fprintf;
1510 info->stream = stdout;
1511 if (info->bytes_per_line != 0)
1512 octets_per_line = info->bytes_per_line;
1513 if (octets < 0)
1515 if (sfile.pos)
1516 printf ("%s\n", sfile.buffer);
1517 break;
1520 else
1522 bfd_vma j;
1524 octets = octets_per_line;
1525 if (addr_offset + octets / opb > stop_offset)
1526 octets = (stop_offset - addr_offset) * opb;
1528 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1530 if (ISPRINT (data[j]))
1531 buf[j - addr_offset * opb] = data[j];
1532 else
1533 buf[j - addr_offset * opb] = '.';
1535 buf[j - addr_offset * opb] = '\0';
1538 if (prefix_addresses
1539 ? show_raw_insn > 0
1540 : show_raw_insn >= 0)
1542 bfd_vma j;
1544 /* If ! prefix_addresses and ! wide_output, we print
1545 octets_per_line octets per line. */
1546 pb = octets;
1547 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1548 pb = octets_per_line;
1550 if (info->bytes_per_chunk)
1551 bpc = info->bytes_per_chunk;
1552 else
1553 bpc = 1;
1555 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1557 int k;
1559 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1561 for (k = bpc - 1; k >= 0; k--)
1562 printf ("%02x", (unsigned) data[j + k]);
1563 putchar (' ');
1565 else
1567 for (k = 0; k < bpc; k++)
1568 printf ("%02x", (unsigned) data[j + k]);
1569 putchar (' ');
1573 for (; pb < octets_per_line; pb += bpc)
1575 int k;
1577 for (k = 0; k < bpc; k++)
1578 printf (" ");
1579 putchar (' ');
1582 /* Separate raw data from instruction by extra space. */
1583 if (insns)
1584 putchar ('\t');
1585 else
1586 printf (" ");
1589 if (! insns)
1590 printf ("%s", buf);
1591 else if (sfile.pos)
1592 printf ("%s", sfile.buffer);
1594 if (prefix_addresses
1595 ? show_raw_insn > 0
1596 : show_raw_insn >= 0)
1598 while (pb < octets)
1600 bfd_vma j;
1601 char *s;
1603 putchar ('\n');
1604 j = addr_offset * opb + pb;
1606 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1607 for (s = buf + skip_addr_chars; *s == '0'; s++)
1608 *s = ' ';
1609 if (*s == '\0')
1610 *--s = '0';
1611 printf ("%s:\t", buf + skip_addr_chars);
1613 pb += octets_per_line;
1614 if (pb > octets)
1615 pb = octets;
1616 for (; j < addr_offset * opb + pb; j += bpc)
1618 int k;
1620 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1622 for (k = bpc - 1; k >= 0; k--)
1623 printf ("%02x", (unsigned) data[j + k]);
1624 putchar (' ');
1626 else
1628 for (k = 0; k < bpc; k++)
1629 printf ("%02x", (unsigned) data[j + k]);
1630 putchar (' ');
1636 if (!wide_output)
1637 putchar ('\n');
1638 else
1639 need_nl = TRUE;
1642 while ((*relppp) < relppend
1643 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1645 if (dump_reloc_info || dump_dynamic_reloc_info)
1647 arelent *q;
1649 q = **relppp;
1651 if (wide_output)
1652 putchar ('\t');
1653 else
1654 printf ("\t\t\t");
1656 objdump_print_value (section->vma - rel_offset + q->address,
1657 info, TRUE);
1659 if (q->howto == NULL)
1660 printf (": *unknown*\t");
1661 else if (q->howto->name)
1662 printf (": %s\t", q->howto->name);
1663 else
1664 printf (": %d\t", q->howto->type);
1666 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1667 printf ("*unknown*");
1668 else
1670 const char *sym_name;
1672 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1673 if (sym_name != NULL && *sym_name != '\0')
1674 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1675 else
1677 asection *sym_sec;
1679 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1680 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1681 if (sym_name == NULL || *sym_name == '\0')
1682 sym_name = "*unknown*";
1683 printf ("%s", sym_name);
1687 if (q->addend)
1689 printf ("+0x");
1690 objdump_print_value (q->addend, info, TRUE);
1693 printf ("\n");
1694 need_nl = FALSE;
1696 ++(*relppp);
1699 if (need_nl)
1700 printf ("\n");
1702 addr_offset += octets / opb;
1705 free (sfile.buffer);
1708 static void
1709 disassemble_section (bfd *abfd, asection *section, void *info)
1711 struct disassemble_info * pinfo = (struct disassemble_info *) info;
1712 struct objdump_disasm_info * paux;
1713 unsigned int opb = pinfo->octets_per_byte;
1714 bfd_byte * data = NULL;
1715 bfd_size_type datasize = 0;
1716 arelent ** rel_pp = NULL;
1717 arelent ** rel_ppstart = NULL;
1718 arelent ** rel_ppend;
1719 unsigned long stop_offset;
1720 asymbol * sym = NULL;
1721 long place = 0;
1722 long rel_count;
1723 bfd_vma rel_offset;
1724 unsigned long addr_offset;
1726 /* Sections that do not contain machine
1727 code are not normally disassembled. */
1728 if (! disassemble_all
1729 && only == NULL
1730 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1731 != (SEC_CODE | SEC_HAS_CONTENTS)))
1732 return;
1734 if (! process_section_p (section))
1735 return;
1737 datasize = bfd_get_section_size (section);
1738 if (datasize == 0)
1739 return;
1741 /* Decide which set of relocs to use. Load them if necessary. */
1742 paux = (struct objdump_disasm_info *) pinfo->application_data;
1743 if (paux->dynrelbuf)
1745 rel_pp = paux->dynrelbuf;
1746 rel_count = paux->dynrelcount;
1747 /* Dynamic reloc addresses are absolute, non-dynamic are section
1748 relative. REL_OFFSET specifies the reloc address corresponding
1749 to the start of this section. */
1750 rel_offset = section->vma;
1752 else
1754 rel_count = 0;
1755 rel_pp = NULL;
1756 rel_offset = 0;
1758 if ((section->flags & SEC_RELOC) != 0
1759 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1761 long relsize;
1763 relsize = bfd_get_reloc_upper_bound (abfd, section);
1764 if (relsize < 0)
1765 bfd_fatal (bfd_get_filename (abfd));
1767 if (relsize > 0)
1769 rel_ppstart = rel_pp = xmalloc (relsize);
1770 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1771 if (rel_count < 0)
1772 bfd_fatal (bfd_get_filename (abfd));
1774 /* Sort the relocs by address. */
1775 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1780 rel_ppend = rel_pp + rel_count;
1782 data = xmalloc (datasize);
1784 bfd_get_section_contents (abfd, section, data, 0, datasize);
1786 paux->sec = section;
1787 pinfo->buffer = data;
1788 pinfo->buffer_vma = section->vma;
1789 pinfo->buffer_length = datasize;
1790 pinfo->section = section;
1792 if (start_address == (bfd_vma) -1
1793 || start_address < pinfo->buffer_vma)
1794 addr_offset = 0;
1795 else
1796 addr_offset = start_address - pinfo->buffer_vma;
1798 if (stop_address == (bfd_vma) -1)
1799 stop_offset = datasize / opb;
1800 else
1802 if (stop_address < pinfo->buffer_vma)
1803 stop_offset = 0;
1804 else
1805 stop_offset = stop_address - pinfo->buffer_vma;
1806 if (stop_offset > pinfo->buffer_length / opb)
1807 stop_offset = pinfo->buffer_length / opb;
1810 /* Skip over the relocs belonging to addresses below the
1811 start address. */
1812 while (rel_pp < rel_ppend
1813 && (*rel_pp)->address < rel_offset + addr_offset)
1814 ++rel_pp;
1816 if (addr_offset < stop_offset)
1817 printf (_("\nDisassembly of section %s:\n"), section->name);
1819 /* Find the nearest symbol forwards from our current position. */
1820 paux->require_sec = TRUE;
1821 sym = find_symbol_for_address (section->vma + addr_offset, info, &place);
1822 paux->require_sec = FALSE;
1824 /* Disassemble a block of instructions up to the address associated with
1825 the symbol we have just found. Then print the symbol and find the
1826 next symbol on. Repeat until we have disassembled the entire section
1827 or we have reached the end of the address range we are interested in. */
1828 while (addr_offset < stop_offset)
1830 bfd_vma addr;
1831 asymbol *nextsym;
1832 unsigned long nextstop_offset;
1833 bfd_boolean insns;
1835 addr = section->vma + addr_offset;
1837 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
1839 int x;
1841 for (x = place;
1842 (x < sorted_symcount
1843 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
1844 ++x)
1845 continue;
1847 pinfo->symbols = sorted_syms + place;
1848 pinfo->num_symbols = x - place;
1849 pinfo->symtab_pos = place;
1851 else
1853 pinfo->symbols = NULL;
1854 pinfo->num_symbols = 0;
1855 pinfo->symtab_pos = -1;
1858 if (! prefix_addresses)
1860 pinfo->fprintf_func (pinfo->stream, "\n");
1861 objdump_print_addr_with_sym (abfd, section, sym, addr,
1862 pinfo, FALSE);
1863 pinfo->fprintf_func (pinfo->stream, ":\n");
1866 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1867 nextsym = sym;
1868 else if (sym == NULL)
1869 nextsym = NULL;
1870 else
1872 #define is_valid_next_sym(SYM) \
1873 ((SYM)->section == section \
1874 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
1875 && pinfo->symbol_is_valid (SYM, pinfo))
1877 /* Search forward for the next appropriate symbol in
1878 SECTION. Note that all the symbols are sorted
1879 together into one big array, and that some sections
1880 may have overlapping addresses. */
1881 while (place < sorted_symcount
1882 && ! is_valid_next_sym (sorted_syms [place]))
1883 ++place;
1885 if (place >= sorted_symcount)
1886 nextsym = NULL;
1887 else
1888 nextsym = sorted_syms[place];
1891 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1892 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1893 else if (nextsym == NULL)
1894 nextstop_offset = stop_offset;
1895 else
1896 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1898 if (nextstop_offset > stop_offset)
1899 nextstop_offset = stop_offset;
1901 /* If a symbol is explicitly marked as being an object
1902 rather than a function, just dump the bytes without
1903 disassembling them. */
1904 if (disassemble_all
1905 || sym == NULL
1906 || bfd_asymbol_value (sym) > addr
1907 || ((sym->flags & BSF_OBJECT) == 0
1908 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1909 == NULL)
1910 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1911 == NULL))
1912 || (sym->flags & BSF_FUNCTION) != 0)
1913 insns = TRUE;
1914 else
1915 insns = FALSE;
1917 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
1918 addr_offset, nextstop_offset,
1919 rel_offset, &rel_pp, rel_ppend);
1921 addr_offset = nextstop_offset;
1922 sym = nextsym;
1925 free (data);
1927 if (rel_ppstart != NULL)
1928 free (rel_ppstart);
1931 /* Disassemble the contents of an object file. */
1933 static void
1934 disassemble_data (bfd *abfd)
1936 struct disassemble_info disasm_info;
1937 struct objdump_disasm_info aux;
1938 long i;
1940 print_files = NULL;
1941 prev_functionname = NULL;
1942 prev_line = -1;
1944 /* We make a copy of syms to sort. We don't want to sort syms
1945 because that will screw up the relocs. */
1946 sorted_symcount = symcount ? symcount : dynsymcount;
1947 sorted_syms = xmalloc ((sorted_symcount + synthcount) * sizeof (asymbol *));
1948 memcpy (sorted_syms, symcount ? syms : dynsyms,
1949 sorted_symcount * sizeof (asymbol *));
1951 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
1953 for (i = 0; i < synthcount; ++i)
1955 sorted_syms[sorted_symcount] = synthsyms + i;
1956 ++sorted_symcount;
1959 /* Sort the symbols into section and symbol order. */
1960 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1962 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
1964 disasm_info.application_data = (void *) &aux;
1965 aux.abfd = abfd;
1966 aux.require_sec = FALSE;
1967 aux.dynrelbuf = NULL;
1968 aux.dynrelcount = 0;
1969 aux.reloc = NULL;
1971 disasm_info.print_address_func = objdump_print_address;
1972 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1974 if (machine != NULL)
1976 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1978 if (info == NULL)
1979 fatal (_("Can't use supplied machine %s"), machine);
1981 abfd->arch_info = info;
1984 if (endian != BFD_ENDIAN_UNKNOWN)
1986 struct bfd_target *xvec;
1988 xvec = xmalloc (sizeof (struct bfd_target));
1989 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1990 xvec->byteorder = endian;
1991 abfd->xvec = xvec;
1994 /* Use libopcodes to locate a suitable disassembler. */
1995 aux.disassemble_fn = disassembler (abfd);
1996 if (!aux.disassemble_fn)
1998 non_fatal (_("Can't disassemble for architecture %s\n"),
1999 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2000 exit_status = 1;
2001 return;
2004 disasm_info.flavour = bfd_get_flavour (abfd);
2005 disasm_info.arch = bfd_get_arch (abfd);
2006 disasm_info.mach = bfd_get_mach (abfd);
2007 disasm_info.disassembler_options = disassembler_options;
2008 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2009 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2010 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2011 disasm_info.disassembler_needs_relocs = FALSE;
2013 if (bfd_big_endian (abfd))
2014 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2015 else if (bfd_little_endian (abfd))
2016 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2017 else
2018 /* ??? Aborting here seems too drastic. We could default to big or little
2019 instead. */
2020 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2022 /* Allow the target to customize the info structure. */
2023 disassemble_init_for_target (& disasm_info);
2025 /* Pre-load the dynamic relocs if we are going
2026 to be dumping them along with the disassembly. */
2027 if (dump_dynamic_reloc_info)
2029 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2031 if (relsize < 0)
2032 bfd_fatal (bfd_get_filename (abfd));
2034 if (relsize > 0)
2036 aux.dynrelbuf = xmalloc (relsize);
2037 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2038 aux.dynrelbuf,
2039 dynsyms);
2040 if (aux.dynrelcount < 0)
2041 bfd_fatal (bfd_get_filename (abfd));
2043 /* Sort the relocs by address. */
2044 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2045 compare_relocs);
2048 disasm_info.symtab = sorted_syms;
2049 disasm_info.symtab_size = sorted_symcount;
2051 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2053 if (aux.dynrelbuf != NULL)
2054 free (aux.dynrelbuf);
2055 free (sorted_syms);
2059 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2061 struct dwarf_section *section = &debug_displays [debug].section;
2062 bfd *abfd = file;
2063 asection *sec;
2064 bfd_boolean ret;
2066 /* If it is already loaded, do nothing. */
2067 if (section->start != NULL)
2068 return 1;
2070 /* Locate the debug section. */
2071 sec = bfd_get_section_by_name (abfd, section->name);
2072 if (sec == NULL)
2073 return 0;
2075 /* Compute a bias to be added to offsets found within the DWARF debug
2076 information. These offsets are meant to be relative to the start of
2077 the dwarf section, and hence the bias should be 0. For MACH-O however
2078 a dwarf section is really just a region of a much larger section and so
2079 the bias is the address of the start of that area within the larger
2080 section. This test is important for PE and COFF based targets which
2081 use DWARF debug information, since unlike ELF, they do not allow the
2082 dwarf sections to be placed at address 0. */
2083 if (bfd_get_flavour (abfd) == bfd_target_mach_o_flavour)
2084 section->address = bfd_get_section_vma (abfd, sec);
2085 else
2086 section->address = 0;
2088 section->size = bfd_get_section_size (sec);
2089 section->start = xmalloc (section->size);
2091 if (is_relocatable && debug_displays [debug].relocate)
2092 ret = bfd_simple_get_relocated_section_contents (abfd,
2093 sec,
2094 section->start,
2095 syms) != NULL;
2096 else
2097 ret = bfd_get_section_contents (abfd, sec, section->start, 0,
2098 section->size);
2100 if (!ret)
2102 free_debug_section (debug);
2103 printf (_("\nCan't get contents for section '%s'.\n"),
2104 section->name);
2107 return ret;
2110 void
2111 free_debug_section (enum dwarf_section_display_enum debug)
2113 struct dwarf_section *section = &debug_displays [debug].section;
2115 if (section->start == NULL)
2116 return;
2118 free ((char *) section->start);
2119 section->start = NULL;
2120 section->address = 0;
2121 section->size = 0;
2124 static void
2125 dump_dwarf_section (bfd *abfd, asection *section,
2126 void *arg ATTRIBUTE_UNUSED)
2128 const char *name = bfd_get_section_name (abfd, section);
2129 const char *match;
2130 enum dwarf_section_display_enum i;
2132 if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2133 match = ".debug_info";
2134 else
2135 match = name;
2137 for (i = 0; i < max; i++)
2138 if (strcmp (debug_displays[i].section.name, match) == 0)
2140 if (!debug_displays[i].eh_frame)
2142 struct dwarf_section *sec = &debug_displays [i].section;
2144 if (load_debug_section (i, abfd))
2146 debug_displays[i].display (sec, abfd);
2148 if (i != info && i != abbrev)
2149 free_debug_section (i);
2152 break;
2156 static const char *mach_o_dwarf_sections [] = {
2157 "LC_SEGMENT.__DWARFA.__debug_abbrev", /* .debug_abbrev */
2158 "LC_SEGMENT.__DWARFA.__debug_aranges", /* .debug_aranges */
2159 "LC_SEGMENT.__DWARFA.__debug_frame", /* .debug_frame */
2160 "LC_SEGMENT.__DWARFA.__debug_info", /* .debug_info */
2161 "LC_SEGMENT.__DWARFA.__debug_line", /* .debug_line */
2162 "LC_SEGMENT.__DWARFA.__debug_pubnames", /* .debug_pubnames */
2163 ".eh_frame", /* .eh_frame */
2164 "LC_SEGMENT.__DWARFA.__debug_macinfo", /* .debug_macinfo */
2165 "LC_SEGMENT.__DWARFA.__debug_str", /* .debug_str */
2166 "LC_SEGMENT.__DWARFA.__debug_loc", /* .debug_loc */
2167 "LC_SEGMENT.__DWARFA.__debug_pubtypes", /* .debug_pubtypes */
2168 "LC_SEGMENT.__DWARFA.__debug_ranges", /* .debug_ranges */
2169 "LC_SEGMENT.__DWARFA.__debug_static_func", /* .debug_static_func */
2170 "LC_SEGMENT.__DWARFA.__debug_static_vars", /* .debug_static_vars */
2171 "LC_SEGMENT.__DWARFA.__debug_types", /* .debug_types */
2172 "LC_SEGMENT.__DWARFA.__debug_weaknames" /* .debug_weaknames */
2175 static const char *generic_dwarf_sections [max];
2177 static void
2178 check_mach_o_dwarf (bfd *abfd)
2180 static enum bfd_flavour old_flavour = bfd_target_unknown_flavour;
2181 enum bfd_flavour current_flavour = bfd_get_flavour (abfd);
2182 enum dwarf_section_display_enum i;
2184 if (generic_dwarf_sections [0] == NULL)
2185 for (i = 0; i < max; i++)
2186 generic_dwarf_sections [i] = debug_displays[i].section.name;
2188 if (old_flavour != current_flavour)
2190 if (current_flavour == bfd_target_mach_o_flavour)
2191 for (i = 0; i < max; i++)
2192 debug_displays[i].section.name = mach_o_dwarf_sections [i];
2193 else if (old_flavour == bfd_target_mach_o_flavour)
2194 for (i = 0; i < max; i++)
2195 debug_displays[i].section.name = generic_dwarf_sections [i];
2197 old_flavour = current_flavour;
2201 /* Dump the dwarf debugging information. */
2203 static void
2204 dump_dwarf (bfd *abfd)
2206 is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2208 /* FIXME: bfd_get_arch_size may return -1. We assume that 64bit
2209 targets will return 64. */
2210 eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
2212 if (bfd_big_endian (abfd))
2213 byte_get = byte_get_big_endian;
2214 else if (bfd_little_endian (abfd))
2215 byte_get = byte_get_little_endian;
2216 else
2217 abort ();
2219 check_mach_o_dwarf (abfd);
2221 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
2223 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2224 init_dwarf_regnames (bed->elf_machine_code);
2227 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2229 free_debug_memory ();
2232 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2233 it. Return NULL on failure. */
2235 static char *
2236 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2238 asection *stabsect;
2239 bfd_size_type size;
2240 char *contents;
2242 stabsect = bfd_get_section_by_name (abfd, sect_name);
2243 if (stabsect == NULL)
2245 printf (_("No %s section present\n\n"), sect_name);
2246 return FALSE;
2249 size = bfd_section_size (abfd, stabsect);
2250 contents = xmalloc (size);
2252 if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2254 non_fatal (_("Reading %s section of %s failed: %s"),
2255 sect_name, bfd_get_filename (abfd),
2256 bfd_errmsg (bfd_get_error ()));
2257 free (contents);
2258 exit_status = 1;
2259 return NULL;
2262 *size_ptr = size;
2264 return contents;
2267 /* Stabs entries use a 12 byte format:
2268 4 byte string table index
2269 1 byte stab type
2270 1 byte stab other field
2271 2 byte stab desc field
2272 4 byte stab value
2273 FIXME: This will have to change for a 64 bit object format. */
2275 #define STRDXOFF (0)
2276 #define TYPEOFF (4)
2277 #define OTHEROFF (5)
2278 #define DESCOFF (6)
2279 #define VALOFF (8)
2280 #define STABSIZE (12)
2282 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2283 using string table section STRSECT_NAME (in `strtab'). */
2285 static void
2286 print_section_stabs (bfd *abfd,
2287 const char *stabsect_name,
2288 unsigned *string_offset_ptr)
2290 int i;
2291 unsigned file_string_table_offset = 0;
2292 unsigned next_file_string_table_offset = *string_offset_ptr;
2293 bfd_byte *stabp, *stabs_end;
2295 stabp = stabs;
2296 stabs_end = stabp + stab_size;
2298 printf (_("Contents of %s section:\n\n"), stabsect_name);
2299 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
2301 /* Loop through all symbols and print them.
2303 We start the index at -1 because there is a dummy symbol on
2304 the front of stabs-in-{coff,elf} sections that supplies sizes. */
2305 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2307 const char *name;
2308 unsigned long strx;
2309 unsigned char type, other;
2310 unsigned short desc;
2311 bfd_vma value;
2313 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2314 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2315 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2316 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2317 value = bfd_h_get_32 (abfd, stabp + VALOFF);
2319 printf ("\n%-6d ", i);
2320 /* Either print the stab name, or, if unnamed, print its number
2321 again (makes consistent formatting for tools like awk). */
2322 name = bfd_get_stab_name (type);
2323 if (name != NULL)
2324 printf ("%-6s", name);
2325 else if (type == N_UNDF)
2326 printf ("HdrSym");
2327 else
2328 printf ("%-6d", type);
2329 printf (" %-6d %-6d ", other, desc);
2330 bfd_printf_vma (abfd, value);
2331 printf (" %-6lu", strx);
2333 /* Symbols with type == 0 (N_UNDF) specify the length of the
2334 string table associated with this file. We use that info
2335 to know how to relocate the *next* file's string table indices. */
2336 if (type == N_UNDF)
2338 file_string_table_offset = next_file_string_table_offset;
2339 next_file_string_table_offset += value;
2341 else
2343 /* Using the (possibly updated) string table offset, print the
2344 string (if any) associated with this symbol. */
2345 if ((strx + file_string_table_offset) < stabstr_size)
2346 printf (" %s", &strtab[strx + file_string_table_offset]);
2347 else
2348 printf (" *");
2351 printf ("\n\n");
2352 *string_offset_ptr = next_file_string_table_offset;
2355 typedef struct
2357 const char * section_name;
2358 const char * string_section_name;
2359 unsigned string_offset;
2361 stab_section_names;
2363 static void
2364 find_stabs_section (bfd *abfd, asection *section, void *names)
2366 int len;
2367 stab_section_names * sought = (stab_section_names *) names;
2369 /* Check for section names for which stabsect_name is a prefix, to
2370 handle .stab.N, etc. */
2371 len = strlen (sought->section_name);
2373 /* If the prefix matches, and the files section name ends with a
2374 nul or a digit, then we match. I.e., we want either an exact
2375 match or a section followed by a number. */
2376 if (strncmp (sought->section_name, section->name, len) == 0
2377 && (section->name[len] == 0
2378 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2380 if (strtab == NULL)
2381 strtab = read_section_stabs (abfd, sought->string_section_name,
2382 &stabstr_size);
2384 if (strtab)
2386 stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2387 &stab_size);
2388 if (stabs)
2389 print_section_stabs (abfd, section->name, &sought->string_offset);
2394 static void
2395 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2397 stab_section_names s;
2399 s.section_name = stabsect_name;
2400 s.string_section_name = strsect_name;
2401 s.string_offset = 0;
2403 bfd_map_over_sections (abfd, find_stabs_section, & s);
2405 free (strtab);
2406 strtab = NULL;
2409 /* Dump the any sections containing stabs debugging information. */
2411 static void
2412 dump_stabs (bfd *abfd)
2414 dump_stabs_section (abfd, ".stab", ".stabstr");
2415 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2416 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2417 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2420 static void
2421 dump_bfd_header (bfd *abfd)
2423 char *comma = "";
2425 printf (_("architecture: %s, "),
2426 bfd_printable_arch_mach (bfd_get_arch (abfd),
2427 bfd_get_mach (abfd)));
2428 printf (_("flags 0x%08x:\n"), abfd->flags);
2430 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2431 PF (HAS_RELOC, "HAS_RELOC");
2432 PF (EXEC_P, "EXEC_P");
2433 PF (HAS_LINENO, "HAS_LINENO");
2434 PF (HAS_DEBUG, "HAS_DEBUG");
2435 PF (HAS_SYMS, "HAS_SYMS");
2436 PF (HAS_LOCALS, "HAS_LOCALS");
2437 PF (DYNAMIC, "DYNAMIC");
2438 PF (WP_TEXT, "WP_TEXT");
2439 PF (D_PAGED, "D_PAGED");
2440 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2441 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2442 printf (_("\nstart address 0x"));
2443 bfd_printf_vma (abfd, abfd->start_address);
2444 printf ("\n");
2448 static void
2449 dump_bfd_private_header (bfd *abfd)
2451 bfd_print_private_bfd_data (abfd, stdout);
2455 /* Display a section in hexadecimal format with associated characters.
2456 Each line prefixed by the zero padded address. */
2458 static void
2459 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2461 bfd_byte *data = 0;
2462 bfd_size_type datasize;
2463 bfd_size_type addr_offset;
2464 bfd_size_type start_offset;
2465 bfd_size_type stop_offset;
2466 unsigned int opb = bfd_octets_per_byte (abfd);
2467 /* Bytes per line. */
2468 const int onaline = 16;
2469 char buf[64];
2470 int count;
2471 int width;
2473 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2474 return;
2476 if (! process_section_p (section))
2477 return;
2479 if ((datasize = bfd_section_size (abfd, section)) == 0)
2480 return;
2482 /* Compute the address range to display. */
2483 if (start_address == (bfd_vma) -1
2484 || start_address < section->vma)
2485 start_offset = 0;
2486 else
2487 start_offset = start_address - section->vma;
2489 if (stop_address == (bfd_vma) -1)
2490 stop_offset = datasize / opb;
2491 else
2493 if (stop_address < section->vma)
2494 stop_offset = 0;
2495 else
2496 stop_offset = stop_address - section->vma;
2498 if (stop_offset > datasize / opb)
2499 stop_offset = datasize / opb;
2502 if (start_offset >= stop_offset)
2503 return;
2505 printf (_("Contents of section %s:"), section->name);
2506 if (display_file_offsets)
2507 printf (_(" (Starting at file offset: 0x%lx)"), (long int)(section->filepos + start_offset));
2508 printf ("\n");
2510 data = xmalloc (datasize);
2512 bfd_get_section_contents (abfd, section, data, 0, datasize);
2514 width = 4;
2516 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2517 if (strlen (buf) >= sizeof (buf))
2518 abort ();
2520 count = 0;
2521 while (buf[count] == '0' && buf[count+1] != '\0')
2522 count++;
2523 count = strlen (buf) - count;
2524 if (count > width)
2525 width = count;
2527 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2528 if (strlen (buf) >= sizeof (buf))
2529 abort ();
2531 count = 0;
2532 while (buf[count] == '0' && buf[count+1] != '\0')
2533 count++;
2534 count = strlen (buf) - count;
2535 if (count > width)
2536 width = count;
2538 for (addr_offset = start_offset;
2539 addr_offset < stop_offset; addr_offset += onaline / opb)
2541 bfd_size_type j;
2543 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2544 count = strlen (buf);
2545 if ((size_t) count >= sizeof (buf))
2546 abort ();
2548 putchar (' ');
2549 while (count < width)
2551 putchar ('0');
2552 count++;
2554 fputs (buf + count - width, stdout);
2555 putchar (' ');
2557 for (j = addr_offset * opb;
2558 j < addr_offset * opb + onaline; j++)
2560 if (j < stop_offset * opb)
2561 printf ("%02x", (unsigned) (data[j]));
2562 else
2563 printf (" ");
2564 if ((j & 3) == 3)
2565 printf (" ");
2568 printf (" ");
2569 for (j = addr_offset * opb;
2570 j < addr_offset * opb + onaline; j++)
2572 if (j >= stop_offset * opb)
2573 printf (" ");
2574 else
2575 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2577 putchar ('\n');
2579 free (data);
2582 /* Actually display the various requested regions. */
2584 static void
2585 dump_data (bfd *abfd)
2587 bfd_map_over_sections (abfd, dump_section, NULL);
2590 /* Should perhaps share code and display with nm? */
2592 static void
2593 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2595 asymbol **current;
2596 long max;
2597 long count;
2599 if (dynamic)
2601 current = dynsyms;
2602 max = dynsymcount;
2603 printf ("DYNAMIC SYMBOL TABLE:\n");
2605 else
2607 current = syms;
2608 max = symcount;
2609 printf ("SYMBOL TABLE:\n");
2612 if (max == 0)
2613 printf (_("no symbols\n"));
2615 for (count = 0; count < max; count++)
2617 bfd *cur_bfd;
2619 if (*current == NULL)
2620 printf (_("no information for symbol number %ld\n"), count);
2622 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2623 printf (_("could not determine the type of symbol number %ld\n"),
2624 count);
2626 else if (process_section_p ((* current)->section)
2627 && (dump_special_syms
2628 || !bfd_is_target_special_symbol (cur_bfd, *current)))
2630 const char *name = (*current)->name;
2632 if (do_demangle && name != NULL && *name != '\0')
2634 char *alloc;
2636 /* If we want to demangle the name, we demangle it
2637 here, and temporarily clobber it while calling
2638 bfd_print_symbol. FIXME: This is a gross hack. */
2639 alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2640 if (alloc != NULL)
2641 (*current)->name = alloc;
2642 bfd_print_symbol (cur_bfd, stdout, *current,
2643 bfd_print_symbol_all);
2644 if (alloc != NULL)
2646 (*current)->name = name;
2647 free (alloc);
2650 else
2651 bfd_print_symbol (cur_bfd, stdout, *current,
2652 bfd_print_symbol_all);
2653 printf ("\n");
2656 current++;
2658 printf ("\n\n");
2661 static void
2662 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2664 arelent **p;
2665 char *last_filename, *last_functionname;
2666 unsigned int last_line;
2668 /* Get column headers lined up reasonably. */
2670 static int width;
2672 if (width == 0)
2674 char buf[30];
2676 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2677 width = strlen (buf) - 7;
2679 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2682 last_filename = NULL;
2683 last_functionname = NULL;
2684 last_line = 0;
2686 for (p = relpp; relcount && *p != NULL; p++, relcount--)
2688 arelent *q = *p;
2689 const char *filename, *functionname;
2690 unsigned int line;
2691 const char *sym_name;
2692 const char *section_name;
2694 if (start_address != (bfd_vma) -1
2695 && q->address < start_address)
2696 continue;
2697 if (stop_address != (bfd_vma) -1
2698 && q->address > stop_address)
2699 continue;
2701 if (with_line_numbers
2702 && sec != NULL
2703 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2704 &filename, &functionname, &line))
2706 if (functionname != NULL
2707 && (last_functionname == NULL
2708 || strcmp (functionname, last_functionname) != 0))
2710 printf ("%s():\n", functionname);
2711 if (last_functionname != NULL)
2712 free (last_functionname);
2713 last_functionname = xstrdup (functionname);
2716 if (line > 0
2717 && (line != last_line
2718 || (filename != NULL
2719 && last_filename != NULL
2720 && strcmp (filename, last_filename) != 0)))
2722 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2723 last_line = line;
2724 if (last_filename != NULL)
2725 free (last_filename);
2726 if (filename == NULL)
2727 last_filename = NULL;
2728 else
2729 last_filename = xstrdup (filename);
2733 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2735 sym_name = (*(q->sym_ptr_ptr))->name;
2736 section_name = (*(q->sym_ptr_ptr))->section->name;
2738 else
2740 sym_name = NULL;
2741 section_name = NULL;
2744 bfd_printf_vma (abfd, q->address);
2745 if (q->howto == NULL)
2746 printf (" *unknown* ");
2747 else if (q->howto->name)
2748 printf (" %-16s ", q->howto->name);
2749 else
2750 printf (" %-16d ", q->howto->type);
2751 if (sym_name)
2752 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
2753 else
2755 if (section_name == NULL)
2756 section_name = "*unknown*";
2757 printf ("[%s]", section_name);
2760 if (q->addend)
2762 printf ("+0x");
2763 bfd_printf_vma (abfd, q->addend);
2766 printf ("\n");
2770 static void
2771 dump_relocs_in_section (bfd *abfd,
2772 asection *section,
2773 void *dummy ATTRIBUTE_UNUSED)
2775 arelent **relpp;
2776 long relcount;
2777 long relsize;
2779 if ( bfd_is_abs_section (section)
2780 || bfd_is_und_section (section)
2781 || bfd_is_com_section (section)
2782 || (! process_section_p (section))
2783 || ((section->flags & SEC_RELOC) == 0))
2784 return;
2786 relsize = bfd_get_reloc_upper_bound (abfd, section);
2787 if (relsize < 0)
2788 bfd_fatal (bfd_get_filename (abfd));
2790 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2792 if (relsize == 0)
2794 printf (" (none)\n\n");
2795 return;
2798 relpp = xmalloc (relsize);
2799 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2801 if (relcount < 0)
2802 bfd_fatal (bfd_get_filename (abfd));
2803 else if (relcount == 0)
2804 printf (" (none)\n\n");
2805 else
2807 printf ("\n");
2808 dump_reloc_set (abfd, section, relpp, relcount);
2809 printf ("\n\n");
2811 free (relpp);
2814 static void
2815 dump_relocs (bfd *abfd)
2817 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2820 static void
2821 dump_dynamic_relocs (bfd *abfd)
2823 long relsize;
2824 arelent **relpp;
2825 long relcount;
2827 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2828 if (relsize < 0)
2829 bfd_fatal (bfd_get_filename (abfd));
2831 printf ("DYNAMIC RELOCATION RECORDS");
2833 if (relsize == 0)
2834 printf (" (none)\n\n");
2835 else
2837 relpp = xmalloc (relsize);
2838 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2840 if (relcount < 0)
2841 bfd_fatal (bfd_get_filename (abfd));
2842 else if (relcount == 0)
2843 printf (" (none)\n\n");
2844 else
2846 printf ("\n");
2847 dump_reloc_set (abfd, NULL, relpp, relcount);
2848 printf ("\n\n");
2850 free (relpp);
2854 /* Creates a table of paths, to search for source files. */
2856 static void
2857 add_include_path (const char *path)
2859 if (path[0] == 0)
2860 return;
2861 include_path_count++;
2862 include_paths = xrealloc (include_paths,
2863 include_path_count * sizeof (*include_paths));
2864 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2865 if (path[1] == ':' && path[2] == 0)
2866 path = concat (path, ".", (const char *) 0);
2867 #endif
2868 include_paths[include_path_count - 1] = path;
2871 static void
2872 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
2873 asection *section,
2874 void *arg)
2876 if ((section->flags & SEC_DEBUGGING) == 0)
2878 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
2879 section->vma += adjust_section_vma;
2880 if (*has_reloc_p)
2881 section->lma += adjust_section_vma;
2885 /* Dump selected contents of ABFD. */
2887 static void
2888 dump_bfd (bfd *abfd)
2890 /* If we are adjusting section VMA's, change them all now. Changing
2891 the BFD information is a hack. However, we must do it, or
2892 bfd_find_nearest_line will not do the right thing. */
2893 if (adjust_section_vma != 0)
2895 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
2896 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
2899 if (! dump_debugging_tags)
2900 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2901 abfd->xvec->name);
2902 if (dump_ar_hdrs)
2903 print_arelt_descr (stdout, abfd, TRUE);
2904 if (dump_file_header)
2905 dump_bfd_header (abfd);
2906 if (dump_private_headers)
2907 dump_bfd_private_header (abfd);
2908 if (! dump_debugging_tags)
2909 putchar ('\n');
2910 if (dump_section_headers)
2911 dump_headers (abfd);
2913 if (dump_symtab
2914 || dump_reloc_info
2915 || disassemble
2916 || dump_debugging
2917 || dump_dwarf_section_info)
2918 syms = slurp_symtab (abfd);
2919 if (dump_dynamic_symtab || dump_dynamic_reloc_info
2920 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
2921 dynsyms = slurp_dynamic_symtab (abfd);
2922 if (disassemble)
2924 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
2925 dynsymcount, dynsyms, &synthsyms);
2926 if (synthcount < 0)
2927 synthcount = 0;
2930 if (dump_symtab)
2931 dump_symbols (abfd, FALSE);
2932 if (dump_dynamic_symtab)
2933 dump_symbols (abfd, TRUE);
2934 if (dump_dwarf_section_info)
2935 dump_dwarf (abfd);
2936 if (dump_stab_section_info)
2937 dump_stabs (abfd);
2938 if (dump_reloc_info && ! disassemble)
2939 dump_relocs (abfd);
2940 if (dump_dynamic_reloc_info && ! disassemble)
2941 dump_dynamic_relocs (abfd);
2942 if (dump_section_contents)
2943 dump_data (abfd);
2944 if (disassemble)
2945 disassemble_data (abfd);
2947 if (dump_debugging)
2949 void *dhandle;
2951 dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
2952 if (dhandle != NULL)
2954 if (!print_debugging_info (stdout, dhandle, abfd, syms,
2955 bfd_demangle,
2956 dump_debugging_tags ? TRUE : FALSE))
2958 non_fatal (_("%s: printing debugging information failed"),
2959 bfd_get_filename (abfd));
2960 exit_status = 1;
2963 /* PR 6483: If there was no STABS or IEEE debug
2964 info in the file, try DWARF instead. */
2965 else if (! dump_dwarf_section_info)
2967 dump_dwarf (abfd);
2971 if (syms)
2973 free (syms);
2974 syms = NULL;
2977 if (dynsyms)
2979 free (dynsyms);
2980 dynsyms = NULL;
2983 if (synthsyms)
2985 free (synthsyms);
2986 synthsyms = NULL;
2989 symcount = 0;
2990 dynsymcount = 0;
2991 synthcount = 0;
2994 static void
2995 display_bfd (bfd *abfd)
2997 char **matching;
2999 if (bfd_check_format_matches (abfd, bfd_object, &matching))
3001 dump_bfd (abfd);
3002 return;
3005 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3007 nonfatal (bfd_get_filename (abfd));
3008 list_matching_formats (matching);
3009 free (matching);
3010 return;
3013 if (bfd_get_error () != bfd_error_file_not_recognized)
3015 nonfatal (bfd_get_filename (abfd));
3016 return;
3019 if (bfd_check_format_matches (abfd, bfd_core, &matching))
3021 dump_bfd (abfd);
3022 return;
3025 nonfatal (bfd_get_filename (abfd));
3027 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3029 list_matching_formats (matching);
3030 free (matching);
3034 static void
3035 display_file (char *filename, char *target)
3037 bfd *file;
3038 bfd *arfile = NULL;
3040 if (get_file_size (filename) < 1)
3042 exit_status = 1;
3043 return;
3046 file = bfd_openr (filename, target);
3047 if (file == NULL)
3049 nonfatal (filename);
3050 return;
3053 /* If the file is an archive, process all of its elements. */
3054 if (bfd_check_format (file, bfd_archive))
3056 bfd *last_arfile = NULL;
3058 printf (_("In archive %s:\n"), bfd_get_filename (file));
3059 for (;;)
3061 bfd_set_error (bfd_error_no_error);
3063 arfile = bfd_openr_next_archived_file (file, arfile);
3064 if (arfile == NULL)
3066 if (bfd_get_error () != bfd_error_no_more_archived_files)
3067 nonfatal (bfd_get_filename (file));
3068 break;
3071 display_bfd (arfile);
3073 if (last_arfile != NULL)
3074 bfd_close (last_arfile);
3075 last_arfile = arfile;
3078 if (last_arfile != NULL)
3079 bfd_close (last_arfile);
3081 else
3082 display_bfd (file);
3084 bfd_close (file);
3088 main (int argc, char **argv)
3090 int c;
3091 char *target = default_target;
3092 bfd_boolean seenflag = FALSE;
3094 #if defined (HAVE_SETLOCALE)
3095 #if defined (HAVE_LC_MESSAGES)
3096 setlocale (LC_MESSAGES, "");
3097 #endif
3098 setlocale (LC_CTYPE, "");
3099 #endif
3101 bindtextdomain (PACKAGE, LOCALEDIR);
3102 textdomain (PACKAGE);
3104 program_name = *argv;
3105 xmalloc_set_program_name (program_name);
3107 START_PROGRESS (program_name, 0);
3109 expandargv (&argc, &argv);
3111 bfd_init ();
3112 set_default_bfd_target ();
3114 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW",
3115 long_options, (int *) 0))
3116 != EOF)
3118 switch (c)
3120 case 0:
3121 break; /* We've been given a long option. */
3122 case 'm':
3123 machine = optarg;
3124 break;
3125 case 'M':
3126 if (disassembler_options)
3127 /* Ignore potential memory leak for now. */
3128 disassembler_options = concat (disassembler_options, ",",
3129 optarg, (const char *) NULL);
3130 else
3131 disassembler_options = optarg;
3132 break;
3133 case 'j':
3134 if (only_used == only_size)
3136 only_size += 8;
3137 only = xrealloc (only, only_size * sizeof (char *));
3139 only [only_used++] = optarg;
3140 break;
3141 case 'F':
3142 display_file_offsets = TRUE;
3143 break;
3144 case 'l':
3145 with_line_numbers = TRUE;
3146 break;
3147 case 'b':
3148 target = optarg;
3149 break;
3150 case 'C':
3151 do_demangle = TRUE;
3152 if (optarg != NULL)
3154 enum demangling_styles style;
3156 style = cplus_demangle_name_to_style (optarg);
3157 if (style == unknown_demangling)
3158 fatal (_("unknown demangling style `%s'"),
3159 optarg);
3161 cplus_demangle_set_style (style);
3163 break;
3164 case 'w':
3165 wide_output = TRUE;
3166 break;
3167 case OPTION_ADJUST_VMA:
3168 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3169 break;
3170 case OPTION_START_ADDRESS:
3171 start_address = parse_vma (optarg, "--start-address");
3172 if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3173 fatal (_("error: the start address should be before the end address"));
3174 break;
3175 case OPTION_STOP_ADDRESS:
3176 stop_address = parse_vma (optarg, "--stop-address");
3177 if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3178 fatal (_("error: the stop address should be after the start address"));
3179 break;
3180 case 'E':
3181 if (strcmp (optarg, "B") == 0)
3182 endian = BFD_ENDIAN_BIG;
3183 else if (strcmp (optarg, "L") == 0)
3184 endian = BFD_ENDIAN_LITTLE;
3185 else
3187 non_fatal (_("unrecognized -E option"));
3188 usage (stderr, 1);
3190 break;
3191 case OPTION_ENDIAN:
3192 if (strncmp (optarg, "big", strlen (optarg)) == 0)
3193 endian = BFD_ENDIAN_BIG;
3194 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3195 endian = BFD_ENDIAN_LITTLE;
3196 else
3198 non_fatal (_("unrecognized --endian type `%s'"), optarg);
3199 usage (stderr, 1);
3201 break;
3203 case 'f':
3204 dump_file_header = TRUE;
3205 seenflag = TRUE;
3206 break;
3207 case 'i':
3208 formats_info = TRUE;
3209 seenflag = TRUE;
3210 break;
3211 case 'I':
3212 add_include_path (optarg);
3213 break;
3214 case 'p':
3215 dump_private_headers = TRUE;
3216 seenflag = TRUE;
3217 break;
3218 case 'x':
3219 dump_private_headers = TRUE;
3220 dump_symtab = TRUE;
3221 dump_reloc_info = TRUE;
3222 dump_file_header = TRUE;
3223 dump_ar_hdrs = TRUE;
3224 dump_section_headers = TRUE;
3225 seenflag = TRUE;
3226 break;
3227 case 't':
3228 dump_symtab = TRUE;
3229 seenflag = TRUE;
3230 break;
3231 case 'T':
3232 dump_dynamic_symtab = TRUE;
3233 seenflag = TRUE;
3234 break;
3235 case 'd':
3236 disassemble = TRUE;
3237 seenflag = TRUE;
3238 break;
3239 case 'z':
3240 disassemble_zeroes = TRUE;
3241 break;
3242 case 'D':
3243 disassemble = TRUE;
3244 disassemble_all = TRUE;
3245 seenflag = TRUE;
3246 break;
3247 case 'S':
3248 disassemble = TRUE;
3249 with_source_code = TRUE;
3250 seenflag = TRUE;
3251 break;
3252 case 'g':
3253 dump_debugging = 1;
3254 seenflag = TRUE;
3255 break;
3256 case 'e':
3257 dump_debugging = 1;
3258 dump_debugging_tags = 1;
3259 do_demangle = TRUE;
3260 seenflag = TRUE;
3261 break;
3262 case 'W':
3263 dump_dwarf_section_info = TRUE;
3264 seenflag = TRUE;
3265 do_debug_info = 1;
3266 do_debug_abbrevs = 1;
3267 do_debug_lines = 1;
3268 do_debug_pubnames = 1;
3269 do_debug_aranges = 1;
3270 do_debug_ranges = 1;
3271 do_debug_frames = 1;
3272 do_debug_macinfo = 1;
3273 do_debug_str = 1;
3274 do_debug_loc = 1;
3275 break;
3276 case 'G':
3277 dump_stab_section_info = TRUE;
3278 seenflag = TRUE;
3279 break;
3280 case 's':
3281 dump_section_contents = TRUE;
3282 seenflag = TRUE;
3283 break;
3284 case 'r':
3285 dump_reloc_info = TRUE;
3286 seenflag = TRUE;
3287 break;
3288 case 'R':
3289 dump_dynamic_reloc_info = TRUE;
3290 seenflag = TRUE;
3291 break;
3292 case 'a':
3293 dump_ar_hdrs = TRUE;
3294 seenflag = TRUE;
3295 break;
3296 case 'h':
3297 dump_section_headers = TRUE;
3298 seenflag = TRUE;
3299 break;
3300 case 'H':
3301 usage (stdout, 0);
3302 seenflag = TRUE;
3303 case 'v':
3304 case 'V':
3305 show_version = TRUE;
3306 seenflag = TRUE;
3307 break;
3309 default:
3310 usage (stderr, 1);
3314 if (show_version)
3315 print_version ("objdump");
3317 if (!seenflag)
3318 usage (stderr, 2);
3320 if (formats_info)
3321 exit_status = display_info ();
3322 else
3324 if (optind == argc)
3325 display_file ("a.out", target);
3326 else
3327 for (; optind < argc;)
3328 display_file (argv[optind++], target);
3331 END_PROGRESS (program_name);
3333 return exit_status;