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