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