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