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