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