PR binutils/15818
[platform/upstream/binutils.git] / binutils / objdump.c
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, 2009, 2010, 2011,
4    2012, 2013 Free Software Foundation, Inc.
5
6    This file is part of GNU Binutils.
7
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.
12
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.
17
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.  */
22
23
24 /* Objdump overview.
25
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.
30
31    The flow of execution is as follows:
32  
33    1. Command line arguments are checked for control switches and the
34       information to be displayed is selected.
35       
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.
39       
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.
43
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.
47
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.  */
52
53 #include "sysdep.h"
54 #include "bfd.h"
55 #include "elf-bfd.h"
56 #include "progress.h"
57 #include "bucomm.h"
58 #include "elfcomm.h"
59 #include "dwarf.h"
60 #include "getopt.h"
61 #include "safe-ctype.h"
62 #include "dis-asm.h"
63 #include "libiberty.h"
64 #include "demangle.h"
65 #include "filenames.h"
66 #include "debug.h"
67 #include "budbg.h"
68 #include "objdump.h"
69
70 #ifdef HAVE_MMAP
71 #include <sys/mman.h>
72 #endif
73
74 /* Internal headers for the ELF .stab-dump code - sorry.  */
75 #define BYTES_IN_WORD   32
76 #include "aout/aout64.h"
77
78 /* Exit status.  */
79 static int exit_status = 0;
80
81 static char *default_target = NULL;     /* Default at runtime.  */
82
83 /* The following variables are set based on arguments passed on the
84    command line.  */
85 static int show_version = 0;            /* Show the version number.  */
86 static int dump_section_contents;       /* -s */
87 static int dump_section_headers;        /* -h */
88 static bfd_boolean dump_file_header;    /* -f */
89 static int dump_symtab;                 /* -t */
90 static int dump_dynamic_symtab;         /* -T */
91 static int dump_reloc_info;             /* -r */
92 static int dump_dynamic_reloc_info;     /* -R */
93 static int dump_ar_hdrs;                /* -a */
94 static int dump_private_headers;        /* -p */
95 static char *dump_private_options;      /* -P */
96 static int prefix_addresses;            /* --prefix-addresses */
97 static int with_line_numbers;           /* -l */
98 static bfd_boolean with_source_code;    /* -S */
99 static int show_raw_insn;               /* --show-raw-insn */
100 static int dump_dwarf_section_info;     /* --dwarf */
101 static int dump_stab_section_info;      /* --stabs */
102 static int do_demangle;                 /* -C, --demangle */
103 static bfd_boolean disassemble;         /* -d */
104 static bfd_boolean disassemble_all;     /* -D */
105 static int disassemble_zeroes;          /* --disassemble-zeroes */
106 static bfd_boolean formats_info;        /* -i */
107 static int wide_output;                 /* -w */
108 static int insn_width;                  /* --insn-width */
109 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
110 static bfd_vma stop_address = (bfd_vma) -1;  /* --stop-address */
111 static int dump_debugging;              /* --debugging */
112 static int dump_debugging_tags;         /* --debugging-tags */
113 static int suppress_bfd_header;
114 static int dump_special_syms = 0;       /* --special-syms */
115 static bfd_vma adjust_section_vma = 0;  /* --adjust-vma */
116 static int file_start_context = 0;      /* --file-start-context */
117 static bfd_boolean display_file_offsets;/* -F */
118 static const char *prefix;              /* --prefix */
119 static int prefix_strip;                /* --prefix-strip */
120 static size_t prefix_length;
121
122 /* A structure to record the sections mentioned in -j switches.  */
123 struct only
124 {
125   const char * name; /* The name of the section.  */
126   bfd_boolean  seen; /* A flag to indicate that the section has been found in one or more input files.  */
127   struct only * next; /* Pointer to the next structure in the list.  */
128 };
129 /* Pointer to an array of 'only' structures.
130    This pointer is NULL if the -j switch has not been used.  */
131 static struct only * only_list = NULL;
132
133 /* Variables for handling include file path table.  */
134 static const char **include_paths;
135 static int include_path_count;
136
137 /* Extra info to pass to the section disassembler and address printing
138    function.  */
139 struct objdump_disasm_info
140 {
141   bfd *              abfd;
142   asection *         sec;
143   bfd_boolean        require_sec;
144   arelent **         dynrelbuf;
145   long               dynrelcount;
146   disassembler_ftype disassemble_fn;
147   arelent *          reloc;
148 };
149
150 /* Architecture to disassemble for, or default if NULL.  */
151 static char *machine = NULL;
152
153 /* Target specific options to the disassembler.  */
154 static char *disassembler_options = NULL;
155
156 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN.  */
157 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
158
159 /* The symbol table.  */
160 static asymbol **syms;
161
162 /* Number of symbols in `syms'.  */
163 static long symcount = 0;
164
165 /* The sorted symbol table.  */
166 static asymbol **sorted_syms;
167
168 /* Number of symbols in `sorted_syms'.  */
169 static long sorted_symcount = 0;
170
171 /* The dynamic symbol table.  */
172 static asymbol **dynsyms;
173
174 /* The synthetic symbol table.  */
175 static asymbol *synthsyms;
176 static long synthcount = 0;
177
178 /* Number of symbols in `dynsyms'.  */
179 static long dynsymcount = 0;
180
181 static bfd_byte *stabs;
182 static bfd_size_type stab_size;
183
184 static char *strtab;
185 static bfd_size_type stabstr_size;
186
187 static bfd_boolean is_relocatable = FALSE;
188
189 /* Handlers for -P/--private.  */
190 static const struct objdump_private_desc * const objdump_private_vectors[] =
191   {
192     OBJDUMP_PRIVATE_VECTORS
193     NULL
194   };
195 \f
196 static void
197 usage (FILE *stream, int status)
198 {
199   fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
200   fprintf (stream, _(" Display information from object <file(s)>.\n"));
201   fprintf (stream, _(" At least one of the following switches must be given:\n"));
202   fprintf (stream, _("\
203   -a, --archive-headers    Display archive header information\n\
204   -f, --file-headers       Display the contents of the overall file header\n\
205   -p, --private-headers    Display object format specific file header contents\n\
206   -P, --private=OPT,OPT... Display object format specific contents\n\
207   -h, --[section-]headers  Display the contents of the section headers\n\
208   -x, --all-headers        Display the contents of all headers\n\
209   -d, --disassemble        Display assembler contents of executable sections\n\
210   -D, --disassemble-all    Display assembler contents of all sections\n\
211   -S, --source             Intermix source code with disassembly\n\
212   -s, --full-contents      Display the full contents of all sections requested\n\
213   -g, --debugging          Display debug information in object file\n\
214   -e, --debugging-tags     Display debug information using ctags style\n\
215   -G, --stabs              Display (in raw form) any STABS info in the file\n\
216   -W[lLiaprmfFsoRt] or\n\
217   --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
218           =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
219           =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
220           =addr,=cu_index]\n\
221                            Display DWARF info in the file\n\
222   -t, --syms               Display the contents of the symbol table(s)\n\
223   -T, --dynamic-syms       Display the contents of the dynamic symbol table\n\
224   -r, --reloc              Display the relocation entries in the file\n\
225   -R, --dynamic-reloc      Display the dynamic relocation entries in the file\n\
226   @<file>                  Read options from <file>\n\
227   -v, --version            Display this program's version number\n\
228   -i, --info               List object formats and architectures supported\n\
229   -H, --help               Display this information\n\
230 "));
231   if (status != 2)
232     {
233       const struct objdump_private_desc * const *desc;
234
235       fprintf (stream, _("\n The following switches are optional:\n"));
236       fprintf (stream, _("\
237   -b, --target=BFDNAME           Specify the target object format as BFDNAME\n\
238   -m, --architecture=MACHINE     Specify the target architecture as MACHINE\n\
239   -j, --section=NAME             Only display information for section NAME\n\
240   -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
241   -EB --endian=big               Assume big endian format when disassembling\n\
242   -EL --endian=little            Assume little endian format when disassembling\n\
243       --file-start-context       Include context from start of file (with -S)\n\
244   -I, --include=DIR              Add DIR to search list for source files\n\
245   -l, --line-numbers             Include line numbers and filenames in output\n\
246   -F, --file-offsets             Include file offsets when displaying information\n\
247   -C, --demangle[=STYLE]         Decode mangled/processed symbol names\n\
248                                   The STYLE, if specified, can be `auto', `gnu',\n\
249                                   `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
250                                   or `gnat'\n\
251   -w, --wide                     Format output for more than 80 columns\n\
252   -z, --disassemble-zeroes       Do not skip blocks of zeroes when disassembling\n\
253       --start-address=ADDR       Only process data whose address is >= ADDR\n\
254       --stop-address=ADDR        Only process data whose address is <= ADDR\n\
255       --prefix-addresses         Print complete address alongside disassembly\n\
256       --[no-]show-raw-insn       Display hex alongside symbolic disassembly\n\
257       --insn-width=WIDTH         Display WIDTH bytes on a single line for -d\n\
258       --adjust-vma=OFFSET        Add OFFSET to all displayed section addresses\n\
259       --special-syms             Include special symbols in symbol dumps\n\
260       --prefix=PREFIX            Add PREFIX to absolute paths for -S\n\
261       --prefix-strip=LEVEL       Strip initial directory names for -S\n"));
262       fprintf (stream, _("\
263       --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
264       --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
265                              or deeper\n\
266       --dwarf-check          Make additional dwarf internal consistency checks.\
267       \n\n"));
268       list_supported_targets (program_name, stream);
269       list_supported_architectures (program_name, stream);
270
271       disassembler_usage (stream);
272
273       if (objdump_private_vectors[0] != NULL)
274         {
275           fprintf (stream,
276                    _("\nOptions supported for -P/--private switch:\n"));
277           for (desc = objdump_private_vectors; *desc != NULL; desc++)
278             (*desc)->help (stream);
279         }
280     }
281   if (REPORT_BUGS_TO[0] && status == 0)
282     fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
283   exit (status);
284 }
285
286 /* 150 isn't special; it's just an arbitrary non-ASCII char value.  */
287 enum option_values
288   {
289     OPTION_ENDIAN=150,
290     OPTION_START_ADDRESS,
291     OPTION_STOP_ADDRESS,
292     OPTION_DWARF,
293     OPTION_PREFIX,
294     OPTION_PREFIX_STRIP,
295     OPTION_INSN_WIDTH,
296     OPTION_ADJUST_VMA,
297     OPTION_DWARF_DEPTH,
298     OPTION_DWARF_CHECK,
299     OPTION_DWARF_START
300   };
301
302 static struct option long_options[]=
303 {
304   {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
305   {"all-headers", no_argument, NULL, 'x'},
306   {"private-headers", no_argument, NULL, 'p'},
307   {"private", required_argument, NULL, 'P'},
308   {"architecture", required_argument, NULL, 'm'},
309   {"archive-headers", no_argument, NULL, 'a'},
310   {"debugging", no_argument, NULL, 'g'},
311   {"debugging-tags", no_argument, NULL, 'e'},
312   {"demangle", optional_argument, NULL, 'C'},
313   {"disassemble", no_argument, NULL, 'd'},
314   {"disassemble-all", no_argument, NULL, 'D'},
315   {"disassembler-options", required_argument, NULL, 'M'},
316   {"disassemble-zeroes", no_argument, NULL, 'z'},
317   {"dynamic-reloc", no_argument, NULL, 'R'},
318   {"dynamic-syms", no_argument, NULL, 'T'},
319   {"endian", required_argument, NULL, OPTION_ENDIAN},
320   {"file-headers", no_argument, NULL, 'f'},
321   {"file-offsets", no_argument, NULL, 'F'},
322   {"file-start-context", no_argument, &file_start_context, 1},
323   {"full-contents", no_argument, NULL, 's'},
324   {"headers", no_argument, NULL, 'h'},
325   {"help", no_argument, NULL, 'H'},
326   {"info", no_argument, NULL, 'i'},
327   {"line-numbers", no_argument, NULL, 'l'},
328   {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
329   {"prefix-addresses", no_argument, &prefix_addresses, 1},
330   {"reloc", no_argument, NULL, 'r'},
331   {"section", required_argument, NULL, 'j'},
332   {"section-headers", no_argument, NULL, 'h'},
333   {"show-raw-insn", no_argument, &show_raw_insn, 1},
334   {"source", no_argument, NULL, 'S'},
335   {"special-syms", no_argument, &dump_special_syms, 1},
336   {"include", required_argument, NULL, 'I'},
337   {"dwarf", optional_argument, NULL, OPTION_DWARF},
338   {"stabs", no_argument, NULL, 'G'},
339   {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
340   {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
341   {"syms", no_argument, NULL, 't'},
342   {"target", required_argument, NULL, 'b'},
343   {"version", no_argument, NULL, 'V'},
344   {"wide", no_argument, NULL, 'w'},
345   {"prefix", required_argument, NULL, OPTION_PREFIX},
346   {"prefix-strip", required_argument, NULL, OPTION_PREFIX_STRIP},
347   {"insn-width", required_argument, NULL, OPTION_INSN_WIDTH},
348   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
349   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
350   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
351   {0, no_argument, 0, 0}
352 };
353 \f
354 static void
355 nonfatal (const char *msg)
356 {
357   bfd_nonfatal (msg);
358   exit_status = 1;
359 }
360 \f
361 /* Returns TRUE if the specified section should be dumped.  */
362
363 static bfd_boolean
364 process_section_p (asection * section)
365 {
366   struct only * only;
367
368   if (only_list == NULL)
369     return TRUE;
370
371   for (only = only_list; only; only = only->next)
372     if (strcmp (only->name, section->name) == 0)
373       {
374         only->seen = TRUE;
375         return TRUE;
376       }
377
378   return FALSE;
379 }
380
381 /* Add an entry to the 'only' list.  */
382
383 static void
384 add_only (char * name)
385 {
386   struct only * only;
387
388   /* First check to make sure that we do not
389      already have an entry for this name.  */
390   for (only = only_list; only; only = only->next)
391     if (strcmp (only->name, name) == 0)
392       return;
393
394   only = xmalloc (sizeof * only);
395   only->name = name;
396   only->seen = FALSE;
397   only->next = only_list;
398   only_list = only;
399 }
400
401 /* Release the memory used by the 'only' list.
402    PR 11225: Issue a warning message for unseen sections.
403    Only do this if none of the sections were seen.  This is mainly to support
404    tools like the GAS testsuite where an object file is dumped with a list of
405    generic section names known to be present in a range of different file
406    formats.  */
407
408 static void
409 free_only_list (void)
410 {
411   bfd_boolean at_least_one_seen = FALSE;
412   struct only * only;
413   struct only * next;
414
415   if (only_list == NULL)
416     return;
417
418   for (only = only_list; only; only = only->next)
419     if (only->seen)
420       {
421         at_least_one_seen = TRUE;
422         break;
423       }
424
425   for (only = only_list; only; only = next)
426     {
427       if (! at_least_one_seen)
428         {
429           non_fatal (_("section '%s' mentioned in a -j option, "
430                        "but not found in any input file"),
431                      only->name);
432           exit_status = 1;
433         }
434       next = only->next;
435       free (only);
436     }
437 }
438
439 \f
440 static void
441 dump_section_header (bfd *abfd, asection *section,
442                      void *ignored ATTRIBUTE_UNUSED)
443 {
444   char *comma = "";
445   unsigned int opb = bfd_octets_per_byte (abfd);
446
447   /* Ignore linker created section.  See elfNN_ia64_object_p in
448      bfd/elfxx-ia64.c.  */
449   if (section->flags & SEC_LINKER_CREATED)
450     return;
451
452   /* PR 10413: Skip sections that we are ignoring.  */
453   if (! process_section_p (section))
454     return;
455
456   printf ("%3d %-13s %08lx  ", section->index,
457           bfd_get_section_name (abfd, section),
458           (unsigned long) bfd_section_size (abfd, section) / opb);
459   bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
460   printf ("  ");
461   bfd_printf_vma (abfd, section->lma);
462   printf ("  %08lx  2**%u", (unsigned long) section->filepos,
463           bfd_get_section_alignment (abfd, section));
464   if (! wide_output)
465     printf ("\n                ");
466   printf ("  ");
467
468 #define PF(x, y) \
469   if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
470
471   PF (SEC_HAS_CONTENTS, "CONTENTS");
472   PF (SEC_ALLOC, "ALLOC");
473   PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
474   PF (SEC_LOAD, "LOAD");
475   PF (SEC_RELOC, "RELOC");
476   PF (SEC_READONLY, "READONLY");
477   PF (SEC_CODE, "CODE");
478   PF (SEC_DATA, "DATA");
479   PF (SEC_ROM, "ROM");
480   PF (SEC_DEBUGGING, "DEBUGGING");
481   PF (SEC_NEVER_LOAD, "NEVER_LOAD");
482   PF (SEC_EXCLUDE, "EXCLUDE");
483   PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
484   if (bfd_get_arch (abfd) == bfd_arch_tic54x)
485     {
486       PF (SEC_TIC54X_BLOCK, "BLOCK");
487       PF (SEC_TIC54X_CLINK, "CLINK");
488     }
489   PF (SEC_SMALL_DATA, "SMALL_DATA");
490   if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
491     PF (SEC_COFF_SHARED, "SHARED");
492   PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
493   PF (SEC_GROUP, "GROUP");
494
495   if ((section->flags & SEC_LINK_ONCE) != 0)
496     {
497       const char *ls;
498       struct coff_comdat_info *comdat;
499
500       switch (section->flags & SEC_LINK_DUPLICATES)
501         {
502         default:
503           abort ();
504         case SEC_LINK_DUPLICATES_DISCARD:
505           ls = "LINK_ONCE_DISCARD";
506           break;
507         case SEC_LINK_DUPLICATES_ONE_ONLY:
508           ls = "LINK_ONCE_ONE_ONLY";
509           break;
510         case SEC_LINK_DUPLICATES_SAME_SIZE:
511           ls = "LINK_ONCE_SAME_SIZE";
512           break;
513         case SEC_LINK_DUPLICATES_SAME_CONTENTS:
514           ls = "LINK_ONCE_SAME_CONTENTS";
515           break;
516         }
517       printf ("%s%s", comma, ls);
518
519       comdat = bfd_coff_get_comdat_section (abfd, section);
520       if (comdat != NULL)
521         printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
522
523       comma = ", ";
524     }
525
526   printf ("\n");
527 #undef PF
528 }
529
530 static void
531 dump_headers (bfd *abfd)
532 {
533   printf (_("Sections:\n"));
534
535 #ifndef BFD64
536   printf (_("Idx Name          Size      VMA       LMA       File off  Algn"));
537 #else
538   /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses.  */
539   if (bfd_get_arch_size (abfd) == 32)
540     printf (_("Idx Name          Size      VMA       LMA       File off  Algn"));
541   else
542     printf (_("Idx Name          Size      VMA               LMA               File off  Algn"));
543 #endif
544
545   if (wide_output)
546     printf (_("  Flags"));
547   printf ("\n");
548
549   bfd_map_over_sections (abfd, dump_section_header, NULL);
550 }
551 \f
552 static asymbol **
553 slurp_symtab (bfd *abfd)
554 {
555   asymbol **sy = NULL;
556   long storage;
557
558   if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
559     {
560       symcount = 0;
561       return NULL;
562     }
563
564   storage = bfd_get_symtab_upper_bound (abfd);
565   if (storage < 0)
566     bfd_fatal (bfd_get_filename (abfd));
567   if (storage)
568     sy = (asymbol **) xmalloc (storage);
569
570   symcount = bfd_canonicalize_symtab (abfd, sy);
571   if (symcount < 0)
572     bfd_fatal (bfd_get_filename (abfd));
573   return sy;
574 }
575
576 /* Read in the dynamic symbols.  */
577
578 static asymbol **
579 slurp_dynamic_symtab (bfd *abfd)
580 {
581   asymbol **sy = NULL;
582   long storage;
583
584   storage = bfd_get_dynamic_symtab_upper_bound (abfd);
585   if (storage < 0)
586     {
587       if (!(bfd_get_file_flags (abfd) & DYNAMIC))
588         {
589           non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
590           exit_status = 1;
591           dynsymcount = 0;
592           return NULL;
593         }
594
595       bfd_fatal (bfd_get_filename (abfd));
596     }
597   if (storage)
598     sy = (asymbol **) xmalloc (storage);
599
600   dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
601   if (dynsymcount < 0)
602     bfd_fatal (bfd_get_filename (abfd));
603   return sy;
604 }
605
606 /* Filter out (in place) symbols that are useless for disassembly.
607    COUNT is the number of elements in SYMBOLS.
608    Return the number of useful symbols.  */
609
610 static long
611 remove_useless_symbols (asymbol **symbols, long count)
612 {
613   asymbol **in_ptr = symbols, **out_ptr = symbols;
614
615   while (--count >= 0)
616     {
617       asymbol *sym = *in_ptr++;
618
619       if (sym->name == NULL || sym->name[0] == '\0')
620         continue;
621       if (sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
622         continue;
623       if (bfd_is_und_section (sym->section)
624           || bfd_is_com_section (sym->section))
625         continue;
626
627       *out_ptr++ = sym;
628     }
629   return out_ptr - symbols;
630 }
631
632 /* Sort symbols into value order.  */
633
634 static int
635 compare_symbols (const void *ap, const void *bp)
636 {
637   const asymbol *a = * (const asymbol **) ap;
638   const asymbol *b = * (const asymbol **) bp;
639   const char *an;
640   const char *bn;
641   size_t anl;
642   size_t bnl;
643   bfd_boolean af;
644   bfd_boolean bf;
645   flagword aflags;
646   flagword bflags;
647
648   if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
649     return 1;
650   else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
651     return -1;
652
653   if (a->section > b->section)
654     return 1;
655   else if (a->section < b->section)
656     return -1;
657
658   an = bfd_asymbol_name (a);
659   bn = bfd_asymbol_name (b);
660   anl = strlen (an);
661   bnl = strlen (bn);
662
663   /* The symbols gnu_compiled and gcc2_compiled convey no real
664      information, so put them after other symbols with the same value.  */
665   af = (strstr (an, "gnu_compiled") != NULL
666         || strstr (an, "gcc2_compiled") != NULL);
667   bf = (strstr (bn, "gnu_compiled") != NULL
668         || strstr (bn, "gcc2_compiled") != NULL);
669
670   if (af && ! bf)
671     return 1;
672   if (! af && bf)
673     return -1;
674
675   /* We use a heuristic for the file name, to try to sort it after
676      more useful symbols.  It may not work on non Unix systems, but it
677      doesn't really matter; the only difference is precisely which
678      symbol names get printed.  */
679
680 #define file_symbol(s, sn, snl)                 \
681   (((s)->flags & BSF_FILE) != 0                 \
682    || ((sn)[(snl) - 2] == '.'                   \
683        && ((sn)[(snl) - 1] == 'o'               \
684            || (sn)[(snl) - 1] == 'a')))
685
686   af = file_symbol (a, an, anl);
687   bf = file_symbol (b, bn, bnl);
688
689   if (af && ! bf)
690     return 1;
691   if (! af && bf)
692     return -1;
693
694   /* Try to sort global symbols before local symbols before function
695      symbols before debugging symbols.  */
696
697   aflags = a->flags;
698   bflags = b->flags;
699
700   if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
701     {
702       if ((aflags & BSF_DEBUGGING) != 0)
703         return 1;
704       else
705         return -1;
706     }
707   if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
708     {
709       if ((aflags & BSF_FUNCTION) != 0)
710         return -1;
711       else
712         return 1;
713     }
714   if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
715     {
716       if ((aflags & BSF_LOCAL) != 0)
717         return 1;
718       else
719         return -1;
720     }
721   if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
722     {
723       if ((aflags & BSF_GLOBAL) != 0)
724         return -1;
725       else
726         return 1;
727     }
728
729   /* Symbols that start with '.' might be section names, so sort them
730      after symbols that don't start with '.'.  */
731   if (an[0] == '.' && bn[0] != '.')
732     return 1;
733   if (an[0] != '.' && bn[0] == '.')
734     return -1;
735
736   /* Finally, if we can't distinguish them in any other way, try to
737      get consistent results by sorting the symbols by name.  */
738   return strcmp (an, bn);
739 }
740
741 /* Sort relocs into address order.  */
742
743 static int
744 compare_relocs (const void *ap, const void *bp)
745 {
746   const arelent *a = * (const arelent **) ap;
747   const arelent *b = * (const arelent **) bp;
748
749   if (a->address > b->address)
750     return 1;
751   else if (a->address < b->address)
752     return -1;
753
754   /* So that associated relocations tied to the same address show up
755      in the correct order, we don't do any further sorting.  */
756   if (a > b)
757     return 1;
758   else if (a < b)
759     return -1;
760   else
761     return 0;
762 }
763
764 /* Print an address (VMA) to the output stream in INFO.
765    If SKIP_ZEROES is TRUE, omit leading zeroes.  */
766
767 static void
768 objdump_print_value (bfd_vma vma, struct disassemble_info *inf,
769                      bfd_boolean skip_zeroes)
770 {
771   char buf[30];
772   char *p;
773   struct objdump_disasm_info *aux;
774
775   aux = (struct objdump_disasm_info *) inf->application_data;
776   bfd_sprintf_vma (aux->abfd, buf, vma);
777   if (! skip_zeroes)
778     p = buf;
779   else
780     {
781       for (p = buf; *p == '0'; ++p)
782         ;
783       if (*p == '\0')
784         --p;
785     }
786   (*inf->fprintf_func) (inf->stream, "%s", p);
787 }
788
789 /* Print the name of a symbol.  */
790
791 static void
792 objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
793                        asymbol *sym)
794 {
795   char *alloc;
796   const char *name;
797
798   alloc = NULL;
799   name = bfd_asymbol_name (sym);
800   if (do_demangle && name[0] != '\0')
801     {
802       /* Demangle the name.  */
803       alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
804       if (alloc != NULL)
805         name = alloc;
806     }
807
808   if (inf != NULL)
809     (*inf->fprintf_func) (inf->stream, "%s", name);
810   else
811     printf ("%s", name);
812
813   if (alloc != NULL)
814     free (alloc);
815 }
816
817 /* Locate a symbol given a bfd and a section (from INFO->application_data),
818    and a VMA.  If INFO->application_data->require_sec is TRUE, then always
819    require the symbol to be in the section.  Returns NULL if there is no
820    suitable symbol.  If PLACE is not NULL, then *PLACE is set to the index
821    of the symbol in sorted_syms.  */
822
823 static asymbol *
824 find_symbol_for_address (bfd_vma vma,
825                          struct disassemble_info *inf,
826                          long *place)
827 {
828   /* @@ Would it speed things up to cache the last two symbols returned,
829      and maybe their address ranges?  For many processors, only one memory
830      operand can be present at a time, so the 2-entry cache wouldn't be
831      constantly churned by code doing heavy memory accesses.  */
832
833   /* Indices in `sorted_syms'.  */
834   long min = 0;
835   long max_count = sorted_symcount;
836   long thisplace;
837   struct objdump_disasm_info *aux;
838   bfd *abfd;
839   asection *sec;
840   unsigned int opb;
841   bfd_boolean want_section;
842
843   if (sorted_symcount < 1)
844     return NULL;
845
846   aux = (struct objdump_disasm_info *) inf->application_data;
847   abfd = aux->abfd;
848   sec = aux->sec;
849   opb = inf->octets_per_byte;
850
851   /* Perform a binary search looking for the closest symbol to the
852      required value.  We are searching the range (min, max_count].  */
853   while (min + 1 < max_count)
854     {
855       asymbol *sym;
856
857       thisplace = (max_count + min) / 2;
858       sym = sorted_syms[thisplace];
859
860       if (bfd_asymbol_value (sym) > vma)
861         max_count = thisplace;
862       else if (bfd_asymbol_value (sym) < vma)
863         min = thisplace;
864       else
865         {
866           min = thisplace;
867           break;
868         }
869     }
870
871   /* The symbol we want is now in min, the low end of the range we
872      were searching.  If there are several symbols with the same
873      value, we want the first one.  */
874   thisplace = min;
875   while (thisplace > 0
876          && (bfd_asymbol_value (sorted_syms[thisplace])
877              == bfd_asymbol_value (sorted_syms[thisplace - 1])))
878     --thisplace;
879
880   /* Prefer a symbol in the current section if we have multple symbols
881      with the same value, as can occur with overlays or zero size
882      sections.  */
883   min = thisplace;
884   while (min < max_count
885          && (bfd_asymbol_value (sorted_syms[min])
886              == bfd_asymbol_value (sorted_syms[thisplace])))
887     {
888       if (sorted_syms[min]->section == sec
889           && inf->symbol_is_valid (sorted_syms[min], inf))
890         {
891           thisplace = min;
892
893           if (place != NULL)
894             *place = thisplace;
895
896           return sorted_syms[thisplace];
897         }
898       ++min;
899     }
900
901   /* If the file is relocatable, and the symbol could be from this
902      section, prefer a symbol from this section over symbols from
903      others, even if the other symbol's value might be closer.
904
905      Note that this may be wrong for some symbol references if the
906      sections have overlapping memory ranges, but in that case there's
907      no way to tell what's desired without looking at the relocation
908      table.
909      
910      Also give the target a chance to reject symbols.  */
911   want_section = (aux->require_sec
912                   || ((abfd->flags & HAS_RELOC) != 0
913                       && vma >= bfd_get_section_vma (abfd, sec)
914                       && vma < (bfd_get_section_vma (abfd, sec)
915                                 + bfd_section_size (abfd, sec) / opb)));
916   if ((sorted_syms[thisplace]->section != sec && want_section)
917       || ! inf->symbol_is_valid (sorted_syms[thisplace], inf))
918     {
919       long i;
920       long newplace = sorted_symcount;
921
922       for (i = min - 1; i >= 0; i--)
923         {
924           if ((sorted_syms[i]->section == sec || !want_section)
925               && inf->symbol_is_valid (sorted_syms[i], inf))
926             {
927               if (newplace == sorted_symcount)
928                 newplace = i;
929
930               if (bfd_asymbol_value (sorted_syms[i])
931                   != bfd_asymbol_value (sorted_syms[newplace]))
932                 break;
933
934               /* Remember this symbol and keep searching until we reach
935                  an earlier address.  */
936               newplace = i;
937             }
938         }
939
940       if (newplace != sorted_symcount)
941         thisplace = newplace;
942       else
943         {
944           /* We didn't find a good symbol with a smaller value.
945              Look for one with a larger value.  */
946           for (i = thisplace + 1; i < sorted_symcount; i++)
947             {
948               if ((sorted_syms[i]->section == sec || !want_section)
949                   && inf->symbol_is_valid (sorted_syms[i], inf))
950                 {
951                   thisplace = i;
952                   break;
953                 }
954             }
955         }
956
957       if ((sorted_syms[thisplace]->section != sec && want_section)
958           || ! inf->symbol_is_valid (sorted_syms[thisplace], inf))
959         /* There is no suitable symbol.  */
960         return NULL;
961     }
962
963   if (place != NULL)
964     *place = thisplace;
965
966   return sorted_syms[thisplace];
967 }
968
969 /* Print an address and the offset to the nearest symbol.  */
970
971 static void
972 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
973                              bfd_vma vma, struct disassemble_info *inf,
974                              bfd_boolean skip_zeroes)
975 {
976   objdump_print_value (vma, inf, skip_zeroes);
977
978   if (sym == NULL)
979     {
980       bfd_vma secaddr;
981
982       (*inf->fprintf_func) (inf->stream, " <%s",
983                             bfd_get_section_name (abfd, sec));
984       secaddr = bfd_get_section_vma (abfd, sec);
985       if (vma < secaddr)
986         {
987           (*inf->fprintf_func) (inf->stream, "-0x");
988           objdump_print_value (secaddr - vma, inf, TRUE);
989         }
990       else if (vma > secaddr)
991         {
992           (*inf->fprintf_func) (inf->stream, "+0x");
993           objdump_print_value (vma - secaddr, inf, TRUE);
994         }
995       (*inf->fprintf_func) (inf->stream, ">");
996     }
997   else
998     {
999       (*inf->fprintf_func) (inf->stream, " <");
1000       objdump_print_symname (abfd, inf, sym);
1001       if (bfd_asymbol_value (sym) > vma)
1002         {
1003           (*inf->fprintf_func) (inf->stream, "-0x");
1004           objdump_print_value (bfd_asymbol_value (sym) - vma, inf, TRUE);
1005         }
1006       else if (vma > bfd_asymbol_value (sym))
1007         {
1008           (*inf->fprintf_func) (inf->stream, "+0x");
1009           objdump_print_value (vma - bfd_asymbol_value (sym), inf, TRUE);
1010         }
1011       (*inf->fprintf_func) (inf->stream, ">");
1012     }
1013
1014   if (display_file_offsets)
1015     inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1016                         (long int)(sec->filepos + (vma - sec->vma)));
1017 }
1018
1019 /* Print an address (VMA), symbolically if possible.
1020    If SKIP_ZEROES is TRUE, don't output leading zeroes.  */
1021
1022 static void
1023 objdump_print_addr (bfd_vma vma,
1024                     struct disassemble_info *inf,
1025                     bfd_boolean skip_zeroes)
1026 {
1027   struct objdump_disasm_info *aux;
1028   asymbol *sym = NULL;
1029   bfd_boolean skip_find = FALSE;
1030
1031   aux = (struct objdump_disasm_info *) inf->application_data;
1032
1033   if (sorted_symcount < 1)
1034     {
1035       (*inf->fprintf_func) (inf->stream, "0x");
1036       objdump_print_value (vma, inf, skip_zeroes);
1037
1038       if (display_file_offsets)
1039         inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1040                            (long int)(aux->sec->filepos + (vma - aux->sec->vma)));
1041       return;
1042     }
1043
1044   if (aux->reloc != NULL
1045       && aux->reloc->sym_ptr_ptr != NULL
1046       && * aux->reloc->sym_ptr_ptr != NULL)
1047     {
1048       sym = * aux->reloc->sym_ptr_ptr;
1049
1050       /* Adjust the vma to the reloc.  */
1051       vma += bfd_asymbol_value (sym);
1052
1053       if (bfd_is_und_section (bfd_get_section (sym)))
1054         skip_find = TRUE;
1055     }
1056
1057   if (!skip_find)
1058     sym = find_symbol_for_address (vma, inf, NULL);
1059
1060   objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, inf,
1061                                skip_zeroes);
1062 }
1063
1064 /* Print VMA to INFO.  This function is passed to the disassembler
1065    routine.  */
1066
1067 static void
1068 objdump_print_address (bfd_vma vma, struct disassemble_info *inf)
1069 {
1070   objdump_print_addr (vma, inf, ! prefix_addresses);
1071 }
1072
1073 /* Determine if the given address has a symbol associated with it.  */
1074
1075 static int
1076 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
1077 {
1078   asymbol * sym;
1079
1080   sym = find_symbol_for_address (vma, inf, NULL);
1081
1082   return (sym != NULL && (bfd_asymbol_value (sym) == vma));
1083 }
1084
1085 /* Hold the last function name and the last line number we displayed
1086    in a disassembly.  */
1087
1088 static char *prev_functionname;
1089 static unsigned int prev_line;
1090 static unsigned int prev_discriminator;
1091
1092 /* We keep a list of all files that we have seen when doing a
1093    disassembly with source, so that we know how much of the file to
1094    display.  This can be important for inlined functions.  */
1095
1096 struct print_file_list
1097 {
1098   struct print_file_list *next;
1099   const char *filename;
1100   const char *modname;
1101   const char *map; 
1102   size_t mapsize;
1103   const char **linemap; 
1104   unsigned maxline;
1105   unsigned last_line;
1106   int first;
1107 };
1108
1109 static struct print_file_list *print_files;
1110
1111 /* The number of preceding context lines to show when we start
1112    displaying a file for the first time.  */
1113
1114 #define SHOW_PRECEDING_CONTEXT_LINES (5)
1115
1116 /* Read a complete file into memory.  */
1117
1118 static const char *
1119 slurp_file (const char *fn, size_t *size)
1120 {
1121 #ifdef HAVE_MMAP
1122   int ps = getpagesize ();
1123   size_t msize;
1124 #endif
1125   const char *map;
1126   struct stat st;
1127   int fd = open (fn, O_RDONLY | O_BINARY);
1128
1129   if (fd < 0)
1130     return NULL;
1131   if (fstat (fd, &st) < 0)
1132     {
1133       close (fd);
1134       return NULL;
1135     }
1136   *size = st.st_size;
1137 #ifdef HAVE_MMAP
1138   msize = (*size + ps - 1) & ~(ps - 1);
1139   map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
1140   if (map != (char *) -1L)
1141     {
1142       close (fd);
1143       return map;
1144     }
1145 #endif
1146   map = (const char *) malloc (*size);
1147   if (!map || (size_t) read (fd, (char *) map, *size) != *size)
1148     {
1149       free ((void *) map);
1150       map = NULL;
1151     }
1152   close (fd);
1153   return map;
1154 }
1155
1156 #define line_map_decrease 5
1157
1158 /* Precompute array of lines for a mapped file. */
1159
1160 static const char ** 
1161 index_file (const char *map, size_t size, unsigned int *maxline) 
1162 {
1163   const char *p, *lstart, *end;
1164   int chars_per_line = 45; /* First iteration will use 40.  */
1165   unsigned int lineno;
1166   const char **linemap = NULL; 
1167   unsigned long line_map_size = 0;
1168  
1169   lineno = 0;
1170   lstart = map;
1171   end = map + size;
1172
1173   for (p = map; p < end; p++) 
1174     { 
1175       if (*p == '\n') 
1176         { 
1177           if (p + 1 < end && p[1] == '\r') 
1178             p++;  
1179         } 
1180       else if (*p == '\r') 
1181         { 
1182           if (p + 1 < end && p[1] == '\n')
1183             p++;
1184         }
1185       else
1186         continue;
1187       
1188       /* End of line found.  */
1189
1190       if (linemap == NULL || line_map_size < lineno + 1) 
1191         { 
1192           unsigned long newsize;
1193
1194           chars_per_line -= line_map_decrease;
1195           if (chars_per_line <= 1)
1196             chars_per_line = 1;
1197           line_map_size = size / chars_per_line + 1;
1198           if (line_map_size < lineno + 1)
1199             line_map_size = lineno + 1;
1200           newsize = line_map_size * sizeof (char *);
1201           linemap = (const char **) xrealloc (linemap, newsize);
1202         }
1203
1204       linemap[lineno++] = lstart; 
1205       lstart = p + 1; 
1206     }
1207   
1208   *maxline = lineno; 
1209   return linemap;
1210 }
1211
1212 /* Tries to open MODNAME, and if successful adds a node to print_files
1213    linked list and returns that node.  Returns NULL on failure.  */
1214
1215 static struct print_file_list *
1216 try_print_file_open (const char *origname, const char *modname)
1217 {
1218   struct print_file_list *p;
1219
1220   p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
1221
1222   p->map = slurp_file (modname, &p->mapsize);
1223   if (p->map == NULL)
1224     {
1225       free (p);
1226       return NULL;
1227     }
1228   
1229   p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1230   p->last_line = 0;
1231   p->filename = origname;
1232   p->modname = modname;
1233   p->next = print_files;
1234   p->first = 1;
1235   print_files = p;
1236   return p;
1237 }
1238
1239 /* If the source file, as described in the symtab, is not found
1240    try to locate it in one of the paths specified with -I
1241    If found, add location to print_files linked list.  */
1242
1243 static struct print_file_list *
1244 update_source_path (const char *filename)
1245 {
1246   struct print_file_list *p;
1247   const char *fname;
1248   int i;
1249
1250   p = try_print_file_open (filename, filename);
1251   if (p != NULL)
1252     return p;
1253
1254   if (include_path_count == 0)
1255     return NULL;
1256
1257   /* Get the name of the file.  */
1258   fname = lbasename (filename);
1259
1260   /* If file exists under a new path, we need to add it to the list
1261      so that show_line knows about it.  */
1262   for (i = 0; i < include_path_count; i++)
1263     {
1264       char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1265
1266       p = try_print_file_open (filename, modname);
1267       if (p)
1268         return p;
1269
1270       free (modname);
1271     }
1272
1273   return NULL;
1274 }
1275
1276 /* Print a source file line.  */
1277
1278 static void 
1279 print_line (struct print_file_list *p, unsigned int linenum)
1280 {
1281   const char *l;
1282   size_t len;
1283  
1284   --linenum; 
1285   if (linenum >= p->maxline)
1286     return;
1287   l = p->linemap [linenum];
1288   /* Test fwrite return value to quiet glibc warning.  */
1289   len = strcspn (l, "\n\r");
1290   if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1291     putchar ('\n');
1292 }
1293
1294 /* Print a range of source code lines. */
1295
1296 static void
1297 dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1298 {
1299   if (p->map == NULL)
1300     return;
1301   while (start <= end) 
1302     {
1303       print_line (p, start);
1304       start++;
1305     }
1306 }
1307
1308 /* Show the line number, or the source line, in a disassembly
1309    listing.  */
1310
1311 static void
1312 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1313 {
1314   const char *filename;
1315   const char *functionname;
1316   unsigned int linenumber;
1317   unsigned int discriminator;
1318   bfd_boolean reloc;
1319
1320   if (! with_line_numbers && ! with_source_code)
1321     return;
1322
1323   if (! bfd_find_nearest_line_discriminator (abfd, section, syms, addr_offset,
1324                                              &filename, &functionname,
1325                                              &linenumber, &discriminator))
1326     return;
1327
1328   if (filename != NULL && *filename == '\0')
1329     filename = NULL;
1330   if (functionname != NULL && *functionname == '\0')
1331     functionname = NULL;
1332
1333   if (filename
1334       && IS_ABSOLUTE_PATH (filename)
1335       && prefix)
1336     {
1337       char *path_up;
1338       const char *fname = filename;
1339       char *path = (char *) alloca (prefix_length + PATH_MAX + 1);
1340
1341       if (prefix_length)
1342         memcpy (path, prefix, prefix_length);
1343       path_up = path + prefix_length;
1344
1345       /* Build relocated filename, stripping off leading directories
1346          from the initial filename if requested. */
1347       if (prefix_strip > 0)
1348         {
1349           int level = 0;
1350           const char *s;
1351
1352           /* Skip selected directory levels. */
1353           for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
1354             if (IS_DIR_SEPARATOR(*s))
1355               {
1356                 fname = s;
1357                 level++;
1358               }
1359         }
1360
1361       /* Update complete filename. */
1362       strncpy (path_up, fname, PATH_MAX);
1363       path_up[PATH_MAX] = '\0';
1364
1365       filename = path;
1366       reloc = TRUE;
1367     }
1368   else
1369     reloc = FALSE;
1370
1371   if (with_line_numbers)
1372     {
1373       if (functionname != NULL
1374           && (prev_functionname == NULL
1375               || strcmp (functionname, prev_functionname) != 0))
1376         printf ("%s():\n", functionname);
1377       if (linenumber > 0 && (linenumber != prev_line || 
1378                              (discriminator != prev_discriminator)))
1379         { 
1380           if (discriminator > 0)
1381             printf ("%s:%u (discriminator %u)\n", filename == NULL ? "???" : filename,
1382                     linenumber, discriminator);
1383           else
1384             printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
1385         }
1386     }
1387
1388   if (with_source_code
1389       && filename != NULL
1390       && linenumber > 0)
1391     {
1392       struct print_file_list **pp, *p;
1393       unsigned l;
1394
1395       for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1396         if (filename_cmp ((*pp)->filename, filename) == 0)
1397           break;
1398       p = *pp;
1399
1400       if (p == NULL)
1401         {
1402           if (reloc)
1403             filename = xstrdup (filename);
1404           p = update_source_path (filename);
1405         }
1406
1407       if (p != NULL && linenumber != p->last_line)
1408         {
1409           if (file_start_context && p->first) 
1410             l = 1;
1411           else 
1412             {
1413               l = linenumber - SHOW_PRECEDING_CONTEXT_LINES;
1414               if (l >= linenumber) 
1415                 l = 1;
1416               if (p->last_line >= l && p->last_line <= linenumber)
1417                 l = p->last_line + 1;
1418             }
1419           dump_lines (p, l, linenumber);
1420           p->last_line = linenumber;
1421           p->first = 0;
1422         }
1423     }
1424
1425   if (functionname != NULL
1426       && (prev_functionname == NULL
1427           || strcmp (functionname, prev_functionname) != 0))
1428     {
1429       if (prev_functionname != NULL)
1430         free (prev_functionname);
1431       prev_functionname = (char *) xmalloc (strlen (functionname) + 1);
1432       strcpy (prev_functionname, functionname);
1433     }
1434
1435   if (linenumber > 0 && linenumber != prev_line)
1436     prev_line = linenumber;
1437
1438   if (discriminator != prev_discriminator)
1439     prev_discriminator = discriminator;
1440 }
1441
1442 /* Pseudo FILE object for strings.  */
1443 typedef struct
1444 {
1445   char *buffer;
1446   size_t pos;
1447   size_t alloc;
1448 } SFILE;
1449
1450 /* sprintf to a "stream".  */
1451
1452 static int ATTRIBUTE_PRINTF_2
1453 objdump_sprintf (SFILE *f, const char *format, ...)
1454 {
1455   size_t n;
1456   va_list args;
1457
1458   while (1)
1459     {
1460       size_t space = f->alloc - f->pos;
1461   
1462       va_start (args, format);
1463       n = vsnprintf (f->buffer + f->pos, space, format, args);
1464       va_end (args);
1465
1466       if (space > n)
1467         break;
1468       
1469       f->alloc = (f->alloc + n) * 2;
1470       f->buffer = (char *) xrealloc (f->buffer, f->alloc);
1471     }
1472   f->pos += n;
1473   
1474   return n;
1475 }
1476
1477 /* The number of zeroes we want to see before we start skipping them.
1478    The number is arbitrarily chosen.  */
1479
1480 #define DEFAULT_SKIP_ZEROES 8
1481
1482 /* The number of zeroes to skip at the end of a section.  If the
1483    number of zeroes at the end is between SKIP_ZEROES_AT_END and
1484    SKIP_ZEROES, they will be disassembled.  If there are fewer than
1485    SKIP_ZEROES_AT_END, they will be skipped.  This is a heuristic
1486    attempt to avoid disassembling zeroes inserted by section
1487    alignment.  */
1488
1489 #define DEFAULT_SKIP_ZEROES_AT_END 3
1490
1491 /* Disassemble some data in memory between given values.  */
1492
1493 static void
1494 disassemble_bytes (struct disassemble_info * inf,
1495                    disassembler_ftype        disassemble_fn,
1496                    bfd_boolean               insns,
1497                    bfd_byte *                data,
1498                    bfd_vma                   start_offset,
1499                    bfd_vma                   stop_offset,
1500                    bfd_vma                   rel_offset,
1501                    arelent ***               relppp,
1502                    arelent **                relppend)
1503 {
1504   struct objdump_disasm_info *aux;
1505   asection *section;
1506   int octets_per_line;
1507   int skip_addr_chars;
1508   bfd_vma addr_offset;
1509   unsigned int opb = inf->octets_per_byte;
1510   unsigned int skip_zeroes = inf->skip_zeroes;
1511   unsigned int skip_zeroes_at_end = inf->skip_zeroes_at_end;
1512   int octets = opb;
1513   SFILE sfile;
1514
1515   aux = (struct objdump_disasm_info *) inf->application_data;
1516   section = aux->sec;
1517
1518   sfile.alloc = 120;
1519   sfile.buffer = (char *) xmalloc (sfile.alloc);
1520   sfile.pos = 0;
1521   
1522   if (insn_width)
1523     octets_per_line = insn_width;
1524   else if (insns)
1525     octets_per_line = 4;
1526   else
1527     octets_per_line = 16;
1528
1529   /* Figure out how many characters to skip at the start of an
1530      address, to make the disassembly look nicer.  We discard leading
1531      zeroes in chunks of 4, ensuring that there is always a leading
1532      zero remaining.  */
1533   skip_addr_chars = 0;
1534   if (! prefix_addresses)
1535     {
1536       char buf[30];
1537
1538       bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1539
1540       while (buf[skip_addr_chars] == '0')
1541         ++skip_addr_chars;
1542
1543       /* Don't discard zeros on overflow.  */
1544       if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1545         skip_addr_chars = 0;
1546
1547       if (skip_addr_chars != 0)
1548         skip_addr_chars = (skip_addr_chars - 1) & -4;
1549     }
1550
1551   inf->insn_info_valid = 0;
1552
1553   addr_offset = start_offset;
1554   while (addr_offset < stop_offset)
1555     {
1556       bfd_vma z;
1557       bfd_boolean need_nl = FALSE;
1558       int previous_octets;
1559
1560       /* Remember the length of the previous instruction.  */
1561       previous_octets = octets;
1562       octets = 0;
1563
1564       /* Make sure we don't use relocs from previous instructions.  */
1565       aux->reloc = NULL;
1566
1567       /* If we see more than SKIP_ZEROES octets of zeroes, we just
1568          print `...'.  */
1569       for (z = addr_offset * opb; z < stop_offset * opb; z++)
1570         if (data[z] != 0)
1571           break;
1572       if (! disassemble_zeroes
1573           && (inf->insn_info_valid == 0
1574               || inf->branch_delay_insns == 0)
1575           && (z - addr_offset * opb >= skip_zeroes
1576               || (z == stop_offset * opb &&
1577                   z - addr_offset * opb < skip_zeroes_at_end)))
1578         {
1579           /* If there are more nonzero octets to follow, we only skip
1580              zeroes in multiples of 4, to try to avoid running over
1581              the start of an instruction which happens to start with
1582              zero.  */
1583           if (z != stop_offset * opb)
1584             z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1585
1586           octets = z - addr_offset * opb;
1587
1588           /* If we are going to display more data, and we are displaying
1589              file offsets, then tell the user how many zeroes we skip
1590              and the file offset from where we resume dumping.  */
1591           if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1592             printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1593                     octets / opb,
1594                     (unsigned long) (section->filepos
1595                                      + (addr_offset + (octets / opb))));
1596           else
1597             printf ("\t...\n");
1598         }
1599       else
1600         {
1601           char buf[50];
1602           int bpc = 0;
1603           int pb = 0;
1604
1605           if (with_line_numbers || with_source_code)
1606             show_line (aux->abfd, section, addr_offset);
1607
1608           if (! prefix_addresses)
1609             {
1610               char *s;
1611
1612               bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1613               for (s = buf + skip_addr_chars; *s == '0'; s++)
1614                 *s = ' ';
1615               if (*s == '\0')
1616                 *--s = '0';
1617               printf ("%s:\t", buf + skip_addr_chars);
1618             }
1619           else
1620             {
1621               aux->require_sec = TRUE;
1622               objdump_print_address (section->vma + addr_offset, inf);
1623               aux->require_sec = FALSE;
1624               putchar (' ');
1625             }
1626
1627           if (insns)
1628             {
1629               sfile.pos = 0;
1630               inf->fprintf_func = (fprintf_ftype) objdump_sprintf;
1631               inf->stream = &sfile;
1632               inf->bytes_per_line = 0;
1633               inf->bytes_per_chunk = 0;
1634               inf->flags = disassemble_all ? DISASSEMBLE_DATA : 0;
1635               if (machine)
1636                 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
1637
1638               if (inf->disassembler_needs_relocs
1639                   && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1640                   && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1641                   && *relppp < relppend)
1642                 {
1643                   bfd_signed_vma distance_to_rel;
1644
1645                   distance_to_rel = (**relppp)->address
1646                     - (rel_offset + addr_offset);
1647
1648                   /* Check to see if the current reloc is associated with
1649                      the instruction that we are about to disassemble.  */
1650                   if (distance_to_rel == 0
1651                       /* FIXME: This is wrong.  We are trying to catch
1652                          relocs that are addressed part way through the
1653                          current instruction, as might happen with a packed
1654                          VLIW instruction.  Unfortunately we do not know the
1655                          length of the current instruction since we have not
1656                          disassembled it yet.  Instead we take a guess based
1657                          upon the length of the previous instruction.  The
1658                          proper solution is to have a new target-specific
1659                          disassembler function which just returns the length
1660                          of an instruction at a given address without trying
1661                          to display its disassembly. */
1662                       || (distance_to_rel > 0
1663                           && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1664                     {
1665                       inf->flags |= INSN_HAS_RELOC;
1666                       aux->reloc = **relppp;
1667                     }
1668                 }
1669
1670               octets = (*disassemble_fn) (section->vma + addr_offset, inf);
1671               inf->fprintf_func = (fprintf_ftype) fprintf;
1672               inf->stream = stdout;
1673               if (insn_width == 0 && inf->bytes_per_line != 0)
1674                 octets_per_line = inf->bytes_per_line;
1675               if (octets < (int) opb)
1676                 {
1677                   if (sfile.pos)
1678                     printf ("%s\n", sfile.buffer);
1679                   if (octets >= 0)
1680                     {
1681                       non_fatal (_("disassemble_fn returned length %d"),
1682                                  octets);
1683                       exit_status = 1;
1684                     }
1685                   break;
1686                 }
1687             }
1688           else
1689             {
1690               bfd_vma j;
1691
1692               octets = octets_per_line;
1693               if (addr_offset + octets / opb > stop_offset)
1694                 octets = (stop_offset - addr_offset) * opb;
1695
1696               for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1697                 {
1698                   if (ISPRINT (data[j]))
1699                     buf[j - addr_offset * opb] = data[j];
1700                   else
1701                     buf[j - addr_offset * opb] = '.';
1702                 }
1703               buf[j - addr_offset * opb] = '\0';
1704             }
1705
1706           if (prefix_addresses
1707               ? show_raw_insn > 0
1708               : show_raw_insn >= 0)
1709             {
1710               bfd_vma j;
1711
1712               /* If ! prefix_addresses and ! wide_output, we print
1713                  octets_per_line octets per line.  */
1714               pb = octets;
1715               if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1716                 pb = octets_per_line;
1717
1718               if (inf->bytes_per_chunk)
1719                 bpc = inf->bytes_per_chunk;
1720               else
1721                 bpc = 1;
1722
1723               for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1724                 {
1725                   int k;
1726
1727                   if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1728                     {
1729                       for (k = bpc - 1; k >= 0; k--)
1730                         printf ("%02x", (unsigned) data[j + k]);
1731                       putchar (' ');
1732                     }
1733                   else
1734                     {
1735                       for (k = 0; k < bpc; k++)
1736                         printf ("%02x", (unsigned) data[j + k]);
1737                       putchar (' ');
1738                     }
1739                 }
1740
1741               for (; pb < octets_per_line; pb += bpc)
1742                 {
1743                   int k;
1744
1745                   for (k = 0; k < bpc; k++)
1746                     printf ("  ");
1747                   putchar (' ');
1748                 }
1749
1750               /* Separate raw data from instruction by extra space.  */
1751               if (insns)
1752                 putchar ('\t');
1753               else
1754                 printf ("    ");
1755             }
1756
1757           if (! insns)
1758             printf ("%s", buf);
1759           else if (sfile.pos)
1760             printf ("%s", sfile.buffer);
1761
1762           if (prefix_addresses
1763               ? show_raw_insn > 0
1764               : show_raw_insn >= 0)
1765             {
1766               while (pb < octets)
1767                 {
1768                   bfd_vma j;
1769                   char *s;
1770
1771                   putchar ('\n');
1772                   j = addr_offset * opb + pb;
1773
1774                   bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1775                   for (s = buf + skip_addr_chars; *s == '0'; s++)
1776                     *s = ' ';
1777                   if (*s == '\0')
1778                     *--s = '0';
1779                   printf ("%s:\t", buf + skip_addr_chars);
1780
1781                   pb += octets_per_line;
1782                   if (pb > octets)
1783                     pb = octets;
1784                   for (; j < addr_offset * opb + pb; j += bpc)
1785                     {
1786                       int k;
1787
1788                       if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1789                         {
1790                           for (k = bpc - 1; k >= 0; k--)
1791                             printf ("%02x", (unsigned) data[j + k]);
1792                           putchar (' ');
1793                         }
1794                       else
1795                         {
1796                           for (k = 0; k < bpc; k++)
1797                             printf ("%02x", (unsigned) data[j + k]);
1798                           putchar (' ');
1799                         }
1800                     }
1801                 }
1802             }
1803
1804           if (!wide_output)
1805             putchar ('\n');
1806           else
1807             need_nl = TRUE;
1808         }
1809
1810       while ((*relppp) < relppend
1811              && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1812         {
1813           if (dump_reloc_info || dump_dynamic_reloc_info)
1814             {
1815               arelent *q;
1816
1817               q = **relppp;
1818
1819               if (wide_output)
1820                 putchar ('\t');
1821               else
1822                 printf ("\t\t\t");
1823
1824               objdump_print_value (section->vma - rel_offset + q->address,
1825                                    inf, TRUE);
1826
1827               if (q->howto == NULL)
1828                 printf (": *unknown*\t");
1829               else if (q->howto->name)
1830                 printf (": %s\t", q->howto->name);
1831               else
1832                 printf (": %d\t", q->howto->type);
1833
1834               if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1835                 printf ("*unknown*");
1836               else
1837                 {
1838                   const char *sym_name;
1839
1840                   sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1841                   if (sym_name != NULL && *sym_name != '\0')
1842                     objdump_print_symname (aux->abfd, inf, *q->sym_ptr_ptr);
1843                   else
1844                     {
1845                       asection *sym_sec;
1846
1847                       sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1848                       sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1849                       if (sym_name == NULL || *sym_name == '\0')
1850                         sym_name = "*unknown*";
1851                       printf ("%s", sym_name);
1852                     }
1853                 }
1854
1855               if (q->addend)
1856                 {
1857                   bfd_signed_vma addend = q->addend;
1858                   if (addend < 0)
1859                     {
1860                       printf ("-0x");
1861                       addend = -addend;
1862                     }
1863                   else
1864                     printf ("+0x");
1865                   objdump_print_value (addend, inf, TRUE);
1866                 }
1867
1868               printf ("\n");
1869               need_nl = FALSE;
1870             }
1871           ++(*relppp);
1872         }
1873
1874       if (need_nl)
1875         printf ("\n");
1876
1877       addr_offset += octets / opb;
1878     }
1879
1880   free (sfile.buffer);
1881 }
1882
1883 static void
1884 disassemble_section (bfd *abfd, asection *section, void *inf)
1885 {
1886   const struct elf_backend_data * bed;
1887   bfd_vma                      sign_adjust = 0;
1888   struct disassemble_info *    pinfo = (struct disassemble_info *) inf;
1889   struct objdump_disasm_info * paux;
1890   unsigned int                 opb = pinfo->octets_per_byte;
1891   bfd_byte *                   data = NULL;
1892   bfd_size_type                datasize = 0;
1893   arelent **                   rel_pp = NULL;
1894   arelent **                   rel_ppstart = NULL;
1895   arelent **                   rel_ppend;
1896   unsigned long                stop_offset;
1897   asymbol *                    sym = NULL;
1898   long                         place = 0;
1899   long                         rel_count;
1900   bfd_vma                      rel_offset;
1901   unsigned long                addr_offset;
1902
1903   /* Sections that do not contain machine
1904      code are not normally disassembled.  */
1905   if (! disassemble_all
1906       && only_list == NULL
1907       && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1908           != (SEC_CODE | SEC_HAS_CONTENTS)))
1909     return;
1910
1911   if (! process_section_p (section))
1912     return;
1913
1914   datasize = bfd_get_section_size (section);
1915   if (datasize == 0)
1916     return;
1917
1918   if (start_address == (bfd_vma) -1
1919       || start_address < section->vma)
1920     addr_offset = 0;
1921   else
1922     addr_offset = start_address - section->vma;
1923
1924   if (stop_address == (bfd_vma) -1)
1925     stop_offset = datasize / opb;
1926   else
1927     {
1928       if (stop_address < section->vma)
1929         stop_offset = 0;
1930       else
1931         stop_offset = stop_address - section->vma;
1932       if (stop_offset > datasize / opb)
1933         stop_offset = datasize / opb;
1934     }
1935
1936   if (addr_offset >= stop_offset)
1937     return;
1938
1939   /* Decide which set of relocs to use.  Load them if necessary.  */
1940   paux = (struct objdump_disasm_info *) pinfo->application_data;
1941   if (paux->dynrelbuf)
1942     {
1943       rel_pp = paux->dynrelbuf;
1944       rel_count = paux->dynrelcount;
1945       /* Dynamic reloc addresses are absolute, non-dynamic are section
1946          relative.  REL_OFFSET specifies the reloc address corresponding
1947          to the start of this section.  */
1948       rel_offset = section->vma;
1949     }
1950   else
1951     {
1952       rel_count = 0;
1953       rel_pp = NULL;
1954       rel_offset = 0;
1955
1956       if ((section->flags & SEC_RELOC) != 0
1957           && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1958         {
1959           long relsize;
1960
1961           relsize = bfd_get_reloc_upper_bound (abfd, section);
1962           if (relsize < 0)
1963             bfd_fatal (bfd_get_filename (abfd));
1964
1965           if (relsize > 0)
1966             {
1967               rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
1968               rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1969               if (rel_count < 0)
1970                 bfd_fatal (bfd_get_filename (abfd));
1971
1972               /* Sort the relocs by address.  */
1973               qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1974             }
1975         }
1976     }
1977   rel_ppend = rel_pp + rel_count;
1978
1979   data = (bfd_byte *) xmalloc (datasize);
1980
1981   bfd_get_section_contents (abfd, section, data, 0, datasize);
1982
1983   paux->sec = section;
1984   pinfo->buffer = data;
1985   pinfo->buffer_vma = section->vma;
1986   pinfo->buffer_length = datasize;
1987   pinfo->section = section;
1988
1989   /* Skip over the relocs belonging to addresses below the
1990      start address.  */
1991   while (rel_pp < rel_ppend
1992          && (*rel_pp)->address < rel_offset + addr_offset)
1993     ++rel_pp;
1994
1995   printf (_("\nDisassembly of section %s:\n"), section->name);
1996
1997   /* Find the nearest symbol forwards from our current position.  */
1998   paux->require_sec = TRUE;
1999   sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
2000                                              (struct disassemble_info *) inf,
2001                                              &place);
2002   paux->require_sec = FALSE;
2003
2004   /* PR 9774: If the target used signed addresses then we must make
2005      sure that we sign extend the value that we calculate for 'addr'
2006      in the loop below.  */
2007   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2008       && (bed = get_elf_backend_data (abfd)) != NULL
2009       && bed->sign_extend_vma)
2010     sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
2011
2012   /* Disassemble a block of instructions up to the address associated with
2013      the symbol we have just found.  Then print the symbol and find the
2014      next symbol on.  Repeat until we have disassembled the entire section
2015      or we have reached the end of the address range we are interested in.  */
2016   while (addr_offset < stop_offset)
2017     {
2018       bfd_vma addr;
2019       asymbol *nextsym;
2020       unsigned long nextstop_offset;
2021       bfd_boolean insns;
2022
2023       addr = section->vma + addr_offset;
2024       addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
2025
2026       if (sym != NULL && bfd_asymbol_value (sym) <= addr)
2027         {
2028           int x;
2029
2030           for (x = place;
2031                (x < sorted_symcount
2032                 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
2033                ++x)
2034             continue;
2035
2036           pinfo->symbols = sorted_syms + place;
2037           pinfo->num_symbols = x - place;
2038           pinfo->symtab_pos = place;
2039         }
2040       else
2041         {
2042           pinfo->symbols = NULL;
2043           pinfo->num_symbols = 0;
2044           pinfo->symtab_pos = -1;
2045         }
2046
2047       if (! prefix_addresses)
2048         {
2049           pinfo->fprintf_func (pinfo->stream, "\n");
2050           objdump_print_addr_with_sym (abfd, section, sym, addr,
2051                                        pinfo, FALSE);
2052           pinfo->fprintf_func (pinfo->stream, ":\n");
2053         }
2054
2055       if (sym != NULL && bfd_asymbol_value (sym) > addr)
2056         nextsym = sym;
2057       else if (sym == NULL)
2058         nextsym = NULL;
2059       else
2060         {
2061 #define is_valid_next_sym(SYM) \
2062   ((SYM)->section == section \
2063    && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
2064    && pinfo->symbol_is_valid (SYM, pinfo))
2065             
2066           /* Search forward for the next appropriate symbol in
2067              SECTION.  Note that all the symbols are sorted
2068              together into one big array, and that some sections
2069              may have overlapping addresses.  */
2070           while (place < sorted_symcount
2071                  && ! is_valid_next_sym (sorted_syms [place]))
2072             ++place;
2073
2074           if (place >= sorted_symcount)
2075             nextsym = NULL;
2076           else
2077             nextsym = sorted_syms[place];
2078         }
2079
2080       if (sym != NULL && bfd_asymbol_value (sym) > addr)
2081         nextstop_offset = bfd_asymbol_value (sym) - section->vma;
2082       else if (nextsym == NULL)
2083         nextstop_offset = stop_offset;
2084       else
2085         nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
2086
2087       if (nextstop_offset > stop_offset
2088           || nextstop_offset <= addr_offset)
2089         nextstop_offset = stop_offset;
2090
2091       /* If a symbol is explicitly marked as being an object
2092          rather than a function, just dump the bytes without
2093          disassembling them.  */
2094       if (disassemble_all
2095           || sym == NULL
2096           || sym->section != section
2097           || bfd_asymbol_value (sym) > addr
2098           || ((sym->flags & BSF_OBJECT) == 0
2099               && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
2100                   == NULL)
2101               && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
2102                   == NULL))
2103           || (sym->flags & BSF_FUNCTION) != 0)
2104         insns = TRUE;
2105       else
2106         insns = FALSE;
2107
2108       disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2109                          addr_offset, nextstop_offset,
2110                          rel_offset, &rel_pp, rel_ppend);
2111       
2112       addr_offset = nextstop_offset;
2113       sym = nextsym;
2114     }
2115
2116   free (data);
2117
2118   if (rel_ppstart != NULL)
2119     free (rel_ppstart);
2120 }
2121
2122 /* Disassemble the contents of an object file.  */
2123
2124 static void
2125 disassemble_data (bfd *abfd)
2126 {
2127   struct disassemble_info disasm_info;
2128   struct objdump_disasm_info aux;
2129   long i;
2130
2131   print_files = NULL;
2132   prev_functionname = NULL;
2133   prev_line = -1;
2134   prev_discriminator = 0;
2135
2136   /* We make a copy of syms to sort.  We don't want to sort syms
2137      because that will screw up the relocs.  */
2138   sorted_symcount = symcount ? symcount : dynsymcount;
2139   sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2140                                       * sizeof (asymbol *));
2141   memcpy (sorted_syms, symcount ? syms : dynsyms,
2142           sorted_symcount * sizeof (asymbol *));
2143
2144   sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2145
2146   for (i = 0; i < synthcount; ++i)
2147     {
2148       sorted_syms[sorted_symcount] = synthsyms + i;
2149       ++sorted_symcount;
2150     }
2151
2152   /* Sort the symbols into section and symbol order.  */
2153   qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2154
2155   init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
2156
2157   disasm_info.application_data = (void *) &aux;
2158   aux.abfd = abfd;
2159   aux.require_sec = FALSE;
2160   aux.dynrelbuf = NULL;
2161   aux.dynrelcount = 0;
2162   aux.reloc = NULL;
2163
2164   disasm_info.print_address_func = objdump_print_address;
2165   disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2166
2167   if (machine != NULL)
2168     {
2169       const bfd_arch_info_type *inf = bfd_scan_arch (machine);
2170
2171       if (inf == NULL)
2172         fatal (_("can't use supplied machine %s"), machine);
2173
2174       abfd->arch_info = inf;
2175     }
2176
2177   if (endian != BFD_ENDIAN_UNKNOWN)
2178     {
2179       struct bfd_target *xvec;
2180
2181       xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
2182       memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2183       xvec->byteorder = endian;
2184       abfd->xvec = xvec;
2185     }
2186
2187   /* Use libopcodes to locate a suitable disassembler.  */
2188   aux.disassemble_fn = disassembler (abfd);
2189   if (!aux.disassemble_fn)
2190     {
2191       non_fatal (_("can't disassemble for architecture %s\n"),
2192                  bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2193       exit_status = 1;
2194       return;
2195     }
2196
2197   disasm_info.flavour = bfd_get_flavour (abfd);
2198   disasm_info.arch = bfd_get_arch (abfd);
2199   disasm_info.mach = bfd_get_mach (abfd);
2200   disasm_info.disassembler_options = disassembler_options;
2201   disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2202   disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2203   disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2204   disasm_info.disassembler_needs_relocs = FALSE;
2205
2206   if (bfd_big_endian (abfd))
2207     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2208   else if (bfd_little_endian (abfd))
2209     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2210   else
2211     /* ??? Aborting here seems too drastic.  We could default to big or little
2212        instead.  */
2213     disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2214
2215   /* Allow the target to customize the info structure.  */
2216   disassemble_init_for_target (& disasm_info);
2217
2218   /* Pre-load the dynamic relocs if we are going
2219      to be dumping them along with the disassembly.  */
2220   if (dump_dynamic_reloc_info)
2221     {
2222       long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2223   
2224       if (relsize < 0)
2225         bfd_fatal (bfd_get_filename (abfd));
2226
2227       if (relsize > 0)
2228         {
2229           aux.dynrelbuf = (arelent **) xmalloc (relsize);
2230           aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2231                                                             aux.dynrelbuf,
2232                                                             dynsyms);
2233           if (aux.dynrelcount < 0)
2234             bfd_fatal (bfd_get_filename (abfd));
2235
2236           /* Sort the relocs by address.  */
2237           qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2238                  compare_relocs);
2239         }
2240     }
2241   disasm_info.symtab = sorted_syms;
2242   disasm_info.symtab_size = sorted_symcount;
2243
2244   bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2245
2246   if (aux.dynrelbuf != NULL)
2247     free (aux.dynrelbuf);
2248   free (sorted_syms);
2249 }
2250 \f
2251 static int
2252 load_specific_debug_section (enum dwarf_section_display_enum debug,
2253                              asection *sec, void *file)
2254 {
2255   struct dwarf_section *section = &debug_displays [debug].section;
2256   bfd *abfd = (bfd *) file;
2257   bfd_boolean ret;
2258
2259   /* If it is already loaded, do nothing.  */
2260   if (section->start != NULL)
2261     return 1;
2262
2263   section->address = 0;
2264   section->size = bfd_get_section_size (sec);
2265   section->start = NULL;
2266   ret = bfd_get_full_section_contents (abfd, sec, &section->start);
2267
2268   if (! ret)
2269     {
2270       free_debug_section (debug);
2271       printf (_("\nCan't get contents for section '%s'.\n"),
2272               section->name);
2273       return 0;
2274     }
2275
2276   if (is_relocatable && debug_displays [debug].relocate)
2277     {
2278       bfd_cache_section_contents (sec, section->start);
2279
2280       ret = bfd_simple_get_relocated_section_contents (abfd,
2281                                                        sec,
2282                                                        section->start,
2283                                                        syms) != NULL;
2284
2285       if (! ret)
2286         {
2287           free_debug_section (debug);
2288           printf (_("\nCan't get contents for section '%s'.\n"),
2289                   section->name);
2290           return 0;
2291         }
2292     }
2293
2294   return 1;
2295 }
2296
2297 int
2298 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2299 {
2300   struct dwarf_section *section = &debug_displays [debug].section;
2301   bfd *abfd = (bfd *) file;
2302   asection *sec;
2303
2304   /* If it is already loaded, do nothing.  */
2305   if (section->start != NULL)
2306     return 1;
2307
2308   /* Locate the debug section.  */
2309   sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2310   if (sec != NULL)
2311     section->name = section->uncompressed_name;
2312   else
2313     {
2314       sec = bfd_get_section_by_name (abfd, section->compressed_name);
2315       if (sec != NULL)
2316         section->name = section->compressed_name;
2317     }
2318   if (sec == NULL)
2319     return 0;
2320
2321   return load_specific_debug_section (debug, sec, file);
2322 }
2323
2324 void
2325 free_debug_section (enum dwarf_section_display_enum debug)
2326 {
2327   struct dwarf_section *section = &debug_displays [debug].section;
2328
2329   if (section->start == NULL)
2330     return;
2331
2332   free ((char *) section->start);
2333   section->start = NULL;
2334   section->address = 0;
2335   section->size = 0;
2336 }
2337
2338 static void
2339 dump_dwarf_section (bfd *abfd, asection *section,
2340                     void *arg ATTRIBUTE_UNUSED)
2341 {
2342   const char *name = bfd_get_section_name (abfd, section);
2343   const char *match;
2344   int i;
2345
2346   if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2347     match = ".debug_info";
2348   else
2349     match = name;
2350
2351   for (i = 0; i < max; i++)
2352     if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2353          || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2354         && debug_displays [i].enabled != NULL
2355         && *debug_displays [i].enabled)
2356       {
2357         struct dwarf_section *sec = &debug_displays [i].section;
2358
2359         if (strcmp (sec->uncompressed_name, match) == 0)
2360           sec->name = sec->uncompressed_name;
2361         else
2362           sec->name = sec->compressed_name;
2363         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2364                                          section, abfd))
2365           {
2366             debug_displays [i].display (sec, abfd);
2367             
2368             if (i != info && i != abbrev)
2369               free_debug_section ((enum dwarf_section_display_enum) i);
2370           }
2371         break;
2372       }
2373 }
2374
2375 /* Dump the dwarf debugging information.  */
2376
2377 static void
2378 dump_dwarf (bfd *abfd)
2379 {
2380   is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2381
2382   eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
2383
2384   if (bfd_big_endian (abfd))
2385     byte_get = byte_get_big_endian;
2386   else if (bfd_little_endian (abfd))
2387     byte_get = byte_get_little_endian;
2388   else
2389     abort ();
2390
2391   switch (bfd_get_arch (abfd))
2392     {
2393     case bfd_arch_i386:
2394       switch (bfd_get_mach (abfd))
2395         {
2396         case bfd_mach_x86_64:
2397         case bfd_mach_x86_64_intel_syntax:
2398         case bfd_mach_x64_32:
2399         case bfd_mach_x64_32_intel_syntax:
2400           init_dwarf_regnames_x86_64 ();
2401           break;
2402
2403         default:
2404           init_dwarf_regnames_i386 ();
2405           break;
2406         }
2407       break;
2408
2409     default:
2410       break;
2411     }
2412
2413   bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2414
2415   free_debug_memory ();
2416 }
2417 \f
2418 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2419    it.  Return NULL on failure.   */
2420
2421 static char *
2422 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2423 {
2424   asection *stabsect;
2425   bfd_size_type size;
2426   char *contents;
2427
2428   stabsect = bfd_get_section_by_name (abfd, sect_name);
2429   if (stabsect == NULL)
2430     {
2431       printf (_("No %s section present\n\n"), sect_name);
2432       return FALSE;
2433     }
2434
2435   size = bfd_section_size (abfd, stabsect);
2436   contents  = (char *) xmalloc (size);
2437
2438   if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2439     {
2440       non_fatal (_("reading %s section of %s failed: %s"),
2441                  sect_name, bfd_get_filename (abfd),
2442                  bfd_errmsg (bfd_get_error ()));
2443       exit_status = 1;
2444       free (contents);
2445       return NULL;
2446     }
2447
2448   *size_ptr = size;
2449
2450   return contents;
2451 }
2452
2453 /* Stabs entries use a 12 byte format:
2454      4 byte string table index
2455      1 byte stab type
2456      1 byte stab other field
2457      2 byte stab desc field
2458      4 byte stab value
2459    FIXME: This will have to change for a 64 bit object format.  */
2460
2461 #define STRDXOFF  (0)
2462 #define TYPEOFF   (4)
2463 #define OTHEROFF  (5)
2464 #define DESCOFF   (6)
2465 #define VALOFF    (8)
2466 #define STABSIZE (12)
2467
2468 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2469    using string table section STRSECT_NAME (in `strtab').  */
2470
2471 static void
2472 print_section_stabs (bfd *abfd,
2473                      const char *stabsect_name,
2474                      unsigned *string_offset_ptr)
2475 {
2476   int i;
2477   unsigned file_string_table_offset = 0;
2478   unsigned next_file_string_table_offset = *string_offset_ptr;
2479   bfd_byte *stabp, *stabs_end;
2480
2481   stabp = stabs;
2482   stabs_end = stabp + stab_size;
2483
2484   printf (_("Contents of %s section:\n\n"), stabsect_name);
2485   printf ("Symnum n_type n_othr n_desc n_value  n_strx String\n");
2486
2487   /* Loop through all symbols and print them.
2488
2489      We start the index at -1 because there is a dummy symbol on
2490      the front of stabs-in-{coff,elf} sections that supplies sizes.  */
2491   for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2492     {
2493       const char *name;
2494       unsigned long strx;
2495       unsigned char type, other;
2496       unsigned short desc;
2497       bfd_vma value;
2498
2499       strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2500       type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2501       other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2502       desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2503       value = bfd_h_get_32 (abfd, stabp + VALOFF);
2504
2505       printf ("\n%-6d ", i);
2506       /* Either print the stab name, or, if unnamed, print its number
2507          again (makes consistent formatting for tools like awk).  */
2508       name = bfd_get_stab_name (type);
2509       if (name != NULL)
2510         printf ("%-6s", name);
2511       else if (type == N_UNDF)
2512         printf ("HdrSym");
2513       else
2514         printf ("%-6d", type);
2515       printf (" %-6d %-6d ", other, desc);
2516       bfd_printf_vma (abfd, value);
2517       printf (" %-6lu", strx);
2518
2519       /* Symbols with type == 0 (N_UNDF) specify the length of the
2520          string table associated with this file.  We use that info
2521          to know how to relocate the *next* file's string table indices.  */
2522       if (type == N_UNDF)
2523         {
2524           file_string_table_offset = next_file_string_table_offset;
2525           next_file_string_table_offset += value;
2526         }
2527       else
2528         {
2529           /* Using the (possibly updated) string table offset, print the
2530              string (if any) associated with this symbol.  */
2531           if ((strx + file_string_table_offset) < stabstr_size)
2532             printf (" %s", &strtab[strx + file_string_table_offset]);
2533           else
2534             printf (" *");
2535         }
2536     }
2537   printf ("\n\n");
2538   *string_offset_ptr = next_file_string_table_offset;
2539 }
2540
2541 typedef struct
2542 {
2543   const char * section_name;
2544   const char * string_section_name;
2545   unsigned string_offset;
2546 }
2547 stab_section_names;
2548
2549 static void
2550 find_stabs_section (bfd *abfd, asection *section, void *names)
2551 {
2552   int len;
2553   stab_section_names * sought = (stab_section_names *) names;
2554
2555   /* Check for section names for which stabsect_name is a prefix, to
2556      handle .stab.N, etc.  */
2557   len = strlen (sought->section_name);
2558
2559   /* If the prefix matches, and the files section name ends with a
2560      nul or a digit, then we match.  I.e., we want either an exact
2561      match or a section followed by a number.  */
2562   if (strncmp (sought->section_name, section->name, len) == 0
2563       && (section->name[len] == 0
2564           || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2565     {
2566       if (strtab == NULL)
2567         strtab = read_section_stabs (abfd, sought->string_section_name,
2568                                      &stabstr_size);
2569       
2570       if (strtab)
2571         {
2572           stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2573                                                    &stab_size);
2574           if (stabs)
2575             print_section_stabs (abfd, section->name, &sought->string_offset);
2576         }
2577     }
2578 }
2579
2580 static void
2581 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2582 {
2583   stab_section_names s;
2584
2585   s.section_name = stabsect_name;
2586   s.string_section_name = strsect_name;
2587   s.string_offset = 0;
2588
2589   bfd_map_over_sections (abfd, find_stabs_section, & s);
2590
2591   free (strtab);
2592   strtab = NULL;
2593 }
2594
2595 /* Dump the any sections containing stabs debugging information.  */
2596
2597 static void
2598 dump_stabs (bfd *abfd)
2599 {
2600   dump_stabs_section (abfd, ".stab", ".stabstr");
2601   dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2602   dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2603
2604   /* For Darwin.  */
2605   dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2606
2607   dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2608 }
2609 \f
2610 static void
2611 dump_bfd_header (bfd *abfd)
2612 {
2613   char *comma = "";
2614
2615   printf (_("architecture: %s, "),
2616           bfd_printable_arch_mach (bfd_get_arch (abfd),
2617                                    bfd_get_mach (abfd)));
2618   printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
2619
2620 #define PF(x, y)    if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2621   PF (HAS_RELOC, "HAS_RELOC");
2622   PF (EXEC_P, "EXEC_P");
2623   PF (HAS_LINENO, "HAS_LINENO");
2624   PF (HAS_DEBUG, "HAS_DEBUG");
2625   PF (HAS_SYMS, "HAS_SYMS");
2626   PF (HAS_LOCALS, "HAS_LOCALS");
2627   PF (DYNAMIC, "DYNAMIC");
2628   PF (WP_TEXT, "WP_TEXT");
2629   PF (D_PAGED, "D_PAGED");
2630   PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2631   PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2632   printf (_("\nstart address 0x"));
2633   bfd_printf_vma (abfd, abfd->start_address);
2634   printf ("\n");
2635 }
2636
2637 \f
2638 static void
2639 dump_bfd_private_header (bfd *abfd)
2640 {
2641   bfd_print_private_bfd_data (abfd, stdout);
2642 }
2643
2644 static void
2645 dump_target_specific (bfd *abfd)
2646 {
2647   const struct objdump_private_desc * const *desc;
2648   struct objdump_private_option *opt;
2649   char *e, *b;
2650
2651   /* Find the desc.  */
2652   for (desc = objdump_private_vectors; *desc != NULL; desc++)
2653     if ((*desc)->filter (abfd))
2654       break;
2655
2656   if (*desc == NULL)
2657     {
2658       non_fatal (_("option -P/--private not supported by this file"));
2659       return;
2660     }
2661
2662   /* Clear all options.  */
2663   for (opt = (*desc)->options; opt->name; opt++)
2664     opt->selected = FALSE;
2665
2666   /* Decode options.  */
2667   b = dump_private_options;
2668   do
2669     {
2670       e = strchr (b, ',');
2671
2672       if (e)
2673         *e = 0;
2674
2675       for (opt = (*desc)->options; opt->name; opt++)
2676         if (strcmp (opt->name, b) == 0)
2677           {
2678             opt->selected = TRUE;
2679             break;
2680           }
2681       if (opt->name == NULL)
2682         non_fatal (_("target specific dump '%s' not supported"), b);
2683
2684       if (e)
2685         {
2686           *e = ',';
2687           b = e + 1;
2688         }
2689     }
2690   while (e != NULL);
2691
2692   /* Dump.  */
2693   (*desc)->dump (abfd);
2694 }
2695 \f
2696 /* Display a section in hexadecimal format with associated characters.
2697    Each line prefixed by the zero padded address.  */
2698
2699 static void
2700 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2701 {
2702   bfd_byte *data = 0;
2703   bfd_size_type datasize;
2704   bfd_size_type addr_offset;
2705   bfd_size_type start_offset;
2706   bfd_size_type stop_offset;
2707   unsigned int opb = bfd_octets_per_byte (abfd);
2708   /* Bytes per line.  */
2709   const int onaline = 16;
2710   char buf[64];
2711   int count;
2712   int width;
2713
2714   if ((section->flags & SEC_HAS_CONTENTS) == 0)
2715     return;
2716
2717   if (! process_section_p (section))
2718     return;
2719   
2720   if ((datasize = bfd_section_size (abfd, section)) == 0)
2721     return;
2722
2723   /* Compute the address range to display.  */
2724   if (start_address == (bfd_vma) -1
2725       || start_address < section->vma)
2726     start_offset = 0;
2727   else
2728     start_offset = start_address - section->vma;
2729
2730   if (stop_address == (bfd_vma) -1)
2731     stop_offset = datasize / opb;
2732   else
2733     {
2734       if (stop_address < section->vma)
2735         stop_offset = 0;
2736       else
2737         stop_offset = stop_address - section->vma;
2738
2739       if (stop_offset > datasize / opb)
2740         stop_offset = datasize / opb;
2741     }
2742
2743   if (start_offset >= stop_offset)
2744     return;
2745   
2746   printf (_("Contents of section %s:"), section->name);
2747   if (display_file_offsets)
2748     printf (_("  (Starting at file offset: 0x%lx)"),
2749             (unsigned long) (section->filepos + start_offset));
2750   printf ("\n");
2751
2752   if (!bfd_get_full_section_contents (abfd, section, &data))
2753     {
2754       non_fatal (_("Reading section failed"));
2755       return;
2756     }
2757
2758   width = 4;
2759
2760   bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2761   if (strlen (buf) >= sizeof (buf))
2762     abort ();
2763
2764   count = 0;
2765   while (buf[count] == '0' && buf[count+1] != '\0')
2766     count++;
2767   count = strlen (buf) - count;
2768   if (count > width)
2769     width = count;
2770
2771   bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2772   if (strlen (buf) >= sizeof (buf))
2773     abort ();
2774
2775   count = 0;
2776   while (buf[count] == '0' && buf[count+1] != '\0')
2777     count++;
2778   count = strlen (buf) - count;
2779   if (count > width)
2780     width = count;
2781
2782   for (addr_offset = start_offset;
2783        addr_offset < stop_offset; addr_offset += onaline / opb)
2784     {
2785       bfd_size_type j;
2786
2787       bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2788       count = strlen (buf);
2789       if ((size_t) count >= sizeof (buf))
2790         abort ();
2791
2792       putchar (' ');
2793       while (count < width)
2794         {
2795           putchar ('0');
2796           count++;
2797         }
2798       fputs (buf + count - width, stdout);
2799       putchar (' ');
2800
2801       for (j = addr_offset * opb;
2802            j < addr_offset * opb + onaline; j++)
2803         {
2804           if (j < stop_offset * opb)
2805             printf ("%02x", (unsigned) (data[j]));
2806           else
2807             printf ("  ");
2808           if ((j & 3) == 3)
2809             printf (" ");
2810         }
2811
2812       printf (" ");
2813       for (j = addr_offset * opb;
2814            j < addr_offset * opb + onaline; j++)
2815         {
2816           if (j >= stop_offset * opb)
2817             printf (" ");
2818           else
2819             printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2820         }
2821       putchar ('\n');
2822     }
2823   free (data);
2824 }
2825
2826 /* Actually display the various requested regions.  */
2827
2828 static void
2829 dump_data (bfd *abfd)
2830 {
2831   bfd_map_over_sections (abfd, dump_section, NULL);
2832 }
2833
2834 /* Should perhaps share code and display with nm?  */
2835
2836 static void
2837 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2838 {
2839   asymbol **current;
2840   long max_count;
2841   long count;
2842
2843   if (dynamic)
2844     {
2845       current = dynsyms;
2846       max_count = dynsymcount;
2847       printf ("DYNAMIC SYMBOL TABLE:\n");
2848     }
2849   else
2850     {
2851       current = syms;
2852       max_count = symcount;
2853       printf ("SYMBOL TABLE:\n");
2854     }
2855
2856   if (max_count == 0)
2857     printf (_("no symbols\n"));
2858
2859   for (count = 0; count < max_count; count++)
2860     {
2861       bfd *cur_bfd;
2862
2863       if (*current == NULL)
2864         printf (_("no information for symbol number %ld\n"), count);
2865
2866       else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2867         printf (_("could not determine the type of symbol number %ld\n"),
2868                 count);
2869
2870       else if (process_section_p ((* current)->section)
2871                && (dump_special_syms
2872                    || !bfd_is_target_special_symbol (cur_bfd, *current)))
2873         {
2874           const char *name = (*current)->name;
2875
2876           if (do_demangle && name != NULL && *name != '\0')
2877             {
2878               char *alloc;
2879
2880               /* If we want to demangle the name, we demangle it
2881                  here, and temporarily clobber it while calling
2882                  bfd_print_symbol.  FIXME: This is a gross hack.  */
2883               alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2884               if (alloc != NULL)
2885                 (*current)->name = alloc;
2886               bfd_print_symbol (cur_bfd, stdout, *current,
2887                                 bfd_print_symbol_all);
2888               if (alloc != NULL)
2889                 {
2890                   (*current)->name = name;
2891                   free (alloc);
2892                 }
2893             }
2894           else
2895             bfd_print_symbol (cur_bfd, stdout, *current,
2896                               bfd_print_symbol_all);
2897           printf ("\n");
2898         }
2899
2900       current++;
2901     }
2902   printf ("\n\n");
2903 }
2904 \f
2905 static void
2906 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2907 {
2908   arelent **p;
2909   char *last_filename, *last_functionname;
2910   unsigned int last_line;
2911   unsigned int last_discriminator;
2912
2913   /* Get column headers lined up reasonably.  */
2914   {
2915     static int width;
2916
2917     if (width == 0)
2918       {
2919         char buf[30];
2920
2921         bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2922         width = strlen (buf) - 7;
2923       }
2924     printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2925   }
2926
2927   last_filename = NULL;
2928   last_functionname = NULL;
2929   last_line = 0;
2930   last_discriminator = 0;
2931
2932   for (p = relpp; relcount && *p != NULL; p++, relcount--)
2933     {
2934       arelent *q = *p;
2935       const char *filename, *functionname;
2936       unsigned int linenumber;
2937       unsigned int discriminator;
2938       const char *sym_name;
2939       const char *section_name;
2940       bfd_vma addend2 = 0;
2941
2942       if (start_address != (bfd_vma) -1
2943           && q->address < start_address)
2944         continue;
2945       if (stop_address != (bfd_vma) -1
2946           && q->address > stop_address)
2947         continue;
2948
2949       if (with_line_numbers
2950           && sec != NULL
2951           && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
2952                                                   &filename, &functionname,
2953                                                   &linenumber, &discriminator))
2954         {
2955           if (functionname != NULL
2956               && (last_functionname == NULL
2957                   || strcmp (functionname, last_functionname) != 0))
2958             {
2959               printf ("%s():\n", functionname);
2960               if (last_functionname != NULL)
2961                 free (last_functionname);
2962               last_functionname = xstrdup (functionname);
2963             }
2964
2965           if (linenumber > 0
2966               && (linenumber != last_line
2967                   || (filename != NULL
2968                       && last_filename != NULL
2969                       && filename_cmp (filename, last_filename) != 0)
2970                   || (discriminator != last_discriminator)))
2971             {
2972               if (discriminator > 0)
2973                 printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
2974               else
2975                 printf ("%s:%u (discriminator %u)\n", filename == NULL ? "???" : filename,
2976                         linenumber, discriminator);
2977               last_line = linenumber;
2978               last_discriminator = discriminator;
2979               if (last_filename != NULL)
2980                 free (last_filename);
2981               if (filename == NULL)
2982                 last_filename = NULL;
2983               else
2984                 last_filename = xstrdup (filename);
2985             }
2986         }
2987
2988       if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2989         {
2990           sym_name = (*(q->sym_ptr_ptr))->name;
2991           section_name = (*(q->sym_ptr_ptr))->section->name;
2992         }
2993       else
2994         {
2995           sym_name = NULL;
2996           section_name = NULL;
2997         }
2998
2999       bfd_printf_vma (abfd, q->address);
3000       if (q->howto == NULL)
3001         printf (" *unknown*         ");
3002       else if (q->howto->name)
3003         {
3004           const char *name = q->howto->name;
3005
3006           /* R_SPARC_OLO10 relocations contain two addends.
3007              But because 'arelent' lacks enough storage to
3008              store them both, the 64-bit ELF Sparc backend
3009              records this as two relocations.  One R_SPARC_LO10
3010              and one R_SPARC_13, both pointing to the same
3011              address.  This is merely so that we have some
3012              place to store both addend fields.
3013
3014              Undo this transformation, otherwise the output
3015              will be confusing.  */
3016           if (abfd->xvec->flavour == bfd_target_elf_flavour
3017               && elf_tdata(abfd)->elf_header->e_machine == EM_SPARCV9
3018               && relcount > 1
3019               && !strcmp (q->howto->name, "R_SPARC_LO10"))
3020             {
3021               arelent *q2 = *(p + 1);
3022               if (q2 != NULL
3023                   && q2->howto
3024                   && q->address == q2->address
3025                   && !strcmp (q2->howto->name, "R_SPARC_13"))
3026                 {
3027                   name = "R_SPARC_OLO10";
3028                   addend2 = q2->addend;
3029                   p++;
3030                 }
3031             }
3032           printf (" %-16s  ", name);
3033         }
3034       else
3035         printf (" %-16d  ", q->howto->type);
3036
3037       if (sym_name)
3038         {
3039           objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
3040         }
3041       else
3042         {
3043           if (section_name == NULL)
3044             section_name = "*unknown*";
3045           printf ("[%s]", section_name);
3046         }
3047
3048       if (q->addend)
3049         {
3050           bfd_signed_vma addend = q->addend;
3051           if (addend < 0)
3052             {
3053               printf ("-0x");
3054               addend = -addend;
3055             }
3056           else
3057             printf ("+0x");
3058           bfd_printf_vma (abfd, addend);
3059         }
3060       if (addend2)
3061         {
3062           printf ("+0x");
3063           bfd_printf_vma (abfd, addend2);
3064         }
3065
3066       printf ("\n");
3067     }
3068
3069   if (last_filename != NULL)
3070     free (last_filename);
3071   if (last_functionname != NULL)
3072     free (last_functionname);
3073 }
3074
3075 static void
3076 dump_relocs_in_section (bfd *abfd,
3077                         asection *section,
3078                         void *dummy ATTRIBUTE_UNUSED)
3079 {
3080   arelent **relpp;
3081   long relcount;
3082   long relsize;
3083
3084   if (   bfd_is_abs_section (section)
3085       || bfd_is_und_section (section)
3086       || bfd_is_com_section (section)
3087       || (! process_section_p (section))
3088       || ((section->flags & SEC_RELOC) == 0))
3089     return;
3090
3091   relsize = bfd_get_reloc_upper_bound (abfd, section);
3092   if (relsize < 0)
3093     bfd_fatal (bfd_get_filename (abfd));
3094
3095   printf ("RELOCATION RECORDS FOR [%s]:", section->name);
3096
3097   if (relsize == 0)
3098     {
3099       printf (" (none)\n\n");
3100       return;
3101     }
3102
3103   relpp = (arelent **) xmalloc (relsize);
3104   relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
3105
3106   if (relcount < 0)
3107     bfd_fatal (bfd_get_filename (abfd));
3108   else if (relcount == 0)
3109     printf (" (none)\n\n");
3110   else
3111     {
3112       printf ("\n");
3113       dump_reloc_set (abfd, section, relpp, relcount);
3114       printf ("\n\n");
3115     }
3116   free (relpp);
3117 }
3118
3119 static void
3120 dump_relocs (bfd *abfd)
3121 {
3122   bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
3123 }
3124
3125 static void
3126 dump_dynamic_relocs (bfd *abfd)
3127 {
3128   long relsize;
3129   arelent **relpp;
3130   long relcount;
3131
3132   relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3133   if (relsize < 0)
3134     bfd_fatal (bfd_get_filename (abfd));
3135
3136   printf ("DYNAMIC RELOCATION RECORDS");
3137
3138   if (relsize == 0)
3139     printf (" (none)\n\n");
3140   else
3141     {
3142       relpp = (arelent **) xmalloc (relsize);
3143       relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
3144
3145       if (relcount < 0)
3146         bfd_fatal (bfd_get_filename (abfd));
3147       else if (relcount == 0)
3148         printf (" (none)\n\n");
3149       else
3150         {
3151           printf ("\n");
3152           dump_reloc_set (abfd, NULL, relpp, relcount);
3153           printf ("\n\n");
3154         }
3155       free (relpp);
3156     }
3157 }
3158
3159 /* Creates a table of paths, to search for source files.  */
3160
3161 static void
3162 add_include_path (const char *path)
3163 {
3164   if (path[0] == 0)
3165     return;
3166   include_path_count++;
3167   include_paths = (const char **)
3168       xrealloc (include_paths, include_path_count * sizeof (*include_paths));
3169 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3170   if (path[1] == ':' && path[2] == 0)
3171     path = concat (path, ".", (const char *) 0);
3172 #endif
3173   include_paths[include_path_count - 1] = path;
3174 }
3175
3176 static void
3177 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
3178                   asection *section,
3179                   void *arg)
3180 {
3181   if ((section->flags & SEC_DEBUGGING) == 0)
3182     {
3183       bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
3184       section->vma += adjust_section_vma;
3185       if (*has_reloc_p)
3186         section->lma += adjust_section_vma;
3187     }
3188 }
3189
3190 /* Dump selected contents of ABFD.  */
3191
3192 static void
3193 dump_bfd (bfd *abfd)
3194 {
3195   /* If we are adjusting section VMA's, change them all now.  Changing
3196      the BFD information is a hack.  However, we must do it, or
3197      bfd_find_nearest_line will not do the right thing.  */
3198   if (adjust_section_vma != 0)
3199     {
3200       bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3201       bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
3202     }
3203
3204   if (! dump_debugging_tags && ! suppress_bfd_header)
3205     printf (_("\n%s:     file format %s\n"), bfd_get_filename (abfd),
3206             abfd->xvec->name);
3207   if (dump_ar_hdrs)
3208     print_arelt_descr (stdout, abfd, TRUE);
3209   if (dump_file_header)
3210     dump_bfd_header (abfd);
3211   if (dump_private_headers)
3212     dump_bfd_private_header (abfd);
3213   if (dump_private_options != NULL)
3214     dump_target_specific (abfd);
3215   if (! dump_debugging_tags && ! suppress_bfd_header)
3216     putchar ('\n');
3217
3218   if (dump_symtab
3219       || dump_reloc_info
3220       || disassemble
3221       || dump_debugging
3222       || dump_dwarf_section_info)
3223     syms = slurp_symtab (abfd);
3224
3225   if (dump_section_headers)
3226     dump_headers (abfd);
3227
3228   if (dump_dynamic_symtab || dump_dynamic_reloc_info
3229       || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
3230     dynsyms = slurp_dynamic_symtab (abfd);
3231   if (disassemble)
3232     {
3233       synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
3234                                              dynsymcount, dynsyms, &synthsyms);
3235       if (synthcount < 0)
3236         synthcount = 0;
3237     }
3238
3239   if (dump_symtab)
3240     dump_symbols (abfd, FALSE);
3241   if (dump_dynamic_symtab)
3242     dump_symbols (abfd, TRUE);
3243   if (dump_dwarf_section_info)
3244     dump_dwarf (abfd);
3245   if (dump_stab_section_info)
3246     dump_stabs (abfd);
3247   if (dump_reloc_info && ! disassemble)
3248     dump_relocs (abfd);
3249   if (dump_dynamic_reloc_info && ! disassemble)
3250     dump_dynamic_relocs (abfd);
3251   if (dump_section_contents)
3252     dump_data (abfd);
3253   if (disassemble)
3254     disassemble_data (abfd);
3255
3256   if (dump_debugging)
3257     {
3258       void *dhandle;
3259
3260       dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3261       if (dhandle != NULL)
3262         {
3263           if (!print_debugging_info (stdout, dhandle, abfd, syms,
3264                                      bfd_demangle,
3265                                      dump_debugging_tags ? TRUE : FALSE))
3266             {
3267               non_fatal (_("%s: printing debugging information failed"),
3268                          bfd_get_filename (abfd));
3269               exit_status = 1;
3270             }
3271         }
3272       /* PR 6483: If there was no STABS or IEEE debug
3273          info in the file, try DWARF instead.  */
3274       else if (! dump_dwarf_section_info)
3275         {
3276           dwarf_select_sections_all (); 
3277           dump_dwarf (abfd);
3278         }
3279     }
3280
3281   if (syms)
3282     {
3283       free (syms);
3284       syms = NULL;
3285     }
3286
3287   if (dynsyms)
3288     {
3289       free (dynsyms);
3290       dynsyms = NULL;
3291     }
3292
3293   if (synthsyms)
3294     {
3295       free (synthsyms);
3296       synthsyms = NULL;
3297     }
3298
3299   symcount = 0;
3300   dynsymcount = 0;
3301   synthcount = 0;
3302 }
3303
3304 static void
3305 display_object_bfd (bfd *abfd)
3306 {
3307   char **matching;
3308
3309   if (bfd_check_format_matches (abfd, bfd_object, &matching))
3310     {
3311       dump_bfd (abfd);
3312       return;
3313     }
3314
3315   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3316     {
3317       nonfatal (bfd_get_filename (abfd));
3318       list_matching_formats (matching);
3319       free (matching);
3320       return;
3321     }
3322
3323   if (bfd_get_error () != bfd_error_file_not_recognized)
3324     {
3325       nonfatal (bfd_get_filename (abfd));
3326       return;
3327     }
3328
3329   if (bfd_check_format_matches (abfd, bfd_core, &matching))
3330     {
3331       dump_bfd (abfd);
3332       return;
3333     }
3334
3335   nonfatal (bfd_get_filename (abfd));
3336
3337   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3338     {
3339       list_matching_formats (matching);
3340       free (matching);
3341     }
3342 }
3343
3344 static void
3345 display_any_bfd (bfd *file, int level)
3346 {
3347   /* Decompress sections unless dumping the section contents.  */
3348   if (!dump_section_contents)
3349     file->flags |= BFD_DECOMPRESS;
3350
3351   /* If the file is an archive, process all of its elements.  */
3352   if (bfd_check_format (file, bfd_archive))
3353     {
3354       bfd *arfile = NULL;
3355       bfd *last_arfile = NULL;
3356
3357       if (level == 0)
3358         printf (_("In archive %s:\n"), bfd_get_filename (file));
3359       else
3360         printf (_("In nested archive %s:\n"), bfd_get_filename (file));
3361
3362       for (;;)
3363         {
3364           bfd_set_error (bfd_error_no_error);
3365
3366           arfile = bfd_openr_next_archived_file (file, arfile);
3367           if (arfile == NULL)
3368             {
3369               if (bfd_get_error () != bfd_error_no_more_archived_files)
3370                 nonfatal (bfd_get_filename (file));
3371               break;
3372             }
3373
3374           display_any_bfd (arfile, level + 1);
3375
3376           if (last_arfile != NULL)
3377             bfd_close (last_arfile);
3378           last_arfile = arfile;
3379         }
3380
3381       if (last_arfile != NULL)
3382         bfd_close (last_arfile);
3383     }
3384   else
3385     display_object_bfd (file);
3386 }
3387
3388 static void
3389 display_file (char *filename, char *target)
3390 {
3391   bfd *file;
3392
3393   if (get_file_size (filename) < 1)
3394     {
3395       exit_status = 1;
3396       return;
3397     }
3398
3399   file = bfd_openr (filename, target);
3400   if (file == NULL)
3401     {
3402       nonfatal (filename);
3403       return;
3404     }
3405
3406   display_any_bfd (file, 0);
3407
3408   bfd_close (file);
3409 }
3410 \f
3411 int
3412 main (int argc, char **argv)
3413 {
3414   int c;
3415   char *target = default_target;
3416   bfd_boolean seenflag = FALSE;
3417
3418 #if defined (HAVE_SETLOCALE)
3419 #if defined (HAVE_LC_MESSAGES)
3420   setlocale (LC_MESSAGES, "");
3421 #endif
3422   setlocale (LC_CTYPE, "");
3423 #endif
3424
3425   bindtextdomain (PACKAGE, LOCALEDIR);
3426   textdomain (PACKAGE);
3427
3428   program_name = *argv;
3429   xmalloc_set_program_name (program_name);
3430
3431   START_PROGRESS (program_name, 0);
3432
3433   expandargv (&argc, &argv);
3434
3435   bfd_init ();
3436   set_default_bfd_target ();
3437
3438   while ((c = getopt_long (argc, argv,
3439                            "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
3440                            long_options, (int *) 0))
3441          != EOF)
3442     {
3443       switch (c)
3444         {
3445         case 0:
3446           break;                /* We've been given a long option.  */
3447         case 'm':
3448           machine = optarg;
3449           break;
3450         case 'M':
3451           if (disassembler_options)
3452             /* Ignore potential memory leak for now.  */
3453             disassembler_options = concat (disassembler_options, ",",
3454                                            optarg, (const char *) NULL);
3455           else
3456             disassembler_options = optarg;
3457           break;
3458         case 'j':
3459           add_only (optarg);
3460           break;
3461         case 'F':
3462           display_file_offsets = TRUE;
3463           break;
3464         case 'l':
3465           with_line_numbers = TRUE;
3466           break;
3467         case 'b':
3468           target = optarg;
3469           break;
3470         case 'C':
3471           do_demangle = TRUE;
3472           if (optarg != NULL)
3473             {
3474               enum demangling_styles style;
3475
3476               style = cplus_demangle_name_to_style (optarg);
3477               if (style == unknown_demangling)
3478                 fatal (_("unknown demangling style `%s'"),
3479                        optarg);
3480
3481               cplus_demangle_set_style (style);
3482             }
3483           break;
3484         case 'w':
3485           wide_output = TRUE;
3486           break;
3487         case OPTION_ADJUST_VMA:
3488           adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3489           break;
3490         case OPTION_START_ADDRESS:
3491           start_address = parse_vma (optarg, "--start-address");
3492           if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3493             fatal (_("error: the start address should be before the end address"));
3494           break;
3495         case OPTION_STOP_ADDRESS:
3496           stop_address = parse_vma (optarg, "--stop-address");
3497           if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3498             fatal (_("error: the stop address should be after the start address"));
3499           break;
3500         case OPTION_PREFIX:
3501           prefix = optarg;
3502           prefix_length = strlen (prefix);
3503           /* Remove an unnecessary trailing '/' */
3504           while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
3505             prefix_length--;
3506           break;
3507         case OPTION_PREFIX_STRIP:
3508           prefix_strip = atoi (optarg);
3509           if (prefix_strip < 0)
3510             fatal (_("error: prefix strip must be non-negative"));
3511           break;
3512         case OPTION_INSN_WIDTH:
3513           insn_width = strtoul (optarg, NULL, 0);
3514           if (insn_width <= 0)
3515             fatal (_("error: instruction width must be positive"));
3516           break;
3517         case 'E':
3518           if (strcmp (optarg, "B") == 0)
3519             endian = BFD_ENDIAN_BIG;
3520           else if (strcmp (optarg, "L") == 0)
3521             endian = BFD_ENDIAN_LITTLE;
3522           else
3523             {
3524               nonfatal (_("unrecognized -E option"));
3525               usage (stderr, 1);
3526             }
3527           break;
3528         case OPTION_ENDIAN:
3529           if (strncmp (optarg, "big", strlen (optarg)) == 0)
3530             endian = BFD_ENDIAN_BIG;
3531           else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3532             endian = BFD_ENDIAN_LITTLE;
3533           else
3534             {
3535               non_fatal (_("unrecognized --endian type `%s'"), optarg);
3536               exit_status = 1;
3537               usage (stderr, 1);
3538             }
3539           break;
3540
3541         case 'f':
3542           dump_file_header = TRUE;
3543           seenflag = TRUE;
3544           break;
3545         case 'i':
3546           formats_info = TRUE;
3547           seenflag = TRUE;
3548           break;
3549         case 'I':
3550           add_include_path (optarg);
3551           break;
3552         case 'p':
3553           dump_private_headers = TRUE;
3554           seenflag = TRUE;
3555           break;
3556         case 'P':
3557           dump_private_options = optarg;
3558           seenflag = TRUE;
3559           break;
3560         case 'x':
3561           dump_private_headers = TRUE;
3562           dump_symtab = TRUE;
3563           dump_reloc_info = TRUE;
3564           dump_file_header = TRUE;
3565           dump_ar_hdrs = TRUE;
3566           dump_section_headers = TRUE;
3567           seenflag = TRUE;
3568           break;
3569         case 't':
3570           dump_symtab = TRUE;
3571           seenflag = TRUE;
3572           break;
3573         case 'T':
3574           dump_dynamic_symtab = TRUE;
3575           seenflag = TRUE;
3576           break;
3577         case 'd':
3578           disassemble = TRUE;
3579           seenflag = TRUE;
3580           break;
3581         case 'z':
3582           disassemble_zeroes = TRUE;
3583           break;
3584         case 'D':
3585           disassemble = TRUE;
3586           disassemble_all = TRUE;
3587           seenflag = TRUE;
3588           break;
3589         case 'S':
3590           disassemble = TRUE;
3591           with_source_code = TRUE;
3592           seenflag = TRUE;
3593           break;
3594         case 'g':
3595           dump_debugging = 1;
3596           seenflag = TRUE;
3597           break;
3598         case 'e':
3599           dump_debugging = 1;
3600           dump_debugging_tags = 1;
3601           do_demangle = TRUE;
3602           seenflag = TRUE;
3603           break;
3604         case 'W':
3605           dump_dwarf_section_info = TRUE;
3606           seenflag = TRUE;
3607           if (optarg)
3608             dwarf_select_sections_by_letters (optarg);
3609           else
3610             dwarf_select_sections_all ();
3611           break;
3612         case OPTION_DWARF:
3613           dump_dwarf_section_info = TRUE;
3614           seenflag = TRUE;
3615           if (optarg)
3616             dwarf_select_sections_by_names (optarg);
3617           else
3618             dwarf_select_sections_all ();
3619           break;
3620         case OPTION_DWARF_DEPTH:
3621           {
3622             char *cp;
3623             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3624           }
3625           break;
3626         case OPTION_DWARF_START:
3627           {
3628             char *cp;
3629             dwarf_start_die = strtoul (optarg, & cp, 0);
3630             suppress_bfd_header = 1;
3631           }
3632           break;
3633         case OPTION_DWARF_CHECK:
3634           dwarf_check = TRUE;
3635           break;
3636         case 'G':
3637           dump_stab_section_info = TRUE;
3638           seenflag = TRUE;
3639           break;
3640         case 's':
3641           dump_section_contents = TRUE;
3642           seenflag = TRUE;
3643           break;
3644         case 'r':
3645           dump_reloc_info = TRUE;
3646           seenflag = TRUE;
3647           break;
3648         case 'R':
3649           dump_dynamic_reloc_info = TRUE;
3650           seenflag = TRUE;
3651           break;
3652         case 'a':
3653           dump_ar_hdrs = TRUE;
3654           seenflag = TRUE;
3655           break;
3656         case 'h':
3657           dump_section_headers = TRUE;
3658           seenflag = TRUE;
3659           break;
3660         case 'H':
3661           usage (stdout, 0);
3662           seenflag = TRUE;
3663         case 'v':
3664         case 'V':
3665           show_version = TRUE;
3666           seenflag = TRUE;
3667           break;
3668
3669         default:
3670           usage (stderr, 1);
3671         }
3672     }
3673
3674   if (show_version)
3675     print_version ("objdump");
3676
3677   if (!seenflag)
3678     usage (stderr, 2);
3679
3680   if (formats_info)
3681     exit_status = display_info ();
3682   else
3683     {
3684       if (optind == argc)
3685         display_file ("a.out", target);
3686       else
3687         for (; optind < argc;)
3688           display_file (argv[optind++], target);
3689     }
3690
3691   free_only_list ();
3692
3693   END_PROGRESS (program_name);
3694
3695   return exit_status;
3696 }