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