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