More fixes for buffer overruns instigated by corrupt binaries.
[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;
799
800   alloc = NULL;
801   name = bfd_asymbol_name (sym);
802   if (do_demangle && name[0] != '\0')
803     {
804       /* Demangle the name.  */
805       alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
806       if (alloc != NULL)
807         name = alloc;
808     }
809
810   if (inf != NULL)
811     (*inf->fprintf_func) (inf->stream, "%s", name);
812   else
813     printf ("%s", name);
814
815   if (alloc != NULL)
816     free (alloc);
817 }
818
819 /* Locate a symbol given a bfd and a section (from INFO->application_data),
820    and a VMA.  If INFO->application_data->require_sec is TRUE, then always
821    require the symbol to be in the section.  Returns NULL if there is no
822    suitable symbol.  If PLACE is not NULL, then *PLACE is set to the index
823    of the symbol in sorted_syms.  */
824
825 static asymbol *
826 find_symbol_for_address (bfd_vma vma,
827                          struct disassemble_info *inf,
828                          long *place)
829 {
830   /* @@ Would it speed things up to cache the last two symbols returned,
831      and maybe their address ranges?  For many processors, only one memory
832      operand can be present at a time, so the 2-entry cache wouldn't be
833      constantly churned by code doing heavy memory accesses.  */
834
835   /* Indices in `sorted_syms'.  */
836   long min = 0;
837   long max_count = sorted_symcount;
838   long thisplace;
839   struct objdump_disasm_info *aux;
840   bfd *abfd;
841   asection *sec;
842   unsigned int opb;
843   bfd_boolean want_section;
844
845   if (sorted_symcount < 1)
846     return NULL;
847
848   aux = (struct objdump_disasm_info *) inf->application_data;
849   abfd = aux->abfd;
850   sec = aux->sec;
851   opb = inf->octets_per_byte;
852
853   /* Perform a binary search looking for the closest symbol to the
854      required value.  We are searching the range (min, max_count].  */
855   while (min + 1 < max_count)
856     {
857       asymbol *sym;
858
859       thisplace = (max_count + min) / 2;
860       sym = sorted_syms[thisplace];
861
862       if (bfd_asymbol_value (sym) > vma)
863         max_count = thisplace;
864       else if (bfd_asymbol_value (sym) < vma)
865         min = thisplace;
866       else
867         {
868           min = thisplace;
869           break;
870         }
871     }
872
873   /* The symbol we want is now in min, the low end of the range we
874      were searching.  If there are several symbols with the same
875      value, we want the first one.  */
876   thisplace = min;
877   while (thisplace > 0
878          && (bfd_asymbol_value (sorted_syms[thisplace])
879              == bfd_asymbol_value (sorted_syms[thisplace - 1])))
880     --thisplace;
881
882   /* Prefer a symbol in the current section if we have multple symbols
883      with the same value, as can occur with overlays or zero size
884      sections.  */
885   min = thisplace;
886   while (min < max_count
887          && (bfd_asymbol_value (sorted_syms[min])
888              == bfd_asymbol_value (sorted_syms[thisplace])))
889     {
890       if (sorted_syms[min]->section == sec
891           && inf->symbol_is_valid (sorted_syms[min], inf))
892         {
893           thisplace = min;
894
895           if (place != NULL)
896             *place = thisplace;
897
898           return sorted_syms[thisplace];
899         }
900       ++min;
901     }
902
903   /* If the file is relocatable, and the symbol could be from this
904      section, prefer a symbol from this section over symbols from
905      others, even if the other symbol's value might be closer.
906
907      Note that this may be wrong for some symbol references if the
908      sections have overlapping memory ranges, but in that case there's
909      no way to tell what's desired without looking at the relocation
910      table.
911      
912      Also give the target a chance to reject symbols.  */
913   want_section = (aux->require_sec
914                   || ((abfd->flags & HAS_RELOC) != 0
915                       && vma >= bfd_get_section_vma (abfd, sec)
916                       && vma < (bfd_get_section_vma (abfd, sec)
917                                 + bfd_section_size (abfd, sec) / opb)));
918   if ((sorted_syms[thisplace]->section != sec && want_section)
919       || ! inf->symbol_is_valid (sorted_syms[thisplace], inf))
920     {
921       long i;
922       long newplace = sorted_symcount;
923
924       for (i = min - 1; i >= 0; i--)
925         {
926           if ((sorted_syms[i]->section == sec || !want_section)
927               && inf->symbol_is_valid (sorted_syms[i], inf))
928             {
929               if (newplace == sorted_symcount)
930                 newplace = i;
931
932               if (bfd_asymbol_value (sorted_syms[i])
933                   != bfd_asymbol_value (sorted_syms[newplace]))
934                 break;
935
936               /* Remember this symbol and keep searching until we reach
937                  an earlier address.  */
938               newplace = i;
939             }
940         }
941
942       if (newplace != sorted_symcount)
943         thisplace = newplace;
944       else
945         {
946           /* We didn't find a good symbol with a smaller value.
947              Look for one with a larger value.  */
948           for (i = thisplace + 1; i < sorted_symcount; i++)
949             {
950               if ((sorted_syms[i]->section == sec || !want_section)
951                   && inf->symbol_is_valid (sorted_syms[i], inf))
952                 {
953                   thisplace = i;
954                   break;
955                 }
956             }
957         }
958
959       if ((sorted_syms[thisplace]->section != sec && want_section)
960           || ! inf->symbol_is_valid (sorted_syms[thisplace], inf))
961         /* There is no suitable symbol.  */
962         return NULL;
963     }
964
965   if (place != NULL)
966     *place = thisplace;
967
968   return sorted_syms[thisplace];
969 }
970
971 /* Print an address and the offset to the nearest symbol.  */
972
973 static void
974 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
975                              bfd_vma vma, struct disassemble_info *inf,
976                              bfd_boolean skip_zeroes)
977 {
978   objdump_print_value (vma, inf, skip_zeroes);
979
980   if (sym == NULL)
981     {
982       bfd_vma secaddr;
983
984       (*inf->fprintf_func) (inf->stream, " <%s",
985                             bfd_get_section_name (abfd, sec));
986       secaddr = bfd_get_section_vma (abfd, sec);
987       if (vma < secaddr)
988         {
989           (*inf->fprintf_func) (inf->stream, "-0x");
990           objdump_print_value (secaddr - vma, inf, TRUE);
991         }
992       else if (vma > secaddr)
993         {
994           (*inf->fprintf_func) (inf->stream, "+0x");
995           objdump_print_value (vma - secaddr, inf, TRUE);
996         }
997       (*inf->fprintf_func) (inf->stream, ">");
998     }
999   else
1000     {
1001       (*inf->fprintf_func) (inf->stream, " <");
1002       objdump_print_symname (abfd, inf, sym);
1003       if (bfd_asymbol_value (sym) > vma)
1004         {
1005           (*inf->fprintf_func) (inf->stream, "-0x");
1006           objdump_print_value (bfd_asymbol_value (sym) - vma, inf, TRUE);
1007         }
1008       else if (vma > bfd_asymbol_value (sym))
1009         {
1010           (*inf->fprintf_func) (inf->stream, "+0x");
1011           objdump_print_value (vma - bfd_asymbol_value (sym), inf, TRUE);
1012         }
1013       (*inf->fprintf_func) (inf->stream, ">");
1014     }
1015
1016   if (display_file_offsets)
1017     inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1018                         (long int)(sec->filepos + (vma - sec->vma)));
1019 }
1020
1021 /* Print an address (VMA), symbolically if possible.
1022    If SKIP_ZEROES is TRUE, don't output leading zeroes.  */
1023
1024 static void
1025 objdump_print_addr (bfd_vma vma,
1026                     struct disassemble_info *inf,
1027                     bfd_boolean skip_zeroes)
1028 {
1029   struct objdump_disasm_info *aux;
1030   asymbol *sym = NULL;
1031   bfd_boolean skip_find = FALSE;
1032
1033   aux = (struct objdump_disasm_info *) inf->application_data;
1034
1035   if (sorted_symcount < 1)
1036     {
1037       (*inf->fprintf_func) (inf->stream, "0x");
1038       objdump_print_value (vma, inf, skip_zeroes);
1039
1040       if (display_file_offsets)
1041         inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1042                            (long int)(aux->sec->filepos + (vma - aux->sec->vma)));
1043       return;
1044     }
1045
1046   if (aux->reloc != NULL
1047       && aux->reloc->sym_ptr_ptr != NULL
1048       && * aux->reloc->sym_ptr_ptr != NULL)
1049     {
1050       sym = * aux->reloc->sym_ptr_ptr;
1051
1052       /* Adjust the vma to the reloc.  */
1053       vma += bfd_asymbol_value (sym);
1054
1055       if (bfd_is_und_section (bfd_get_section (sym)))
1056         skip_find = TRUE;
1057     }
1058
1059   if (!skip_find)
1060     sym = find_symbol_for_address (vma, inf, NULL);
1061
1062   objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, inf,
1063                                skip_zeroes);
1064 }
1065
1066 /* Print VMA to INFO.  This function is passed to the disassembler
1067    routine.  */
1068
1069 static void
1070 objdump_print_address (bfd_vma vma, struct disassemble_info *inf)
1071 {
1072   objdump_print_addr (vma, inf, ! prefix_addresses);
1073 }
1074
1075 /* Determine if the given address has a symbol associated with it.  */
1076
1077 static int
1078 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
1079 {
1080   asymbol * sym;
1081
1082   sym = find_symbol_for_address (vma, inf, NULL);
1083
1084   return (sym != NULL && (bfd_asymbol_value (sym) == vma));
1085 }
1086
1087 /* Hold the last function name and the last line number we displayed
1088    in a disassembly.  */
1089
1090 static char *prev_functionname;
1091 static unsigned int prev_line;
1092 static unsigned int prev_discriminator;
1093
1094 /* We keep a list of all files that we have seen when doing a
1095    disassembly with source, so that we know how much of the file to
1096    display.  This can be important for inlined functions.  */
1097
1098 struct print_file_list
1099 {
1100   struct print_file_list *next;
1101   const char *filename;
1102   const char *modname;
1103   const char *map; 
1104   size_t mapsize;
1105   const char **linemap; 
1106   unsigned maxline;
1107   unsigned last_line;
1108   int first;
1109 };
1110
1111 static struct print_file_list *print_files;
1112
1113 /* The number of preceding context lines to show when we start
1114    displaying a file for the first time.  */
1115
1116 #define SHOW_PRECEDING_CONTEXT_LINES (5)
1117
1118 /* Read a complete file into memory.  */
1119
1120 static const char *
1121 slurp_file (const char *fn, size_t *size)
1122 {
1123 #ifdef HAVE_MMAP
1124   int ps = getpagesize ();
1125   size_t msize;
1126 #endif
1127   const char *map;
1128   struct stat st;
1129   int fd = open (fn, O_RDONLY | O_BINARY);
1130
1131   if (fd < 0)
1132     return NULL;
1133   if (fstat (fd, &st) < 0)
1134     {
1135       close (fd);
1136       return NULL;
1137     }
1138   *size = st.st_size;
1139 #ifdef HAVE_MMAP
1140   msize = (*size + ps - 1) & ~(ps - 1);
1141   map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
1142   if (map != (char *) -1L)
1143     {
1144       close (fd);
1145       return map;
1146     }
1147 #endif
1148   map = (const char *) malloc (*size);
1149   if (!map || (size_t) read (fd, (char *) map, *size) != *size)
1150     {
1151       free ((void *) map);
1152       map = NULL;
1153     }
1154   close (fd);
1155   return map;
1156 }
1157
1158 #define line_map_decrease 5
1159
1160 /* Precompute array of lines for a mapped file. */
1161
1162 static const char ** 
1163 index_file (const char *map, size_t size, unsigned int *maxline) 
1164 {
1165   const char *p, *lstart, *end;
1166   int chars_per_line = 45; /* First iteration will use 40.  */
1167   unsigned int lineno;
1168   const char **linemap = NULL; 
1169   unsigned long line_map_size = 0;
1170  
1171   lineno = 0;
1172   lstart = map;
1173   end = map + size;
1174
1175   for (p = map; p < end; p++) 
1176     { 
1177       if (*p == '\n') 
1178         { 
1179           if (p + 1 < end && p[1] == '\r') 
1180             p++;  
1181         } 
1182       else if (*p == '\r') 
1183         { 
1184           if (p + 1 < end && p[1] == '\n')
1185             p++;
1186         }
1187       else
1188         continue;
1189       
1190       /* End of line found.  */
1191
1192       if (linemap == NULL || line_map_size < lineno + 1) 
1193         { 
1194           unsigned long newsize;
1195
1196           chars_per_line -= line_map_decrease;
1197           if (chars_per_line <= 1)
1198             chars_per_line = 1;
1199           line_map_size = size / chars_per_line + 1;
1200           if (line_map_size < lineno + 1)
1201             line_map_size = lineno + 1;
1202           newsize = line_map_size * sizeof (char *);
1203           linemap = (const char **) xrealloc (linemap, newsize);
1204         }
1205
1206       linemap[lineno++] = lstart; 
1207       lstart = p + 1; 
1208     }
1209   
1210   *maxline = lineno; 
1211   return linemap;
1212 }
1213
1214 /* Tries to open MODNAME, and if successful adds a node to print_files
1215    linked list and returns that node.  Returns NULL on failure.  */
1216
1217 static struct print_file_list *
1218 try_print_file_open (const char *origname, const char *modname)
1219 {
1220   struct print_file_list *p;
1221
1222   p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
1223
1224   p->map = slurp_file (modname, &p->mapsize);
1225   if (p->map == NULL)
1226     {
1227       free (p);
1228       return NULL;
1229     }
1230   
1231   p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1232   p->last_line = 0;
1233   p->filename = origname;
1234   p->modname = modname;
1235   p->next = print_files;
1236   p->first = 1;
1237   print_files = p;
1238   return p;
1239 }
1240
1241 /* If the source file, as described in the symtab, is not found
1242    try to locate it in one of the paths specified with -I
1243    If found, add location to print_files linked list.  */
1244
1245 static struct print_file_list *
1246 update_source_path (const char *filename)
1247 {
1248   struct print_file_list *p;
1249   const char *fname;
1250   int i;
1251
1252   p = try_print_file_open (filename, filename);
1253   if (p != NULL)
1254     return p;
1255
1256   if (include_path_count == 0)
1257     return NULL;
1258
1259   /* Get the name of the file.  */
1260   fname = lbasename (filename);
1261
1262   /* If file exists under a new path, we need to add it to the list
1263      so that show_line knows about it.  */
1264   for (i = 0; i < include_path_count; i++)
1265     {
1266       char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1267
1268       p = try_print_file_open (filename, modname);
1269       if (p)
1270         return p;
1271
1272       free (modname);
1273     }
1274
1275   return NULL;
1276 }
1277
1278 /* Print a source file line.  */
1279
1280 static void 
1281 print_line (struct print_file_list *p, unsigned int linenum)
1282 {
1283   const char *l;
1284   size_t len;
1285  
1286   --linenum; 
1287   if (linenum >= p->maxline)
1288     return;
1289   l = p->linemap [linenum];
1290   /* Test fwrite return value to quiet glibc warning.  */
1291   len = strcspn (l, "\n\r");
1292   if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1293     putchar ('\n');
1294 }
1295
1296 /* Print a range of source code lines. */
1297
1298 static void
1299 dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1300 {
1301   if (p->map == NULL)
1302     return;
1303   while (start <= end) 
1304     {
1305       print_line (p, start);
1306       start++;
1307     }
1308 }
1309
1310 /* Show the line number, or the source line, in a disassembly
1311    listing.  */
1312
1313 static void
1314 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1315 {
1316   const char *filename;
1317   const char *functionname;
1318   unsigned int linenumber;
1319   unsigned int discriminator;
1320   bfd_boolean reloc;
1321
1322   if (! with_line_numbers && ! with_source_code)
1323     return;
1324
1325   if (! bfd_find_nearest_line_discriminator (abfd, section, syms, addr_offset,
1326                                              &filename, &functionname,
1327                                              &linenumber, &discriminator))
1328     return;
1329
1330   if (filename != NULL && *filename == '\0')
1331     filename = NULL;
1332   if (functionname != NULL && *functionname == '\0')
1333     functionname = NULL;
1334
1335   if (filename
1336       && IS_ABSOLUTE_PATH (filename)
1337       && prefix)
1338     {
1339       char *path_up;
1340       const char *fname = filename;
1341       char *path = (char *) alloca (prefix_length + PATH_MAX + 1);
1342
1343       if (prefix_length)
1344         memcpy (path, prefix, prefix_length);
1345       path_up = path + prefix_length;
1346
1347       /* Build relocated filename, stripping off leading directories
1348          from the initial filename if requested. */
1349       if (prefix_strip > 0)
1350         {
1351           int level = 0;
1352           const char *s;
1353
1354           /* Skip selected directory levels. */
1355           for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
1356             if (IS_DIR_SEPARATOR(*s))
1357               {
1358                 fname = s;
1359                 level++;
1360               }
1361         }
1362
1363       /* Update complete filename. */
1364       strncpy (path_up, fname, PATH_MAX);
1365       path_up[PATH_MAX] = '\0';
1366
1367       filename = path;
1368       reloc = TRUE;
1369     }
1370   else
1371     reloc = FALSE;
1372
1373   if (with_line_numbers)
1374     {
1375       if (functionname != NULL
1376           && (prev_functionname == NULL
1377               || strcmp (functionname, prev_functionname) != 0))
1378         printf ("%s():\n", functionname);
1379       if (linenumber > 0 && (linenumber != prev_line || 
1380                              (discriminator != prev_discriminator)))
1381         { 
1382           if (discriminator > 0)
1383             printf ("%s:%u (discriminator %u)\n", filename == NULL ? "???" : filename,
1384                     linenumber, discriminator);
1385           else
1386             printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
1387         }
1388     }
1389
1390   if (with_source_code
1391       && filename != NULL
1392       && linenumber > 0)
1393     {
1394       struct print_file_list **pp, *p;
1395       unsigned l;
1396
1397       for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1398         if (filename_cmp ((*pp)->filename, filename) == 0)
1399           break;
1400       p = *pp;
1401
1402       if (p == NULL)
1403         {
1404           if (reloc)
1405             filename = xstrdup (filename);
1406           p = update_source_path (filename);
1407         }
1408
1409       if (p != NULL && linenumber != p->last_line)
1410         {
1411           if (file_start_context && p->first) 
1412             l = 1;
1413           else 
1414             {
1415               l = linenumber - SHOW_PRECEDING_CONTEXT_LINES;
1416               if (l >= linenumber) 
1417                 l = 1;
1418               if (p->last_line >= l && p->last_line <= linenumber)
1419                 l = p->last_line + 1;
1420             }
1421           dump_lines (p, l, linenumber);
1422           p->last_line = linenumber;
1423           p->first = 0;
1424         }
1425     }
1426
1427   if (functionname != NULL
1428       && (prev_functionname == NULL
1429           || strcmp (functionname, prev_functionname) != 0))
1430     {
1431       if (prev_functionname != NULL)
1432         free (prev_functionname);
1433       prev_functionname = (char *) xmalloc (strlen (functionname) + 1);
1434       strcpy (prev_functionname, functionname);
1435     }
1436
1437   if (linenumber > 0 && linenumber != prev_line)
1438     prev_line = linenumber;
1439
1440   if (discriminator != prev_discriminator)
1441     prev_discriminator = discriminator;
1442 }
1443
1444 /* Pseudo FILE object for strings.  */
1445 typedef struct
1446 {
1447   char *buffer;
1448   size_t pos;
1449   size_t alloc;
1450 } SFILE;
1451
1452 /* sprintf to a "stream".  */
1453
1454 static int ATTRIBUTE_PRINTF_2
1455 objdump_sprintf (SFILE *f, const char *format, ...)
1456 {
1457   size_t n;
1458   va_list args;
1459
1460   while (1)
1461     {
1462       size_t space = f->alloc - f->pos;
1463   
1464       va_start (args, format);
1465       n = vsnprintf (f->buffer + f->pos, space, format, args);
1466       va_end (args);
1467
1468       if (space > n)
1469         break;
1470       
1471       f->alloc = (f->alloc + n) * 2;
1472       f->buffer = (char *) xrealloc (f->buffer, f->alloc);
1473     }
1474   f->pos += n;
1475   
1476   return n;
1477 }
1478
1479 /* The number of zeroes we want to see before we start skipping them.
1480    The number is arbitrarily chosen.  */
1481
1482 #define DEFAULT_SKIP_ZEROES 8
1483
1484 /* The number of zeroes to skip at the end of a section.  If the
1485    number of zeroes at the end is between SKIP_ZEROES_AT_END and
1486    SKIP_ZEROES, they will be disassembled.  If there are fewer than
1487    SKIP_ZEROES_AT_END, they will be skipped.  This is a heuristic
1488    attempt to avoid disassembling zeroes inserted by section
1489    alignment.  */
1490
1491 #define DEFAULT_SKIP_ZEROES_AT_END 3
1492
1493 /* Disassemble some data in memory between given values.  */
1494
1495 static void
1496 disassemble_bytes (struct disassemble_info * inf,
1497                    disassembler_ftype        disassemble_fn,
1498                    bfd_boolean               insns,
1499                    bfd_byte *                data,
1500                    bfd_vma                   start_offset,
1501                    bfd_vma                   stop_offset,
1502                    bfd_vma                   rel_offset,
1503                    arelent ***               relppp,
1504                    arelent **                relppend)
1505 {
1506   struct objdump_disasm_info *aux;
1507   asection *section;
1508   int octets_per_line;
1509   int skip_addr_chars;
1510   bfd_vma addr_offset;
1511   unsigned int opb = inf->octets_per_byte;
1512   unsigned int skip_zeroes = inf->skip_zeroes;
1513   unsigned int skip_zeroes_at_end = inf->skip_zeroes_at_end;
1514   int octets = opb;
1515   SFILE sfile;
1516
1517   aux = (struct objdump_disasm_info *) inf->application_data;
1518   section = aux->sec;
1519
1520   sfile.alloc = 120;
1521   sfile.buffer = (char *) xmalloc (sfile.alloc);
1522   sfile.pos = 0;
1523   
1524   if (insn_width)
1525     octets_per_line = insn_width;
1526   else if (insns)
1527     octets_per_line = 4;
1528   else
1529     octets_per_line = 16;
1530
1531   /* Figure out how many characters to skip at the start of an
1532      address, to make the disassembly look nicer.  We discard leading
1533      zeroes in chunks of 4, ensuring that there is always a leading
1534      zero remaining.  */
1535   skip_addr_chars = 0;
1536   if (! prefix_addresses)
1537     {
1538       char buf[30];
1539
1540       bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1541
1542       while (buf[skip_addr_chars] == '0')
1543         ++skip_addr_chars;
1544
1545       /* Don't discard zeros on overflow.  */
1546       if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1547         skip_addr_chars = 0;
1548
1549       if (skip_addr_chars != 0)
1550         skip_addr_chars = (skip_addr_chars - 1) & -4;
1551     }
1552
1553   inf->insn_info_valid = 0;
1554
1555   addr_offset = start_offset;
1556   while (addr_offset < stop_offset)
1557     {
1558       bfd_vma z;
1559       bfd_boolean need_nl = FALSE;
1560       int previous_octets;
1561
1562       /* Remember the length of the previous instruction.  */
1563       previous_octets = octets;
1564       octets = 0;
1565
1566       /* Make sure we don't use relocs from previous instructions.  */
1567       aux->reloc = NULL;
1568
1569       /* If we see more than SKIP_ZEROES octets of zeroes, we just
1570          print `...'.  */
1571       for (z = addr_offset * opb; z < stop_offset * opb; z++)
1572         if (data[z] != 0)
1573           break;
1574       if (! disassemble_zeroes
1575           && (inf->insn_info_valid == 0
1576               || inf->branch_delay_insns == 0)
1577           && (z - addr_offset * opb >= skip_zeroes
1578               || (z == stop_offset * opb &&
1579                   z - addr_offset * opb < skip_zeroes_at_end)))
1580         {
1581           /* If there are more nonzero octets to follow, we only skip
1582              zeroes in multiples of 4, to try to avoid running over
1583              the start of an instruction which happens to start with
1584              zero.  */
1585           if (z != stop_offset * opb)
1586             z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1587
1588           octets = z - addr_offset * opb;
1589
1590           /* If we are going to display more data, and we are displaying
1591              file offsets, then tell the user how many zeroes we skip
1592              and the file offset from where we resume dumping.  */
1593           if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1594             printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1595                     octets / opb,
1596                     (unsigned long) (section->filepos
1597                                      + (addr_offset + (octets / opb))));
1598           else
1599             printf ("\t...\n");
1600         }
1601       else
1602         {
1603           char buf[50];
1604           int bpc = 0;
1605           int pb = 0;
1606
1607           if (with_line_numbers || with_source_code)
1608             show_line (aux->abfd, section, addr_offset);
1609
1610           if (! prefix_addresses)
1611             {
1612               char *s;
1613
1614               bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1615               for (s = buf + skip_addr_chars; *s == '0'; s++)
1616                 *s = ' ';
1617               if (*s == '\0')
1618                 *--s = '0';
1619               printf ("%s:\t", buf + skip_addr_chars);
1620             }
1621           else
1622             {
1623               aux->require_sec = TRUE;
1624               objdump_print_address (section->vma + addr_offset, inf);
1625               aux->require_sec = FALSE;
1626               putchar (' ');
1627             }
1628
1629           if (insns)
1630             {
1631               sfile.pos = 0;
1632               inf->fprintf_func = (fprintf_ftype) objdump_sprintf;
1633               inf->stream = &sfile;
1634               inf->bytes_per_line = 0;
1635               inf->bytes_per_chunk = 0;
1636               inf->flags = disassemble_all ? DISASSEMBLE_DATA : 0;
1637               if (machine)
1638                 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
1639
1640               if (inf->disassembler_needs_relocs
1641                   && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1642                   && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1643                   && *relppp < relppend)
1644                 {
1645                   bfd_signed_vma distance_to_rel;
1646
1647                   distance_to_rel = (**relppp)->address
1648                     - (rel_offset + addr_offset);
1649
1650                   /* Check to see if the current reloc is associated with
1651                      the instruction that we are about to disassemble.  */
1652                   if (distance_to_rel == 0
1653                       /* FIXME: This is wrong.  We are trying to catch
1654                          relocs that are addressed part way through the
1655                          current instruction, as might happen with a packed
1656                          VLIW instruction.  Unfortunately we do not know the
1657                          length of the current instruction since we have not
1658                          disassembled it yet.  Instead we take a guess based
1659                          upon the length of the previous instruction.  The
1660                          proper solution is to have a new target-specific
1661                          disassembler function which just returns the length
1662                          of an instruction at a given address without trying
1663                          to display its disassembly. */
1664                       || (distance_to_rel > 0
1665                           && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1666                     {
1667                       inf->flags |= INSN_HAS_RELOC;
1668                       aux->reloc = **relppp;
1669                     }
1670                 }
1671
1672               octets = (*disassemble_fn) (section->vma + addr_offset, inf);
1673               inf->fprintf_func = (fprintf_ftype) fprintf;
1674               inf->stream = stdout;
1675               if (insn_width == 0 && inf->bytes_per_line != 0)
1676                 octets_per_line = inf->bytes_per_line;
1677               if (octets < (int) opb)
1678                 {
1679                   if (sfile.pos)
1680                     printf ("%s\n", sfile.buffer);
1681                   if (octets >= 0)
1682                     {
1683                       non_fatal (_("disassemble_fn returned length %d"),
1684                                  octets);
1685                       exit_status = 1;
1686                     }
1687                   break;
1688                 }
1689             }
1690           else
1691             {
1692               bfd_vma j;
1693
1694               octets = octets_per_line;
1695               if (addr_offset + octets / opb > stop_offset)
1696                 octets = (stop_offset - addr_offset) * opb;
1697
1698               for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1699                 {
1700                   if (ISPRINT (data[j]))
1701                     buf[j - addr_offset * opb] = data[j];
1702                   else
1703                     buf[j - addr_offset * opb] = '.';
1704                 }
1705               buf[j - addr_offset * opb] = '\0';
1706             }
1707
1708           if (prefix_addresses
1709               ? show_raw_insn > 0
1710               : show_raw_insn >= 0)
1711             {
1712               bfd_vma j;
1713
1714               /* If ! prefix_addresses and ! wide_output, we print
1715                  octets_per_line octets per line.  */
1716               pb = octets;
1717               if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1718                 pb = octets_per_line;
1719
1720               if (inf->bytes_per_chunk)
1721                 bpc = inf->bytes_per_chunk;
1722               else
1723                 bpc = 1;
1724
1725               for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1726                 {
1727                   int k;
1728
1729                   if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1730                     {
1731                       for (k = bpc - 1; k >= 0; k--)
1732                         printf ("%02x", (unsigned) data[j + k]);
1733                       putchar (' ');
1734                     }
1735                   else
1736                     {
1737                       for (k = 0; k < bpc; k++)
1738                         printf ("%02x", (unsigned) data[j + k]);
1739                       putchar (' ');
1740                     }
1741                 }
1742
1743               for (; pb < octets_per_line; pb += bpc)
1744                 {
1745                   int k;
1746
1747                   for (k = 0; k < bpc; k++)
1748                     printf ("  ");
1749                   putchar (' ');
1750                 }
1751
1752               /* Separate raw data from instruction by extra space.  */
1753               if (insns)
1754                 putchar ('\t');
1755               else
1756                 printf ("    ");
1757             }
1758
1759           if (! insns)
1760             printf ("%s", buf);
1761           else if (sfile.pos)
1762             printf ("%s", sfile.buffer);
1763
1764           if (prefix_addresses
1765               ? show_raw_insn > 0
1766               : show_raw_insn >= 0)
1767             {
1768               while (pb < octets)
1769                 {
1770                   bfd_vma j;
1771                   char *s;
1772
1773                   putchar ('\n');
1774                   j = addr_offset * opb + pb;
1775
1776                   bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1777                   for (s = buf + skip_addr_chars; *s == '0'; s++)
1778                     *s = ' ';
1779                   if (*s == '\0')
1780                     *--s = '0';
1781                   printf ("%s:\t", buf + skip_addr_chars);
1782
1783                   pb += octets_per_line;
1784                   if (pb > octets)
1785                     pb = octets;
1786                   for (; j < addr_offset * opb + pb; j += bpc)
1787                     {
1788                       int k;
1789
1790                       if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1791                         {
1792                           for (k = bpc - 1; k >= 0; k--)
1793                             printf ("%02x", (unsigned) data[j + k]);
1794                           putchar (' ');
1795                         }
1796                       else
1797                         {
1798                           for (k = 0; k < bpc; k++)
1799                             printf ("%02x", (unsigned) data[j + k]);
1800                           putchar (' ');
1801                         }
1802                     }
1803                 }
1804             }
1805
1806           if (!wide_output)
1807             putchar ('\n');
1808           else
1809             need_nl = TRUE;
1810         }
1811
1812       while ((*relppp) < relppend
1813              && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1814         {
1815           if (dump_reloc_info || dump_dynamic_reloc_info)
1816             {
1817               arelent *q;
1818
1819               q = **relppp;
1820
1821               if (wide_output)
1822                 putchar ('\t');
1823               else
1824                 printf ("\t\t\t");
1825
1826               objdump_print_value (section->vma - rel_offset + q->address,
1827                                    inf, TRUE);
1828
1829               if (q->howto == NULL)
1830                 printf (": *unknown*\t");
1831               else if (q->howto->name)
1832                 printf (": %s\t", q->howto->name);
1833               else
1834                 printf (": %d\t", q->howto->type);
1835
1836               if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1837                 printf ("*unknown*");
1838               else
1839                 {
1840                   const char *sym_name;
1841
1842                   sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1843                   if (sym_name != NULL && *sym_name != '\0')
1844                     objdump_print_symname (aux->abfd, inf, *q->sym_ptr_ptr);
1845                   else
1846                     {
1847                       asection *sym_sec;
1848
1849                       sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1850                       sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1851                       if (sym_name == NULL || *sym_name == '\0')
1852                         sym_name = "*unknown*";
1853                       printf ("%s", sym_name);
1854                     }
1855                 }
1856
1857               if (q->addend)
1858                 {
1859                   bfd_signed_vma addend = q->addend;
1860                   if (addend < 0)
1861                     {
1862                       printf ("-0x");
1863                       addend = -addend;
1864                     }
1865                   else
1866                     printf ("+0x");
1867                   objdump_print_value (addend, inf, TRUE);
1868                 }
1869
1870               printf ("\n");
1871               need_nl = FALSE;
1872             }
1873           ++(*relppp);
1874         }
1875
1876       if (need_nl)
1877         printf ("\n");
1878
1879       addr_offset += octets / opb;
1880     }
1881
1882   free (sfile.buffer);
1883 }
1884
1885 static void
1886 disassemble_section (bfd *abfd, asection *section, void *inf)
1887 {
1888   const struct elf_backend_data * bed;
1889   bfd_vma                      sign_adjust = 0;
1890   struct disassemble_info *    pinfo = (struct disassemble_info *) inf;
1891   struct objdump_disasm_info * paux;
1892   unsigned int                 opb = pinfo->octets_per_byte;
1893   bfd_byte *                   data = NULL;
1894   bfd_size_type                datasize = 0;
1895   arelent **                   rel_pp = NULL;
1896   arelent **                   rel_ppstart = NULL;
1897   arelent **                   rel_ppend;
1898   unsigned long                stop_offset;
1899   asymbol *                    sym = NULL;
1900   long                         place = 0;
1901   long                         rel_count;
1902   bfd_vma                      rel_offset;
1903   unsigned long                addr_offset;
1904
1905   /* Sections that do not contain machine
1906      code are not normally disassembled.  */
1907   if (! disassemble_all
1908       && only_list == NULL
1909       && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1910           != (SEC_CODE | SEC_HAS_CONTENTS)))
1911     return;
1912
1913   if (! process_section_p (section))
1914     return;
1915
1916   datasize = bfd_get_section_size (section);
1917   if (datasize == 0)
1918     return;
1919
1920   if (start_address == (bfd_vma) -1
1921       || start_address < section->vma)
1922     addr_offset = 0;
1923   else
1924     addr_offset = start_address - section->vma;
1925
1926   if (stop_address == (bfd_vma) -1)
1927     stop_offset = datasize / opb;
1928   else
1929     {
1930       if (stop_address < section->vma)
1931         stop_offset = 0;
1932       else
1933         stop_offset = stop_address - section->vma;
1934       if (stop_offset > datasize / opb)
1935         stop_offset = datasize / opb;
1936     }
1937
1938   if (addr_offset >= stop_offset)
1939     return;
1940
1941   /* Decide which set of relocs to use.  Load them if necessary.  */
1942   paux = (struct objdump_disasm_info *) pinfo->application_data;
1943   if (paux->dynrelbuf)
1944     {
1945       rel_pp = paux->dynrelbuf;
1946       rel_count = paux->dynrelcount;
1947       /* Dynamic reloc addresses are absolute, non-dynamic are section
1948          relative.  REL_OFFSET specifies the reloc address corresponding
1949          to the start of this section.  */
1950       rel_offset = section->vma;
1951     }
1952   else
1953     {
1954       rel_count = 0;
1955       rel_pp = NULL;
1956       rel_offset = 0;
1957
1958       if ((section->flags & SEC_RELOC) != 0
1959           && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1960         {
1961           long relsize;
1962
1963           relsize = bfd_get_reloc_upper_bound (abfd, section);
1964           if (relsize < 0)
1965             bfd_fatal (bfd_get_filename (abfd));
1966
1967           if (relsize > 0)
1968             {
1969               rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
1970               rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1971               if (rel_count < 0)
1972                 bfd_fatal (bfd_get_filename (abfd));
1973
1974               /* Sort the relocs by address.  */
1975               qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1976             }
1977         }
1978     }
1979   rel_ppend = rel_pp + rel_count;
1980
1981   data = (bfd_byte *) xmalloc (datasize);
1982
1983   bfd_get_section_contents (abfd, section, data, 0, datasize);
1984
1985   paux->sec = section;
1986   pinfo->buffer = data;
1987   pinfo->buffer_vma = section->vma;
1988   pinfo->buffer_length = datasize;
1989   pinfo->section = section;
1990
1991   /* Skip over the relocs belonging to addresses below the
1992      start address.  */
1993   while (rel_pp < rel_ppend
1994          && (*rel_pp)->address < rel_offset + addr_offset)
1995     ++rel_pp;
1996
1997   printf (_("\nDisassembly of section %s:\n"), section->name);
1998
1999   /* Find the nearest symbol forwards from our current position.  */
2000   paux->require_sec = TRUE;
2001   sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
2002                                              (struct disassemble_info *) inf,
2003                                              &place);
2004   paux->require_sec = FALSE;
2005
2006   /* PR 9774: If the target used signed addresses then we must make
2007      sure that we sign extend the value that we calculate for 'addr'
2008      in the loop below.  */
2009   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2010       && (bed = get_elf_backend_data (abfd)) != NULL
2011       && bed->sign_extend_vma)
2012     sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
2013
2014   /* Disassemble a block of instructions up to the address associated with
2015      the symbol we have just found.  Then print the symbol and find the
2016      next symbol on.  Repeat until we have disassembled the entire section
2017      or we have reached the end of the address range we are interested in.  */
2018   while (addr_offset < stop_offset)
2019     {
2020       bfd_vma addr;
2021       asymbol *nextsym;
2022       unsigned long nextstop_offset;
2023       bfd_boolean insns;
2024
2025       addr = section->vma + addr_offset;
2026       addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
2027
2028       if (sym != NULL && bfd_asymbol_value (sym) <= addr)
2029         {
2030           int x;
2031
2032           for (x = place;
2033                (x < sorted_symcount
2034                 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
2035                ++x)
2036             continue;
2037
2038           pinfo->symbols = sorted_syms + place;
2039           pinfo->num_symbols = x - place;
2040           pinfo->symtab_pos = place;
2041         }
2042       else
2043         {
2044           pinfo->symbols = NULL;
2045           pinfo->num_symbols = 0;
2046           pinfo->symtab_pos = -1;
2047         }
2048
2049       if (! prefix_addresses)
2050         {
2051           pinfo->fprintf_func (pinfo->stream, "\n");
2052           objdump_print_addr_with_sym (abfd, section, sym, addr,
2053                                        pinfo, FALSE);
2054           pinfo->fprintf_func (pinfo->stream, ":\n");
2055         }
2056
2057       if (sym != NULL && bfd_asymbol_value (sym) > addr)
2058         nextsym = sym;
2059       else if (sym == NULL)
2060         nextsym = NULL;
2061       else
2062         {
2063 #define is_valid_next_sym(SYM) \
2064   ((SYM)->section == section \
2065    && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
2066    && pinfo->symbol_is_valid (SYM, pinfo))
2067             
2068           /* Search forward for the next appropriate symbol in
2069              SECTION.  Note that all the symbols are sorted
2070              together into one big array, and that some sections
2071              may have overlapping addresses.  */
2072           while (place < sorted_symcount
2073                  && ! is_valid_next_sym (sorted_syms [place]))
2074             ++place;
2075
2076           if (place >= sorted_symcount)
2077             nextsym = NULL;
2078           else
2079             nextsym = sorted_syms[place];
2080         }
2081
2082       if (sym != NULL && bfd_asymbol_value (sym) > addr)
2083         nextstop_offset = bfd_asymbol_value (sym) - section->vma;
2084       else if (nextsym == NULL)
2085         nextstop_offset = stop_offset;
2086       else
2087         nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
2088
2089       if (nextstop_offset > stop_offset
2090           || nextstop_offset <= addr_offset)
2091         nextstop_offset = stop_offset;
2092
2093       /* If a symbol is explicitly marked as being an object
2094          rather than a function, just dump the bytes without
2095          disassembling them.  */
2096       if (disassemble_all
2097           || sym == NULL
2098           || sym->section != section
2099           || bfd_asymbol_value (sym) > addr
2100           || ((sym->flags & BSF_OBJECT) == 0
2101               && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
2102                   == NULL)
2103               && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
2104                   == NULL))
2105           || (sym->flags & BSF_FUNCTION) != 0)
2106         insns = TRUE;
2107       else
2108         insns = FALSE;
2109
2110       disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2111                          addr_offset, nextstop_offset,
2112                          rel_offset, &rel_pp, rel_ppend);
2113       
2114       addr_offset = nextstop_offset;
2115       sym = nextsym;
2116     }
2117
2118   free (data);
2119
2120   if (rel_ppstart != NULL)
2121     free (rel_ppstart);
2122 }
2123
2124 /* Disassemble the contents of an object file.  */
2125
2126 static void
2127 disassemble_data (bfd *abfd)
2128 {
2129   struct disassemble_info disasm_info;
2130   struct objdump_disasm_info aux;
2131   long i;
2132
2133   print_files = NULL;
2134   prev_functionname = NULL;
2135   prev_line = -1;
2136   prev_discriminator = 0;
2137
2138   /* We make a copy of syms to sort.  We don't want to sort syms
2139      because that will screw up the relocs.  */
2140   sorted_symcount = symcount ? symcount : dynsymcount;
2141   sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2142                                       * sizeof (asymbol *));
2143   memcpy (sorted_syms, symcount ? syms : dynsyms,
2144           sorted_symcount * sizeof (asymbol *));
2145
2146   sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2147
2148   for (i = 0; i < synthcount; ++i)
2149     {
2150       sorted_syms[sorted_symcount] = synthsyms + i;
2151       ++sorted_symcount;
2152     }
2153
2154   /* Sort the symbols into section and symbol order.  */
2155   qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2156
2157   init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
2158
2159   disasm_info.application_data = (void *) &aux;
2160   aux.abfd = abfd;
2161   aux.require_sec = FALSE;
2162   aux.dynrelbuf = NULL;
2163   aux.dynrelcount = 0;
2164   aux.reloc = NULL;
2165
2166   disasm_info.print_address_func = objdump_print_address;
2167   disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2168
2169   if (machine != NULL)
2170     {
2171       const bfd_arch_info_type *inf = bfd_scan_arch (machine);
2172
2173       if (inf == NULL)
2174         fatal (_("can't use supplied machine %s"), machine);
2175
2176       abfd->arch_info = inf;
2177     }
2178
2179   if (endian != BFD_ENDIAN_UNKNOWN)
2180     {
2181       struct bfd_target *xvec;
2182
2183       xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
2184       memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2185       xvec->byteorder = endian;
2186       abfd->xvec = xvec;
2187     }
2188
2189   /* Use libopcodes to locate a suitable disassembler.  */
2190   aux.disassemble_fn = disassembler (abfd);
2191   if (!aux.disassemble_fn)
2192     {
2193       non_fatal (_("can't disassemble for architecture %s\n"),
2194                  bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2195       exit_status = 1;
2196       return;
2197     }
2198
2199   disasm_info.flavour = bfd_get_flavour (abfd);
2200   disasm_info.arch = bfd_get_arch (abfd);
2201   disasm_info.mach = bfd_get_mach (abfd);
2202   disasm_info.disassembler_options = disassembler_options;
2203   disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2204   disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2205   disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2206   disasm_info.disassembler_needs_relocs = FALSE;
2207
2208   if (bfd_big_endian (abfd))
2209     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2210   else if (bfd_little_endian (abfd))
2211     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2212   else
2213     /* ??? Aborting here seems too drastic.  We could default to big or little
2214        instead.  */
2215     disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2216
2217   /* Allow the target to customize the info structure.  */
2218   disassemble_init_for_target (& disasm_info);
2219
2220   /* Pre-load the dynamic relocs if we are going
2221      to be dumping them along with the disassembly.  */
2222   if (dump_dynamic_reloc_info)
2223     {
2224       long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2225   
2226       if (relsize < 0)
2227         bfd_fatal (bfd_get_filename (abfd));
2228
2229       if (relsize > 0)
2230         {
2231           aux.dynrelbuf = (arelent **) xmalloc (relsize);
2232           aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2233                                                             aux.dynrelbuf,
2234                                                             dynsyms);
2235           if (aux.dynrelcount < 0)
2236             bfd_fatal (bfd_get_filename (abfd));
2237
2238           /* Sort the relocs by address.  */
2239           qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2240                  compare_relocs);
2241         }
2242     }
2243   disasm_info.symtab = sorted_syms;
2244   disasm_info.symtab_size = sorted_symcount;
2245
2246   bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2247
2248   if (aux.dynrelbuf != NULL)
2249     free (aux.dynrelbuf);
2250   free (sorted_syms);
2251 }
2252 \f
2253 static int
2254 load_specific_debug_section (enum dwarf_section_display_enum debug,
2255                              asection *sec, void *file)
2256 {
2257   struct dwarf_section *section = &debug_displays [debug].section;
2258   bfd *abfd = (bfd *) file;
2259   bfd_boolean ret;
2260
2261   /* If it is already loaded, do nothing.  */
2262   if (section->start != NULL)
2263     return 1;
2264
2265   section->address = bfd_get_section_vma (abfd, sec);
2266   section->size = bfd_get_section_size (sec);
2267   section->start = NULL;
2268   ret = bfd_get_full_section_contents (abfd, sec, &section->start);
2269
2270   if (! ret)
2271     {
2272       free_debug_section (debug);
2273       printf (_("\nCan't get contents for section '%s'.\n"),
2274               section->name);
2275       return 0;
2276     }
2277
2278   if (is_relocatable && debug_displays [debug].relocate)
2279     {
2280       bfd_cache_section_contents (sec, section->start);
2281
2282       ret = bfd_simple_get_relocated_section_contents (abfd,
2283                                                        sec,
2284                                                        section->start,
2285                                                        syms) != NULL;
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
2296   return 1;
2297 }
2298
2299 int
2300 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2301 {
2302   struct dwarf_section *section = &debug_displays [debug].section;
2303   bfd *abfd = (bfd *) file;
2304   asection *sec;
2305
2306   /* If it is already loaded, do nothing.  */
2307   if (section->start != NULL)
2308     return 1;
2309
2310   /* Locate the debug section.  */
2311   sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2312   if (sec != NULL)
2313     section->name = section->uncompressed_name;
2314   else
2315     {
2316       sec = bfd_get_section_by_name (abfd, section->compressed_name);
2317       if (sec != NULL)
2318         section->name = section->compressed_name;
2319     }
2320   if (sec == NULL)
2321     return 0;
2322
2323   return load_specific_debug_section (debug, sec, file);
2324 }
2325
2326 void
2327 free_debug_section (enum dwarf_section_display_enum debug)
2328 {
2329   struct dwarf_section *section = &debug_displays [debug].section;
2330
2331   if (section->start == NULL)
2332     return;
2333
2334   free ((char *) section->start);
2335   section->start = NULL;
2336   section->address = 0;
2337   section->size = 0;
2338 }
2339
2340 static void
2341 dump_dwarf_section (bfd *abfd, asection *section,
2342                     void *arg ATTRIBUTE_UNUSED)
2343 {
2344   const char *name = bfd_get_section_name (abfd, section);
2345   const char *match;
2346   int i;
2347
2348   if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2349     match = ".debug_info";
2350   else
2351     match = name;
2352
2353   for (i = 0; i < max; i++)
2354     if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2355          || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2356         && debug_displays [i].enabled != NULL
2357         && *debug_displays [i].enabled)
2358       {
2359         struct dwarf_section *sec = &debug_displays [i].section;
2360
2361         if (strcmp (sec->uncompressed_name, match) == 0)
2362           sec->name = sec->uncompressed_name;
2363         else
2364           sec->name = sec->compressed_name;
2365         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2366                                          section, abfd))
2367           {
2368             debug_displays [i].display (sec, abfd);
2369             
2370             if (i != info && i != abbrev)
2371               free_debug_section ((enum dwarf_section_display_enum) i);
2372           }
2373         break;
2374       }
2375 }
2376
2377 /* Dump the dwarf debugging information.  */
2378
2379 static void
2380 dump_dwarf (bfd *abfd)
2381 {
2382   is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2383
2384   eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
2385
2386   if (bfd_big_endian (abfd))
2387     byte_get = byte_get_big_endian;
2388   else if (bfd_little_endian (abfd))
2389     byte_get = byte_get_little_endian;
2390   else
2391     abort ();
2392
2393   switch (bfd_get_arch (abfd))
2394     {
2395     case bfd_arch_i386:
2396       switch (bfd_get_mach (abfd))
2397         {
2398         case bfd_mach_x86_64:
2399         case bfd_mach_x86_64_intel_syntax:
2400         case bfd_mach_x86_64_nacl:
2401         case bfd_mach_x64_32:
2402         case bfd_mach_x64_32_intel_syntax:
2403         case bfd_mach_x64_32_nacl:
2404           init_dwarf_regnames_x86_64 ();
2405           break;
2406
2407         default:
2408           init_dwarf_regnames_i386 ();
2409           break;
2410         }
2411       break;
2412
2413     case bfd_arch_aarch64:
2414       init_dwarf_regnames_aarch64();
2415       break;
2416
2417     default:
2418       break;
2419     }
2420
2421   bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2422
2423   free_debug_memory ();
2424 }
2425 \f
2426 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2427    it.  Return NULL on failure.   */
2428
2429 static char *
2430 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2431 {
2432   asection *stabsect;
2433   bfd_size_type size;
2434   char *contents;
2435
2436   stabsect = bfd_get_section_by_name (abfd, sect_name);
2437   if (stabsect == NULL)
2438     {
2439       printf (_("No %s section present\n\n"), sect_name);
2440       return FALSE;
2441     }
2442
2443   size = bfd_section_size (abfd, stabsect);
2444   contents  = (char *) xmalloc (size);
2445
2446   if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2447     {
2448       non_fatal (_("reading %s section of %s failed: %s"),
2449                  sect_name, bfd_get_filename (abfd),
2450                  bfd_errmsg (bfd_get_error ()));
2451       exit_status = 1;
2452       free (contents);
2453       return NULL;
2454     }
2455
2456   *size_ptr = size;
2457
2458   return contents;
2459 }
2460
2461 /* Stabs entries use a 12 byte format:
2462      4 byte string table index
2463      1 byte stab type
2464      1 byte stab other field
2465      2 byte stab desc field
2466      4 byte stab value
2467    FIXME: This will have to change for a 64 bit object format.  */
2468
2469 #define STRDXOFF  (0)
2470 #define TYPEOFF   (4)
2471 #define OTHEROFF  (5)
2472 #define DESCOFF   (6)
2473 #define VALOFF    (8)
2474 #define STABSIZE (12)
2475
2476 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2477    using string table section STRSECT_NAME (in `strtab').  */
2478
2479 static void
2480 print_section_stabs (bfd *abfd,
2481                      const char *stabsect_name,
2482                      unsigned *string_offset_ptr)
2483 {
2484   int i;
2485   unsigned file_string_table_offset = 0;
2486   unsigned next_file_string_table_offset = *string_offset_ptr;
2487   bfd_byte *stabp, *stabs_end;
2488
2489   stabp = stabs;
2490   stabs_end = stabp + stab_size;
2491
2492   printf (_("Contents of %s section:\n\n"), stabsect_name);
2493   printf ("Symnum n_type n_othr n_desc n_value  n_strx String\n");
2494
2495   /* Loop through all symbols and print them.
2496
2497      We start the index at -1 because there is a dummy symbol on
2498      the front of stabs-in-{coff,elf} sections that supplies sizes.  */
2499   for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2500     {
2501       const char *name;
2502       unsigned long strx;
2503       unsigned char type, other;
2504       unsigned short desc;
2505       bfd_vma value;
2506
2507       strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2508       type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2509       other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2510       desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2511       value = bfd_h_get_32 (abfd, stabp + VALOFF);
2512
2513       printf ("\n%-6d ", i);
2514       /* Either print the stab name, or, if unnamed, print its number
2515          again (makes consistent formatting for tools like awk).  */
2516       name = bfd_get_stab_name (type);
2517       if (name != NULL)
2518         printf ("%-6s", name);
2519       else if (type == N_UNDF)
2520         printf ("HdrSym");
2521       else
2522         printf ("%-6d", type);
2523       printf (" %-6d %-6d ", other, desc);
2524       bfd_printf_vma (abfd, value);
2525       printf (" %-6lu", strx);
2526
2527       /* Symbols with type == 0 (N_UNDF) specify the length of the
2528          string table associated with this file.  We use that info
2529          to know how to relocate the *next* file's string table indices.  */
2530       if (type == N_UNDF)
2531         {
2532           file_string_table_offset = next_file_string_table_offset;
2533           next_file_string_table_offset += value;
2534         }
2535       else
2536         {
2537           /* Using the (possibly updated) string table offset, print the
2538              string (if any) associated with this symbol.  */
2539           if ((strx + file_string_table_offset) < stabstr_size)
2540             printf (" %s", &strtab[strx + file_string_table_offset]);
2541           else
2542             printf (" *");
2543         }
2544     }
2545   printf ("\n\n");
2546   *string_offset_ptr = next_file_string_table_offset;
2547 }
2548
2549 typedef struct
2550 {
2551   const char * section_name;
2552   const char * string_section_name;
2553   unsigned string_offset;
2554 }
2555 stab_section_names;
2556
2557 static void
2558 find_stabs_section (bfd *abfd, asection *section, void *names)
2559 {
2560   int len;
2561   stab_section_names * sought = (stab_section_names *) names;
2562
2563   /* Check for section names for which stabsect_name is a prefix, to
2564      handle .stab.N, etc.  */
2565   len = strlen (sought->section_name);
2566
2567   /* If the prefix matches, and the files section name ends with a
2568      nul or a digit, then we match.  I.e., we want either an exact
2569      match or a section followed by a number.  */
2570   if (strncmp (sought->section_name, section->name, len) == 0
2571       && (section->name[len] == 0
2572           || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2573     {
2574       if (strtab == NULL)
2575         strtab = read_section_stabs (abfd, sought->string_section_name,
2576                                      &stabstr_size);
2577       
2578       if (strtab)
2579         {
2580           stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2581                                                    &stab_size);
2582           if (stabs)
2583             print_section_stabs (abfd, section->name, &sought->string_offset);
2584         }
2585     }
2586 }
2587
2588 static void
2589 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2590 {
2591   stab_section_names s;
2592
2593   s.section_name = stabsect_name;
2594   s.string_section_name = strsect_name;
2595   s.string_offset = 0;
2596
2597   bfd_map_over_sections (abfd, find_stabs_section, & s);
2598
2599   free (strtab);
2600   strtab = NULL;
2601 }
2602
2603 /* Dump the any sections containing stabs debugging information.  */
2604
2605 static void
2606 dump_stabs (bfd *abfd)
2607 {
2608   dump_stabs_section (abfd, ".stab", ".stabstr");
2609   dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2610   dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2611
2612   /* For Darwin.  */
2613   dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2614
2615   dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2616 }
2617 \f
2618 static void
2619 dump_bfd_header (bfd *abfd)
2620 {
2621   char *comma = "";
2622
2623   printf (_("architecture: %s, "),
2624           bfd_printable_arch_mach (bfd_get_arch (abfd),
2625                                    bfd_get_mach (abfd)));
2626   printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
2627
2628 #define PF(x, y)    if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2629   PF (HAS_RELOC, "HAS_RELOC");
2630   PF (EXEC_P, "EXEC_P");
2631   PF (HAS_LINENO, "HAS_LINENO");
2632   PF (HAS_DEBUG, "HAS_DEBUG");
2633   PF (HAS_SYMS, "HAS_SYMS");
2634   PF (HAS_LOCALS, "HAS_LOCALS");
2635   PF (DYNAMIC, "DYNAMIC");
2636   PF (WP_TEXT, "WP_TEXT");
2637   PF (D_PAGED, "D_PAGED");
2638   PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2639   printf (_("\nstart address 0x"));
2640   bfd_printf_vma (abfd, abfd->start_address);
2641   printf ("\n");
2642 }
2643
2644 \f
2645 static void
2646 dump_bfd_private_header (bfd *abfd)
2647 {
2648   bfd_print_private_bfd_data (abfd, stdout);
2649 }
2650
2651 static void
2652 dump_target_specific (bfd *abfd)
2653 {
2654   const struct objdump_private_desc * const *desc;
2655   struct objdump_private_option *opt;
2656   char *e, *b;
2657
2658   /* Find the desc.  */
2659   for (desc = objdump_private_vectors; *desc != NULL; desc++)
2660     if ((*desc)->filter (abfd))
2661       break;
2662
2663   if (*desc == NULL)
2664     {
2665       non_fatal (_("option -P/--private not supported by this file"));
2666       return;
2667     }
2668
2669   /* Clear all options.  */
2670   for (opt = (*desc)->options; opt->name; opt++)
2671     opt->selected = FALSE;
2672
2673   /* Decode options.  */
2674   b = dump_private_options;
2675   do
2676     {
2677       e = strchr (b, ',');
2678
2679       if (e)
2680         *e = 0;
2681
2682       for (opt = (*desc)->options; opt->name; opt++)
2683         if (strcmp (opt->name, b) == 0)
2684           {
2685             opt->selected = TRUE;
2686             break;
2687           }
2688       if (opt->name == NULL)
2689         non_fatal (_("target specific dump '%s' not supported"), b);
2690
2691       if (e)
2692         {
2693           *e = ',';
2694           b = e + 1;
2695         }
2696     }
2697   while (e != NULL);
2698
2699   /* Dump.  */
2700   (*desc)->dump (abfd);
2701 }
2702 \f
2703 /* Display a section in hexadecimal format with associated characters.
2704    Each line prefixed by the zero padded address.  */
2705
2706 static void
2707 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2708 {
2709   bfd_byte *data = 0;
2710   bfd_size_type datasize;
2711   bfd_size_type addr_offset;
2712   bfd_size_type start_offset;
2713   bfd_size_type stop_offset;
2714   unsigned int opb = bfd_octets_per_byte (abfd);
2715   /* Bytes per line.  */
2716   const int onaline = 16;
2717   char buf[64];
2718   int count;
2719   int width;
2720
2721   if ((section->flags & SEC_HAS_CONTENTS) == 0)
2722     return;
2723
2724   if (! process_section_p (section))
2725     return;
2726   
2727   if ((datasize = bfd_section_size (abfd, section)) == 0)
2728     return;
2729
2730   /* Compute the address range to display.  */
2731   if (start_address == (bfd_vma) -1
2732       || start_address < section->vma)
2733     start_offset = 0;
2734   else
2735     start_offset = start_address - section->vma;
2736
2737   if (stop_address == (bfd_vma) -1)
2738     stop_offset = datasize / opb;
2739   else
2740     {
2741       if (stop_address < section->vma)
2742         stop_offset = 0;
2743       else
2744         stop_offset = stop_address - section->vma;
2745
2746       if (stop_offset > datasize / opb)
2747         stop_offset = datasize / opb;
2748     }
2749
2750   if (start_offset >= stop_offset)
2751     return;
2752   
2753   printf (_("Contents of section %s:"), section->name);
2754   if (display_file_offsets)
2755     printf (_("  (Starting at file offset: 0x%lx)"),
2756             (unsigned long) (section->filepos + start_offset));
2757   printf ("\n");
2758
2759   if (!bfd_get_full_section_contents (abfd, section, &data))
2760     {
2761       non_fatal (_("Reading section failed"));
2762       return;
2763     }
2764
2765   width = 4;
2766
2767   bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2768   if (strlen (buf) >= sizeof (buf))
2769     abort ();
2770
2771   count = 0;
2772   while (buf[count] == '0' && buf[count+1] != '\0')
2773     count++;
2774   count = strlen (buf) - count;
2775   if (count > width)
2776     width = count;
2777
2778   bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2779   if (strlen (buf) >= sizeof (buf))
2780     abort ();
2781
2782   count = 0;
2783   while (buf[count] == '0' && buf[count+1] != '\0')
2784     count++;
2785   count = strlen (buf) - count;
2786   if (count > width)
2787     width = count;
2788
2789   for (addr_offset = start_offset;
2790        addr_offset < stop_offset; addr_offset += onaline / opb)
2791     {
2792       bfd_size_type j;
2793
2794       bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2795       count = strlen (buf);
2796       if ((size_t) count >= sizeof (buf))
2797         abort ();
2798
2799       putchar (' ');
2800       while (count < width)
2801         {
2802           putchar ('0');
2803           count++;
2804         }
2805       fputs (buf + count - width, stdout);
2806       putchar (' ');
2807
2808       for (j = addr_offset * opb;
2809            j < addr_offset * opb + onaline; j++)
2810         {
2811           if (j < stop_offset * opb)
2812             printf ("%02x", (unsigned) (data[j]));
2813           else
2814             printf ("  ");
2815           if ((j & 3) == 3)
2816             printf (" ");
2817         }
2818
2819       printf (" ");
2820       for (j = addr_offset * opb;
2821            j < addr_offset * opb + onaline; j++)
2822         {
2823           if (j >= stop_offset * opb)
2824             printf (" ");
2825           else
2826             printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2827         }
2828       putchar ('\n');
2829     }
2830   free (data);
2831 }
2832
2833 /* Actually display the various requested regions.  */
2834
2835 static void
2836 dump_data (bfd *abfd)
2837 {
2838   bfd_map_over_sections (abfd, dump_section, NULL);
2839 }
2840
2841 /* Should perhaps share code and display with nm?  */
2842
2843 static void
2844 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2845 {
2846   asymbol **current;
2847   long max_count;
2848   long count;
2849
2850   if (dynamic)
2851     {
2852       current = dynsyms;
2853       max_count = dynsymcount;
2854       printf ("DYNAMIC SYMBOL TABLE:\n");
2855     }
2856   else
2857     {
2858       current = syms;
2859       max_count = symcount;
2860       printf ("SYMBOL TABLE:\n");
2861     }
2862
2863   if (max_count == 0)
2864     printf (_("no symbols\n"));
2865
2866   for (count = 0; count < max_count; count++)
2867     {
2868       bfd *cur_bfd;
2869
2870       if (*current == NULL)
2871         printf (_("no information for symbol number %ld\n"), count);
2872
2873       else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2874         printf (_("could not determine the type of symbol number %ld\n"),
2875                 count);
2876
2877       else if (process_section_p ((* current)->section)
2878                && (dump_special_syms
2879                    || !bfd_is_target_special_symbol (cur_bfd, *current)))
2880         {
2881           const char *name = (*current)->name;
2882
2883           if (do_demangle && name != NULL && *name != '\0')
2884             {
2885               char *alloc;
2886
2887               /* If we want to demangle the name, we demangle it
2888                  here, and temporarily clobber it while calling
2889                  bfd_print_symbol.  FIXME: This is a gross hack.  */
2890               alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2891               if (alloc != NULL)
2892                 (*current)->name = alloc;
2893               bfd_print_symbol (cur_bfd, stdout, *current,
2894                                 bfd_print_symbol_all);
2895               if (alloc != NULL)
2896                 {
2897                   (*current)->name = name;
2898                   free (alloc);
2899                 }
2900             }
2901           else
2902             bfd_print_symbol (cur_bfd, stdout, *current,
2903                               bfd_print_symbol_all);
2904           printf ("\n");
2905         }
2906
2907       current++;
2908     }
2909   printf ("\n\n");
2910 }
2911 \f
2912 static void
2913 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2914 {
2915   arelent **p;
2916   char *last_filename, *last_functionname;
2917   unsigned int last_line;
2918   unsigned int last_discriminator;
2919
2920   /* Get column headers lined up reasonably.  */
2921   {
2922     static int width;
2923
2924     if (width == 0)
2925       {
2926         char buf[30];
2927
2928         bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2929         width = strlen (buf) - 7;
2930       }
2931     printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2932   }
2933
2934   last_filename = NULL;
2935   last_functionname = NULL;
2936   last_line = 0;
2937   last_discriminator = 0;
2938
2939   for (p = relpp; relcount && *p != NULL; p++, relcount--)
2940     {
2941       arelent *q = *p;
2942       const char *filename, *functionname;
2943       unsigned int linenumber;
2944       unsigned int discriminator;
2945       const char *sym_name;
2946       const char *section_name;
2947       bfd_vma addend2 = 0;
2948
2949       if (start_address != (bfd_vma) -1
2950           && q->address < start_address)
2951         continue;
2952       if (stop_address != (bfd_vma) -1
2953           && q->address > stop_address)
2954         continue;
2955
2956       if (with_line_numbers
2957           && sec != NULL
2958           && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
2959                                                   &filename, &functionname,
2960                                                   &linenumber, &discriminator))
2961         {
2962           if (functionname != NULL
2963               && (last_functionname == NULL
2964                   || strcmp (functionname, last_functionname) != 0))
2965             {
2966               printf ("%s():\n", functionname);
2967               if (last_functionname != NULL)
2968                 free (last_functionname);
2969               last_functionname = xstrdup (functionname);
2970             }
2971
2972           if (linenumber > 0
2973               && (linenumber != last_line
2974                   || (filename != NULL
2975                       && last_filename != NULL
2976                       && filename_cmp (filename, last_filename) != 0)
2977                   || (discriminator != last_discriminator)))
2978             {
2979               if (discriminator > 0)
2980                 printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
2981               else
2982                 printf ("%s:%u (discriminator %u)\n", filename == NULL ? "???" : filename,
2983                         linenumber, discriminator);
2984               last_line = linenumber;
2985               last_discriminator = discriminator;
2986               if (last_filename != NULL)
2987                 free (last_filename);
2988               if (filename == NULL)
2989                 last_filename = NULL;
2990               else
2991                 last_filename = xstrdup (filename);
2992             }
2993         }
2994
2995       if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2996         {
2997           sym_name = (*(q->sym_ptr_ptr))->name;
2998           section_name = (*(q->sym_ptr_ptr))->section->name;
2999         }
3000       else
3001         {
3002           sym_name = NULL;
3003           section_name = NULL;
3004         }
3005
3006       bfd_printf_vma (abfd, q->address);
3007       if (q->howto == NULL)
3008         printf (" *unknown*         ");
3009       else if (q->howto->name)
3010         {
3011           const char *name = q->howto->name;
3012
3013           /* R_SPARC_OLO10 relocations contain two addends.
3014              But because 'arelent' lacks enough storage to
3015              store them both, the 64-bit ELF Sparc backend
3016              records this as two relocations.  One R_SPARC_LO10
3017              and one R_SPARC_13, both pointing to the same
3018              address.  This is merely so that we have some
3019              place to store both addend fields.
3020
3021              Undo this transformation, otherwise the output
3022              will be confusing.  */
3023           if (abfd->xvec->flavour == bfd_target_elf_flavour
3024               && elf_tdata(abfd)->elf_header->e_machine == EM_SPARCV9
3025               && relcount > 1
3026               && !strcmp (q->howto->name, "R_SPARC_LO10"))
3027             {
3028               arelent *q2 = *(p + 1);
3029               if (q2 != NULL
3030                   && q2->howto
3031                   && q->address == q2->address
3032                   && !strcmp (q2->howto->name, "R_SPARC_13"))
3033                 {
3034                   name = "R_SPARC_OLO10";
3035                   addend2 = q2->addend;
3036                   p++;
3037                 }
3038             }
3039           printf (" %-16s  ", name);
3040         }
3041       else
3042         printf (" %-16d  ", q->howto->type);
3043
3044       if (sym_name)
3045         {
3046           objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
3047         }
3048       else
3049         {
3050           if (section_name == NULL)
3051             section_name = "*unknown*";
3052           printf ("[%s]", section_name);
3053         }
3054
3055       if (q->addend)
3056         {
3057           bfd_signed_vma addend = q->addend;
3058           if (addend < 0)
3059             {
3060               printf ("-0x");
3061               addend = -addend;
3062             }
3063           else
3064             printf ("+0x");
3065           bfd_printf_vma (abfd, addend);
3066         }
3067       if (addend2)
3068         {
3069           printf ("+0x");
3070           bfd_printf_vma (abfd, addend2);
3071         }
3072
3073       printf ("\n");
3074     }
3075
3076   if (last_filename != NULL)
3077     free (last_filename);
3078   if (last_functionname != NULL)
3079     free (last_functionname);
3080 }
3081
3082 static void
3083 dump_relocs_in_section (bfd *abfd,
3084                         asection *section,
3085                         void *dummy ATTRIBUTE_UNUSED)
3086 {
3087   arelent **relpp;
3088   long relcount;
3089   long relsize;
3090
3091   if (   bfd_is_abs_section (section)
3092       || bfd_is_und_section (section)
3093       || bfd_is_com_section (section)
3094       || (! process_section_p (section))
3095       || ((section->flags & SEC_RELOC) == 0))
3096     return;
3097
3098   relsize = bfd_get_reloc_upper_bound (abfd, section);
3099   if (relsize < 0)
3100     bfd_fatal (bfd_get_filename (abfd));
3101
3102   printf ("RELOCATION RECORDS FOR [%s]:", section->name);
3103
3104   if (relsize == 0)
3105     {
3106       printf (" (none)\n\n");
3107       return;
3108     }
3109
3110   relpp = (arelent **) xmalloc (relsize);
3111   relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
3112
3113   if (relcount < 0)
3114     {
3115       printf ("\n");
3116       non_fatal (_("failed to read relocs in: %s"), bfd_get_filename (abfd));
3117       bfd_fatal (_("error message was"));
3118     }
3119   else if (relcount == 0)
3120     printf (" (none)\n\n");
3121   else
3122     {
3123       printf ("\n");
3124       dump_reloc_set (abfd, section, relpp, relcount);
3125       printf ("\n\n");
3126     }
3127   free (relpp);
3128 }
3129
3130 static void
3131 dump_relocs (bfd *abfd)
3132 {
3133   bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
3134 }
3135
3136 static void
3137 dump_dynamic_relocs (bfd *abfd)
3138 {
3139   long relsize;
3140   arelent **relpp;
3141   long relcount;
3142
3143   relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3144   if (relsize < 0)
3145     bfd_fatal (bfd_get_filename (abfd));
3146
3147   printf ("DYNAMIC RELOCATION RECORDS");
3148
3149   if (relsize == 0)
3150     printf (" (none)\n\n");
3151   else
3152     {
3153       relpp = (arelent **) xmalloc (relsize);
3154       relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
3155
3156       if (relcount < 0)
3157         bfd_fatal (bfd_get_filename (abfd));
3158       else if (relcount == 0)
3159         printf (" (none)\n\n");
3160       else
3161         {
3162           printf ("\n");
3163           dump_reloc_set (abfd, NULL, relpp, relcount);
3164           printf ("\n\n");
3165         }
3166       free (relpp);
3167     }
3168 }
3169
3170 /* Creates a table of paths, to search for source files.  */
3171
3172 static void
3173 add_include_path (const char *path)
3174 {
3175   if (path[0] == 0)
3176     return;
3177   include_path_count++;
3178   include_paths = (const char **)
3179       xrealloc (include_paths, include_path_count * sizeof (*include_paths));
3180 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3181   if (path[1] == ':' && path[2] == 0)
3182     path = concat (path, ".", (const char *) 0);
3183 #endif
3184   include_paths[include_path_count - 1] = path;
3185 }
3186
3187 static void
3188 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
3189                   asection *section,
3190                   void *arg)
3191 {
3192   if ((section->flags & SEC_DEBUGGING) == 0)
3193     {
3194       bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
3195       section->vma += adjust_section_vma;
3196       if (*has_reloc_p)
3197         section->lma += adjust_section_vma;
3198     }
3199 }
3200
3201 /* Dump selected contents of ABFD.  */
3202
3203 static void
3204 dump_bfd (bfd *abfd)
3205 {
3206   /* If we are adjusting section VMA's, change them all now.  Changing
3207      the BFD information is a hack.  However, we must do it, or
3208      bfd_find_nearest_line will not do the right thing.  */
3209   if (adjust_section_vma != 0)
3210     {
3211       bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3212       bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
3213     }
3214
3215   if (! dump_debugging_tags && ! suppress_bfd_header)
3216     printf (_("\n%s:     file format %s\n"), bfd_get_filename (abfd),
3217             abfd->xvec->name);
3218   if (dump_ar_hdrs)
3219     print_arelt_descr (stdout, abfd, TRUE);
3220   if (dump_file_header)
3221     dump_bfd_header (abfd);
3222   if (dump_private_headers)
3223     dump_bfd_private_header (abfd);
3224   if (dump_private_options != NULL)
3225     dump_target_specific (abfd);
3226   if (! dump_debugging_tags && ! suppress_bfd_header)
3227     putchar ('\n');
3228
3229   if (dump_symtab
3230       || dump_reloc_info
3231       || disassemble
3232       || dump_debugging
3233       || dump_dwarf_section_info)
3234     syms = slurp_symtab (abfd);
3235
3236   if (dump_section_headers)
3237     dump_headers (abfd);
3238
3239   if (dump_dynamic_symtab || dump_dynamic_reloc_info
3240       || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
3241     dynsyms = slurp_dynamic_symtab (abfd);
3242   if (disassemble)
3243     {
3244       synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
3245                                              dynsymcount, dynsyms, &synthsyms);
3246       if (synthcount < 0)
3247         synthcount = 0;
3248     }
3249
3250   if (dump_symtab)
3251     dump_symbols (abfd, FALSE);
3252   if (dump_dynamic_symtab)
3253     dump_symbols (abfd, TRUE);
3254   if (dump_dwarf_section_info)
3255     dump_dwarf (abfd);
3256   if (dump_stab_section_info)
3257     dump_stabs (abfd);
3258   if (dump_reloc_info && ! disassemble)
3259     dump_relocs (abfd);
3260   if (dump_dynamic_reloc_info && ! disassemble)
3261     dump_dynamic_relocs (abfd);
3262   if (dump_section_contents)
3263     dump_data (abfd);
3264   if (disassemble)
3265     disassemble_data (abfd);
3266
3267   if (dump_debugging)
3268     {
3269       void *dhandle;
3270
3271       dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3272       if (dhandle != NULL)
3273         {
3274           if (!print_debugging_info (stdout, dhandle, abfd, syms,
3275                                      bfd_demangle,
3276                                      dump_debugging_tags ? TRUE : FALSE))
3277             {
3278               non_fatal (_("%s: printing debugging information failed"),
3279                          bfd_get_filename (abfd));
3280               exit_status = 1;
3281             }
3282         }
3283       /* PR 6483: If there was no STABS or IEEE debug
3284          info in the file, try DWARF instead.  */
3285       else if (! dump_dwarf_section_info)
3286         {
3287           dwarf_select_sections_all (); 
3288           dump_dwarf (abfd);
3289         }
3290     }
3291
3292   if (syms)
3293     {
3294       free (syms);
3295       syms = NULL;
3296     }
3297
3298   if (dynsyms)
3299     {
3300       free (dynsyms);
3301       dynsyms = NULL;
3302     }
3303
3304   if (synthsyms)
3305     {
3306       free (synthsyms);
3307       synthsyms = NULL;
3308     }
3309
3310   symcount = 0;
3311   dynsymcount = 0;
3312   synthcount = 0;
3313 }
3314
3315 static void
3316 display_object_bfd (bfd *abfd)
3317 {
3318   char **matching;
3319
3320   if (bfd_check_format_matches (abfd, bfd_object, &matching))
3321     {
3322       dump_bfd (abfd);
3323       return;
3324     }
3325
3326   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3327     {
3328       nonfatal (bfd_get_filename (abfd));
3329       list_matching_formats (matching);
3330       free (matching);
3331       return;
3332     }
3333
3334   if (bfd_get_error () != bfd_error_file_not_recognized)
3335     {
3336       nonfatal (bfd_get_filename (abfd));
3337       return;
3338     }
3339
3340   if (bfd_check_format_matches (abfd, bfd_core, &matching))
3341     {
3342       dump_bfd (abfd);
3343       return;
3344     }
3345
3346   nonfatal (bfd_get_filename (abfd));
3347
3348   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3349     {
3350       list_matching_formats (matching);
3351       free (matching);
3352     }
3353 }
3354
3355 static void
3356 display_any_bfd (bfd *file, int level)
3357 {
3358   /* Decompress sections unless dumping the section contents.  */
3359   if (!dump_section_contents)
3360     file->flags |= BFD_DECOMPRESS;
3361
3362   /* If the file is an archive, process all of its elements.  */
3363   if (bfd_check_format (file, bfd_archive))
3364     {
3365       bfd *arfile = NULL;
3366       bfd *last_arfile = NULL;
3367
3368       if (level == 0)
3369         printf (_("In archive %s:\n"), bfd_get_filename (file));
3370       else
3371         printf (_("In nested archive %s:\n"), bfd_get_filename (file));
3372
3373       for (;;)
3374         {
3375           bfd_set_error (bfd_error_no_error);
3376
3377           arfile = bfd_openr_next_archived_file (file, arfile);
3378           if (arfile == NULL)
3379             {
3380               if (bfd_get_error () != bfd_error_no_more_archived_files)
3381                 nonfatal (bfd_get_filename (file));
3382               break;
3383             }
3384
3385           display_any_bfd (arfile, level + 1);
3386
3387           if (last_arfile != NULL)
3388             bfd_close (last_arfile);
3389           last_arfile = arfile;
3390         }
3391
3392       if (last_arfile != NULL)
3393         bfd_close (last_arfile);
3394     }
3395   else
3396     display_object_bfd (file);
3397 }
3398
3399 static void
3400 display_file (char *filename, char *target)
3401 {
3402   bfd *file;
3403
3404   if (get_file_size (filename) < 1)
3405     {
3406       exit_status = 1;
3407       return;
3408     }
3409
3410   file = bfd_openr (filename, target);
3411   if (file == NULL)
3412     {
3413       nonfatal (filename);
3414       return;
3415     }
3416
3417   display_any_bfd (file, 0);
3418
3419   bfd_close (file);
3420 }
3421 \f
3422 int
3423 main (int argc, char **argv)
3424 {
3425   int c;
3426   char *target = default_target;
3427   bfd_boolean seenflag = FALSE;
3428
3429 #if defined (HAVE_SETLOCALE)
3430 #if defined (HAVE_LC_MESSAGES)
3431   setlocale (LC_MESSAGES, "");
3432 #endif
3433   setlocale (LC_CTYPE, "");
3434 #endif
3435
3436   bindtextdomain (PACKAGE, LOCALEDIR);
3437   textdomain (PACKAGE);
3438
3439   program_name = *argv;
3440   xmalloc_set_program_name (program_name);
3441
3442   START_PROGRESS (program_name, 0);
3443
3444   expandargv (&argc, &argv);
3445
3446   bfd_init ();
3447   set_default_bfd_target ();
3448
3449   while ((c = getopt_long (argc, argv,
3450                            "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
3451                            long_options, (int *) 0))
3452          != EOF)
3453     {
3454       switch (c)
3455         {
3456         case 0:
3457           break;                /* We've been given a long option.  */
3458         case 'm':
3459           machine = optarg;
3460           break;
3461         case 'M':
3462           if (disassembler_options)
3463             /* Ignore potential memory leak for now.  */
3464             disassembler_options = concat (disassembler_options, ",",
3465                                            optarg, (const char *) NULL);
3466           else
3467             disassembler_options = optarg;
3468           break;
3469         case 'j':
3470           add_only (optarg);
3471           break;
3472         case 'F':
3473           display_file_offsets = TRUE;
3474           break;
3475         case 'l':
3476           with_line_numbers = TRUE;
3477           break;
3478         case 'b':
3479           target = optarg;
3480           break;
3481         case 'C':
3482           do_demangle = TRUE;
3483           if (optarg != NULL)
3484             {
3485               enum demangling_styles style;
3486
3487               style = cplus_demangle_name_to_style (optarg);
3488               if (style == unknown_demangling)
3489                 fatal (_("unknown demangling style `%s'"),
3490                        optarg);
3491
3492               cplus_demangle_set_style (style);
3493             }
3494           break;
3495         case 'w':
3496           wide_output = TRUE;
3497           break;
3498         case OPTION_ADJUST_VMA:
3499           adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3500           break;
3501         case OPTION_START_ADDRESS:
3502           start_address = parse_vma (optarg, "--start-address");
3503           if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3504             fatal (_("error: the start address should be before the end address"));
3505           break;
3506         case OPTION_STOP_ADDRESS:
3507           stop_address = parse_vma (optarg, "--stop-address");
3508           if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3509             fatal (_("error: the stop address should be after the start address"));
3510           break;
3511         case OPTION_PREFIX:
3512           prefix = optarg;
3513           prefix_length = strlen (prefix);
3514           /* Remove an unnecessary trailing '/' */
3515           while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
3516             prefix_length--;
3517           break;
3518         case OPTION_PREFIX_STRIP:
3519           prefix_strip = atoi (optarg);
3520           if (prefix_strip < 0)
3521             fatal (_("error: prefix strip must be non-negative"));
3522           break;
3523         case OPTION_INSN_WIDTH:
3524           insn_width = strtoul (optarg, NULL, 0);
3525           if (insn_width <= 0)
3526             fatal (_("error: instruction width must be positive"));
3527           break;
3528         case 'E':
3529           if (strcmp (optarg, "B") == 0)
3530             endian = BFD_ENDIAN_BIG;
3531           else if (strcmp (optarg, "L") == 0)
3532             endian = BFD_ENDIAN_LITTLE;
3533           else
3534             {
3535               nonfatal (_("unrecognized -E option"));
3536               usage (stderr, 1);
3537             }
3538           break;
3539         case OPTION_ENDIAN:
3540           if (strncmp (optarg, "big", strlen (optarg)) == 0)
3541             endian = BFD_ENDIAN_BIG;
3542           else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3543             endian = BFD_ENDIAN_LITTLE;
3544           else
3545             {
3546               non_fatal (_("unrecognized --endian type `%s'"), optarg);
3547               exit_status = 1;
3548               usage (stderr, 1);
3549             }
3550           break;
3551
3552         case 'f':
3553           dump_file_header = TRUE;
3554           seenflag = TRUE;
3555           break;
3556         case 'i':
3557           formats_info = TRUE;
3558           seenflag = TRUE;
3559           break;
3560         case 'I':
3561           add_include_path (optarg);
3562           break;
3563         case 'p':
3564           dump_private_headers = TRUE;
3565           seenflag = TRUE;
3566           break;
3567         case 'P':
3568           dump_private_options = optarg;
3569           seenflag = TRUE;
3570           break;
3571         case 'x':
3572           dump_private_headers = TRUE;
3573           dump_symtab = TRUE;
3574           dump_reloc_info = TRUE;
3575           dump_file_header = TRUE;
3576           dump_ar_hdrs = TRUE;
3577           dump_section_headers = TRUE;
3578           seenflag = TRUE;
3579           break;
3580         case 't':
3581           dump_symtab = TRUE;
3582           seenflag = TRUE;
3583           break;
3584         case 'T':
3585           dump_dynamic_symtab = TRUE;
3586           seenflag = TRUE;
3587           break;
3588         case 'd':
3589           disassemble = TRUE;
3590           seenflag = TRUE;
3591           break;
3592         case 'z':
3593           disassemble_zeroes = TRUE;
3594           break;
3595         case 'D':
3596           disassemble = TRUE;
3597           disassemble_all = TRUE;
3598           seenflag = TRUE;
3599           break;
3600         case 'S':
3601           disassemble = TRUE;
3602           with_source_code = TRUE;
3603           seenflag = TRUE;
3604           break;
3605         case 'g':
3606           dump_debugging = 1;
3607           seenflag = TRUE;
3608           break;
3609         case 'e':
3610           dump_debugging = 1;
3611           dump_debugging_tags = 1;
3612           do_demangle = TRUE;
3613           seenflag = TRUE;
3614           break;
3615         case 'W':
3616           dump_dwarf_section_info = TRUE;
3617           seenflag = TRUE;
3618           if (optarg)
3619             dwarf_select_sections_by_letters (optarg);
3620           else
3621             dwarf_select_sections_all ();
3622           break;
3623         case OPTION_DWARF:
3624           dump_dwarf_section_info = TRUE;
3625           seenflag = TRUE;
3626           if (optarg)
3627             dwarf_select_sections_by_names (optarg);
3628           else
3629             dwarf_select_sections_all ();
3630           break;
3631         case OPTION_DWARF_DEPTH:
3632           {
3633             char *cp;
3634             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3635           }
3636           break;
3637         case OPTION_DWARF_START:
3638           {
3639             char *cp;
3640             dwarf_start_die = strtoul (optarg, & cp, 0);
3641             suppress_bfd_header = 1;
3642           }
3643           break;
3644         case OPTION_DWARF_CHECK:
3645           dwarf_check = TRUE;
3646           break;
3647         case 'G':
3648           dump_stab_section_info = TRUE;
3649           seenflag = TRUE;
3650           break;
3651         case 's':
3652           dump_section_contents = TRUE;
3653           seenflag = TRUE;
3654           break;
3655         case 'r':
3656           dump_reloc_info = TRUE;
3657           seenflag = TRUE;
3658           break;
3659         case 'R':
3660           dump_dynamic_reloc_info = TRUE;
3661           seenflag = TRUE;
3662           break;
3663         case 'a':
3664           dump_ar_hdrs = TRUE;
3665           seenflag = TRUE;
3666           break;
3667         case 'h':
3668           dump_section_headers = TRUE;
3669           seenflag = TRUE;
3670           break;
3671         case 'v':
3672         case 'V':
3673           show_version = TRUE;
3674           seenflag = TRUE;
3675           break;
3676
3677         case 'H':
3678           usage (stdout, 0);
3679           /* No need to set seenflag or to break - usage() does not return.  */
3680         default:
3681           usage (stderr, 1);
3682         }
3683     }
3684
3685   if (show_version)
3686     print_version ("objdump");
3687
3688   if (!seenflag)
3689     usage (stderr, 2);
3690
3691   if (formats_info)
3692     exit_status = display_info ();
3693   else
3694     {
3695       if (optind == argc)
3696         display_file ("a.out", target);
3697       else
3698         for (; optind < argc;)
3699           display_file (argv[optind++], target);
3700     }
3701
3702   free_only_list ();
3703
3704   END_PROGRESS (program_name);
3705
3706   return exit_status;
3707 }