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