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