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