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