binutils/
[external/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 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   /* Decide which set of relocs to use.  Load them if necessary.  */
1919   paux = (struct objdump_disasm_info *) pinfo->application_data;
1920   if (paux->dynrelbuf)
1921     {
1922       rel_pp = paux->dynrelbuf;
1923       rel_count = paux->dynrelcount;
1924       /* Dynamic reloc addresses are absolute, non-dynamic are section
1925          relative.  REL_OFFSET specifies the reloc address corresponding
1926          to the start of this section.  */
1927       rel_offset = section->vma;
1928     }
1929   else
1930     {
1931       rel_count = 0;
1932       rel_pp = NULL;
1933       rel_offset = 0;
1934
1935       if ((section->flags & SEC_RELOC) != 0
1936           && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1937         {
1938           long relsize;
1939
1940           relsize = bfd_get_reloc_upper_bound (abfd, section);
1941           if (relsize < 0)
1942             bfd_fatal (bfd_get_filename (abfd));
1943
1944           if (relsize > 0)
1945             {
1946               rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
1947               rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1948               if (rel_count < 0)
1949                 bfd_fatal (bfd_get_filename (abfd));
1950
1951               /* Sort the relocs by address.  */
1952               qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1953             }
1954         }
1955     }
1956   rel_ppend = rel_pp + rel_count;
1957
1958   data = (bfd_byte *) xmalloc (datasize);
1959
1960   bfd_get_section_contents (abfd, section, data, 0, datasize);
1961
1962   paux->sec = section;
1963   pinfo->buffer = data;
1964   pinfo->buffer_vma = section->vma;
1965   pinfo->buffer_length = datasize;
1966   pinfo->section = section;
1967
1968   if (start_address == (bfd_vma) -1
1969       || start_address < pinfo->buffer_vma)
1970     addr_offset = 0;
1971   else
1972     addr_offset = start_address - pinfo->buffer_vma;
1973
1974   if (stop_address == (bfd_vma) -1)
1975     stop_offset = datasize / opb;
1976   else
1977     {
1978       if (stop_address < pinfo->buffer_vma)
1979         stop_offset = 0;
1980       else
1981         stop_offset = stop_address - pinfo->buffer_vma;
1982       if (stop_offset > pinfo->buffer_length / opb)
1983         stop_offset = pinfo->buffer_length / opb;
1984     }
1985
1986   /* Skip over the relocs belonging to addresses below the
1987      start address.  */
1988   while (rel_pp < rel_ppend
1989          && (*rel_pp)->address < rel_offset + addr_offset)
1990     ++rel_pp;
1991
1992   if (addr_offset < stop_offset)
1993     printf (_("\nDisassembly of section %s:\n"), section->name);
1994
1995   /* Find the nearest symbol forwards from our current position.  */
1996   paux->require_sec = TRUE;
1997   sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
1998                                              (struct disassemble_info *) inf,
1999                                              &place);
2000   paux->require_sec = FALSE;
2001
2002   /* PR 9774: If the target used signed addresses then we must make
2003      sure that we sign extend the value that we calculate for 'addr'
2004      in the loop below.  */
2005   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2006       && (bed = get_elf_backend_data (abfd)) != NULL
2007       && bed->sign_extend_vma)
2008     sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
2009
2010   /* Disassemble a block of instructions up to the address associated with
2011      the symbol we have just found.  Then print the symbol and find the
2012      next symbol on.  Repeat until we have disassembled the entire section
2013      or we have reached the end of the address range we are interested in.  */
2014   while (addr_offset < stop_offset)
2015     {
2016       bfd_vma addr;
2017       asymbol *nextsym;
2018       unsigned long nextstop_offset;
2019       bfd_boolean insns;
2020
2021       addr = section->vma + addr_offset;
2022       addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
2023
2024       if (sym != NULL && bfd_asymbol_value (sym) <= addr)
2025         {
2026           int x;
2027
2028           for (x = place;
2029                (x < sorted_symcount
2030                 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
2031                ++x)
2032             continue;
2033
2034           pinfo->symbols = sorted_syms + place;
2035           pinfo->num_symbols = x - place;
2036           pinfo->symtab_pos = place;
2037         }
2038       else
2039         {
2040           pinfo->symbols = NULL;
2041           pinfo->num_symbols = 0;
2042           pinfo->symtab_pos = -1;
2043         }
2044
2045       if (! prefix_addresses)
2046         {
2047           pinfo->fprintf_func (pinfo->stream, "\n");
2048           objdump_print_addr_with_sym (abfd, section, sym, addr,
2049                                        pinfo, FALSE);
2050           pinfo->fprintf_func (pinfo->stream, ":\n");
2051         }
2052
2053       if (sym != NULL && bfd_asymbol_value (sym) > addr)
2054         nextsym = sym;
2055       else if (sym == NULL)
2056         nextsym = NULL;
2057       else
2058         {
2059 #define is_valid_next_sym(SYM) \
2060   ((SYM)->section == section \
2061    && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
2062    && pinfo->symbol_is_valid (SYM, pinfo))
2063             
2064           /* Search forward for the next appropriate symbol in
2065              SECTION.  Note that all the symbols are sorted
2066              together into one big array, and that some sections
2067              may have overlapping addresses.  */
2068           while (place < sorted_symcount
2069                  && ! is_valid_next_sym (sorted_syms [place]))
2070             ++place;
2071
2072           if (place >= sorted_symcount)
2073             nextsym = NULL;
2074           else
2075             nextsym = sorted_syms[place];
2076         }
2077
2078       if (sym != NULL && bfd_asymbol_value (sym) > addr)
2079         nextstop_offset = bfd_asymbol_value (sym) - section->vma;
2080       else if (nextsym == NULL)
2081         nextstop_offset = stop_offset;
2082       else
2083         nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
2084
2085       if (nextstop_offset > stop_offset
2086           || nextstop_offset <= addr_offset)
2087         nextstop_offset = stop_offset;
2088
2089       /* If a symbol is explicitly marked as being an object
2090          rather than a function, just dump the bytes without
2091          disassembling them.  */
2092       if (disassemble_all
2093           || sym == NULL
2094           || sym->section != section
2095           || bfd_asymbol_value (sym) > addr
2096           || ((sym->flags & BSF_OBJECT) == 0
2097               && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
2098                   == NULL)
2099               && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
2100                   == NULL))
2101           || (sym->flags & BSF_FUNCTION) != 0)
2102         insns = TRUE;
2103       else
2104         insns = FALSE;
2105
2106       disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2107                          addr_offset, nextstop_offset,
2108                          rel_offset, &rel_pp, rel_ppend);
2109       
2110       addr_offset = nextstop_offset;
2111       sym = nextsym;
2112     }
2113
2114   free (data);
2115
2116   if (rel_ppstart != NULL)
2117     free (rel_ppstart);
2118 }
2119
2120 /* Disassemble the contents of an object file.  */
2121
2122 static void
2123 disassemble_data (bfd *abfd)
2124 {
2125   struct disassemble_info disasm_info;
2126   struct objdump_disasm_info aux;
2127   long i;
2128
2129   print_files = NULL;
2130   prev_functionname = NULL;
2131   prev_line = -1;
2132   prev_discriminator = 0;
2133
2134   /* We make a copy of syms to sort.  We don't want to sort syms
2135      because that will screw up the relocs.  */
2136   sorted_symcount = symcount ? symcount : dynsymcount;
2137   sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2138                                       * sizeof (asymbol *));
2139   memcpy (sorted_syms, symcount ? syms : dynsyms,
2140           sorted_symcount * sizeof (asymbol *));
2141
2142   sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2143
2144   for (i = 0; i < synthcount; ++i)
2145     {
2146       sorted_syms[sorted_symcount] = synthsyms + i;
2147       ++sorted_symcount;
2148     }
2149
2150   /* Sort the symbols into section and symbol order.  */
2151   qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2152
2153   init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
2154
2155   disasm_info.application_data = (void *) &aux;
2156   aux.abfd = abfd;
2157   aux.require_sec = FALSE;
2158   aux.dynrelbuf = NULL;
2159   aux.dynrelcount = 0;
2160   aux.reloc = NULL;
2161
2162   disasm_info.print_address_func = objdump_print_address;
2163   disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2164
2165   if (machine != NULL)
2166     {
2167       const bfd_arch_info_type *inf = bfd_scan_arch (machine);
2168
2169       if (inf == NULL)
2170         fatal (_("can't use supplied machine %s"), machine);
2171
2172       abfd->arch_info = inf;
2173     }
2174
2175   if (endian != BFD_ENDIAN_UNKNOWN)
2176     {
2177       struct bfd_target *xvec;
2178
2179       xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
2180       memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2181       xvec->byteorder = endian;
2182       abfd->xvec = xvec;
2183     }
2184
2185   /* Use libopcodes to locate a suitable disassembler.  */
2186   aux.disassemble_fn = disassembler (abfd);
2187   if (!aux.disassemble_fn)
2188     {
2189       non_fatal (_("can't disassemble for architecture %s\n"),
2190                  bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2191       exit_status = 1;
2192       return;
2193     }
2194
2195   disasm_info.flavour = bfd_get_flavour (abfd);
2196   disasm_info.arch = bfd_get_arch (abfd);
2197   disasm_info.mach = bfd_get_mach (abfd);
2198   disasm_info.disassembler_options = disassembler_options;
2199   disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2200   disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2201   disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2202   disasm_info.disassembler_needs_relocs = FALSE;
2203
2204   if (bfd_big_endian (abfd))
2205     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2206   else if (bfd_little_endian (abfd))
2207     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2208   else
2209     /* ??? Aborting here seems too drastic.  We could default to big or little
2210        instead.  */
2211     disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2212
2213   /* Allow the target to customize the info structure.  */
2214   disassemble_init_for_target (& disasm_info);
2215
2216   /* Pre-load the dynamic relocs if we are going
2217      to be dumping them along with the disassembly.  */
2218   if (dump_dynamic_reloc_info)
2219     {
2220       long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2221   
2222       if (relsize < 0)
2223         bfd_fatal (bfd_get_filename (abfd));
2224
2225       if (relsize > 0)
2226         {
2227           aux.dynrelbuf = (arelent **) xmalloc (relsize);
2228           aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2229                                                             aux.dynrelbuf,
2230                                                             dynsyms);
2231           if (aux.dynrelcount < 0)
2232             bfd_fatal (bfd_get_filename (abfd));
2233
2234           /* Sort the relocs by address.  */
2235           qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2236                  compare_relocs);
2237         }
2238     }
2239   disasm_info.symtab = sorted_syms;
2240   disasm_info.symtab_size = sorted_symcount;
2241
2242   bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2243
2244   if (aux.dynrelbuf != NULL)
2245     free (aux.dynrelbuf);
2246   free (sorted_syms);
2247 }
2248 \f
2249 static int
2250 load_specific_debug_section (enum dwarf_section_display_enum debug,
2251                              asection *sec, void *file)
2252 {
2253   struct dwarf_section *section = &debug_displays [debug].section;
2254   bfd *abfd = (bfd *) file;
2255   bfd_boolean ret;
2256
2257   /* If it is already loaded, do nothing.  */
2258   if (section->start != NULL)
2259     return 1;
2260
2261   section->address = 0;
2262   section->size = bfd_get_section_size (sec);
2263   section->start = NULL;
2264   ret = bfd_get_full_section_contents (abfd, sec, &section->start);
2265
2266   if (! ret)
2267     {
2268       free_debug_section (debug);
2269       printf (_("\nCan't get contents for section '%s'.\n"),
2270               section->name);
2271       return 0;
2272     }
2273
2274   if (is_relocatable && debug_displays [debug].relocate)
2275     {
2276       bfd_cache_section_contents (sec, section->start);
2277
2278       ret = bfd_simple_get_relocated_section_contents (abfd,
2279                                                        sec,
2280                                                        section->start,
2281                                                        syms) != NULL;
2282
2283       if (! ret)
2284         {
2285           free_debug_section (debug);
2286           printf (_("\nCan't get contents for section '%s'.\n"),
2287                   section->name);
2288           return 0;
2289         }
2290     }
2291
2292   return 1;
2293 }
2294
2295 int
2296 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2297 {
2298   struct dwarf_section *section = &debug_displays [debug].section;
2299   bfd *abfd = (bfd *) file;
2300   asection *sec;
2301
2302   /* If it is already loaded, do nothing.  */
2303   if (section->start != NULL)
2304     return 1;
2305
2306   /* Locate the debug section.  */
2307   sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2308   if (sec != NULL)
2309     section->name = section->uncompressed_name;
2310   else
2311     {
2312       sec = bfd_get_section_by_name (abfd, section->compressed_name);
2313       if (sec != NULL)
2314         section->name = section->compressed_name;
2315     }
2316   if (sec == NULL)
2317     return 0;
2318
2319   return load_specific_debug_section (debug, sec, file);
2320 }
2321
2322 void
2323 free_debug_section (enum dwarf_section_display_enum debug)
2324 {
2325   struct dwarf_section *section = &debug_displays [debug].section;
2326
2327   if (section->start == NULL)
2328     return;
2329
2330   free ((char *) section->start);
2331   section->start = NULL;
2332   section->address = 0;
2333   section->size = 0;
2334 }
2335
2336 static void
2337 dump_dwarf_section (bfd *abfd, asection *section,
2338                     void *arg ATTRIBUTE_UNUSED)
2339 {
2340   const char *name = bfd_get_section_name (abfd, section);
2341   const char *match;
2342   int i;
2343
2344   if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2345     match = ".debug_info";
2346   else
2347     match = name;
2348
2349   for (i = 0; i < max; i++)
2350     if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2351          || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2352         && debug_displays [i].enabled != NULL
2353         && *debug_displays [i].enabled)
2354       {
2355         struct dwarf_section *sec = &debug_displays [i].section;
2356
2357         if (strcmp (sec->uncompressed_name, match) == 0)
2358           sec->name = sec->uncompressed_name;
2359         else
2360           sec->name = sec->compressed_name;
2361         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2362                                          section, abfd))
2363           {
2364             debug_displays [i].display (sec, abfd);
2365             
2366             if (i != info && i != abbrev)
2367               free_debug_section ((enum dwarf_section_display_enum) i);
2368           }
2369         break;
2370       }
2371 }
2372
2373 /* Dump the dwarf debugging information.  */
2374
2375 static void
2376 dump_dwarf (bfd *abfd)
2377 {
2378   is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2379
2380   eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
2381
2382   if (bfd_big_endian (abfd))
2383     byte_get = byte_get_big_endian;
2384   else if (bfd_little_endian (abfd))
2385     byte_get = byte_get_little_endian;
2386   else
2387     abort ();
2388
2389   switch (bfd_get_arch (abfd))
2390     {
2391     case bfd_arch_i386:
2392       switch (bfd_get_mach (abfd))
2393         {
2394         case bfd_mach_x86_64:
2395         case bfd_mach_x86_64_intel_syntax:
2396         case bfd_mach_x64_32:
2397         case bfd_mach_x64_32_intel_syntax:
2398           init_dwarf_regnames_x86_64 ();
2399           break;
2400
2401         default:
2402           init_dwarf_regnames_i386 ();
2403           break;
2404         }
2405       break;
2406
2407     default:
2408       break;
2409     }
2410
2411   bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2412
2413   free_debug_memory ();
2414 }
2415 \f
2416 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2417    it.  Return NULL on failure.   */
2418
2419 static char *
2420 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2421 {
2422   asection *stabsect;
2423   bfd_size_type size;
2424   char *contents;
2425
2426   stabsect = bfd_get_section_by_name (abfd, sect_name);
2427   if (stabsect == NULL)
2428     {
2429       printf (_("No %s section present\n\n"), sect_name);
2430       return FALSE;
2431     }
2432
2433   size = bfd_section_size (abfd, stabsect);
2434   contents  = (char *) xmalloc (size);
2435
2436   if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2437     {
2438       non_fatal (_("reading %s section of %s failed: %s"),
2439                  sect_name, bfd_get_filename (abfd),
2440                  bfd_errmsg (bfd_get_error ()));
2441       exit_status = 1;
2442       free (contents);
2443       return NULL;
2444     }
2445
2446   *size_ptr = size;
2447
2448   return contents;
2449 }
2450
2451 /* Stabs entries use a 12 byte format:
2452      4 byte string table index
2453      1 byte stab type
2454      1 byte stab other field
2455      2 byte stab desc field
2456      4 byte stab value
2457    FIXME: This will have to change for a 64 bit object format.  */
2458
2459 #define STRDXOFF  (0)
2460 #define TYPEOFF   (4)
2461 #define OTHEROFF  (5)
2462 #define DESCOFF   (6)
2463 #define VALOFF    (8)
2464 #define STABSIZE (12)
2465
2466 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2467    using string table section STRSECT_NAME (in `strtab').  */
2468
2469 static void
2470 print_section_stabs (bfd *abfd,
2471                      const char *stabsect_name,
2472                      unsigned *string_offset_ptr)
2473 {
2474   int i;
2475   unsigned file_string_table_offset = 0;
2476   unsigned next_file_string_table_offset = *string_offset_ptr;
2477   bfd_byte *stabp, *stabs_end;
2478
2479   stabp = stabs;
2480   stabs_end = stabp + stab_size;
2481
2482   printf (_("Contents of %s section:\n\n"), stabsect_name);
2483   printf ("Symnum n_type n_othr n_desc n_value  n_strx String\n");
2484
2485   /* Loop through all symbols and print them.
2486
2487      We start the index at -1 because there is a dummy symbol on
2488      the front of stabs-in-{coff,elf} sections that supplies sizes.  */
2489   for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2490     {
2491       const char *name;
2492       unsigned long strx;
2493       unsigned char type, other;
2494       unsigned short desc;
2495       bfd_vma value;
2496
2497       strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2498       type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2499       other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2500       desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2501       value = bfd_h_get_32 (abfd, stabp + VALOFF);
2502
2503       printf ("\n%-6d ", i);
2504       /* Either print the stab name, or, if unnamed, print its number
2505          again (makes consistent formatting for tools like awk).  */
2506       name = bfd_get_stab_name (type);
2507       if (name != NULL)
2508         printf ("%-6s", name);
2509       else if (type == N_UNDF)
2510         printf ("HdrSym");
2511       else
2512         printf ("%-6d", type);
2513       printf (" %-6d %-6d ", other, desc);
2514       bfd_printf_vma (abfd, value);
2515       printf (" %-6lu", strx);
2516
2517       /* Symbols with type == 0 (N_UNDF) specify the length of the
2518          string table associated with this file.  We use that info
2519          to know how to relocate the *next* file's string table indices.  */
2520       if (type == N_UNDF)
2521         {
2522           file_string_table_offset = next_file_string_table_offset;
2523           next_file_string_table_offset += value;
2524         }
2525       else
2526         {
2527           /* Using the (possibly updated) string table offset, print the
2528              string (if any) associated with this symbol.  */
2529           if ((strx + file_string_table_offset) < stabstr_size)
2530             printf (" %s", &strtab[strx + file_string_table_offset]);
2531           else
2532             printf (" *");
2533         }
2534     }
2535   printf ("\n\n");
2536   *string_offset_ptr = next_file_string_table_offset;
2537 }
2538
2539 typedef struct
2540 {
2541   const char * section_name;
2542   const char * string_section_name;
2543   unsigned string_offset;
2544 }
2545 stab_section_names;
2546
2547 static void
2548 find_stabs_section (bfd *abfd, asection *section, void *names)
2549 {
2550   int len;
2551   stab_section_names * sought = (stab_section_names *) names;
2552
2553   /* Check for section names for which stabsect_name is a prefix, to
2554      handle .stab.N, etc.  */
2555   len = strlen (sought->section_name);
2556
2557   /* If the prefix matches, and the files section name ends with a
2558      nul or a digit, then we match.  I.e., we want either an exact
2559      match or a section followed by a number.  */
2560   if (strncmp (sought->section_name, section->name, len) == 0
2561       && (section->name[len] == 0
2562           || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2563     {
2564       if (strtab == NULL)
2565         strtab = read_section_stabs (abfd, sought->string_section_name,
2566                                      &stabstr_size);
2567       
2568       if (strtab)
2569         {
2570           stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2571                                                    &stab_size);
2572           if (stabs)
2573             print_section_stabs (abfd, section->name, &sought->string_offset);
2574         }
2575     }
2576 }
2577
2578 static void
2579 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2580 {
2581   stab_section_names s;
2582
2583   s.section_name = stabsect_name;
2584   s.string_section_name = strsect_name;
2585   s.string_offset = 0;
2586
2587   bfd_map_over_sections (abfd, find_stabs_section, & s);
2588
2589   free (strtab);
2590   strtab = NULL;
2591 }
2592
2593 /* Dump the any sections containing stabs debugging information.  */
2594
2595 static void
2596 dump_stabs (bfd *abfd)
2597 {
2598   dump_stabs_section (abfd, ".stab", ".stabstr");
2599   dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2600   dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2601
2602   /* For Darwin.  */
2603   dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2604
2605   dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2606 }
2607 \f
2608 static void
2609 dump_bfd_header (bfd *abfd)
2610 {
2611   char *comma = "";
2612
2613   printf (_("architecture: %s, "),
2614           bfd_printable_arch_mach (bfd_get_arch (abfd),
2615                                    bfd_get_mach (abfd)));
2616   printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
2617
2618 #define PF(x, y)    if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2619   PF (HAS_RELOC, "HAS_RELOC");
2620   PF (EXEC_P, "EXEC_P");
2621   PF (HAS_LINENO, "HAS_LINENO");
2622   PF (HAS_DEBUG, "HAS_DEBUG");
2623   PF (HAS_SYMS, "HAS_SYMS");
2624   PF (HAS_LOCALS, "HAS_LOCALS");
2625   PF (DYNAMIC, "DYNAMIC");
2626   PF (WP_TEXT, "WP_TEXT");
2627   PF (D_PAGED, "D_PAGED");
2628   PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2629   PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2630   printf (_("\nstart address 0x"));
2631   bfd_printf_vma (abfd, abfd->start_address);
2632   printf ("\n");
2633 }
2634
2635 \f
2636 static void
2637 dump_bfd_private_header (bfd *abfd)
2638 {
2639   bfd_print_private_bfd_data (abfd, stdout);
2640 }
2641
2642 static void
2643 dump_target_specific (bfd *abfd)
2644 {
2645   const struct objdump_private_desc * const *desc;
2646   struct objdump_private_option *opt;
2647   char *e, *b;
2648
2649   /* Find the desc.  */
2650   for (desc = objdump_private_vectors; *desc != NULL; desc++)
2651     if ((*desc)->filter (abfd))
2652       break;
2653
2654   if (desc == NULL)
2655     {
2656       non_fatal (_("option -P/--private not supported by this file"));
2657       return;
2658     }
2659
2660   /* Clear all options.  */
2661   for (opt = (*desc)->options; opt->name; opt++)
2662     opt->selected = FALSE;
2663
2664   /* Decode options.  */
2665   b = dump_private_options;
2666   do
2667     {
2668       e = strchr (b, ',');
2669
2670       if (e)
2671         *e = 0;
2672
2673       for (opt = (*desc)->options; opt->name; opt++)
2674         if (strcmp (opt->name, b) == 0)
2675           {
2676             opt->selected = TRUE;
2677             break;
2678           }
2679       if (opt->name == NULL)
2680         non_fatal (_("target specific dump '%s' not supported"), b);
2681
2682       if (e)
2683         {
2684           *e = ',';
2685           b = e + 1;
2686         }
2687     }
2688   while (e != NULL);
2689
2690   /* Dump.  */
2691   (*desc)->dump (abfd);
2692 }
2693 \f
2694 /* Display a section in hexadecimal format with associated characters.
2695    Each line prefixed by the zero padded address.  */
2696
2697 static void
2698 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2699 {
2700   bfd_byte *data = 0;
2701   bfd_size_type datasize;
2702   bfd_size_type addr_offset;
2703   bfd_size_type start_offset;
2704   bfd_size_type stop_offset;
2705   unsigned int opb = bfd_octets_per_byte (abfd);
2706   /* Bytes per line.  */
2707   const int onaline = 16;
2708   char buf[64];
2709   int count;
2710   int width;
2711
2712   if ((section->flags & SEC_HAS_CONTENTS) == 0)
2713     return;
2714
2715   if (! process_section_p (section))
2716     return;
2717   
2718   if ((datasize = bfd_section_size (abfd, section)) == 0)
2719     return;
2720
2721   /* Compute the address range to display.  */
2722   if (start_address == (bfd_vma) -1
2723       || start_address < section->vma)
2724     start_offset = 0;
2725   else
2726     start_offset = start_address - section->vma;
2727
2728   if (stop_address == (bfd_vma) -1)
2729     stop_offset = datasize / opb;
2730   else
2731     {
2732       if (stop_address < section->vma)
2733         stop_offset = 0;
2734       else
2735         stop_offset = stop_address - section->vma;
2736
2737       if (stop_offset > datasize / opb)
2738         stop_offset = datasize / opb;
2739     }
2740
2741   if (start_offset >= stop_offset)
2742     return;
2743   
2744   printf (_("Contents of section %s:"), section->name);
2745   if (display_file_offsets)
2746     printf (_("  (Starting at file offset: 0x%lx)"),
2747             (unsigned long) (section->filepos + start_offset));
2748   printf ("\n");
2749
2750   if (!bfd_get_full_section_contents (abfd, section, &data))
2751     {
2752       non_fatal (_("Reading section failed"));
2753       return;
2754     }
2755
2756   width = 4;
2757
2758   bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2759   if (strlen (buf) >= sizeof (buf))
2760     abort ();
2761
2762   count = 0;
2763   while (buf[count] == '0' && buf[count+1] != '\0')
2764     count++;
2765   count = strlen (buf) - count;
2766   if (count > width)
2767     width = count;
2768
2769   bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2770   if (strlen (buf) >= sizeof (buf))
2771     abort ();
2772
2773   count = 0;
2774   while (buf[count] == '0' && buf[count+1] != '\0')
2775     count++;
2776   count = strlen (buf) - count;
2777   if (count > width)
2778     width = count;
2779
2780   for (addr_offset = start_offset;
2781        addr_offset < stop_offset; addr_offset += onaline / opb)
2782     {
2783       bfd_size_type j;
2784
2785       bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2786       count = strlen (buf);
2787       if ((size_t) count >= sizeof (buf))
2788         abort ();
2789
2790       putchar (' ');
2791       while (count < width)
2792         {
2793           putchar ('0');
2794           count++;
2795         }
2796       fputs (buf + count - width, stdout);
2797       putchar (' ');
2798
2799       for (j = addr_offset * opb;
2800            j < addr_offset * opb + onaline; j++)
2801         {
2802           if (j < stop_offset * opb)
2803             printf ("%02x", (unsigned) (data[j]));
2804           else
2805             printf ("  ");
2806           if ((j & 3) == 3)
2807             printf (" ");
2808         }
2809
2810       printf (" ");
2811       for (j = addr_offset * opb;
2812            j < addr_offset * opb + onaline; j++)
2813         {
2814           if (j >= stop_offset * opb)
2815             printf (" ");
2816           else
2817             printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2818         }
2819       putchar ('\n');
2820     }
2821   free (data);
2822 }
2823
2824 /* Actually display the various requested regions.  */
2825
2826 static void
2827 dump_data (bfd *abfd)
2828 {
2829   bfd_map_over_sections (abfd, dump_section, NULL);
2830 }
2831
2832 /* Should perhaps share code and display with nm?  */
2833
2834 static void
2835 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2836 {
2837   asymbol **current;
2838   long max_count;
2839   long count;
2840
2841   if (dynamic)
2842     {
2843       current = dynsyms;
2844       max_count = dynsymcount;
2845       printf ("DYNAMIC SYMBOL TABLE:\n");
2846     }
2847   else
2848     {
2849       current = syms;
2850       max_count = symcount;
2851       printf ("SYMBOL TABLE:\n");
2852     }
2853
2854   if (max_count == 0)
2855     printf (_("no symbols\n"));
2856
2857   for (count = 0; count < max_count; count++)
2858     {
2859       bfd *cur_bfd;
2860
2861       if (*current == NULL)
2862         printf (_("no information for symbol number %ld\n"), count);
2863
2864       else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2865         printf (_("could not determine the type of symbol number %ld\n"),
2866                 count);
2867
2868       else if (process_section_p ((* current)->section)
2869                && (dump_special_syms
2870                    || !bfd_is_target_special_symbol (cur_bfd, *current)))
2871         {
2872           const char *name = (*current)->name;
2873
2874           if (do_demangle && name != NULL && *name != '\0')
2875             {
2876               char *alloc;
2877
2878               /* If we want to demangle the name, we demangle it
2879                  here, and temporarily clobber it while calling
2880                  bfd_print_symbol.  FIXME: This is a gross hack.  */
2881               alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2882               if (alloc != NULL)
2883                 (*current)->name = alloc;
2884               bfd_print_symbol (cur_bfd, stdout, *current,
2885                                 bfd_print_symbol_all);
2886               if (alloc != NULL)
2887                 {
2888                   (*current)->name = name;
2889                   free (alloc);
2890                 }
2891             }
2892           else
2893             bfd_print_symbol (cur_bfd, stdout, *current,
2894                               bfd_print_symbol_all);
2895           printf ("\n");
2896         }
2897
2898       current++;
2899     }
2900   printf ("\n\n");
2901 }
2902 \f
2903 static void
2904 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2905 {
2906   arelent **p;
2907   char *last_filename, *last_functionname;
2908   unsigned int last_line;
2909   unsigned int last_discriminator;
2910
2911   /* Get column headers lined up reasonably.  */
2912   {
2913     static int width;
2914
2915     if (width == 0)
2916       {
2917         char buf[30];
2918
2919         bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2920         width = strlen (buf) - 7;
2921       }
2922     printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2923   }
2924
2925   last_filename = NULL;
2926   last_functionname = NULL;
2927   last_line = 0;
2928   last_discriminator = 0;
2929
2930   for (p = relpp; relcount && *p != NULL; p++, relcount--)
2931     {
2932       arelent *q = *p;
2933       const char *filename, *functionname;
2934       unsigned int linenumber;
2935       unsigned int discriminator;
2936       const char *sym_name;
2937       const char *section_name;
2938       bfd_vma addend2 = 0;
2939
2940       if (start_address != (bfd_vma) -1
2941           && q->address < start_address)
2942         continue;
2943       if (stop_address != (bfd_vma) -1
2944           && q->address > stop_address)
2945         continue;
2946
2947       if (with_line_numbers
2948           && sec != NULL
2949           && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
2950                                                   &filename, &functionname,
2951                                                   &linenumber, &discriminator))
2952         {
2953           if (functionname != NULL
2954               && (last_functionname == NULL
2955                   || strcmp (functionname, last_functionname) != 0))
2956             {
2957               printf ("%s():\n", functionname);
2958               if (last_functionname != NULL)
2959                 free (last_functionname);
2960               last_functionname = xstrdup (functionname);
2961             }
2962
2963           if (linenumber > 0
2964               && (linenumber != last_line
2965                   || (filename != NULL
2966                       && last_filename != NULL
2967                       && filename_cmp (filename, last_filename) != 0)
2968                   || (discriminator != last_discriminator)))
2969             {
2970               if (discriminator > 0)
2971                 printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
2972               else
2973                 printf ("%s:%u (discriminator %u)\n", filename == NULL ? "???" : filename,
2974                         linenumber, discriminator);
2975               last_line = linenumber;
2976               last_discriminator = discriminator;
2977               if (last_filename != NULL)
2978                 free (last_filename);
2979               if (filename == NULL)
2980                 last_filename = NULL;
2981               else
2982                 last_filename = xstrdup (filename);
2983             }
2984         }
2985
2986       if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2987         {
2988           sym_name = (*(q->sym_ptr_ptr))->name;
2989           section_name = (*(q->sym_ptr_ptr))->section->name;
2990         }
2991       else
2992         {
2993           sym_name = NULL;
2994           section_name = NULL;
2995         }
2996
2997       bfd_printf_vma (abfd, q->address);
2998       if (q->howto == NULL)
2999         printf (" *unknown*         ");
3000       else if (q->howto->name)
3001         {
3002           const char *name = q->howto->name;
3003
3004           /* R_SPARC_OLO10 relocations contain two addends.
3005              But because 'arelent' lacks enough storage to
3006              store them both, the 64-bit ELF Sparc backend
3007              records this as two relocations.  One R_SPARC_LO10
3008              and one R_SPARC_13, both pointing to the same
3009              address.  This is merely so that we have some
3010              place to store both addend fields.
3011
3012              Undo this transformation, otherwise the output
3013              will be confusing.  */
3014           if (abfd->xvec->flavour == bfd_target_elf_flavour
3015               && elf_tdata(abfd)->elf_header->e_machine == EM_SPARCV9
3016               && relcount > 1
3017               && !strcmp (q->howto->name, "R_SPARC_LO10"))
3018             {
3019               arelent *q2 = *(p + 1);
3020               if (q2 != NULL
3021                   && q2->howto
3022                   && q->address == q2->address
3023                   && !strcmp (q2->howto->name, "R_SPARC_13"))
3024                 {
3025                   name = "R_SPARC_OLO10";
3026                   addend2 = q2->addend;
3027                   p++;
3028                 }
3029             }
3030           printf (" %-16s  ", name);
3031         }
3032       else
3033         printf (" %-16d  ", q->howto->type);
3034
3035       if (sym_name)
3036         {
3037           objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
3038         }
3039       else
3040         {
3041           if (section_name == NULL)
3042             section_name = "*unknown*";
3043           printf ("[%s]", section_name);
3044         }
3045
3046       if (q->addend)
3047         {
3048           bfd_signed_vma addend = q->addend;
3049           if (addend < 0)
3050             {
3051               printf ("-0x");
3052               addend = -addend;
3053             }
3054           else
3055             printf ("+0x");
3056           bfd_printf_vma (abfd, addend);
3057         }
3058       if (addend2)
3059         {
3060           printf ("+0x");
3061           bfd_printf_vma (abfd, addend2);
3062         }
3063
3064       printf ("\n");
3065     }
3066
3067   if (last_filename != NULL)
3068     free (last_filename);
3069   if (last_functionname != NULL)
3070     free (last_functionname);
3071 }
3072
3073 static void
3074 dump_relocs_in_section (bfd *abfd,
3075                         asection *section,
3076                         void *dummy ATTRIBUTE_UNUSED)
3077 {
3078   arelent **relpp;
3079   long relcount;
3080   long relsize;
3081
3082   if (   bfd_is_abs_section (section)
3083       || bfd_is_und_section (section)
3084       || bfd_is_com_section (section)
3085       || (! process_section_p (section))
3086       || ((section->flags & SEC_RELOC) == 0))
3087     return;
3088
3089   relsize = bfd_get_reloc_upper_bound (abfd, section);
3090   if (relsize < 0)
3091     bfd_fatal (bfd_get_filename (abfd));
3092
3093   printf ("RELOCATION RECORDS FOR [%s]:", section->name);
3094
3095   if (relsize == 0)
3096     {
3097       printf (" (none)\n\n");
3098       return;
3099     }
3100
3101   relpp = (arelent **) xmalloc (relsize);
3102   relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
3103
3104   if (relcount < 0)
3105     bfd_fatal (bfd_get_filename (abfd));
3106   else if (relcount == 0)
3107     printf (" (none)\n\n");
3108   else
3109     {
3110       printf ("\n");
3111       dump_reloc_set (abfd, section, relpp, relcount);
3112       printf ("\n\n");
3113     }
3114   free (relpp);
3115 }
3116
3117 static void
3118 dump_relocs (bfd *abfd)
3119 {
3120   bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
3121 }
3122
3123 static void
3124 dump_dynamic_relocs (bfd *abfd)
3125 {
3126   long relsize;
3127   arelent **relpp;
3128   long relcount;
3129
3130   relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3131   if (relsize < 0)
3132     bfd_fatal (bfd_get_filename (abfd));
3133
3134   printf ("DYNAMIC RELOCATION RECORDS");
3135
3136   if (relsize == 0)
3137     printf (" (none)\n\n");
3138   else
3139     {
3140       relpp = (arelent **) xmalloc (relsize);
3141       relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
3142
3143       if (relcount < 0)
3144         bfd_fatal (bfd_get_filename (abfd));
3145       else if (relcount == 0)
3146         printf (" (none)\n\n");
3147       else
3148         {
3149           printf ("\n");
3150           dump_reloc_set (abfd, NULL, relpp, relcount);
3151           printf ("\n\n");
3152         }
3153       free (relpp);
3154     }
3155 }
3156
3157 /* Creates a table of paths, to search for source files.  */
3158
3159 static void
3160 add_include_path (const char *path)
3161 {
3162   if (path[0] == 0)
3163     return;
3164   include_path_count++;
3165   include_paths = (const char **)
3166       xrealloc (include_paths, include_path_count * sizeof (*include_paths));
3167 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3168   if (path[1] == ':' && path[2] == 0)
3169     path = concat (path, ".", (const char *) 0);
3170 #endif
3171   include_paths[include_path_count - 1] = path;
3172 }
3173
3174 static void
3175 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
3176                   asection *section,
3177                   void *arg)
3178 {
3179   if ((section->flags & SEC_DEBUGGING) == 0)
3180     {
3181       bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
3182       section->vma += adjust_section_vma;
3183       if (*has_reloc_p)
3184         section->lma += adjust_section_vma;
3185     }
3186 }
3187
3188 /* Dump selected contents of ABFD.  */
3189
3190 static void
3191 dump_bfd (bfd *abfd)
3192 {
3193   /* If we are adjusting section VMA's, change them all now.  Changing
3194      the BFD information is a hack.  However, we must do it, or
3195      bfd_find_nearest_line will not do the right thing.  */
3196   if (adjust_section_vma != 0)
3197     {
3198       bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3199       bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
3200     }
3201
3202   if (! dump_debugging_tags && ! suppress_bfd_header)
3203     printf (_("\n%s:     file format %s\n"), bfd_get_filename (abfd),
3204             abfd->xvec->name);
3205   if (dump_ar_hdrs)
3206     print_arelt_descr (stdout, abfd, TRUE);
3207   if (dump_file_header)
3208     dump_bfd_header (abfd);
3209   if (dump_private_headers)
3210     dump_bfd_private_header (abfd);
3211   if (dump_private_options != NULL)
3212     dump_target_specific (abfd);
3213   if (! dump_debugging_tags && ! suppress_bfd_header)
3214     putchar ('\n');
3215
3216   if (dump_symtab
3217       || dump_reloc_info
3218       || disassemble
3219       || dump_debugging
3220       || dump_dwarf_section_info)
3221     syms = slurp_symtab (abfd);
3222
3223   if (dump_section_headers)
3224     dump_headers (abfd);
3225
3226   if (dump_dynamic_symtab || dump_dynamic_reloc_info
3227       || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
3228     dynsyms = slurp_dynamic_symtab (abfd);
3229   if (disassemble)
3230     {
3231       synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
3232                                              dynsymcount, dynsyms, &synthsyms);
3233       if (synthcount < 0)
3234         synthcount = 0;
3235     }
3236
3237   if (dump_symtab)
3238     dump_symbols (abfd, FALSE);
3239   if (dump_dynamic_symtab)
3240     dump_symbols (abfd, TRUE);
3241   if (dump_dwarf_section_info)
3242     dump_dwarf (abfd);
3243   if (dump_stab_section_info)
3244     dump_stabs (abfd);
3245   if (dump_reloc_info && ! disassemble)
3246     dump_relocs (abfd);
3247   if (dump_dynamic_reloc_info && ! disassemble)
3248     dump_dynamic_relocs (abfd);
3249   if (dump_section_contents)
3250     dump_data (abfd);
3251   if (disassemble)
3252     disassemble_data (abfd);
3253
3254   if (dump_debugging)
3255     {
3256       void *dhandle;
3257
3258       dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3259       if (dhandle != NULL)
3260         {
3261           if (!print_debugging_info (stdout, dhandle, abfd, syms,
3262                                      bfd_demangle,
3263                                      dump_debugging_tags ? TRUE : FALSE))
3264             {
3265               non_fatal (_("%s: printing debugging information failed"),
3266                          bfd_get_filename (abfd));
3267               exit_status = 1;
3268             }
3269         }
3270       /* PR 6483: If there was no STABS or IEEE debug
3271          info in the file, try DWARF instead.  */
3272       else if (! dump_dwarf_section_info)
3273         {
3274           dwarf_select_sections_all (); 
3275           dump_dwarf (abfd);
3276         }
3277     }
3278
3279   if (syms)
3280     {
3281       free (syms);
3282       syms = NULL;
3283     }
3284
3285   if (dynsyms)
3286     {
3287       free (dynsyms);
3288       dynsyms = NULL;
3289     }
3290
3291   if (synthsyms)
3292     {
3293       free (synthsyms);
3294       synthsyms = NULL;
3295     }
3296
3297   symcount = 0;
3298   dynsymcount = 0;
3299   synthcount = 0;
3300 }
3301
3302 static void
3303 display_object_bfd (bfd *abfd)
3304 {
3305   char **matching;
3306
3307   if (bfd_check_format_matches (abfd, bfd_object, &matching))
3308     {
3309       dump_bfd (abfd);
3310       return;
3311     }
3312
3313   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3314     {
3315       nonfatal (bfd_get_filename (abfd));
3316       list_matching_formats (matching);
3317       free (matching);
3318       return;
3319     }
3320
3321   if (bfd_get_error () != bfd_error_file_not_recognized)
3322     {
3323       nonfatal (bfd_get_filename (abfd));
3324       return;
3325     }
3326
3327   if (bfd_check_format_matches (abfd, bfd_core, &matching))
3328     {
3329       dump_bfd (abfd);
3330       return;
3331     }
3332
3333   nonfatal (bfd_get_filename (abfd));
3334
3335   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3336     {
3337       list_matching_formats (matching);
3338       free (matching);
3339     }
3340 }
3341
3342 static void
3343 display_any_bfd (bfd *file, int level)
3344 {
3345   /* Decompress sections unless dumping the section contents.  */
3346   if (!dump_section_contents)
3347     file->flags |= BFD_DECOMPRESS;
3348
3349   /* If the file is an archive, process all of its elements.  */
3350   if (bfd_check_format (file, bfd_archive))
3351     {
3352       bfd *arfile = NULL;
3353       bfd *last_arfile = NULL;
3354
3355       if (level == 0)
3356         printf (_("In archive %s:\n"), bfd_get_filename (file));
3357       else
3358         printf (_("In nested archive %s:\n"), bfd_get_filename (file));
3359
3360       for (;;)
3361         {
3362           bfd_set_error (bfd_error_no_error);
3363
3364           arfile = bfd_openr_next_archived_file (file, arfile);
3365           if (arfile == NULL)
3366             {
3367               if (bfd_get_error () != bfd_error_no_more_archived_files)
3368                 nonfatal (bfd_get_filename (file));
3369               break;
3370             }
3371
3372           display_any_bfd (arfile, level + 1);
3373
3374           if (last_arfile != NULL)
3375             bfd_close (last_arfile);
3376           last_arfile = arfile;
3377         }
3378
3379       if (last_arfile != NULL)
3380         bfd_close (last_arfile);
3381     }
3382   else
3383     display_object_bfd (file);
3384 }
3385
3386 static void
3387 display_file (char *filename, char *target)
3388 {
3389   bfd *file;
3390
3391   if (get_file_size (filename) < 1)
3392     {
3393       exit_status = 1;
3394       return;
3395     }
3396
3397   file = bfd_openr (filename, target);
3398   if (file == NULL)
3399     {
3400       nonfatal (filename);
3401       return;
3402     }
3403
3404   display_any_bfd (file, 0);
3405
3406   bfd_close (file);
3407 }
3408 \f
3409 int
3410 main (int argc, char **argv)
3411 {
3412   int c;
3413   char *target = default_target;
3414   bfd_boolean seenflag = FALSE;
3415
3416 #if defined (HAVE_SETLOCALE)
3417 #if defined (HAVE_LC_MESSAGES)
3418   setlocale (LC_MESSAGES, "");
3419 #endif
3420   setlocale (LC_CTYPE, "");
3421 #endif
3422
3423   bindtextdomain (PACKAGE, LOCALEDIR);
3424   textdomain (PACKAGE);
3425
3426   program_name = *argv;
3427   xmalloc_set_program_name (program_name);
3428
3429   START_PROGRESS (program_name, 0);
3430
3431   expandargv (&argc, &argv);
3432
3433   bfd_init ();
3434   set_default_bfd_target ();
3435
3436   while ((c = getopt_long (argc, argv,
3437                            "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
3438                            long_options, (int *) 0))
3439          != EOF)
3440     {
3441       switch (c)
3442         {
3443         case 0:
3444           break;                /* We've been given a long option.  */
3445         case 'm':
3446           machine = optarg;
3447           break;
3448         case 'M':
3449           if (disassembler_options)
3450             /* Ignore potential memory leak for now.  */
3451             disassembler_options = concat (disassembler_options, ",",
3452                                            optarg, (const char *) NULL);
3453           else
3454             disassembler_options = optarg;
3455           break;
3456         case 'j':
3457           add_only (optarg);
3458           break;
3459         case 'F':
3460           display_file_offsets = TRUE;
3461           break;
3462         case 'l':
3463           with_line_numbers = TRUE;
3464           break;
3465         case 'b':
3466           target = optarg;
3467           break;
3468         case 'C':
3469           do_demangle = TRUE;
3470           if (optarg != NULL)
3471             {
3472               enum demangling_styles style;
3473
3474               style = cplus_demangle_name_to_style (optarg);
3475               if (style == unknown_demangling)
3476                 fatal (_("unknown demangling style `%s'"),
3477                        optarg);
3478
3479               cplus_demangle_set_style (style);
3480             }
3481           break;
3482         case 'w':
3483           wide_output = TRUE;
3484           break;
3485         case OPTION_ADJUST_VMA:
3486           adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3487           break;
3488         case OPTION_START_ADDRESS:
3489           start_address = parse_vma (optarg, "--start-address");
3490           if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3491             fatal (_("error: the start address should be before the end address"));
3492           break;
3493         case OPTION_STOP_ADDRESS:
3494           stop_address = parse_vma (optarg, "--stop-address");
3495           if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3496             fatal (_("error: the stop address should be after the start address"));
3497           break;
3498         case OPTION_PREFIX:
3499           prefix = optarg;
3500           prefix_length = strlen (prefix);
3501           /* Remove an unnecessary trailing '/' */
3502           while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
3503             prefix_length--;
3504           break;
3505         case OPTION_PREFIX_STRIP:
3506           prefix_strip = atoi (optarg);
3507           if (prefix_strip < 0)
3508             fatal (_("error: prefix strip must be non-negative"));
3509           break;
3510         case OPTION_INSN_WIDTH:
3511           insn_width = strtoul (optarg, NULL, 0);
3512           if (insn_width <= 0)
3513             fatal (_("error: instruction width must be positive"));
3514           break;
3515         case 'E':
3516           if (strcmp (optarg, "B") == 0)
3517             endian = BFD_ENDIAN_BIG;
3518           else if (strcmp (optarg, "L") == 0)
3519             endian = BFD_ENDIAN_LITTLE;
3520           else
3521             {
3522               nonfatal (_("unrecognized -E option"));
3523               usage (stderr, 1);
3524             }
3525           break;
3526         case OPTION_ENDIAN:
3527           if (strncmp (optarg, "big", strlen (optarg)) == 0)
3528             endian = BFD_ENDIAN_BIG;
3529           else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3530             endian = BFD_ENDIAN_LITTLE;
3531           else
3532             {
3533               non_fatal (_("unrecognized --endian type `%s'"), optarg);
3534               exit_status = 1;
3535               usage (stderr, 1);
3536             }
3537           break;
3538
3539         case 'f':
3540           dump_file_header = TRUE;
3541           seenflag = TRUE;
3542           break;
3543         case 'i':
3544           formats_info = TRUE;
3545           seenflag = TRUE;
3546           break;
3547         case 'I':
3548           add_include_path (optarg);
3549           break;
3550         case 'p':
3551           dump_private_headers = TRUE;
3552           seenflag = TRUE;
3553           break;
3554         case 'P':
3555           dump_private_options = optarg;
3556           seenflag = TRUE;
3557           break;
3558         case 'x':
3559           dump_private_headers = TRUE;
3560           dump_symtab = TRUE;
3561           dump_reloc_info = TRUE;
3562           dump_file_header = TRUE;
3563           dump_ar_hdrs = TRUE;
3564           dump_section_headers = TRUE;
3565           seenflag = TRUE;
3566           break;
3567         case 't':
3568           dump_symtab = TRUE;
3569           seenflag = TRUE;
3570           break;
3571         case 'T':
3572           dump_dynamic_symtab = TRUE;
3573           seenflag = TRUE;
3574           break;
3575         case 'd':
3576           disassemble = TRUE;
3577           seenflag = TRUE;
3578           break;
3579         case 'z':
3580           disassemble_zeroes = TRUE;
3581           break;
3582         case 'D':
3583           disassemble = TRUE;
3584           disassemble_all = TRUE;
3585           seenflag = TRUE;
3586           break;
3587         case 'S':
3588           disassemble = TRUE;
3589           with_source_code = TRUE;
3590           seenflag = TRUE;
3591           break;
3592         case 'g':
3593           dump_debugging = 1;
3594           seenflag = TRUE;
3595           break;
3596         case 'e':
3597           dump_debugging = 1;
3598           dump_debugging_tags = 1;
3599           do_demangle = TRUE;
3600           seenflag = TRUE;
3601           break;
3602         case 'W':
3603           dump_dwarf_section_info = TRUE;
3604           seenflag = TRUE;
3605           if (optarg)
3606             dwarf_select_sections_by_letters (optarg);
3607           else
3608             dwarf_select_sections_all ();
3609           break;
3610         case OPTION_DWARF:
3611           dump_dwarf_section_info = TRUE;
3612           seenflag = TRUE;
3613           if (optarg)
3614             dwarf_select_sections_by_names (optarg);
3615           else
3616             dwarf_select_sections_all ();
3617           break;
3618         case OPTION_DWARF_DEPTH:
3619           {
3620             char *cp;
3621             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3622           }
3623           break;
3624         case OPTION_DWARF_START:
3625           {
3626             char *cp;
3627             dwarf_start_die = strtoul (optarg, & cp, 0);
3628             suppress_bfd_header = 1;
3629           }
3630           break;
3631         case OPTION_DWARF_CHECK:
3632           dwarf_check = TRUE;
3633           break;
3634         case 'G':
3635           dump_stab_section_info = TRUE;
3636           seenflag = TRUE;
3637           break;
3638         case 's':
3639           dump_section_contents = TRUE;
3640           seenflag = TRUE;
3641           break;
3642         case 'r':
3643           dump_reloc_info = TRUE;
3644           seenflag = TRUE;
3645           break;
3646         case 'R':
3647           dump_dynamic_reloc_info = TRUE;
3648           seenflag = TRUE;
3649           break;
3650         case 'a':
3651           dump_ar_hdrs = TRUE;
3652           seenflag = TRUE;
3653           break;
3654         case 'h':
3655           dump_section_headers = TRUE;
3656           seenflag = TRUE;
3657           break;
3658         case 'H':
3659           usage (stdout, 0);
3660           seenflag = TRUE;
3661         case 'v':
3662         case 'V':
3663           show_version = TRUE;
3664           seenflag = TRUE;
3665           break;
3666
3667         default:
3668           usage (stderr, 1);
3669         }
3670     }
3671
3672   if (show_version)
3673     print_version ("objdump");
3674
3675   if (!seenflag)
3676     usage (stderr, 2);
3677
3678   if (formats_info)
3679     exit_status = display_info ();
3680   else
3681     {
3682       if (optind == argc)
3683         display_file ("a.out", target);
3684       else
3685         for (; optind < argc;)
3686           display_file (argv[optind++], target);
3687     }
3688
3689   free_only_list ();
3690
3691   END_PROGRESS (program_name);
3692
3693   return exit_status;
3694 }