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