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