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