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