PR 11225
[platform/upstream/binutils.git] / binutils / objdump.c
1 /* objdump.c -- dump information about an object file.
2    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 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   bfd_boolean done_dot;
1461   int skip_addr_chars;
1462   bfd_vma addr_offset;
1463   unsigned int opb = inf->octets_per_byte;
1464   unsigned int skip_zeroes = inf->skip_zeroes;
1465   unsigned int skip_zeroes_at_end = inf->skip_zeroes_at_end;
1466   int octets = opb;
1467   SFILE sfile;
1468
1469   aux = (struct objdump_disasm_info *) inf->application_data;
1470   section = aux->sec;
1471
1472   sfile.alloc = 120;
1473   sfile.buffer = (char *) xmalloc (sfile.alloc);
1474   sfile.pos = 0;
1475   
1476   if (insn_width)
1477     octets_per_line = insn_width;
1478   else if (insns)
1479     octets_per_line = 4;
1480   else
1481     octets_per_line = 16;
1482
1483   /* Figure out how many characters to skip at the start of an
1484      address, to make the disassembly look nicer.  We discard leading
1485      zeroes in chunks of 4, ensuring that there is always a leading
1486      zero remaining.  */
1487   skip_addr_chars = 0;
1488   if (! prefix_addresses)
1489     {
1490       char buf[30];
1491
1492       bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1493
1494       while (buf[skip_addr_chars] == '0')
1495         ++skip_addr_chars;
1496
1497       /* Don't discard zeros on overflow.  */
1498       if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1499         skip_addr_chars = 0;
1500
1501       if (skip_addr_chars != 0)
1502         skip_addr_chars = (skip_addr_chars - 1) & -4;
1503     }
1504
1505   inf->insn_info_valid = 0;
1506
1507   done_dot = FALSE;
1508   addr_offset = start_offset;
1509   while (addr_offset < stop_offset)
1510     {
1511       bfd_vma z;
1512       bfd_boolean need_nl = FALSE;
1513       int previous_octets;
1514
1515       /* Remember the length of the previous instruction.  */
1516       previous_octets = octets;
1517       octets = 0;
1518
1519       /* If we see more than SKIP_ZEROES octets of zeroes, we just
1520          print `...'.  */
1521       for (z = addr_offset * opb; z < stop_offset * opb; z++)
1522         if (data[z] != 0)
1523           break;
1524       if (! disassemble_zeroes
1525           && (inf->insn_info_valid == 0
1526               || inf->branch_delay_insns == 0)
1527           && (z - addr_offset * opb >= skip_zeroes
1528               || (z == stop_offset * opb &&
1529                   z - addr_offset * opb < skip_zeroes_at_end)))
1530         {
1531           /* If there are more nonzero octets to follow, we only skip
1532              zeroes in multiples of 4, to try to avoid running over
1533              the start of an instruction which happens to start with
1534              zero.  */
1535           if (z != stop_offset * opb)
1536             z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1537
1538           octets = z - addr_offset * opb;
1539
1540           /* If we are going to display more data, and we are displaying
1541              file offsets, then tell the user how many zeroes we skip
1542              and the file offset from where we resume dumping.  */
1543           if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1544             printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1545                     octets / opb,
1546                     (unsigned long) (section->filepos
1547                                      + (addr_offset + (octets / opb))));
1548           else
1549             printf ("\t...\n");
1550         }
1551       else
1552         {
1553           char buf[50];
1554           int bpc = 0;
1555           int pb = 0;
1556
1557           done_dot = FALSE;
1558
1559           if (with_line_numbers || with_source_code)
1560             show_line (aux->abfd, section, addr_offset);
1561
1562           if (! prefix_addresses)
1563             {
1564               char *s;
1565
1566               bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1567               for (s = buf + skip_addr_chars; *s == '0'; s++)
1568                 *s = ' ';
1569               if (*s == '\0')
1570                 *--s = '0';
1571               printf ("%s:\t", buf + skip_addr_chars);
1572             }
1573           else
1574             {
1575               aux->require_sec = TRUE;
1576               objdump_print_address (section->vma + addr_offset, inf);
1577               aux->require_sec = FALSE;
1578               putchar (' ');
1579             }
1580
1581           if (insns)
1582             {
1583               sfile.pos = 0;
1584               inf->fprintf_func = (fprintf_ftype) objdump_sprintf;
1585               inf->stream = &sfile;
1586               inf->bytes_per_line = 0;
1587               inf->bytes_per_chunk = 0;
1588               inf->flags = disassemble_all ? DISASSEMBLE_DATA : 0;
1589               if (machine)
1590                 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
1591
1592               if (inf->disassembler_needs_relocs
1593                   && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1594                   && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1595                   && *relppp < relppend)
1596                 {
1597                   bfd_signed_vma distance_to_rel;
1598
1599                   distance_to_rel = (**relppp)->address
1600                     - (rel_offset + addr_offset);
1601
1602                   /* Check to see if the current reloc is associated with
1603                      the instruction that we are about to disassemble.  */
1604                   if (distance_to_rel == 0
1605                       /* FIXME: This is wrong.  We are trying to catch
1606                          relocs that are addressed part way through the
1607                          current instruction, as might happen with a packed
1608                          VLIW instruction.  Unfortunately we do not know the
1609                          length of the current instruction since we have not
1610                          disassembled it yet.  Instead we take a guess based
1611                          upon the length of the previous instruction.  The
1612                          proper solution is to have a new target-specific
1613                          disassembler function which just returns the length
1614                          of an instruction at a given address without trying
1615                          to display its disassembly. */
1616                       || (distance_to_rel > 0
1617                           && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1618                     {
1619                       inf->flags |= INSN_HAS_RELOC;
1620                       aux->reloc = **relppp;
1621                     }
1622                   else
1623                     aux->reloc = NULL;
1624                 }
1625
1626               octets = (*disassemble_fn) (section->vma + addr_offset, inf);
1627               inf->fprintf_func = (fprintf_ftype) fprintf;
1628               inf->stream = stdout;
1629               if (insn_width == 0 && inf->bytes_per_line != 0)
1630                 octets_per_line = inf->bytes_per_line;
1631               if (octets < 0)
1632                 {
1633                   if (sfile.pos)
1634                     printf ("%s\n", sfile.buffer);
1635                   break;
1636                 }
1637             }
1638           else
1639             {
1640               bfd_vma j;
1641
1642               octets = octets_per_line;
1643               if (addr_offset + octets / opb > stop_offset)
1644                 octets = (stop_offset - addr_offset) * opb;
1645
1646               for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1647                 {
1648                   if (ISPRINT (data[j]))
1649                     buf[j - addr_offset * opb] = data[j];
1650                   else
1651                     buf[j - addr_offset * opb] = '.';
1652                 }
1653               buf[j - addr_offset * opb] = '\0';
1654             }
1655
1656           if (prefix_addresses
1657               ? show_raw_insn > 0
1658               : show_raw_insn >= 0)
1659             {
1660               bfd_vma j;
1661
1662               /* If ! prefix_addresses and ! wide_output, we print
1663                  octets_per_line octets per line.  */
1664               pb = octets;
1665               if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1666                 pb = octets_per_line;
1667
1668               if (inf->bytes_per_chunk)
1669                 bpc = inf->bytes_per_chunk;
1670               else
1671                 bpc = 1;
1672
1673               for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1674                 {
1675                   int k;
1676
1677                   if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1678                     {
1679                       for (k = bpc - 1; k >= 0; k--)
1680                         printf ("%02x", (unsigned) data[j + k]);
1681                       putchar (' ');
1682                     }
1683                   else
1684                     {
1685                       for (k = 0; k < bpc; k++)
1686                         printf ("%02x", (unsigned) data[j + k]);
1687                       putchar (' ');
1688                     }
1689                 }
1690
1691               for (; pb < octets_per_line; pb += bpc)
1692                 {
1693                   int k;
1694
1695                   for (k = 0; k < bpc; k++)
1696                     printf ("  ");
1697                   putchar (' ');
1698                 }
1699
1700               /* Separate raw data from instruction by extra space.  */
1701               if (insns)
1702                 putchar ('\t');
1703               else
1704                 printf ("    ");
1705             }
1706
1707           if (! insns)
1708             printf ("%s", buf);
1709           else if (sfile.pos)
1710             printf ("%s", sfile.buffer);
1711
1712           if (prefix_addresses
1713               ? show_raw_insn > 0
1714               : show_raw_insn >= 0)
1715             {
1716               while (pb < octets)
1717                 {
1718                   bfd_vma j;
1719                   char *s;
1720
1721                   putchar ('\n');
1722                   j = addr_offset * opb + pb;
1723
1724                   bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1725                   for (s = buf + skip_addr_chars; *s == '0'; s++)
1726                     *s = ' ';
1727                   if (*s == '\0')
1728                     *--s = '0';
1729                   printf ("%s:\t", buf + skip_addr_chars);
1730
1731                   pb += octets_per_line;
1732                   if (pb > octets)
1733                     pb = octets;
1734                   for (; j < addr_offset * opb + pb; j += bpc)
1735                     {
1736                       int k;
1737
1738                       if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1739                         {
1740                           for (k = bpc - 1; k >= 0; k--)
1741                             printf ("%02x", (unsigned) data[j + k]);
1742                           putchar (' ');
1743                         }
1744                       else
1745                         {
1746                           for (k = 0; k < bpc; k++)
1747                             printf ("%02x", (unsigned) data[j + k]);
1748                           putchar (' ');
1749                         }
1750                     }
1751                 }
1752             }
1753
1754           if (!wide_output)
1755             putchar ('\n');
1756           else
1757             need_nl = TRUE;
1758         }
1759
1760       while ((*relppp) < relppend
1761              && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1762         {
1763           if (dump_reloc_info || dump_dynamic_reloc_info)
1764             {
1765               arelent *q;
1766
1767               q = **relppp;
1768
1769               if (wide_output)
1770                 putchar ('\t');
1771               else
1772                 printf ("\t\t\t");
1773
1774               objdump_print_value (section->vma - rel_offset + q->address,
1775                                    inf, TRUE);
1776
1777               if (q->howto == NULL)
1778                 printf (": *unknown*\t");
1779               else if (q->howto->name)
1780                 printf (": %s\t", q->howto->name);
1781               else
1782                 printf (": %d\t", q->howto->type);
1783
1784               if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1785                 printf ("*unknown*");
1786               else
1787                 {
1788                   const char *sym_name;
1789
1790                   sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1791                   if (sym_name != NULL && *sym_name != '\0')
1792                     objdump_print_symname (aux->abfd, inf, *q->sym_ptr_ptr);
1793                   else
1794                     {
1795                       asection *sym_sec;
1796
1797                       sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1798                       sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1799                       if (sym_name == NULL || *sym_name == '\0')
1800                         sym_name = "*unknown*";
1801                       printf ("%s", sym_name);
1802                     }
1803                 }
1804
1805               if (q->addend)
1806                 {
1807                   printf ("+0x");
1808                   objdump_print_value (q->addend, inf, TRUE);
1809                 }
1810
1811               printf ("\n");
1812               need_nl = FALSE;
1813             }
1814           ++(*relppp);
1815         }
1816
1817       if (need_nl)
1818         printf ("\n");
1819
1820       addr_offset += octets / opb;
1821     }
1822
1823   free (sfile.buffer);
1824 }
1825
1826 static void
1827 disassemble_section (bfd *abfd, asection *section, void *inf)
1828 {
1829   const struct elf_backend_data * bed;
1830   bfd_vma                      sign_adjust = 0;
1831   struct disassemble_info *    pinfo = (struct disassemble_info *) inf;
1832   struct objdump_disasm_info * paux;
1833   unsigned int                 opb = pinfo->octets_per_byte;
1834   bfd_byte *                   data = NULL;
1835   bfd_size_type                datasize = 0;
1836   arelent **                   rel_pp = NULL;
1837   arelent **                   rel_ppstart = NULL;
1838   arelent **                   rel_ppend;
1839   unsigned long                stop_offset;
1840   asymbol *                    sym = NULL;
1841   long                         place = 0;
1842   long                         rel_count;
1843   bfd_vma                      rel_offset;
1844   unsigned long                addr_offset;
1845
1846   /* Sections that do not contain machine
1847      code are not normally disassembled.  */
1848   if (! disassemble_all
1849       && only_list == NULL
1850       && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1851           != (SEC_CODE | SEC_HAS_CONTENTS)))
1852     return;
1853
1854   if (! process_section_p (section))
1855     return;
1856
1857   datasize = bfd_get_section_size (section);
1858   if (datasize == 0)
1859     return;
1860
1861   /* Decide which set of relocs to use.  Load them if necessary.  */
1862   paux = (struct objdump_disasm_info *) pinfo->application_data;
1863   if (paux->dynrelbuf)
1864     {
1865       rel_pp = paux->dynrelbuf;
1866       rel_count = paux->dynrelcount;
1867       /* Dynamic reloc addresses are absolute, non-dynamic are section
1868          relative.  REL_OFFSET specifies the reloc address corresponding
1869          to the start of this section.  */
1870       rel_offset = section->vma;
1871     }
1872   else
1873     {
1874       rel_count = 0;
1875       rel_pp = NULL;
1876       rel_offset = 0;
1877
1878       if ((section->flags & SEC_RELOC) != 0
1879           && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1880         {
1881           long relsize;
1882
1883           relsize = bfd_get_reloc_upper_bound (abfd, section);
1884           if (relsize < 0)
1885             bfd_fatal (bfd_get_filename (abfd));
1886
1887           if (relsize > 0)
1888             {
1889               rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
1890               rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1891               if (rel_count < 0)
1892                 bfd_fatal (bfd_get_filename (abfd));
1893
1894               /* Sort the relocs by address.  */
1895               qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1896             }
1897         }
1898     }
1899   rel_ppend = rel_pp + rel_count;
1900
1901   data = (bfd_byte *) xmalloc (datasize);
1902
1903   bfd_get_section_contents (abfd, section, data, 0, datasize);
1904
1905   paux->sec = section;
1906   pinfo->buffer = data;
1907   pinfo->buffer_vma = section->vma;
1908   pinfo->buffer_length = datasize;
1909   pinfo->section = section;
1910
1911   if (start_address == (bfd_vma) -1
1912       || start_address < pinfo->buffer_vma)
1913     addr_offset = 0;
1914   else
1915     addr_offset = start_address - pinfo->buffer_vma;
1916
1917   if (stop_address == (bfd_vma) -1)
1918     stop_offset = datasize / opb;
1919   else
1920     {
1921       if (stop_address < pinfo->buffer_vma)
1922         stop_offset = 0;
1923       else
1924         stop_offset = stop_address - pinfo->buffer_vma;
1925       if (stop_offset > pinfo->buffer_length / opb)
1926         stop_offset = pinfo->buffer_length / opb;
1927     }
1928
1929   /* Skip over the relocs belonging to addresses below the
1930      start address.  */
1931   while (rel_pp < rel_ppend
1932          && (*rel_pp)->address < rel_offset + addr_offset)
1933     ++rel_pp;
1934
1935   if (addr_offset < stop_offset)
1936     printf (_("\nDisassembly of section %s:\n"), section->name);
1937
1938   /* Find the nearest symbol forwards from our current position.  */
1939   paux->require_sec = TRUE;
1940   sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
1941                                              (struct disassemble_info *) inf,
1942                                              &place);
1943   paux->require_sec = FALSE;
1944
1945   /* PR 9774: If the target used signed addresses then we must make
1946      sure that we sign extend the value that we calculate for 'addr'
1947      in the loop below.  */
1948   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
1949       && (bed = get_elf_backend_data (abfd)) != NULL
1950       && bed->sign_extend_vma)
1951     sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
1952
1953   /* Disassemble a block of instructions up to the address associated with
1954      the symbol we have just found.  Then print the symbol and find the
1955      next symbol on.  Repeat until we have disassembled the entire section
1956      or we have reached the end of the address range we are interested in.  */
1957   while (addr_offset < stop_offset)
1958     {
1959       bfd_vma addr;
1960       asymbol *nextsym;
1961       unsigned long nextstop_offset;
1962       bfd_boolean insns;
1963
1964       addr = section->vma + addr_offset;
1965       addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
1966
1967       if (sym != NULL && bfd_asymbol_value (sym) <= addr)
1968         {
1969           int x;
1970
1971           for (x = place;
1972                (x < sorted_symcount
1973                 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
1974                ++x)
1975             continue;
1976
1977           pinfo->symbols = sorted_syms + place;
1978           pinfo->num_symbols = x - place;
1979           pinfo->symtab_pos = place;
1980         }
1981       else
1982         {
1983           pinfo->symbols = NULL;
1984           pinfo->num_symbols = 0;
1985           pinfo->symtab_pos = -1;
1986         }
1987
1988       if (! prefix_addresses)
1989         {
1990           pinfo->fprintf_func (pinfo->stream, "\n");
1991           objdump_print_addr_with_sym (abfd, section, sym, addr,
1992                                        pinfo, FALSE);
1993           pinfo->fprintf_func (pinfo->stream, ":\n");
1994         }
1995
1996       if (sym != NULL && bfd_asymbol_value (sym) > addr)
1997         nextsym = sym;
1998       else if (sym == NULL)
1999         nextsym = NULL;
2000       else
2001         {
2002 #define is_valid_next_sym(SYM) \
2003   ((SYM)->section == section \
2004    && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
2005    && pinfo->symbol_is_valid (SYM, pinfo))
2006             
2007           /* Search forward for the next appropriate symbol in
2008              SECTION.  Note that all the symbols are sorted
2009              together into one big array, and that some sections
2010              may have overlapping addresses.  */
2011           while (place < sorted_symcount
2012                  && ! is_valid_next_sym (sorted_syms [place]))
2013             ++place;
2014
2015           if (place >= sorted_symcount)
2016             nextsym = NULL;
2017           else
2018             nextsym = sorted_syms[place];
2019         }
2020
2021       if (sym != NULL && bfd_asymbol_value (sym) > addr)
2022         nextstop_offset = bfd_asymbol_value (sym) - section->vma;
2023       else if (nextsym == NULL)
2024         nextstop_offset = stop_offset;
2025       else
2026         nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
2027
2028       if (nextstop_offset > stop_offset
2029           || nextstop_offset <= addr_offset)
2030         nextstop_offset = stop_offset;
2031
2032       /* If a symbol is explicitly marked as being an object
2033          rather than a function, just dump the bytes without
2034          disassembling them.  */
2035       if (disassemble_all
2036           || sym == NULL
2037           || sym->section != section
2038           || bfd_asymbol_value (sym) > addr
2039           || ((sym->flags & BSF_OBJECT) == 0
2040               && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
2041                   == NULL)
2042               && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
2043                   == NULL))
2044           || (sym->flags & BSF_FUNCTION) != 0)
2045         insns = TRUE;
2046       else
2047         insns = FALSE;
2048
2049       disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2050                          addr_offset, nextstop_offset,
2051                          rel_offset, &rel_pp, rel_ppend);
2052       
2053       addr_offset = nextstop_offset;
2054       sym = nextsym;
2055     }
2056
2057   free (data);
2058
2059   if (rel_ppstart != NULL)
2060     free (rel_ppstart);
2061 }
2062
2063 /* Disassemble the contents of an object file.  */
2064
2065 static void
2066 disassemble_data (bfd *abfd)
2067 {
2068   struct disassemble_info disasm_info;
2069   struct objdump_disasm_info aux;
2070   long i;
2071
2072   print_files = NULL;
2073   prev_functionname = NULL;
2074   prev_line = -1;
2075
2076   /* We make a copy of syms to sort.  We don't want to sort syms
2077      because that will screw up the relocs.  */
2078   sorted_symcount = symcount ? symcount : dynsymcount;
2079   sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2080                                       * sizeof (asymbol *));
2081   memcpy (sorted_syms, symcount ? syms : dynsyms,
2082           sorted_symcount * sizeof (asymbol *));
2083
2084   sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2085
2086   for (i = 0; i < synthcount; ++i)
2087     {
2088       sorted_syms[sorted_symcount] = synthsyms + i;
2089       ++sorted_symcount;
2090     }
2091
2092   /* Sort the symbols into section and symbol order.  */
2093   qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2094
2095   init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
2096
2097   disasm_info.application_data = (void *) &aux;
2098   aux.abfd = abfd;
2099   aux.require_sec = FALSE;
2100   aux.dynrelbuf = NULL;
2101   aux.dynrelcount = 0;
2102   aux.reloc = NULL;
2103
2104   disasm_info.print_address_func = objdump_print_address;
2105   disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2106
2107   if (machine != NULL)
2108     {
2109       const bfd_arch_info_type *inf = bfd_scan_arch (machine);
2110
2111       if (inf == NULL)
2112         fatal (_("Can't use supplied machine %s"), machine);
2113
2114       abfd->arch_info = inf;
2115     }
2116
2117   if (endian != BFD_ENDIAN_UNKNOWN)
2118     {
2119       struct bfd_target *xvec;
2120
2121       xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
2122       memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2123       xvec->byteorder = endian;
2124       abfd->xvec = xvec;
2125     }
2126
2127   /* Use libopcodes to locate a suitable disassembler.  */
2128   aux.disassemble_fn = disassembler (abfd);
2129   if (!aux.disassemble_fn)
2130     {
2131       non_fatal (_("Can't disassemble for architecture %s\n"),
2132                  bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2133       exit_status = 1;
2134       return;
2135     }
2136
2137   disasm_info.flavour = bfd_get_flavour (abfd);
2138   disasm_info.arch = bfd_get_arch (abfd);
2139   disasm_info.mach = bfd_get_mach (abfd);
2140   disasm_info.disassembler_options = disassembler_options;
2141   disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2142   disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2143   disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2144   disasm_info.disassembler_needs_relocs = FALSE;
2145
2146   if (bfd_big_endian (abfd))
2147     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2148   else if (bfd_little_endian (abfd))
2149     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2150   else
2151     /* ??? Aborting here seems too drastic.  We could default to big or little
2152        instead.  */
2153     disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2154
2155   /* Allow the target to customize the info structure.  */
2156   disassemble_init_for_target (& disasm_info);
2157
2158   /* Pre-load the dynamic relocs if we are going
2159      to be dumping them along with the disassembly.  */
2160   if (dump_dynamic_reloc_info)
2161     {
2162       long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2163   
2164       if (relsize < 0)
2165         bfd_fatal (bfd_get_filename (abfd));
2166
2167       if (relsize > 0)
2168         {
2169           aux.dynrelbuf = (arelent **) xmalloc (relsize);
2170           aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2171                                                             aux.dynrelbuf,
2172                                                             dynsyms);
2173           if (aux.dynrelcount < 0)
2174             bfd_fatal (bfd_get_filename (abfd));
2175
2176           /* Sort the relocs by address.  */
2177           qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2178                  compare_relocs);
2179         }
2180     }
2181   disasm_info.symtab = sorted_syms;
2182   disasm_info.symtab_size = sorted_symcount;
2183
2184   bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2185
2186   if (aux.dynrelbuf != NULL)
2187     free (aux.dynrelbuf);
2188   free (sorted_syms);
2189 }
2190 \f
2191 static int
2192 load_specific_debug_section (enum dwarf_section_display_enum debug,
2193                              asection *sec, void *file)
2194 {
2195   struct dwarf_section *section = &debug_displays [debug].section;
2196   bfd *abfd = (bfd *) file;
2197   bfd_boolean ret;
2198   int section_is_compressed;
2199
2200   /* If it is already loaded, do nothing.  */
2201   if (section->start != NULL)
2202     return 1;
2203
2204   section_is_compressed = section->name == section->compressed_name;
2205
2206   section->address = 0;
2207   section->size = bfd_get_section_size (sec);
2208   section->start = (unsigned char *) xmalloc (section->size);
2209
2210   if (is_relocatable && debug_displays [debug].relocate)
2211     ret = bfd_simple_get_relocated_section_contents (abfd,
2212                                                      sec,
2213                                                      section->start,
2214                                                      syms) != NULL;
2215   else
2216     ret = bfd_get_section_contents (abfd, sec, section->start, 0,
2217                                     section->size);
2218
2219   if (! ret)
2220     {
2221       free_debug_section (debug);
2222       printf (_("\nCan't get contents for section '%s'.\n"),
2223               section->name);
2224       return 0;
2225     }
2226
2227   if (section_is_compressed)
2228     {
2229       bfd_size_type size = section->size;
2230       if (! bfd_uncompress_section_contents (&section->start, &size))
2231         {
2232           free_debug_section (debug);
2233           printf (_("\nCan't uncompress section '%s'.\n"), section->name);
2234           return 0;
2235         }
2236       section->size = size;
2237     }
2238
2239   return 1;
2240 }
2241
2242 int
2243 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2244 {
2245   struct dwarf_section *section = &debug_displays [debug].section;
2246   bfd *abfd = (bfd *) file;
2247   asection *sec;
2248
2249   /* If it is already loaded, do nothing.  */
2250   if (section->start != NULL)
2251     return 1;
2252
2253   /* Locate the debug section.  */
2254   sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2255   if (sec != NULL)
2256     section->name = section->uncompressed_name;
2257   else
2258     {
2259       sec = bfd_get_section_by_name (abfd, section->compressed_name);
2260       if (sec != NULL)
2261         section->name = section->compressed_name;
2262     }
2263   if (sec == NULL)
2264     return 0;
2265
2266   return load_specific_debug_section (debug, sec, file);
2267 }
2268
2269 void
2270 free_debug_section (enum dwarf_section_display_enum debug)
2271 {
2272   struct dwarf_section *section = &debug_displays [debug].section;
2273
2274   if (section->start == NULL)
2275     return;
2276
2277   free ((char *) section->start);
2278   section->start = NULL;
2279   section->address = 0;
2280   section->size = 0;
2281 }
2282
2283 static void
2284 dump_dwarf_section (bfd *abfd, asection *section,
2285                     void *arg ATTRIBUTE_UNUSED)
2286 {
2287   const char *name = bfd_get_section_name (abfd, section);
2288   const char *match;
2289   int i;
2290
2291   if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2292     match = ".debug_info";
2293   else
2294     match = name;
2295
2296   for (i = 0; i < max; i++)
2297     if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2298          || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2299         && debug_displays [i].enabled != NULL
2300         && *debug_displays [i].enabled)
2301       {
2302         struct dwarf_section *sec = &debug_displays [i].section;
2303
2304         if (strcmp (sec->uncompressed_name, match) == 0)
2305           sec->name = sec->uncompressed_name;
2306         else
2307           sec->name = sec->compressed_name;
2308         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2309                                          section, abfd))
2310           {
2311             debug_displays [i].display (sec, abfd);
2312             
2313             if (i != info && i != abbrev)
2314               free_debug_section ((enum dwarf_section_display_enum) i);
2315           }
2316         break;
2317       }
2318 }
2319
2320 /* Dump the dwarf debugging information.  */
2321
2322 static void
2323 dump_dwarf (bfd *abfd)
2324 {
2325   is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2326
2327   /* FIXME: bfd_get_arch_size may return -1.  We assume that 64bit
2328      targets will return 64.  */
2329   eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
2330
2331   if (bfd_big_endian (abfd))
2332     byte_get = byte_get_big_endian;
2333   else if (bfd_little_endian (abfd))
2334     byte_get = byte_get_little_endian;
2335   else
2336     abort ();
2337
2338   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
2339     {
2340       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2341       init_dwarf_regnames (bed->elf_machine_code);
2342     }
2343
2344   bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2345
2346   free_debug_memory ();
2347 }
2348 \f
2349 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2350    it.  Return NULL on failure.   */
2351
2352 static char *
2353 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2354 {
2355   asection *stabsect;
2356   bfd_size_type size;
2357   char *contents;
2358
2359   stabsect = bfd_get_section_by_name (abfd, sect_name);
2360   if (stabsect == NULL)
2361     {
2362       printf (_("No %s section present\n\n"), sect_name);
2363       return FALSE;
2364     }
2365
2366   size = bfd_section_size (abfd, stabsect);
2367   contents  = (char *) xmalloc (size);
2368
2369   if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2370     {
2371       non_fatal (_("Reading %s section of %s failed: %s"),
2372                  sect_name, bfd_get_filename (abfd),
2373                  bfd_errmsg (bfd_get_error ()));
2374       free (contents);
2375       exit_status = 1;
2376       return NULL;
2377     }
2378
2379   *size_ptr = size;
2380
2381   return contents;
2382 }
2383
2384 /* Stabs entries use a 12 byte format:
2385      4 byte string table index
2386      1 byte stab type
2387      1 byte stab other field
2388      2 byte stab desc field
2389      4 byte stab value
2390    FIXME: This will have to change for a 64 bit object format.  */
2391
2392 #define STRDXOFF  (0)
2393 #define TYPEOFF   (4)
2394 #define OTHEROFF  (5)
2395 #define DESCOFF   (6)
2396 #define VALOFF    (8)
2397 #define STABSIZE (12)
2398
2399 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2400    using string table section STRSECT_NAME (in `strtab').  */
2401
2402 static void
2403 print_section_stabs (bfd *abfd,
2404                      const char *stabsect_name,
2405                      unsigned *string_offset_ptr)
2406 {
2407   int i;
2408   unsigned file_string_table_offset = 0;
2409   unsigned next_file_string_table_offset = *string_offset_ptr;
2410   bfd_byte *stabp, *stabs_end;
2411
2412   stabp = stabs;
2413   stabs_end = stabp + stab_size;
2414
2415   printf (_("Contents of %s section:\n\n"), stabsect_name);
2416   printf ("Symnum n_type n_othr n_desc n_value  n_strx String\n");
2417
2418   /* Loop through all symbols and print them.
2419
2420      We start the index at -1 because there is a dummy symbol on
2421      the front of stabs-in-{coff,elf} sections that supplies sizes.  */
2422   for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2423     {
2424       const char *name;
2425       unsigned long strx;
2426       unsigned char type, other;
2427       unsigned short desc;
2428       bfd_vma value;
2429
2430       strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2431       type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2432       other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2433       desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2434       value = bfd_h_get_32 (abfd, stabp + VALOFF);
2435
2436       printf ("\n%-6d ", i);
2437       /* Either print the stab name, or, if unnamed, print its number
2438          again (makes consistent formatting for tools like awk).  */
2439       name = bfd_get_stab_name (type);
2440       if (name != NULL)
2441         printf ("%-6s", name);
2442       else if (type == N_UNDF)
2443         printf ("HdrSym");
2444       else
2445         printf ("%-6d", type);
2446       printf (" %-6d %-6d ", other, desc);
2447       bfd_printf_vma (abfd, value);
2448       printf (" %-6lu", strx);
2449
2450       /* Symbols with type == 0 (N_UNDF) specify the length of the
2451          string table associated with this file.  We use that info
2452          to know how to relocate the *next* file's string table indices.  */
2453       if (type == N_UNDF)
2454         {
2455           file_string_table_offset = next_file_string_table_offset;
2456           next_file_string_table_offset += value;
2457         }
2458       else
2459         {
2460           /* Using the (possibly updated) string table offset, print the
2461              string (if any) associated with this symbol.  */
2462           if ((strx + file_string_table_offset) < stabstr_size)
2463             printf (" %s", &strtab[strx + file_string_table_offset]);
2464           else
2465             printf (" *");
2466         }
2467     }
2468   printf ("\n\n");
2469   *string_offset_ptr = next_file_string_table_offset;
2470 }
2471
2472 typedef struct
2473 {
2474   const char * section_name;
2475   const char * string_section_name;
2476   unsigned string_offset;
2477 }
2478 stab_section_names;
2479
2480 static void
2481 find_stabs_section (bfd *abfd, asection *section, void *names)
2482 {
2483   int len;
2484   stab_section_names * sought = (stab_section_names *) names;
2485
2486   /* Check for section names for which stabsect_name is a prefix, to
2487      handle .stab.N, etc.  */
2488   len = strlen (sought->section_name);
2489
2490   /* If the prefix matches, and the files section name ends with a
2491      nul or a digit, then we match.  I.e., we want either an exact
2492      match or a section followed by a number.  */
2493   if (strncmp (sought->section_name, section->name, len) == 0
2494       && (section->name[len] == 0
2495           || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2496     {
2497       if (strtab == NULL)
2498         strtab = read_section_stabs (abfd, sought->string_section_name,
2499                                      &stabstr_size);
2500       
2501       if (strtab)
2502         {
2503           stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2504                                                    &stab_size);
2505           if (stabs)
2506             print_section_stabs (abfd, section->name, &sought->string_offset);
2507         }
2508     }
2509 }
2510
2511 static void
2512 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2513 {
2514   stab_section_names s;
2515
2516   s.section_name = stabsect_name;
2517   s.string_section_name = strsect_name;
2518   s.string_offset = 0;
2519
2520   bfd_map_over_sections (abfd, find_stabs_section, & s);
2521
2522   free (strtab);
2523   strtab = NULL;
2524 }
2525
2526 /* Dump the any sections containing stabs debugging information.  */
2527
2528 static void
2529 dump_stabs (bfd *abfd)
2530 {
2531   dump_stabs_section (abfd, ".stab", ".stabstr");
2532   dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2533   dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2534
2535   /* For Darwin.  */
2536   dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2537
2538   dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2539 }
2540 \f
2541 static void
2542 dump_bfd_header (bfd *abfd)
2543 {
2544   char *comma = "";
2545
2546   printf (_("architecture: %s, "),
2547           bfd_printable_arch_mach (bfd_get_arch (abfd),
2548                                    bfd_get_mach (abfd)));
2549   printf (_("flags 0x%08x:\n"), abfd->flags);
2550
2551 #define PF(x, y)    if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2552   PF (HAS_RELOC, "HAS_RELOC");
2553   PF (EXEC_P, "EXEC_P");
2554   PF (HAS_LINENO, "HAS_LINENO");
2555   PF (HAS_DEBUG, "HAS_DEBUG");
2556   PF (HAS_SYMS, "HAS_SYMS");
2557   PF (HAS_LOCALS, "HAS_LOCALS");
2558   PF (DYNAMIC, "DYNAMIC");
2559   PF (WP_TEXT, "WP_TEXT");
2560   PF (D_PAGED, "D_PAGED");
2561   PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2562   PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2563   printf (_("\nstart address 0x"));
2564   bfd_printf_vma (abfd, abfd->start_address);
2565   printf ("\n");
2566 }
2567
2568 \f
2569 static void
2570 dump_bfd_private_header (bfd *abfd)
2571 {
2572   bfd_print_private_bfd_data (abfd, stdout);
2573 }
2574
2575 \f
2576 /* Display a section in hexadecimal format with associated characters.
2577    Each line prefixed by the zero padded address.  */
2578
2579 static void
2580 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2581 {
2582   bfd_byte *data = 0;
2583   bfd_size_type datasize;
2584   bfd_size_type addr_offset;
2585   bfd_size_type start_offset;
2586   bfd_size_type stop_offset;
2587   unsigned int opb = bfd_octets_per_byte (abfd);
2588   /* Bytes per line.  */
2589   const int onaline = 16;
2590   char buf[64];
2591   int count;
2592   int width;
2593
2594   if ((section->flags & SEC_HAS_CONTENTS) == 0)
2595     return;
2596
2597   if (! process_section_p (section))
2598     return;
2599   
2600   if ((datasize = bfd_section_size (abfd, section)) == 0)
2601     return;
2602
2603   /* Compute the address range to display.  */
2604   if (start_address == (bfd_vma) -1
2605       || start_address < section->vma)
2606     start_offset = 0;
2607   else
2608     start_offset = start_address - section->vma;
2609
2610   if (stop_address == (bfd_vma) -1)
2611     stop_offset = datasize / opb;
2612   else
2613     {
2614       if (stop_address < section->vma)
2615         stop_offset = 0;
2616       else
2617         stop_offset = stop_address - section->vma;
2618
2619       if (stop_offset > datasize / opb)
2620         stop_offset = datasize / opb;
2621     }
2622
2623   if (start_offset >= stop_offset)
2624     return;
2625   
2626   printf (_("Contents of section %s:"), section->name);
2627   if (display_file_offsets)
2628     printf (_("  (Starting at file offset: 0x%lx)"),
2629             (unsigned long) (section->filepos + start_offset));
2630   printf ("\n");
2631
2632   data = (bfd_byte *) xmalloc (datasize);
2633
2634   bfd_get_section_contents (abfd, section, data, 0, datasize);
2635
2636   width = 4;
2637
2638   bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2639   if (strlen (buf) >= sizeof (buf))
2640     abort ();
2641
2642   count = 0;
2643   while (buf[count] == '0' && buf[count+1] != '\0')
2644     count++;
2645   count = strlen (buf) - count;
2646   if (count > width)
2647     width = count;
2648
2649   bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2650   if (strlen (buf) >= sizeof (buf))
2651     abort ();
2652
2653   count = 0;
2654   while (buf[count] == '0' && buf[count+1] != '\0')
2655     count++;
2656   count = strlen (buf) - count;
2657   if (count > width)
2658     width = count;
2659
2660   for (addr_offset = start_offset;
2661        addr_offset < stop_offset; addr_offset += onaline / opb)
2662     {
2663       bfd_size_type j;
2664
2665       bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2666       count = strlen (buf);
2667       if ((size_t) count >= sizeof (buf))
2668         abort ();
2669
2670       putchar (' ');
2671       while (count < width)
2672         {
2673           putchar ('0');
2674           count++;
2675         }
2676       fputs (buf + count - width, stdout);
2677       putchar (' ');
2678
2679       for (j = addr_offset * opb;
2680            j < addr_offset * opb + onaline; j++)
2681         {
2682           if (j < stop_offset * opb)
2683             printf ("%02x", (unsigned) (data[j]));
2684           else
2685             printf ("  ");
2686           if ((j & 3) == 3)
2687             printf (" ");
2688         }
2689
2690       printf (" ");
2691       for (j = addr_offset * opb;
2692            j < addr_offset * opb + onaline; j++)
2693         {
2694           if (j >= stop_offset * opb)
2695             printf (" ");
2696           else
2697             printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2698         }
2699       putchar ('\n');
2700     }
2701   free (data);
2702 }
2703
2704 /* Actually display the various requested regions.  */
2705
2706 static void
2707 dump_data (bfd *abfd)
2708 {
2709   bfd_map_over_sections (abfd, dump_section, NULL);
2710 }
2711
2712 /* Should perhaps share code and display with nm?  */
2713
2714 static void
2715 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2716 {
2717   asymbol **current;
2718   long max_count;
2719   long count;
2720
2721   if (dynamic)
2722     {
2723       current = dynsyms;
2724       max_count = dynsymcount;
2725       printf ("DYNAMIC SYMBOL TABLE:\n");
2726     }
2727   else
2728     {
2729       current = syms;
2730       max_count = symcount;
2731       printf ("SYMBOL TABLE:\n");
2732     }
2733
2734   if (max_count == 0)
2735     printf (_("no symbols\n"));
2736
2737   for (count = 0; count < max_count; count++)
2738     {
2739       bfd *cur_bfd;
2740
2741       if (*current == NULL)
2742         printf (_("no information for symbol number %ld\n"), count);
2743
2744       else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2745         printf (_("could not determine the type of symbol number %ld\n"),
2746                 count);
2747
2748       else if (process_section_p ((* current)->section)
2749                && (dump_special_syms
2750                    || !bfd_is_target_special_symbol (cur_bfd, *current)))
2751         {
2752           const char *name = (*current)->name;
2753
2754           if (do_demangle && name != NULL && *name != '\0')
2755             {
2756               char *alloc;
2757
2758               /* If we want to demangle the name, we demangle it
2759                  here, and temporarily clobber it while calling
2760                  bfd_print_symbol.  FIXME: This is a gross hack.  */
2761               alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2762               if (alloc != NULL)
2763                 (*current)->name = alloc;
2764               bfd_print_symbol (cur_bfd, stdout, *current,
2765                                 bfd_print_symbol_all);
2766               if (alloc != NULL)
2767                 {
2768                   (*current)->name = name;
2769                   free (alloc);
2770                 }
2771             }
2772           else
2773             bfd_print_symbol (cur_bfd, stdout, *current,
2774                               bfd_print_symbol_all);
2775           printf ("\n");
2776         }
2777
2778       current++;
2779     }
2780   printf ("\n\n");
2781 }
2782 \f
2783 static void
2784 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2785 {
2786   arelent **p;
2787   char *last_filename, *last_functionname;
2788   unsigned int last_line;
2789
2790   /* Get column headers lined up reasonably.  */
2791   {
2792     static int width;
2793
2794     if (width == 0)
2795       {
2796         char buf[30];
2797
2798         bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2799         width = strlen (buf) - 7;
2800       }
2801     printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2802   }
2803
2804   last_filename = NULL;
2805   last_functionname = NULL;
2806   last_line = 0;
2807
2808   for (p = relpp; relcount && *p != NULL; p++, relcount--)
2809     {
2810       arelent *q = *p;
2811       const char *filename, *functionname;
2812       unsigned int linenumber;
2813       const char *sym_name;
2814       const char *section_name;
2815
2816       if (start_address != (bfd_vma) -1
2817           && q->address < start_address)
2818         continue;
2819       if (stop_address != (bfd_vma) -1
2820           && q->address > stop_address)
2821         continue;
2822
2823       if (with_line_numbers
2824           && sec != NULL
2825           && bfd_find_nearest_line (abfd, sec, syms, q->address,
2826                                     &filename, &functionname, &linenumber))
2827         {
2828           if (functionname != NULL
2829               && (last_functionname == NULL
2830                   || strcmp (functionname, last_functionname) != 0))
2831             {
2832               printf ("%s():\n", functionname);
2833               if (last_functionname != NULL)
2834                 free (last_functionname);
2835               last_functionname = xstrdup (functionname);
2836             }
2837
2838           if (linenumber > 0
2839               && (linenumber != last_line
2840                   || (filename != NULL
2841                       && last_filename != NULL
2842                       && strcmp (filename, last_filename) != 0)))
2843             {
2844               printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
2845               last_line = linenumber;
2846               if (last_filename != NULL)
2847                 free (last_filename);
2848               if (filename == NULL)
2849                 last_filename = NULL;
2850               else
2851                 last_filename = xstrdup (filename);
2852             }
2853         }
2854
2855       if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2856         {
2857           sym_name = (*(q->sym_ptr_ptr))->name;
2858           section_name = (*(q->sym_ptr_ptr))->section->name;
2859         }
2860       else
2861         {
2862           sym_name = NULL;
2863           section_name = NULL;
2864         }
2865
2866       bfd_printf_vma (abfd, q->address);
2867       if (q->howto == NULL)
2868         printf (" *unknown*         ");
2869       else if (q->howto->name)
2870         printf (" %-16s  ", q->howto->name);
2871       else
2872         printf (" %-16d  ", q->howto->type);
2873
2874       if (sym_name)
2875         {
2876           objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
2877         }
2878       else
2879         {
2880           if (section_name == NULL)
2881             section_name = "*unknown*";
2882           printf ("[%s]", section_name);
2883         }
2884
2885       if (q->addend)
2886         {
2887           printf ("+0x");
2888           bfd_printf_vma (abfd, q->addend);
2889         }
2890
2891       printf ("\n");
2892     }
2893 }
2894
2895 static void
2896 dump_relocs_in_section (bfd *abfd,
2897                         asection *section,
2898                         void *dummy ATTRIBUTE_UNUSED)
2899 {
2900   arelent **relpp;
2901   long relcount;
2902   long relsize;
2903
2904   if (   bfd_is_abs_section (section)
2905       || bfd_is_und_section (section)
2906       || bfd_is_com_section (section)
2907       || (! process_section_p (section))
2908       || ((section->flags & SEC_RELOC) == 0))
2909     return;
2910
2911   relsize = bfd_get_reloc_upper_bound (abfd, section);
2912   if (relsize < 0)
2913     bfd_fatal (bfd_get_filename (abfd));
2914
2915   printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2916
2917   if (relsize == 0)
2918     {
2919       printf (" (none)\n\n");
2920       return;
2921     }
2922
2923   relpp = (arelent **) xmalloc (relsize);
2924   relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2925
2926   if (relcount < 0)
2927     bfd_fatal (bfd_get_filename (abfd));
2928   else if (relcount == 0)
2929     printf (" (none)\n\n");
2930   else
2931     {
2932       printf ("\n");
2933       dump_reloc_set (abfd, section, relpp, relcount);
2934       printf ("\n\n");
2935     }
2936   free (relpp);
2937 }
2938
2939 static void
2940 dump_relocs (bfd *abfd)
2941 {
2942   bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2943 }
2944
2945 static void
2946 dump_dynamic_relocs (bfd *abfd)
2947 {
2948   long relsize;
2949   arelent **relpp;
2950   long relcount;
2951
2952   relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2953   if (relsize < 0)
2954     bfd_fatal (bfd_get_filename (abfd));
2955
2956   printf ("DYNAMIC RELOCATION RECORDS");
2957
2958   if (relsize == 0)
2959     printf (" (none)\n\n");
2960   else
2961     {
2962       relpp = (arelent **) xmalloc (relsize);
2963       relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2964
2965       if (relcount < 0)
2966         bfd_fatal (bfd_get_filename (abfd));
2967       else if (relcount == 0)
2968         printf (" (none)\n\n");
2969       else
2970         {
2971           printf ("\n");
2972           dump_reloc_set (abfd, NULL, relpp, relcount);
2973           printf ("\n\n");
2974         }
2975       free (relpp);
2976     }
2977 }
2978
2979 /* Creates a table of paths, to search for source files.  */
2980
2981 static void
2982 add_include_path (const char *path)
2983 {
2984   if (path[0] == 0)
2985     return;
2986   include_path_count++;
2987   include_paths = (const char **)
2988       xrealloc (include_paths, include_path_count * sizeof (*include_paths));
2989 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2990   if (path[1] == ':' && path[2] == 0)
2991     path = concat (path, ".", (const char *) 0);
2992 #endif
2993   include_paths[include_path_count - 1] = path;
2994 }
2995
2996 static void
2997 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
2998                   asection *section,
2999                   void *arg)
3000 {
3001   if ((section->flags & SEC_DEBUGGING) == 0)
3002     {
3003       bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
3004       section->vma += adjust_section_vma;
3005       if (*has_reloc_p)
3006         section->lma += adjust_section_vma;
3007     }
3008 }
3009
3010 /* Dump selected contents of ABFD.  */
3011
3012 static void
3013 dump_bfd (bfd *abfd)
3014 {
3015   /* If we are adjusting section VMA's, change them all now.  Changing
3016      the BFD information is a hack.  However, we must do it, or
3017      bfd_find_nearest_line will not do the right thing.  */
3018   if (adjust_section_vma != 0)
3019     {
3020       bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3021       bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
3022     }
3023
3024   if (! dump_debugging_tags)
3025     printf (_("\n%s:     file format %s\n"), bfd_get_filename (abfd),
3026             abfd->xvec->name);
3027   if (dump_ar_hdrs)
3028     print_arelt_descr (stdout, abfd, TRUE);
3029   if (dump_file_header)
3030     dump_bfd_header (abfd);
3031   if (dump_private_headers)
3032     dump_bfd_private_header (abfd);
3033   if (! dump_debugging_tags)
3034     putchar ('\n');
3035   if (dump_section_headers)
3036     dump_headers (abfd);
3037
3038   if (dump_symtab
3039       || dump_reloc_info
3040       || disassemble
3041       || dump_debugging
3042       || dump_dwarf_section_info)
3043     syms = slurp_symtab (abfd);
3044   if (dump_dynamic_symtab || dump_dynamic_reloc_info
3045       || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
3046     dynsyms = slurp_dynamic_symtab (abfd);
3047   if (disassemble)
3048     {
3049       synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
3050                                              dynsymcount, dynsyms, &synthsyms);
3051       if (synthcount < 0)
3052         synthcount = 0;
3053     }
3054
3055   if (dump_symtab)
3056     dump_symbols (abfd, FALSE);
3057   if (dump_dynamic_symtab)
3058     dump_symbols (abfd, TRUE);
3059   if (dump_dwarf_section_info)
3060     dump_dwarf (abfd);
3061   if (dump_stab_section_info)
3062     dump_stabs (abfd);
3063   if (dump_reloc_info && ! disassemble)
3064     dump_relocs (abfd);
3065   if (dump_dynamic_reloc_info && ! disassemble)
3066     dump_dynamic_relocs (abfd);
3067   if (dump_section_contents)
3068     dump_data (abfd);
3069   if (disassemble)
3070     disassemble_data (abfd);
3071
3072   if (dump_debugging)
3073     {
3074       void *dhandle;
3075
3076       dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3077       if (dhandle != NULL)
3078         {
3079           if (!print_debugging_info (stdout, dhandle, abfd, syms,
3080                                      bfd_demangle,
3081                                      dump_debugging_tags ? TRUE : FALSE))
3082             {
3083               non_fatal (_("%s: printing debugging information failed"),
3084                          bfd_get_filename (abfd));
3085               exit_status = 1;
3086             }
3087         }
3088       /* PR 6483: If there was no STABS or IEEE debug
3089          info in the file, try DWARF instead.  */
3090       else if (! dump_dwarf_section_info)
3091         {
3092           dump_dwarf (abfd);
3093         }
3094     }
3095
3096   if (syms)
3097     {
3098       free (syms);
3099       syms = NULL;
3100     }
3101
3102   if (dynsyms)
3103     {
3104       free (dynsyms);
3105       dynsyms = NULL;
3106     }
3107
3108   if (synthsyms)
3109     {
3110       free (synthsyms);
3111       synthsyms = NULL;
3112     }
3113
3114   symcount = 0;
3115   dynsymcount = 0;
3116   synthcount = 0;
3117 }
3118
3119 static void
3120 display_bfd (bfd *abfd)
3121 {
3122   char **matching;
3123
3124   if (bfd_check_format_matches (abfd, bfd_object, &matching))
3125     {
3126       dump_bfd (abfd);
3127       return;
3128     }
3129
3130   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3131     {
3132       nonfatal (bfd_get_filename (abfd));
3133       list_matching_formats (matching);
3134       free (matching);
3135       return;
3136     }
3137
3138   if (bfd_get_error () != bfd_error_file_not_recognized)
3139     {
3140       nonfatal (bfd_get_filename (abfd));
3141       return;
3142     }
3143
3144   if (bfd_check_format_matches (abfd, bfd_core, &matching))
3145     {
3146       dump_bfd (abfd);
3147       return;
3148     }
3149
3150   nonfatal (bfd_get_filename (abfd));
3151
3152   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3153     {
3154       list_matching_formats (matching);
3155       free (matching);
3156     }
3157 }
3158
3159 static void
3160 display_file (char *filename, char *target)
3161 {
3162   bfd *file;
3163   bfd *arfile = NULL;
3164
3165   if (get_file_size (filename) < 1)
3166     {
3167       exit_status = 1;
3168       return;
3169     }
3170
3171   file = bfd_openr (filename, target);
3172   if (file == NULL)
3173     {
3174       nonfatal (filename);
3175       return;
3176     }
3177
3178   /* If the file is an archive, process all of its elements.  */
3179   if (bfd_check_format (file, bfd_archive))
3180     {
3181       bfd *last_arfile = NULL;
3182
3183       printf (_("In archive %s:\n"), bfd_get_filename (file));
3184       for (;;)
3185         {
3186           bfd_set_error (bfd_error_no_error);
3187
3188           arfile = bfd_openr_next_archived_file (file, arfile);
3189           if (arfile == NULL)
3190             {
3191               if (bfd_get_error () != bfd_error_no_more_archived_files)
3192                 nonfatal (bfd_get_filename (file));
3193               break;
3194             }
3195
3196           display_bfd (arfile);
3197
3198           if (last_arfile != NULL)
3199             bfd_close (last_arfile);
3200           last_arfile = arfile;
3201         }
3202
3203       if (last_arfile != NULL)
3204         bfd_close (last_arfile);
3205     }
3206   else
3207     display_bfd (file);
3208
3209   bfd_close (file);
3210 }
3211 \f
3212 int
3213 main (int argc, char **argv)
3214 {
3215   int c;
3216   char *target = default_target;
3217   bfd_boolean seenflag = FALSE;
3218
3219 #if defined (HAVE_SETLOCALE)
3220 #if defined (HAVE_LC_MESSAGES)
3221   setlocale (LC_MESSAGES, "");
3222 #endif
3223   setlocale (LC_CTYPE, "");
3224 #endif
3225
3226   bindtextdomain (PACKAGE, LOCALEDIR);
3227   textdomain (PACKAGE);
3228
3229   program_name = *argv;
3230   xmalloc_set_program_name (program_name);
3231
3232   START_PROGRESS (program_name, 0);
3233
3234   expandargv (&argc, &argv);
3235
3236   bfd_init ();
3237   set_default_bfd_target ();
3238
3239   while ((c = getopt_long (argc, argv,
3240                            "pib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
3241                            long_options, (int *) 0))
3242          != EOF)
3243     {
3244       switch (c)
3245         {
3246         case 0:
3247           break;                /* We've been given a long option.  */
3248         case 'm':
3249           machine = optarg;
3250           break;
3251         case 'M':
3252           if (disassembler_options)
3253             /* Ignore potential memory leak for now.  */
3254             disassembler_options = concat (disassembler_options, ",",
3255                                            optarg, (const char *) NULL);
3256           else
3257             disassembler_options = optarg;
3258           break;
3259         case 'j':
3260           add_only (optarg);
3261           break;
3262         case 'F':
3263           display_file_offsets = TRUE;
3264           break;
3265         case 'l':
3266           with_line_numbers = TRUE;
3267           break;
3268         case 'b':
3269           target = optarg;
3270           break;
3271         case 'C':
3272           do_demangle = TRUE;
3273           if (optarg != NULL)
3274             {
3275               enum demangling_styles style;
3276
3277               style = cplus_demangle_name_to_style (optarg);
3278               if (style == unknown_demangling)
3279                 fatal (_("unknown demangling style `%s'"),
3280                        optarg);
3281
3282               cplus_demangle_set_style (style);
3283             }
3284           break;
3285         case 'w':
3286           wide_output = TRUE;
3287           break;
3288         case OPTION_ADJUST_VMA:
3289           adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3290           break;
3291         case OPTION_START_ADDRESS:
3292           start_address = parse_vma (optarg, "--start-address");
3293           if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3294             fatal (_("error: the start address should be before the end address"));
3295           break;
3296         case OPTION_STOP_ADDRESS:
3297           stop_address = parse_vma (optarg, "--stop-address");
3298           if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3299             fatal (_("error: the stop address should be after the start address"));
3300           break;
3301         case OPTION_PREFIX:
3302           prefix = optarg;
3303           prefix_length = strlen (prefix);
3304           /* Remove an unnecessary trailing '/' */
3305           while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
3306             prefix_length--;
3307           break;
3308         case OPTION_PREFIX_STRIP:
3309           prefix_strip = atoi (optarg);
3310           if (prefix_strip < 0)
3311             fatal (_("error: prefix strip must be non-negative"));
3312           break;
3313         case OPTION_INSN_WIDTH:
3314           insn_width = strtoul (optarg, NULL, 0);
3315           if (insn_width <= 0)
3316             fatal (_("error: instruction width must be positive"));
3317           break;
3318         case 'E':
3319           if (strcmp (optarg, "B") == 0)
3320             endian = BFD_ENDIAN_BIG;
3321           else if (strcmp (optarg, "L") == 0)
3322             endian = BFD_ENDIAN_LITTLE;
3323           else
3324             {
3325               non_fatal (_("unrecognized -E option"));
3326               usage (stderr, 1);
3327             }
3328           break;
3329         case OPTION_ENDIAN:
3330           if (strncmp (optarg, "big", strlen (optarg)) == 0)
3331             endian = BFD_ENDIAN_BIG;
3332           else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3333             endian = BFD_ENDIAN_LITTLE;
3334           else
3335             {
3336               non_fatal (_("unrecognized --endian type `%s'"), optarg);
3337               usage (stderr, 1);
3338             }
3339           break;
3340
3341         case 'f':
3342           dump_file_header = TRUE;
3343           seenflag = TRUE;
3344           break;
3345         case 'i':
3346           formats_info = TRUE;
3347           seenflag = TRUE;
3348           break;
3349         case 'I':
3350           add_include_path (optarg);
3351           break;
3352         case 'p':
3353           dump_private_headers = TRUE;
3354           seenflag = TRUE;
3355           break;
3356         case 'x':
3357           dump_private_headers = TRUE;
3358           dump_symtab = TRUE;
3359           dump_reloc_info = TRUE;
3360           dump_file_header = TRUE;
3361           dump_ar_hdrs = TRUE;
3362           dump_section_headers = TRUE;
3363           seenflag = TRUE;
3364           break;
3365         case 't':
3366           dump_symtab = TRUE;
3367           seenflag = TRUE;
3368           break;
3369         case 'T':
3370           dump_dynamic_symtab = TRUE;
3371           seenflag = TRUE;
3372           break;
3373         case 'd':
3374           disassemble = TRUE;
3375           seenflag = TRUE;
3376           break;
3377         case 'z':
3378           disassemble_zeroes = TRUE;
3379           break;
3380         case 'D':
3381           disassemble = TRUE;
3382           disassemble_all = TRUE;
3383           seenflag = TRUE;
3384           break;
3385         case 'S':
3386           disassemble = TRUE;
3387           with_source_code = TRUE;
3388           seenflag = TRUE;
3389           break;
3390         case 'g':
3391           dump_debugging = 1;
3392           seenflag = TRUE;
3393           break;
3394         case 'e':
3395           dump_debugging = 1;
3396           dump_debugging_tags = 1;
3397           do_demangle = TRUE;
3398           seenflag = TRUE;
3399           break;
3400         case 'W':
3401           dump_dwarf_section_info = TRUE;
3402           seenflag = TRUE;
3403           if (optarg)
3404             dwarf_select_sections_by_letters (optarg);
3405           else
3406             dwarf_select_sections_all ();
3407           break;
3408         case OPTION_DWARF:
3409           dump_dwarf_section_info = TRUE;
3410           seenflag = TRUE;
3411           if (optarg)
3412             dwarf_select_sections_by_names (optarg);
3413           else
3414             dwarf_select_sections_all ();
3415           break;
3416         case 'G':
3417           dump_stab_section_info = TRUE;
3418           seenflag = TRUE;
3419           break;
3420         case 's':
3421           dump_section_contents = TRUE;
3422           seenflag = TRUE;
3423           break;
3424         case 'r':
3425           dump_reloc_info = TRUE;
3426           seenflag = TRUE;
3427           break;
3428         case 'R':
3429           dump_dynamic_reloc_info = TRUE;
3430           seenflag = TRUE;
3431           break;
3432         case 'a':
3433           dump_ar_hdrs = TRUE;
3434           seenflag = TRUE;
3435           break;
3436         case 'h':
3437           dump_section_headers = TRUE;
3438           seenflag = TRUE;
3439           break;
3440         case 'H':
3441           usage (stdout, 0);
3442           seenflag = TRUE;
3443         case 'v':
3444         case 'V':
3445           show_version = TRUE;
3446           seenflag = TRUE;
3447           break;
3448
3449         default:
3450           usage (stderr, 1);
3451         }
3452     }
3453
3454   if (show_version)
3455     print_version ("objdump");
3456
3457   if (!seenflag)
3458     usage (stderr, 2);
3459
3460   if (formats_info)
3461     exit_status = display_info ();
3462   else
3463     {
3464       if (optind == argc)
3465         display_file ("a.out", target);
3466       else
3467         for (; optind < argc;)
3468           display_file (argv[optind++], target);
3469     }
3470
3471   free_only_list ();
3472
3473   END_PROGRESS (program_name);
3474
3475   return exit_status;
3476 }