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