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