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