* objdump.c (disassemble_bytes): Don't skip leading zeros when
[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
1376       bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1377
1378       while (buf[skip_addr_chars] == '0')
1379         ++skip_addr_chars;
1380
1381       /* Don't discard zeros on overflow.  */
1382       if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1383         skip_addr_chars = 0;
1384
1385       if (skip_addr_chars != 0)
1386         skip_addr_chars = (skip_addr_chars - 1) & -4;
1387     }
1388
1389   info->insn_info_valid = 0;
1390
1391   done_dot = FALSE;
1392   addr_offset = start_offset;
1393   while (addr_offset < stop_offset)
1394     {
1395       bfd_vma z;
1396       bfd_boolean need_nl = FALSE;
1397       int previous_octets;
1398
1399       /* Remember the length of the previous instruction.  */
1400       previous_octets = octets;
1401       octets = 0;
1402
1403       /* If we see more than SKIP_ZEROES octets of zeroes, we just
1404          print `...'.  */
1405       for (z = addr_offset * opb; z < stop_offset * opb; z++)
1406         if (data[z] != 0)
1407           break;
1408       if (! disassemble_zeroes
1409           && (info->insn_info_valid == 0
1410               || info->branch_delay_insns == 0)
1411           && (z - addr_offset * opb >= skip_zeroes
1412               || (z == stop_offset * opb &&
1413                   z - addr_offset * opb < skip_zeroes_at_end)))
1414         {
1415           /* If there are more nonzero octets to follow, we only skip
1416              zeroes in multiples of 4, to try to avoid running over
1417              the start of an instruction which happens to start with
1418              zero.  */
1419           if (z != stop_offset * opb)
1420             z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1421
1422           octets = z - addr_offset * opb;
1423
1424           /* If we are going to display more data, and we are displaying
1425              file offsets, then tell the user how many zeroes we skip
1426              and the file offset from where we resume dumping.  */
1427           if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1428             printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1429                     octets / opb,
1430                     (unsigned long) (section->filepos
1431                                      + (addr_offset + (octets / opb))));
1432           else
1433             printf ("\t...\n");
1434         }
1435       else
1436         {
1437           char buf[50];
1438           int bpc = 0;
1439           int pb = 0;
1440
1441           done_dot = FALSE;
1442
1443           if (with_line_numbers || with_source_code)
1444             show_line (aux->abfd, section, addr_offset);
1445
1446           if (! prefix_addresses)
1447             {
1448               char *s;
1449
1450               bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1451               for (s = buf + skip_addr_chars; *s == '0'; s++)
1452                 *s = ' ';
1453               if (*s == '\0')
1454                 *--s = '0';
1455               printf ("%s:\t", buf + skip_addr_chars);
1456             }
1457           else
1458             {
1459               aux->require_sec = TRUE;
1460               objdump_print_address (section->vma + addr_offset, info);
1461               aux->require_sec = FALSE;
1462               putchar (' ');
1463             }
1464
1465           if (insns)
1466             {
1467               sfile.pos = 0;
1468               info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1469               info->stream = &sfile;
1470               info->bytes_per_line = 0;
1471               info->bytes_per_chunk = 0;
1472               info->flags = 0;
1473
1474               if (info->disassembler_needs_relocs
1475                   && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1476                   && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1477                   && *relppp < relppend)
1478                 {
1479                   bfd_signed_vma distance_to_rel;
1480
1481                   distance_to_rel = (**relppp)->address
1482                     - (rel_offset + addr_offset);
1483
1484                   /* Check to see if the current reloc is associated with
1485                      the instruction that we are about to disassemble.  */
1486                   if (distance_to_rel == 0
1487                       /* FIXME: This is wrong.  We are trying to catch
1488                          relocs that are addressed part way through the
1489                          current instruction, as might happen with a packed
1490                          VLIW instruction.  Unfortunately we do not know the
1491                          length of the current instruction since we have not
1492                          disassembled it yet.  Instead we take a guess based
1493                          upon the length of the previous instruction.  The
1494                          proper solution is to have a new target-specific
1495                          disassembler function which just returns the length
1496                          of an instruction at a given address without trying
1497                          to display its disassembly. */
1498                       || (distance_to_rel > 0
1499                           && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1500                     {
1501                       info->flags = INSN_HAS_RELOC;
1502                       aux->reloc = **relppp;
1503                     }
1504                   else
1505                     aux->reloc = NULL;
1506                 }
1507
1508               octets = (*disassemble_fn) (section->vma + addr_offset, info);
1509               info->fprintf_func = (fprintf_ftype) fprintf;
1510               info->stream = stdout;
1511               if (info->bytes_per_line != 0)
1512                 octets_per_line = info->bytes_per_line;
1513               if (octets < 0)
1514                 {
1515                   if (sfile.pos)
1516                     printf ("%s\n", sfile.buffer);
1517                   break;
1518                 }
1519             }
1520           else
1521             {
1522               bfd_vma j;
1523
1524               octets = octets_per_line;
1525               if (addr_offset + octets / opb > stop_offset)
1526                 octets = (stop_offset - addr_offset) * opb;
1527
1528               for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1529                 {
1530                   if (ISPRINT (data[j]))
1531                     buf[j - addr_offset * opb] = data[j];
1532                   else
1533                     buf[j - addr_offset * opb] = '.';
1534                 }
1535               buf[j - addr_offset * opb] = '\0';
1536             }
1537
1538           if (prefix_addresses
1539               ? show_raw_insn > 0
1540               : show_raw_insn >= 0)
1541             {
1542               bfd_vma j;
1543
1544               /* If ! prefix_addresses and ! wide_output, we print
1545                  octets_per_line octets per line.  */
1546               pb = octets;
1547               if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1548                 pb = octets_per_line;
1549
1550               if (info->bytes_per_chunk)
1551                 bpc = info->bytes_per_chunk;
1552               else
1553                 bpc = 1;
1554
1555               for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1556                 {
1557                   int k;
1558
1559                   if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1560                     {
1561                       for (k = bpc - 1; k >= 0; k--)
1562                         printf ("%02x", (unsigned) data[j + k]);
1563                       putchar (' ');
1564                     }
1565                   else
1566                     {
1567                       for (k = 0; k < bpc; k++)
1568                         printf ("%02x", (unsigned) data[j + k]);
1569                       putchar (' ');
1570                     }
1571                 }
1572
1573               for (; pb < octets_per_line; pb += bpc)
1574                 {
1575                   int k;
1576
1577                   for (k = 0; k < bpc; k++)
1578                     printf ("  ");
1579                   putchar (' ');
1580                 }
1581
1582               /* Separate raw data from instruction by extra space.  */
1583               if (insns)
1584                 putchar ('\t');
1585               else
1586                 printf ("    ");
1587             }
1588
1589           if (! insns)
1590             printf ("%s", buf);
1591           else if (sfile.pos)
1592             printf ("%s", sfile.buffer);
1593
1594           if (prefix_addresses
1595               ? show_raw_insn > 0
1596               : show_raw_insn >= 0)
1597             {
1598               while (pb < octets)
1599                 {
1600                   bfd_vma j;
1601                   char *s;
1602
1603                   putchar ('\n');
1604                   j = addr_offset * opb + pb;
1605
1606                   bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1607                   for (s = buf + skip_addr_chars; *s == '0'; s++)
1608                     *s = ' ';
1609                   if (*s == '\0')
1610                     *--s = '0';
1611                   printf ("%s:\t", buf + skip_addr_chars);
1612
1613                   pb += octets_per_line;
1614                   if (pb > octets)
1615                     pb = octets;
1616                   for (; j < addr_offset * opb + pb; j += bpc)
1617                     {
1618                       int k;
1619
1620                       if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1621                         {
1622                           for (k = bpc - 1; k >= 0; k--)
1623                             printf ("%02x", (unsigned) data[j + k]);
1624                           putchar (' ');
1625                         }
1626                       else
1627                         {
1628                           for (k = 0; k < bpc; k++)
1629                             printf ("%02x", (unsigned) data[j + k]);
1630                           putchar (' ');
1631                         }
1632                     }
1633                 }
1634             }
1635
1636           if (!wide_output)
1637             putchar ('\n');
1638           else
1639             need_nl = TRUE;
1640         }
1641
1642       while ((*relppp) < relppend
1643              && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1644         {
1645           if (dump_reloc_info || dump_dynamic_reloc_info)
1646             {
1647               arelent *q;
1648
1649               q = **relppp;
1650
1651               if (wide_output)
1652                 putchar ('\t');
1653               else
1654                 printf ("\t\t\t");
1655
1656               objdump_print_value (section->vma - rel_offset + q->address,
1657                                    info, TRUE);
1658
1659               if (q->howto == NULL)
1660                 printf (": *unknown*\t");
1661               else if (q->howto->name)
1662                 printf (": %s\t", q->howto->name);
1663               else
1664                 printf (": %d\t", q->howto->type);
1665
1666               if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1667                 printf ("*unknown*");
1668               else
1669                 {
1670                   const char *sym_name;
1671
1672                   sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1673                   if (sym_name != NULL && *sym_name != '\0')
1674                     objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1675                   else
1676                     {
1677                       asection *sym_sec;
1678
1679                       sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1680                       sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1681                       if (sym_name == NULL || *sym_name == '\0')
1682                         sym_name = "*unknown*";
1683                       printf ("%s", sym_name);
1684                     }
1685                 }
1686
1687               if (q->addend)
1688                 {
1689                   printf ("+0x");
1690                   objdump_print_value (q->addend, info, TRUE);
1691                 }
1692
1693               printf ("\n");
1694               need_nl = FALSE;
1695             }
1696           ++(*relppp);
1697         }
1698
1699       if (need_nl)
1700         printf ("\n");
1701
1702       addr_offset += octets / opb;
1703     }
1704
1705   free (sfile.buffer);
1706 }
1707
1708 static void
1709 disassemble_section (bfd *abfd, asection *section, void *info)
1710 {
1711   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   int section_is_compressed;
2066
2067   /* If it is already loaded, do nothing.  */
2068   if (section->start != NULL)
2069     return 1;
2070
2071   /* Locate the debug section.  */
2072   sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2073   if (sec != NULL)
2074     section->name = section->uncompressed_name;
2075   else
2076     {
2077       sec = bfd_get_section_by_name (abfd, section->compressed_name);
2078       if (sec != NULL)
2079         section->name = section->compressed_name;
2080     }
2081   if (sec == NULL)
2082     return 0;
2083   section_is_compressed = section->name == section->compressed_name;
2084
2085   /* Compute a bias to be added to offsets found within the DWARF debug
2086      information.  These offsets are meant to be relative to the start of
2087      the dwarf section, and hence the bias should be 0.  For MACH-O however
2088      a dwarf section is really just a region of a much larger section and so
2089      the bias is the address of the start of that area within the larger
2090      section.  This test is important for PE and COFF based targets which
2091      use DWARF debug information, since unlike ELF, they do not allow the
2092      dwarf sections to be placed at address 0.  */
2093   if (bfd_get_flavour (abfd) == bfd_target_mach_o_flavour)
2094     section->address = bfd_get_section_vma (abfd, sec);
2095   else
2096     section->address = 0;
2097     
2098   section->size = bfd_get_section_size (sec);
2099   section->start = xmalloc (section->size);
2100
2101   if (is_relocatable && debug_displays [debug].relocate)
2102     ret = bfd_simple_get_relocated_section_contents (abfd,
2103                                                      sec,
2104                                                      section->start,
2105                                                      syms) != NULL;
2106   else
2107     ret = bfd_get_section_contents (abfd, sec, section->start, 0,
2108                                     section->size);
2109
2110   if (! ret)
2111     {
2112       free_debug_section (debug);
2113       printf (_("\nCan't get contents for section '%s'.\n"),
2114               section->name);
2115       return 0;
2116     }
2117
2118   if (section_is_compressed)
2119     {
2120       bfd_size_type size = section->size;
2121       if (! bfd_uncompress_section_contents (&section->start, &size))
2122         {
2123           free_debug_section (debug);
2124           printf (_("\nCan't uncompress section '%s'.\n"), section->name);
2125           return 0;
2126         }
2127       section->size = size;
2128     }
2129
2130   return ret;
2131 }
2132
2133 void
2134 free_debug_section (enum dwarf_section_display_enum debug)
2135 {
2136   struct dwarf_section *section = &debug_displays [debug].section;
2137
2138   if (section->start == NULL)
2139     return;
2140
2141   free ((char *) section->start);
2142   section->start = NULL;
2143   section->address = 0;
2144   section->size = 0;
2145 }
2146
2147 static void
2148 dump_dwarf_section (bfd *abfd, asection *section,
2149                     void *arg ATTRIBUTE_UNUSED)
2150 {
2151   const char *name = bfd_get_section_name (abfd, section);
2152   const char *match;
2153   enum dwarf_section_display_enum i;
2154
2155   if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2156     match = ".debug_info";
2157   else
2158     match = name;
2159
2160   for (i = 0; i < max; i++)
2161     if (strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2162         || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2163       {
2164         if (!debug_displays [i].eh_frame)
2165           {
2166             struct dwarf_section *sec = &debug_displays [i].section;
2167
2168             if (load_debug_section (i, abfd))
2169               {
2170                 debug_displays [i].display (sec, abfd);
2171
2172                 if (i != info && i != abbrev)
2173                   free_debug_section (i);
2174               }
2175           }
2176         break;
2177       }
2178 }
2179
2180 static const char *mach_o_uncompressed_dwarf_sections [] = {
2181   "LC_SEGMENT.__DWARFA.__debug_abbrev",         /* .debug_abbrev */
2182   "LC_SEGMENT.__DWARFA.__debug_aranges",        /* .debug_aranges */
2183   "LC_SEGMENT.__DWARFA.__debug_frame",          /* .debug_frame */
2184   "LC_SEGMENT.__DWARFA.__debug_info",           /* .debug_info */
2185   "LC_SEGMENT.__DWARFA.__debug_line",           /* .debug_line */
2186   "LC_SEGMENT.__DWARFA.__debug_pubnames",       /* .debug_pubnames */
2187   ".eh_frame",                                  /* .eh_frame */
2188   "LC_SEGMENT.__DWARFA.__debug_macinfo",        /* .debug_macinfo */
2189   "LC_SEGMENT.__DWARFA.__debug_str",            /* .debug_str */
2190   "LC_SEGMENT.__DWARFA.__debug_loc",            /* .debug_loc */
2191   "LC_SEGMENT.__DWARFA.__debug_pubtypes",       /* .debug_pubtypes */
2192   "LC_SEGMENT.__DWARFA.__debug_ranges",         /* .debug_ranges */
2193   "LC_SEGMENT.__DWARFA.__debug_static_func",    /* .debug_static_func */
2194   "LC_SEGMENT.__DWARFA.__debug_static_vars",    /* .debug_static_vars */
2195   "LC_SEGMENT.__DWARFA.__debug_types",          /* .debug_types */
2196   "LC_SEGMENT.__DWARFA.__debug_weaknames"       /* .debug_weaknames */
2197 };
2198
2199 static const char *mach_o_compressed_dwarf_sections [] = {
2200   "LC_SEGMENT.__DWARFA.__zdebug_abbrev",        /* .zdebug_abbrev */
2201   "LC_SEGMENT.__DWARFA.__zdebug_aranges",       /* .zdebug_aranges */
2202   "LC_SEGMENT.__DWARFA.__zdebug_frame",         /* .zdebug_frame */
2203   "LC_SEGMENT.__DWARFA.__zdebug_info",          /* .zdebug_info */
2204   "LC_SEGMENT.__DWARFA.__zdebug_line",          /* .zdebug_line */
2205   "LC_SEGMENT.__DWARFA.__zdebug_pubnames",      /* .zdebug_pubnames */
2206   ".eh_frame",                                  /* .eh_frame */
2207   "LC_SEGMENT.__DWARFA.__zdebug_macinfo",       /* .zdebug_macinfo */
2208   "LC_SEGMENT.__DWARFA.__zdebug_str",           /* .zdebug_str */
2209   "LC_SEGMENT.__DWARFA.__zdebug_loc",           /* .zdebug_loc */
2210   "LC_SEGMENT.__DWARFA.__zdebug_pubtypes",      /* .zdebug_pubtypes */
2211   "LC_SEGMENT.__DWARFA.__zdebug_ranges",        /* .zdebug_ranges */
2212   "LC_SEGMENT.__DWARFA.__zdebug_static_func",   /* .zdebug_static_func */
2213   "LC_SEGMENT.__DWARFA.__zdebug_static_vars",   /* .zdebug_static_vars */
2214   "LC_SEGMENT.__DWARFA.__zdebug_types",         /* .zdebug_types */
2215   "LC_SEGMENT.__DWARFA.__zdebug_weaknames"      /* .zdebug_weaknames */
2216 };
2217
2218 static const char *generic_uncompressed_dwarf_sections [max];
2219 static const char *generic_compressed_dwarf_sections [max];
2220
2221 static void
2222 check_mach_o_dwarf (bfd *abfd)
2223 {
2224   static enum bfd_flavour old_flavour = bfd_target_unknown_flavour;
2225   enum bfd_flavour current_flavour = bfd_get_flavour (abfd);
2226   enum dwarf_section_display_enum i;
2227
2228   if (generic_uncompressed_dwarf_sections [0] == NULL)
2229     for (i = 0; i < max; i++)
2230       {
2231         generic_uncompressed_dwarf_sections [i]
2232             = debug_displays[i].section.uncompressed_name;
2233         generic_compressed_dwarf_sections [i]
2234             = debug_displays[i].section.compressed_name;
2235       }
2236
2237   if (old_flavour != current_flavour)
2238     {
2239       if (current_flavour == bfd_target_mach_o_flavour)
2240         for (i = 0; i < max; i++)
2241           {
2242             debug_displays[i].section.uncompressed_name
2243                 = mach_o_uncompressed_dwarf_sections [i];
2244             debug_displays[i].section.compressed_name
2245                 = mach_o_compressed_dwarf_sections [i];
2246           }
2247       else if (old_flavour == bfd_target_mach_o_flavour)
2248         for (i = 0; i < max; i++)
2249           {
2250             debug_displays[i].section.uncompressed_name
2251                 = generic_uncompressed_dwarf_sections [i];
2252             debug_displays[i].section.compressed_name
2253                 = generic_compressed_dwarf_sections [i];
2254           }
2255
2256       old_flavour = current_flavour;
2257     }
2258 }
2259
2260 /* Dump the dwarf debugging information.  */
2261
2262 static void
2263 dump_dwarf (bfd *abfd)
2264 {
2265   is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2266
2267   /* FIXME: bfd_get_arch_size may return -1.  We assume that 64bit
2268      targets will return 64.  */
2269   eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
2270
2271   if (bfd_big_endian (abfd))
2272     byte_get = byte_get_big_endian;
2273   else if (bfd_little_endian (abfd))
2274     byte_get = byte_get_little_endian;
2275   else
2276     abort ();
2277
2278   check_mach_o_dwarf (abfd);
2279
2280   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
2281     {
2282       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2283       init_dwarf_regnames (bed->elf_machine_code);
2284     }
2285
2286   bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2287
2288   free_debug_memory ();
2289 }
2290 \f
2291 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2292    it.  Return NULL on failure.   */
2293
2294 static char *
2295 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2296 {
2297   asection *stabsect;
2298   bfd_size_type size;
2299   char *contents;
2300
2301   stabsect = bfd_get_section_by_name (abfd, sect_name);
2302   if (stabsect == NULL)
2303     {
2304       printf (_("No %s section present\n\n"), sect_name);
2305       return FALSE;
2306     }
2307
2308   size = bfd_section_size (abfd, stabsect);
2309   contents  = xmalloc (size);
2310
2311   if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2312     {
2313       non_fatal (_("Reading %s section of %s failed: %s"),
2314                  sect_name, bfd_get_filename (abfd),
2315                  bfd_errmsg (bfd_get_error ()));
2316       free (contents);
2317       exit_status = 1;
2318       return NULL;
2319     }
2320
2321   *size_ptr = size;
2322
2323   return contents;
2324 }
2325
2326 /* Stabs entries use a 12 byte format:
2327      4 byte string table index
2328      1 byte stab type
2329      1 byte stab other field
2330      2 byte stab desc field
2331      4 byte stab value
2332    FIXME: This will have to change for a 64 bit object format.  */
2333
2334 #define STRDXOFF  (0)
2335 #define TYPEOFF   (4)
2336 #define OTHEROFF  (5)
2337 #define DESCOFF   (6)
2338 #define VALOFF    (8)
2339 #define STABSIZE (12)
2340
2341 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2342    using string table section STRSECT_NAME (in `strtab').  */
2343
2344 static void
2345 print_section_stabs (bfd *abfd,
2346                      const char *stabsect_name,
2347                      unsigned *string_offset_ptr)
2348 {
2349   int i;
2350   unsigned file_string_table_offset = 0;
2351   unsigned next_file_string_table_offset = *string_offset_ptr;
2352   bfd_byte *stabp, *stabs_end;
2353
2354   stabp = stabs;
2355   stabs_end = stabp + stab_size;
2356
2357   printf (_("Contents of %s section:\n\n"), stabsect_name);
2358   printf ("Symnum n_type n_othr n_desc n_value  n_strx String\n");
2359
2360   /* Loop through all symbols and print them.
2361
2362      We start the index at -1 because there is a dummy symbol on
2363      the front of stabs-in-{coff,elf} sections that supplies sizes.  */
2364   for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2365     {
2366       const char *name;
2367       unsigned long strx;
2368       unsigned char type, other;
2369       unsigned short desc;
2370       bfd_vma value;
2371
2372       strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2373       type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2374       other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2375       desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2376       value = bfd_h_get_32 (abfd, stabp + VALOFF);
2377
2378       printf ("\n%-6d ", i);
2379       /* Either print the stab name, or, if unnamed, print its number
2380          again (makes consistent formatting for tools like awk).  */
2381       name = bfd_get_stab_name (type);
2382       if (name != NULL)
2383         printf ("%-6s", name);
2384       else if (type == N_UNDF)
2385         printf ("HdrSym");
2386       else
2387         printf ("%-6d", type);
2388       printf (" %-6d %-6d ", other, desc);
2389       bfd_printf_vma (abfd, value);
2390       printf (" %-6lu", strx);
2391
2392       /* Symbols with type == 0 (N_UNDF) specify the length of the
2393          string table associated with this file.  We use that info
2394          to know how to relocate the *next* file's string table indices.  */
2395       if (type == N_UNDF)
2396         {
2397           file_string_table_offset = next_file_string_table_offset;
2398           next_file_string_table_offset += value;
2399         }
2400       else
2401         {
2402           /* Using the (possibly updated) string table offset, print the
2403              string (if any) associated with this symbol.  */
2404           if ((strx + file_string_table_offset) < stabstr_size)
2405             printf (" %s", &strtab[strx + file_string_table_offset]);
2406           else
2407             printf (" *");
2408         }
2409     }
2410   printf ("\n\n");
2411   *string_offset_ptr = next_file_string_table_offset;
2412 }
2413
2414 typedef struct
2415 {
2416   const char * section_name;
2417   const char * string_section_name;
2418   unsigned string_offset;
2419 }
2420 stab_section_names;
2421
2422 static void
2423 find_stabs_section (bfd *abfd, asection *section, void *names)
2424 {
2425   int len;
2426   stab_section_names * sought = (stab_section_names *) names;
2427
2428   /* Check for section names for which stabsect_name is a prefix, to
2429      handle .stab.N, etc.  */
2430   len = strlen (sought->section_name);
2431
2432   /* If the prefix matches, and the files section name ends with a
2433      nul or a digit, then we match.  I.e., we want either an exact
2434      match or a section followed by a number.  */
2435   if (strncmp (sought->section_name, section->name, len) == 0
2436       && (section->name[len] == 0
2437           || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2438     {
2439       if (strtab == NULL)
2440         strtab = read_section_stabs (abfd, sought->string_section_name,
2441                                      &stabstr_size);
2442       
2443       if (strtab)
2444         {
2445           stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2446                                                    &stab_size);
2447           if (stabs)
2448             print_section_stabs (abfd, section->name, &sought->string_offset);
2449         }
2450     }
2451 }
2452
2453 static void
2454 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2455 {
2456   stab_section_names s;
2457
2458   s.section_name = stabsect_name;
2459   s.string_section_name = strsect_name;
2460   s.string_offset = 0;
2461
2462   bfd_map_over_sections (abfd, find_stabs_section, & s);
2463
2464   free (strtab);
2465   strtab = NULL;
2466 }
2467
2468 /* Dump the any sections containing stabs debugging information.  */
2469
2470 static void
2471 dump_stabs (bfd *abfd)
2472 {
2473   dump_stabs_section (abfd, ".stab", ".stabstr");
2474   dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2475   dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2476
2477   /* For Darwin.  */
2478   dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2479
2480   dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2481 }
2482 \f
2483 static void
2484 dump_bfd_header (bfd *abfd)
2485 {
2486   char *comma = "";
2487
2488   printf (_("architecture: %s, "),
2489           bfd_printable_arch_mach (bfd_get_arch (abfd),
2490                                    bfd_get_mach (abfd)));
2491   printf (_("flags 0x%08x:\n"), abfd->flags);
2492
2493 #define PF(x, y)    if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2494   PF (HAS_RELOC, "HAS_RELOC");
2495   PF (EXEC_P, "EXEC_P");
2496   PF (HAS_LINENO, "HAS_LINENO");
2497   PF (HAS_DEBUG, "HAS_DEBUG");
2498   PF (HAS_SYMS, "HAS_SYMS");
2499   PF (HAS_LOCALS, "HAS_LOCALS");
2500   PF (DYNAMIC, "DYNAMIC");
2501   PF (WP_TEXT, "WP_TEXT");
2502   PF (D_PAGED, "D_PAGED");
2503   PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2504   PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2505   printf (_("\nstart address 0x"));
2506   bfd_printf_vma (abfd, abfd->start_address);
2507   printf ("\n");
2508 }
2509
2510 \f
2511 static void
2512 dump_bfd_private_header (bfd *abfd)
2513 {
2514   bfd_print_private_bfd_data (abfd, stdout);
2515 }
2516
2517 \f
2518 /* Display a section in hexadecimal format with associated characters.
2519    Each line prefixed by the zero padded address.  */
2520
2521 static void
2522 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2523 {
2524   bfd_byte *data = 0;
2525   bfd_size_type datasize;
2526   bfd_size_type addr_offset;
2527   bfd_size_type start_offset;
2528   bfd_size_type stop_offset;
2529   unsigned int opb = bfd_octets_per_byte (abfd);
2530   /* Bytes per line.  */
2531   const int onaline = 16;
2532   char buf[64];
2533   int count;
2534   int width;
2535
2536   if ((section->flags & SEC_HAS_CONTENTS) == 0)
2537     return;
2538
2539   if (! process_section_p (section))
2540     return;
2541   
2542   if ((datasize = bfd_section_size (abfd, section)) == 0)
2543     return;
2544
2545   /* Compute the address range to display.  */
2546   if (start_address == (bfd_vma) -1
2547       || start_address < section->vma)
2548     start_offset = 0;
2549   else
2550     start_offset = start_address - section->vma;
2551
2552   if (stop_address == (bfd_vma) -1)
2553     stop_offset = datasize / opb;
2554   else
2555     {
2556       if (stop_address < section->vma)
2557         stop_offset = 0;
2558       else
2559         stop_offset = stop_address - section->vma;
2560
2561       if (stop_offset > datasize / opb)
2562         stop_offset = datasize / opb;
2563     }
2564
2565   if (start_offset >= stop_offset)
2566     return;
2567   
2568   printf (_("Contents of section %s:"), section->name);
2569   if (display_file_offsets)
2570     printf (_("  (Starting at file offset: 0x%lx)"),
2571             (unsigned long) (section->filepos + start_offset));
2572   printf ("\n");
2573
2574   data = xmalloc (datasize);
2575
2576   bfd_get_section_contents (abfd, section, data, 0, datasize);
2577
2578   width = 4;
2579
2580   bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2581   if (strlen (buf) >= sizeof (buf))
2582     abort ();
2583
2584   count = 0;
2585   while (buf[count] == '0' && buf[count+1] != '\0')
2586     count++;
2587   count = strlen (buf) - count;
2588   if (count > width)
2589     width = count;
2590
2591   bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2592   if (strlen (buf) >= sizeof (buf))
2593     abort ();
2594
2595   count = 0;
2596   while (buf[count] == '0' && buf[count+1] != '\0')
2597     count++;
2598   count = strlen (buf) - count;
2599   if (count > width)
2600     width = count;
2601
2602   for (addr_offset = start_offset;
2603        addr_offset < stop_offset; addr_offset += onaline / opb)
2604     {
2605       bfd_size_type j;
2606
2607       bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2608       count = strlen (buf);
2609       if ((size_t) count >= sizeof (buf))
2610         abort ();
2611
2612       putchar (' ');
2613       while (count < width)
2614         {
2615           putchar ('0');
2616           count++;
2617         }
2618       fputs (buf + count - width, stdout);
2619       putchar (' ');
2620
2621       for (j = addr_offset * opb;
2622            j < addr_offset * opb + onaline; j++)
2623         {
2624           if (j < stop_offset * opb)
2625             printf ("%02x", (unsigned) (data[j]));
2626           else
2627             printf ("  ");
2628           if ((j & 3) == 3)
2629             printf (" ");
2630         }
2631
2632       printf (" ");
2633       for (j = addr_offset * opb;
2634            j < addr_offset * opb + onaline; j++)
2635         {
2636           if (j >= stop_offset * opb)
2637             printf (" ");
2638           else
2639             printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2640         }
2641       putchar ('\n');
2642     }
2643   free (data);
2644 }
2645
2646 /* Actually display the various requested regions.  */
2647
2648 static void
2649 dump_data (bfd *abfd)
2650 {
2651   bfd_map_over_sections (abfd, dump_section, NULL);
2652 }
2653
2654 /* Should perhaps share code and display with nm?  */
2655
2656 static void
2657 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2658 {
2659   asymbol **current;
2660   long max;
2661   long count;
2662
2663   if (dynamic)
2664     {
2665       current = dynsyms;
2666       max = dynsymcount;
2667       printf ("DYNAMIC SYMBOL TABLE:\n");
2668     }
2669   else
2670     {
2671       current = syms;
2672       max = symcount;
2673       printf ("SYMBOL TABLE:\n");
2674     }
2675
2676   if (max == 0)
2677     printf (_("no symbols\n"));
2678
2679   for (count = 0; count < max; count++)
2680     {
2681       bfd *cur_bfd;
2682
2683       if (*current == NULL)
2684         printf (_("no information for symbol number %ld\n"), count);
2685
2686       else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2687         printf (_("could not determine the type of symbol number %ld\n"),
2688                 count);
2689
2690       else if (process_section_p ((* current)->section)
2691                && (dump_special_syms
2692                    || !bfd_is_target_special_symbol (cur_bfd, *current)))
2693         {
2694           const char *name = (*current)->name;
2695
2696           if (do_demangle && name != NULL && *name != '\0')
2697             {
2698               char *alloc;
2699
2700               /* If we want to demangle the name, we demangle it
2701                  here, and temporarily clobber it while calling
2702                  bfd_print_symbol.  FIXME: This is a gross hack.  */
2703               alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2704               if (alloc != NULL)
2705                 (*current)->name = alloc;
2706               bfd_print_symbol (cur_bfd, stdout, *current,
2707                                 bfd_print_symbol_all);
2708               if (alloc != NULL)
2709                 {
2710                   (*current)->name = name;
2711                   free (alloc);
2712                 }
2713             }
2714           else
2715             bfd_print_symbol (cur_bfd, stdout, *current,
2716                               bfd_print_symbol_all);
2717           printf ("\n");
2718         }
2719
2720       current++;
2721     }
2722   printf ("\n\n");
2723 }
2724 \f
2725 static void
2726 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2727 {
2728   arelent **p;
2729   char *last_filename, *last_functionname;
2730   unsigned int last_line;
2731
2732   /* Get column headers lined up reasonably.  */
2733   {
2734     static int width;
2735
2736     if (width == 0)
2737       {
2738         char buf[30];
2739
2740         bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2741         width = strlen (buf) - 7;
2742       }
2743     printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2744   }
2745
2746   last_filename = NULL;
2747   last_functionname = NULL;
2748   last_line = 0;
2749
2750   for (p = relpp; relcount && *p != NULL; p++, relcount--)
2751     {
2752       arelent *q = *p;
2753       const char *filename, *functionname;
2754       unsigned int line;
2755       const char *sym_name;
2756       const char *section_name;
2757
2758       if (start_address != (bfd_vma) -1
2759           && q->address < start_address)
2760         continue;
2761       if (stop_address != (bfd_vma) -1
2762           && q->address > stop_address)
2763         continue;
2764
2765       if (with_line_numbers
2766           && sec != NULL
2767           && bfd_find_nearest_line (abfd, sec, syms, q->address,
2768                                     &filename, &functionname, &line))
2769         {
2770           if (functionname != NULL
2771               && (last_functionname == NULL
2772                   || strcmp (functionname, last_functionname) != 0))
2773             {
2774               printf ("%s():\n", functionname);
2775               if (last_functionname != NULL)
2776                 free (last_functionname);
2777               last_functionname = xstrdup (functionname);
2778             }
2779
2780           if (line > 0
2781               && (line != last_line
2782                   || (filename != NULL
2783                       && last_filename != NULL
2784                       && strcmp (filename, last_filename) != 0)))
2785             {
2786               printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2787               last_line = line;
2788               if (last_filename != NULL)
2789                 free (last_filename);
2790               if (filename == NULL)
2791                 last_filename = NULL;
2792               else
2793                 last_filename = xstrdup (filename);
2794             }
2795         }
2796
2797       if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2798         {
2799           sym_name = (*(q->sym_ptr_ptr))->name;
2800           section_name = (*(q->sym_ptr_ptr))->section->name;
2801         }
2802       else
2803         {
2804           sym_name = NULL;
2805           section_name = NULL;
2806         }
2807
2808       bfd_printf_vma (abfd, q->address);
2809       if (q->howto == NULL)
2810         printf (" *unknown*         ");
2811       else if (q->howto->name)
2812         printf (" %-16s  ", q->howto->name);
2813       else
2814         printf (" %-16d  ", q->howto->type);
2815       if (sym_name)
2816         objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
2817       else
2818         {
2819           if (section_name == NULL)
2820             section_name = "*unknown*";
2821           printf ("[%s]", section_name);
2822         }
2823
2824       if (q->addend)
2825         {
2826           printf ("+0x");
2827           bfd_printf_vma (abfd, q->addend);
2828         }
2829
2830       printf ("\n");
2831     }
2832 }
2833
2834 static void
2835 dump_relocs_in_section (bfd *abfd,
2836                         asection *section,
2837                         void *dummy ATTRIBUTE_UNUSED)
2838 {
2839   arelent **relpp;
2840   long relcount;
2841   long relsize;
2842
2843   if (   bfd_is_abs_section (section)
2844       || bfd_is_und_section (section)
2845       || bfd_is_com_section (section)
2846       || (! process_section_p (section))
2847       || ((section->flags & SEC_RELOC) == 0))
2848     return;
2849
2850   relsize = bfd_get_reloc_upper_bound (abfd, section);
2851   if (relsize < 0)
2852     bfd_fatal (bfd_get_filename (abfd));
2853
2854   printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2855
2856   if (relsize == 0)
2857     {
2858       printf (" (none)\n\n");
2859       return;
2860     }
2861
2862   relpp = xmalloc (relsize);
2863   relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2864
2865   if (relcount < 0)
2866     bfd_fatal (bfd_get_filename (abfd));
2867   else if (relcount == 0)
2868     printf (" (none)\n\n");
2869   else
2870     {
2871       printf ("\n");
2872       dump_reloc_set (abfd, section, relpp, relcount);
2873       printf ("\n\n");
2874     }
2875   free (relpp);
2876 }
2877
2878 static void
2879 dump_relocs (bfd *abfd)
2880 {
2881   bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2882 }
2883
2884 static void
2885 dump_dynamic_relocs (bfd *abfd)
2886 {
2887   long relsize;
2888   arelent **relpp;
2889   long relcount;
2890
2891   relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2892   if (relsize < 0)
2893     bfd_fatal (bfd_get_filename (abfd));
2894
2895   printf ("DYNAMIC RELOCATION RECORDS");
2896
2897   if (relsize == 0)
2898     printf (" (none)\n\n");
2899   else
2900     {
2901       relpp = xmalloc (relsize);
2902       relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2903
2904       if (relcount < 0)
2905         bfd_fatal (bfd_get_filename (abfd));
2906       else if (relcount == 0)
2907         printf (" (none)\n\n");
2908       else
2909         {
2910           printf ("\n");
2911           dump_reloc_set (abfd, NULL, relpp, relcount);
2912           printf ("\n\n");
2913         }
2914       free (relpp);
2915     }
2916 }
2917
2918 /* Creates a table of paths, to search for source files.  */
2919
2920 static void
2921 add_include_path (const char *path)
2922 {
2923   if (path[0] == 0)
2924     return;
2925   include_path_count++;
2926   include_paths = xrealloc (include_paths,
2927                             include_path_count * sizeof (*include_paths));
2928 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2929   if (path[1] == ':' && path[2] == 0)
2930     path = concat (path, ".", (const char *) 0);
2931 #endif
2932   include_paths[include_path_count - 1] = path;
2933 }
2934
2935 static void
2936 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
2937                   asection *section,
2938                   void *arg)
2939 {
2940   if ((section->flags & SEC_DEBUGGING) == 0)
2941     {
2942       bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
2943       section->vma += adjust_section_vma;
2944       if (*has_reloc_p)
2945         section->lma += adjust_section_vma;
2946     }
2947 }
2948
2949 /* Dump selected contents of ABFD.  */
2950
2951 static void
2952 dump_bfd (bfd *abfd)
2953 {
2954   /* If we are adjusting section VMA's, change them all now.  Changing
2955      the BFD information is a hack.  However, we must do it, or
2956      bfd_find_nearest_line will not do the right thing.  */
2957   if (adjust_section_vma != 0)
2958     {
2959       bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
2960       bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
2961     }
2962
2963   if (! dump_debugging_tags)
2964     printf (_("\n%s:     file format %s\n"), bfd_get_filename (abfd),
2965             abfd->xvec->name);
2966   if (dump_ar_hdrs)
2967     print_arelt_descr (stdout, abfd, TRUE);
2968   if (dump_file_header)
2969     dump_bfd_header (abfd);
2970   if (dump_private_headers)
2971     dump_bfd_private_header (abfd);
2972   if (! dump_debugging_tags)
2973     putchar ('\n');
2974   if (dump_section_headers)
2975     dump_headers (abfd);
2976
2977   if (dump_symtab
2978       || dump_reloc_info
2979       || disassemble
2980       || dump_debugging
2981       || dump_dwarf_section_info)
2982     syms = slurp_symtab (abfd);
2983   if (dump_dynamic_symtab || dump_dynamic_reloc_info
2984       || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
2985     dynsyms = slurp_dynamic_symtab (abfd);
2986   if (disassemble)
2987     {
2988       synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
2989                                              dynsymcount, dynsyms, &synthsyms);
2990       if (synthcount < 0)
2991         synthcount = 0;
2992     }
2993
2994   if (dump_symtab)
2995     dump_symbols (abfd, FALSE);
2996   if (dump_dynamic_symtab)
2997     dump_symbols (abfd, TRUE);
2998   if (dump_dwarf_section_info)
2999     dump_dwarf (abfd);
3000   if (dump_stab_section_info)
3001     dump_stabs (abfd);
3002   if (dump_reloc_info && ! disassemble)
3003     dump_relocs (abfd);
3004   if (dump_dynamic_reloc_info && ! disassemble)
3005     dump_dynamic_relocs (abfd);
3006   if (dump_section_contents)
3007     dump_data (abfd);
3008   if (disassemble)
3009     disassemble_data (abfd);
3010
3011   if (dump_debugging)
3012     {
3013       void *dhandle;
3014
3015       dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3016       if (dhandle != NULL)
3017         {
3018           if (!print_debugging_info (stdout, dhandle, abfd, syms,
3019                                      bfd_demangle,
3020                                      dump_debugging_tags ? TRUE : FALSE))
3021             {
3022               non_fatal (_("%s: printing debugging information failed"),
3023                          bfd_get_filename (abfd));
3024               exit_status = 1;
3025             }
3026         }
3027       /* PR 6483: If there was no STABS or IEEE debug
3028          info in the file, try DWARF instead.  */
3029       else if (! dump_dwarf_section_info)
3030         {
3031           dump_dwarf (abfd);
3032         }
3033     }
3034
3035   if (syms)
3036     {
3037       free (syms);
3038       syms = NULL;
3039     }
3040
3041   if (dynsyms)
3042     {
3043       free (dynsyms);
3044       dynsyms = NULL;
3045     }
3046
3047   if (synthsyms)
3048     {
3049       free (synthsyms);
3050       synthsyms = NULL;
3051     }
3052
3053   symcount = 0;
3054   dynsymcount = 0;
3055   synthcount = 0;
3056 }
3057
3058 static void
3059 display_bfd (bfd *abfd)
3060 {
3061   char **matching;
3062
3063   if (bfd_check_format_matches (abfd, bfd_object, &matching))
3064     {
3065       dump_bfd (abfd);
3066       return;
3067     }
3068
3069   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3070     {
3071       nonfatal (bfd_get_filename (abfd));
3072       list_matching_formats (matching);
3073       free (matching);
3074       return;
3075     }
3076
3077   if (bfd_get_error () != bfd_error_file_not_recognized)
3078     {
3079       nonfatal (bfd_get_filename (abfd));
3080       return;
3081     }
3082
3083   if (bfd_check_format_matches (abfd, bfd_core, &matching))
3084     {
3085       dump_bfd (abfd);
3086       return;
3087     }
3088
3089   nonfatal (bfd_get_filename (abfd));
3090
3091   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3092     {
3093       list_matching_formats (matching);
3094       free (matching);
3095     }
3096 }
3097
3098 static void
3099 display_file (char *filename, char *target)
3100 {
3101   bfd *file;
3102   bfd *arfile = NULL;
3103
3104   if (get_file_size (filename) < 1)
3105     {
3106       exit_status = 1;
3107       return;
3108     }
3109
3110   file = bfd_openr (filename, target);
3111   if (file == NULL)
3112     {
3113       nonfatal (filename);
3114       return;
3115     }
3116
3117   /* If the file is an archive, process all of its elements.  */
3118   if (bfd_check_format (file, bfd_archive))
3119     {
3120       bfd *last_arfile = NULL;
3121
3122       printf (_("In archive %s:\n"), bfd_get_filename (file));
3123       for (;;)
3124         {
3125           bfd_set_error (bfd_error_no_error);
3126
3127           arfile = bfd_openr_next_archived_file (file, arfile);
3128           if (arfile == NULL)
3129             {
3130               if (bfd_get_error () != bfd_error_no_more_archived_files)
3131                 nonfatal (bfd_get_filename (file));
3132               break;
3133             }
3134
3135           display_bfd (arfile);
3136
3137           if (last_arfile != NULL)
3138             bfd_close (last_arfile);
3139           last_arfile = arfile;
3140         }
3141
3142       if (last_arfile != NULL)
3143         bfd_close (last_arfile);
3144     }
3145   else
3146     display_bfd (file);
3147
3148   bfd_close (file);
3149 }
3150 \f
3151 int
3152 main (int argc, char **argv)
3153 {
3154   int c;
3155   char *target = default_target;
3156   bfd_boolean seenflag = FALSE;
3157
3158 #if defined (HAVE_SETLOCALE)
3159 #if defined (HAVE_LC_MESSAGES)
3160   setlocale (LC_MESSAGES, "");
3161 #endif
3162   setlocale (LC_CTYPE, "");
3163 #endif
3164
3165   bindtextdomain (PACKAGE, LOCALEDIR);
3166   textdomain (PACKAGE);
3167
3168   program_name = *argv;
3169   xmalloc_set_program_name (program_name);
3170
3171   START_PROGRESS (program_name, 0);
3172
3173   expandargv (&argc, &argv);
3174
3175   bfd_init ();
3176   set_default_bfd_target ();
3177
3178   while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW",
3179                            long_options, (int *) 0))
3180          != EOF)
3181     {
3182       switch (c)
3183         {
3184         case 0:
3185           break;                /* We've been given a long option.  */
3186         case 'm':
3187           machine = optarg;
3188           break;
3189         case 'M':
3190           if (disassembler_options)
3191             /* Ignore potential memory leak for now.  */
3192             disassembler_options = concat (disassembler_options, ",",
3193                                            optarg, (const char *) NULL);
3194           else
3195             disassembler_options = optarg;
3196           break;
3197         case 'j':
3198           if (only_used == only_size)
3199             {
3200               only_size += 8;
3201               only = xrealloc (only, only_size * sizeof (char *));
3202             }
3203           only [only_used++] = optarg;
3204           break;
3205         case 'F':
3206           display_file_offsets = TRUE;
3207           break;
3208         case 'l':
3209           with_line_numbers = TRUE;
3210           break;
3211         case 'b':
3212           target = optarg;
3213           break;
3214         case 'C':
3215           do_demangle = TRUE;
3216           if (optarg != NULL)
3217             {
3218               enum demangling_styles style;
3219
3220               style = cplus_demangle_name_to_style (optarg);
3221               if (style == unknown_demangling)
3222                 fatal (_("unknown demangling style `%s'"),
3223                        optarg);
3224
3225               cplus_demangle_set_style (style);
3226             }
3227           break;
3228         case 'w':
3229           wide_output = TRUE;
3230           break;
3231         case OPTION_ADJUST_VMA:
3232           adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3233           break;
3234         case OPTION_START_ADDRESS:
3235           start_address = parse_vma (optarg, "--start-address");
3236           if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3237             fatal (_("error: the start address should be before the end address"));
3238           break;
3239         case OPTION_STOP_ADDRESS:
3240           stop_address = parse_vma (optarg, "--stop-address");
3241           if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3242             fatal (_("error: the stop address should be after the start address"));
3243           break;
3244         case 'E':
3245           if (strcmp (optarg, "B") == 0)
3246             endian = BFD_ENDIAN_BIG;
3247           else if (strcmp (optarg, "L") == 0)
3248             endian = BFD_ENDIAN_LITTLE;
3249           else
3250             {
3251               non_fatal (_("unrecognized -E option"));
3252               usage (stderr, 1);
3253             }
3254           break;
3255         case OPTION_ENDIAN:
3256           if (strncmp (optarg, "big", strlen (optarg)) == 0)
3257             endian = BFD_ENDIAN_BIG;
3258           else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3259             endian = BFD_ENDIAN_LITTLE;
3260           else
3261             {
3262               non_fatal (_("unrecognized --endian type `%s'"), optarg);
3263               usage (stderr, 1);
3264             }
3265           break;
3266
3267         case 'f':
3268           dump_file_header = TRUE;
3269           seenflag = TRUE;
3270           break;
3271         case 'i':
3272           formats_info = TRUE;
3273           seenflag = TRUE;
3274           break;
3275         case 'I':
3276           add_include_path (optarg);
3277           break;
3278         case 'p':
3279           dump_private_headers = TRUE;
3280           seenflag = TRUE;
3281           break;
3282         case 'x':
3283           dump_private_headers = TRUE;
3284           dump_symtab = TRUE;
3285           dump_reloc_info = TRUE;
3286           dump_file_header = TRUE;
3287           dump_ar_hdrs = TRUE;
3288           dump_section_headers = TRUE;
3289           seenflag = TRUE;
3290           break;
3291         case 't':
3292           dump_symtab = TRUE;
3293           seenflag = TRUE;
3294           break;
3295         case 'T':
3296           dump_dynamic_symtab = TRUE;
3297           seenflag = TRUE;
3298           break;
3299         case 'd':
3300           disassemble = TRUE;
3301           seenflag = TRUE;
3302           break;
3303         case 'z':
3304           disassemble_zeroes = TRUE;
3305           break;
3306         case 'D':
3307           disassemble = TRUE;
3308           disassemble_all = TRUE;
3309           seenflag = TRUE;
3310           break;
3311         case 'S':
3312           disassemble = TRUE;
3313           with_source_code = TRUE;
3314           seenflag = TRUE;
3315           break;
3316         case 'g':
3317           dump_debugging = 1;
3318           seenflag = TRUE;
3319           break;
3320         case 'e':
3321           dump_debugging = 1;
3322           dump_debugging_tags = 1;
3323           do_demangle = TRUE;
3324           seenflag = TRUE;
3325           break;
3326         case 'W':
3327           dump_dwarf_section_info = TRUE;
3328           seenflag = TRUE;
3329           do_debug_info = 1;
3330           do_debug_abbrevs = 1;
3331           do_debug_lines = 1;
3332           do_debug_pubnames = 1;
3333           do_debug_aranges = 1;
3334           do_debug_ranges = 1;
3335           do_debug_frames = 1;
3336           do_debug_macinfo = 1;
3337           do_debug_str = 1;
3338           do_debug_loc = 1;
3339           break;
3340         case 'G':
3341           dump_stab_section_info = TRUE;
3342           seenflag = TRUE;
3343           break;
3344         case 's':
3345           dump_section_contents = TRUE;
3346           seenflag = TRUE;
3347           break;
3348         case 'r':
3349           dump_reloc_info = TRUE;
3350           seenflag = TRUE;
3351           break;
3352         case 'R':
3353           dump_dynamic_reloc_info = TRUE;
3354           seenflag = TRUE;
3355           break;
3356         case 'a':
3357           dump_ar_hdrs = TRUE;
3358           seenflag = TRUE;
3359           break;
3360         case 'h':
3361           dump_section_headers = TRUE;
3362           seenflag = TRUE;
3363           break;
3364         case 'H':
3365           usage (stdout, 0);
3366           seenflag = TRUE;
3367         case 'v':
3368         case 'V':
3369           show_version = TRUE;
3370           seenflag = TRUE;
3371           break;
3372
3373         default:
3374           usage (stderr, 1);
3375         }
3376     }
3377
3378   if (show_version)
3379     print_version ("objdump");
3380
3381   if (!seenflag)
3382     usage (stderr, 2);
3383
3384   if (formats_info)
3385     exit_status = display_info ();
3386   else
3387     {
3388       if (optind == argc)
3389         display_file ("a.out", target);
3390       else
3391         for (; optind < argc;)
3392           display_file (argv[optind++], target);
3393     }
3394
3395   END_PROGRESS (program_name);
3396
3397   return exit_status;
3398 }