Prevent an attempt to allocate an excessive amount of memory when dumping the symbols...
[external/binutils.git] / binutils / objdump.c
1 /* objdump.c -- dump information about an object file.
2    Copyright (C) 1990-2019 Free Software Foundation, Inc.
3
4    This file is part of GNU Binutils.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21
22 /* Objdump overview.
23
24    Objdump displays information about one or more object files, either on
25    their own, or inside libraries.  It is commonly used as a disassembler,
26    but it can also display information about file headers, symbol tables,
27    relocations, debugging directives and more.
28
29    The flow of execution is as follows:
30
31    1. Command line arguments are checked for control switches and the
32       information to be displayed is selected.
33
34    2. Any remaining arguments are assumed to be object files, and they are
35       processed in order by display_bfd().  If the file is an archive each
36       of its elements is processed in turn.
37
38    3. The file's target architecture and binary file format are determined
39       by bfd_check_format().  If they are recognised, then dump_bfd() is
40       called.
41
42    4. dump_bfd() in turn calls separate functions to display the requested
43       item(s) of information(s).  For example disassemble_data() is called if
44       a disassembly has been requested.
45
46    When disassembling the code loops through blocks of instructions bounded
47    by symbols, calling disassemble_bytes() on each block.  The actual
48    disassembling is done by the libopcodes library, via a function pointer
49    supplied by the disassembler() function.  */
50
51 #include "sysdep.h"
52 #include "bfd.h"
53 #include "elf-bfd.h"
54 #include "coff-bfd.h"
55 #include "progress.h"
56 #include "bucomm.h"
57 #include "elfcomm.h"
58 #include "dwarf.h"
59 #include "ctf-api.h"
60 #include "getopt.h"
61 #include "safe-ctype.h"
62 #include "dis-asm.h"
63 #include "libiberty.h"
64 #include "demangle.h"
65 #include "filenames.h"
66 #include "debug.h"
67 #include "budbg.h"
68 #include "objdump.h"
69
70 #ifdef HAVE_MMAP
71 #include <sys/mman.h>
72 #endif
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 char *dump_private_options;      /* -P */
96 static int prefix_addresses;            /* --prefix-addresses */
97 static int with_line_numbers;           /* -l */
98 static bfd_boolean with_source_code;    /* -S */
99 static int show_raw_insn;               /* --show-raw-insn */
100 static int dump_dwarf_section_info;     /* --dwarf */
101 static int dump_stab_section_info;      /* --stabs */
102 static int dump_ctf_section_info;       /* --ctf */
103 static char *dump_ctf_section_name;
104 static char *dump_ctf_parent_name;      /* --ctf-parent */
105 static int do_demangle;                 /* -C, --demangle */
106 static bfd_boolean disassemble;         /* -d */
107 static bfd_boolean disassemble_all;     /* -D */
108 static int disassemble_zeroes;          /* --disassemble-zeroes */
109 static bfd_boolean formats_info;        /* -i */
110 static int wide_output;                 /* -w */
111 static int insn_width;                  /* --insn-width */
112 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
113 static bfd_vma stop_address = (bfd_vma) -1;  /* --stop-address */
114 static int dump_debugging;              /* --debugging */
115 static int dump_debugging_tags;         /* --debugging-tags */
116 static int suppress_bfd_header;
117 static int dump_special_syms = 0;       /* --special-syms */
118 static bfd_vma adjust_section_vma = 0;  /* --adjust-vma */
119 static int file_start_context = 0;      /* --file-start-context */
120 static bfd_boolean display_file_offsets;/* -F */
121 static const char *prefix;              /* --prefix */
122 static int prefix_strip;                /* --prefix-strip */
123 static size_t prefix_length;
124 static bfd_boolean unwind_inlines;      /* --inlines.  */
125 static const char * disasm_sym;         /* Disassembly start symbol.  */
126
127 static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
128
129 /* A structure to record the sections mentioned in -j switches.  */
130 struct only
131 {
132   const char * name; /* The name of the section.  */
133   bfd_boolean  seen; /* A flag to indicate that the section has been found in one or more input files.  */
134   struct only * next; /* Pointer to the next structure in the list.  */
135 };
136 /* Pointer to an array of 'only' structures.
137    This pointer is NULL if the -j switch has not been used.  */
138 static struct only * only_list = NULL;
139
140 /* Variables for handling include file path table.  */
141 static const char **include_paths;
142 static int include_path_count;
143
144 /* Extra info to pass to the section disassembler and address printing
145    function.  */
146 struct objdump_disasm_info
147 {
148   bfd *              abfd;
149   asection *         sec;
150   bfd_boolean        require_sec;
151   arelent **         dynrelbuf;
152   long               dynrelcount;
153   disassembler_ftype disassemble_fn;
154   arelent *          reloc;
155   const char *       symbol;
156 };
157
158 /* Architecture to disassemble for, or default if NULL.  */
159 static char *machine = NULL;
160
161 /* Target specific options to the disassembler.  */
162 static char *disassembler_options = NULL;
163
164 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN.  */
165 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
166
167 /* The symbol table.  */
168 static asymbol **syms;
169
170 /* Number of symbols in `syms'.  */
171 static long symcount = 0;
172
173 /* The sorted symbol table.  */
174 static asymbol **sorted_syms;
175
176 /* Number of symbols in `sorted_syms'.  */
177 static long sorted_symcount = 0;
178
179 /* The dynamic symbol table.  */
180 static asymbol **dynsyms;
181
182 /* The synthetic symbol table.  */
183 static asymbol *synthsyms;
184 static long synthcount = 0;
185
186 /* Number of symbols in `dynsyms'.  */
187 static long dynsymcount = 0;
188
189 static bfd_byte *stabs;
190 static bfd_size_type stab_size;
191
192 static bfd_byte *strtab;
193 static bfd_size_type stabstr_size;
194
195 static bfd_boolean is_relocatable = FALSE;
196
197 /* Handlers for -P/--private.  */
198 static const struct objdump_private_desc * const objdump_private_vectors[] =
199   {
200     OBJDUMP_PRIVATE_VECTORS
201     NULL
202   };
203 \f
204 static void usage (FILE *, int) ATTRIBUTE_NORETURN;
205 static void
206 usage (FILE *stream, int status)
207 {
208   fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
209   fprintf (stream, _(" Display information from object <file(s)>.\n"));
210   fprintf (stream, _(" At least one of the following switches must be given:\n"));
211   fprintf (stream, _("\
212   -a, --archive-headers    Display archive header information\n\
213   -f, --file-headers       Display the contents of the overall file header\n\
214   -p, --private-headers    Display object format specific file header contents\n\
215   -P, --private=OPT,OPT... Display object format specific contents\n\
216   -h, --[section-]headers  Display the contents of the section headers\n\
217   -x, --all-headers        Display the contents of all headers\n\
218   -d, --disassemble        Display assembler contents of executable sections\n\
219   -D, --disassemble-all    Display assembler contents of all sections\n\
220       --disassemble=<sym>  Display assembler contents from <sym>\n\
221   -S, --source             Intermix source code with disassembly\n\
222   -s, --full-contents      Display the full contents of all sections requested\n\
223   -g, --debugging          Display debug information in object file\n\
224   -e, --debugging-tags     Display debug information using ctags style\n\
225   -G, --stabs              Display (in raw form) any STABS info in the file\n\
226   -W[lLiaprmfFsoRtUuTgAckK] or\n\
227   --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
228           =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
229           =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
230           =addr,=cu_index,=links,=follow-links]\n\
231                            Display DWARF info in the file\n\
232   --ctf=SECTION            Display CTF info from SECTION\n\
233   -t, --syms               Display the contents of the symbol table(s)\n\
234   -T, --dynamic-syms       Display the contents of the dynamic symbol table\n\
235   -r, --reloc              Display the relocation entries in the file\n\
236   -R, --dynamic-reloc      Display the dynamic relocation entries in the file\n\
237   @<file>                  Read options from <file>\n\
238   -v, --version            Display this program's version number\n\
239   -i, --info               List object formats and architectures supported\n\
240   -H, --help               Display this information\n\
241 "));
242   if (status != 2)
243     {
244       const struct objdump_private_desc * const *desc;
245
246       fprintf (stream, _("\n The following switches are optional:\n"));
247       fprintf (stream, _("\
248   -b, --target=BFDNAME           Specify the target object format as BFDNAME\n\
249   -m, --architecture=MACHINE     Specify the target architecture as MACHINE\n\
250   -j, --section=NAME             Only display information for section NAME\n\
251   -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
252   -EB --endian=big               Assume big endian format when disassembling\n\
253   -EL --endian=little            Assume little endian format when disassembling\n\
254       --file-start-context       Include context from start of file (with -S)\n\
255   -I, --include=DIR              Add DIR to search list for source files\n\
256   -l, --line-numbers             Include line numbers and filenames in output\n\
257   -F, --file-offsets             Include file offsets when displaying information\n\
258   -C, --demangle[=STYLE]         Decode mangled/processed symbol names\n\
259                                   The STYLE, if specified, can be `auto', `gnu',\n\
260                                   `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
261                                   or `gnat'\n\
262       --recurse-limit            Enable a limit on recursion whilst demangling.  [Default]\n\
263       --no-recurse-limit         Disable a limit on recursion whilst demangling\n\
264   -w, --wide                     Format output for more than 80 columns\n\
265   -z, --disassemble-zeroes       Do not skip blocks of zeroes when disassembling\n\
266       --start-address=ADDR       Only process data whose address is >= ADDR\n\
267       --stop-address=ADDR        Only process data whose address is <= ADDR\n\
268       --prefix-addresses         Print complete address alongside disassembly\n\
269       --[no-]show-raw-insn       Display hex alongside symbolic disassembly\n\
270       --insn-width=WIDTH         Display WIDTH bytes on a single line for -d\n\
271       --adjust-vma=OFFSET        Add OFFSET to all displayed section addresses\n\
272       --special-syms             Include special symbols in symbol dumps\n\
273       --inlines                  Print all inlines for source line (with -l)\n\
274       --prefix=PREFIX            Add PREFIX to absolute paths for -S\n\
275       --prefix-strip=LEVEL       Strip initial directory names for -S\n"));
276       fprintf (stream, _("\
277       --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
278       --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
279                              or deeper\n\
280       --dwarf-check          Make additional dwarf internal consistency checks.\
281       \n\
282       --ctf-parent=SECTION     Use SECTION as the CTF parent\n\n"));
283       list_supported_targets (program_name, stream);
284       list_supported_architectures (program_name, stream);
285
286       disassembler_usage (stream);
287
288       if (objdump_private_vectors[0] != NULL)
289         {
290           fprintf (stream,
291                    _("\nOptions supported for -P/--private switch:\n"));
292           for (desc = objdump_private_vectors; *desc != NULL; desc++)
293             (*desc)->help (stream);
294         }
295     }
296   if (REPORT_BUGS_TO[0] && status == 0)
297     fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
298   exit (status);
299 }
300
301 /* 150 isn't special; it's just an arbitrary non-ASCII char value.  */
302 enum option_values
303   {
304     OPTION_ENDIAN=150,
305     OPTION_START_ADDRESS,
306     OPTION_STOP_ADDRESS,
307     OPTION_DWARF,
308     OPTION_PREFIX,
309     OPTION_PREFIX_STRIP,
310     OPTION_INSN_WIDTH,
311     OPTION_ADJUST_VMA,
312     OPTION_DWARF_DEPTH,
313     OPTION_DWARF_CHECK,
314     OPTION_DWARF_START,
315     OPTION_RECURSE_LIMIT,
316     OPTION_NO_RECURSE_LIMIT,
317     OPTION_INLINES,
318     OPTION_CTF,
319     OPTION_CTF_PARENT
320   };
321
322 static struct option long_options[]=
323 {
324   {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
325   {"all-headers", no_argument, NULL, 'x'},
326   {"private-headers", no_argument, NULL, 'p'},
327   {"private", required_argument, NULL, 'P'},
328   {"architecture", required_argument, NULL, 'm'},
329   {"archive-headers", no_argument, NULL, 'a'},
330   {"debugging", no_argument, NULL, 'g'},
331   {"debugging-tags", no_argument, NULL, 'e'},
332   {"demangle", optional_argument, NULL, 'C'},
333   {"disassemble", optional_argument, NULL, 'd'},
334   {"disassemble-all", no_argument, NULL, 'D'},
335   {"disassembler-options", required_argument, NULL, 'M'},
336   {"disassemble-zeroes", no_argument, NULL, 'z'},
337   {"dynamic-reloc", no_argument, NULL, 'R'},
338   {"dynamic-syms", no_argument, NULL, 'T'},
339   {"endian", required_argument, NULL, OPTION_ENDIAN},
340   {"file-headers", no_argument, NULL, 'f'},
341   {"file-offsets", no_argument, NULL, 'F'},
342   {"file-start-context", no_argument, &file_start_context, 1},
343   {"full-contents", no_argument, NULL, 's'},
344   {"headers", no_argument, NULL, 'h'},
345   {"help", no_argument, NULL, 'H'},
346   {"info", no_argument, NULL, 'i'},
347   {"line-numbers", no_argument, NULL, 'l'},
348   {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
349   {"prefix-addresses", no_argument, &prefix_addresses, 1},
350   {"recurse-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
351   {"recursion-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
352   {"no-recurse-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
353   {"no-recursion-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
354   {"reloc", no_argument, NULL, 'r'},
355   {"section", required_argument, NULL, 'j'},
356   {"section-headers", no_argument, NULL, 'h'},
357   {"show-raw-insn", no_argument, &show_raw_insn, 1},
358   {"source", no_argument, NULL, 'S'},
359   {"special-syms", no_argument, &dump_special_syms, 1},
360   {"include", required_argument, NULL, 'I'},
361   {"dwarf", optional_argument, NULL, OPTION_DWARF},
362   {"ctf", required_argument, NULL, OPTION_CTF},
363   {"ctf-parent", required_argument, NULL, OPTION_CTF_PARENT},
364   {"stabs", no_argument, NULL, 'G'},
365   {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
366   {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
367   {"syms", no_argument, NULL, 't'},
368   {"target", required_argument, NULL, 'b'},
369   {"version", no_argument, NULL, 'V'},
370   {"wide", no_argument, NULL, 'w'},
371   {"prefix", required_argument, NULL, OPTION_PREFIX},
372   {"prefix-strip", required_argument, NULL, OPTION_PREFIX_STRIP},
373   {"insn-width", required_argument, NULL, OPTION_INSN_WIDTH},
374   {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
375   {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
376   {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
377   {"inlines", no_argument, 0, OPTION_INLINES},
378   {0, no_argument, 0, 0}
379 };
380 \f
381 static void
382 nonfatal (const char *msg)
383 {
384   bfd_nonfatal (msg);
385   exit_status = 1;
386 }
387
388 /* Returns a version of IN with any control characters
389    replaced by escape sequences.  Uses a static buffer
390    if necessary.  */
391
392 static const char *
393 sanitize_string (const char * in)
394 {
395   static char *  buffer = NULL;
396   static size_t  buffer_len = 0;
397   const char *   original = in;
398   char *         out;
399
400   /* Paranoia.  */
401   if (in == NULL)
402     return "";
403
404   /* See if any conversion is necessary.  In the majority
405      of cases it will not be needed.  */
406   do
407     {
408       char c = *in++;
409
410       if (c == 0)
411         return original;
412
413       if (ISCNTRL (c))
414         break;
415     }
416   while (1);
417
418   /* Copy the input, translating as needed.  */
419   in = original;
420   if (buffer_len < (strlen (in) * 2))
421     {
422       free ((void *) buffer);
423       buffer_len = strlen (in) * 2;
424       buffer = xmalloc (buffer_len + 1);
425     }
426
427   out = buffer;
428   do
429     {
430       char c = *in++;
431
432       if (c == 0)
433         break;
434
435       if (!ISCNTRL (c))
436         *out++ = c;
437       else
438         {
439           *out++ = '^';
440           *out++ = c + 0x40;
441         }
442     }
443   while (1);
444
445   *out = 0;
446   return buffer;
447 }
448
449 \f
450 /* Returns TRUE if the specified section should be dumped.  */
451
452 static bfd_boolean
453 process_section_p (asection * section)
454 {
455   struct only * only;
456
457   if (only_list == NULL)
458     return TRUE;
459
460   for (only = only_list; only; only = only->next)
461     if (strcmp (only->name, section->name) == 0)
462       {
463         only->seen = TRUE;
464         return TRUE;
465       }
466
467   return FALSE;
468 }
469
470 /* Add an entry to the 'only' list.  */
471
472 static void
473 add_only (char * name)
474 {
475   struct only * only;
476
477   /* First check to make sure that we do not
478      already have an entry for this name.  */
479   for (only = only_list; only; only = only->next)
480     if (strcmp (only->name, name) == 0)
481       return;
482
483   only = xmalloc (sizeof * only);
484   only->name = name;
485   only->seen = FALSE;
486   only->next = only_list;
487   only_list = only;
488 }
489
490 /* Release the memory used by the 'only' list.
491    PR 11225: Issue a warning message for unseen sections.
492    Only do this if none of the sections were seen.  This is mainly to support
493    tools like the GAS testsuite where an object file is dumped with a list of
494    generic section names known to be present in a range of different file
495    formats.  */
496
497 static void
498 free_only_list (void)
499 {
500   bfd_boolean at_least_one_seen = FALSE;
501   struct only * only;
502   struct only * next;
503
504   if (only_list == NULL)
505     return;
506
507   for (only = only_list; only; only = only->next)
508     if (only->seen)
509       {
510         at_least_one_seen = TRUE;
511         break;
512       }
513
514   for (only = only_list; only; only = next)
515     {
516       if (! at_least_one_seen)
517         {
518           non_fatal (_("section '%s' mentioned in a -j option, "
519                        "but not found in any input file"),
520                      only->name);
521           exit_status = 1;
522         }
523       next = only->next;
524       free (only);
525     }
526 }
527
528 \f
529 static void
530 dump_section_header (bfd *abfd, asection *section, void *data)
531 {
532   char *comma = "";
533   unsigned int opb = bfd_octets_per_byte (abfd);
534   int longest_section_name = *((int *) data);
535
536   /* Ignore linker created section.  See elfNN_ia64_object_p in
537      bfd/elfxx-ia64.c.  */
538   if (section->flags & SEC_LINKER_CREATED)
539     return;
540
541   /* PR 10413: Skip sections that we are ignoring.  */
542   if (! process_section_p (section))
543     return;
544
545   printf ("%3d %-*s %08lx  ", section->index, longest_section_name,
546           sanitize_string (bfd_get_section_name (abfd, section)),
547           (unsigned long) bfd_section_size (abfd, section) / opb);
548   bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
549   printf ("  ");
550   bfd_printf_vma (abfd, section->lma);
551   printf ("  %08lx  2**%u", (unsigned long) section->filepos,
552           bfd_get_section_alignment (abfd, section));
553   if (! wide_output)
554     printf ("\n                ");
555   printf ("  ");
556
557 #define PF(x, y) \
558   if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
559
560   PF (SEC_HAS_CONTENTS, "CONTENTS");
561   PF (SEC_ALLOC, "ALLOC");
562   PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
563   PF (SEC_LOAD, "LOAD");
564   PF (SEC_RELOC, "RELOC");
565   PF (SEC_READONLY, "READONLY");
566   PF (SEC_CODE, "CODE");
567   PF (SEC_DATA, "DATA");
568   PF (SEC_ROM, "ROM");
569   PF (SEC_DEBUGGING, "DEBUGGING");
570   PF (SEC_NEVER_LOAD, "NEVER_LOAD");
571   PF (SEC_EXCLUDE, "EXCLUDE");
572   PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
573   if (bfd_get_arch (abfd) == bfd_arch_tic54x)
574     {
575       PF (SEC_TIC54X_BLOCK, "BLOCK");
576       PF (SEC_TIC54X_CLINK, "CLINK");
577     }
578   PF (SEC_SMALL_DATA, "SMALL_DATA");
579   if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
580     {
581       PF (SEC_COFF_SHARED, "SHARED");
582       PF (SEC_COFF_NOREAD, "NOREAD");
583     }
584   else if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
585     PF (SEC_ELF_PURECODE, "PURECODE");
586   PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
587   PF (SEC_GROUP, "GROUP");
588   if (bfd_get_arch (abfd) == bfd_arch_mep)
589     {
590       PF (SEC_MEP_VLIW, "VLIW");
591     }
592
593   if ((section->flags & SEC_LINK_ONCE) != 0)
594     {
595       const char *ls;
596       struct coff_comdat_info *comdat;
597
598       switch (section->flags & SEC_LINK_DUPLICATES)
599         {
600         default:
601           abort ();
602         case SEC_LINK_DUPLICATES_DISCARD:
603           ls = "LINK_ONCE_DISCARD";
604           break;
605         case SEC_LINK_DUPLICATES_ONE_ONLY:
606           ls = "LINK_ONCE_ONE_ONLY";
607           break;
608         case SEC_LINK_DUPLICATES_SAME_SIZE:
609           ls = "LINK_ONCE_SAME_SIZE";
610           break;
611         case SEC_LINK_DUPLICATES_SAME_CONTENTS:
612           ls = "LINK_ONCE_SAME_CONTENTS";
613           break;
614         }
615       printf ("%s%s", comma, ls);
616
617       comdat = bfd_coff_get_comdat_section (abfd, section);
618       if (comdat != NULL)
619         printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
620
621       comma = ", ";
622     }
623
624   printf ("\n");
625 #undef PF
626 }
627
628 /* Called on each SECTION in ABFD, update the int variable pointed to by
629    DATA which contains the string length of the longest section name.  */
630
631 static void
632 find_longest_section_name (bfd *abfd, asection *section, void *data)
633 {
634   int *longest_so_far = (int *) data;
635   const char *name;
636   int len;
637
638   /* Ignore linker created section.  */
639   if (section->flags & SEC_LINKER_CREATED)
640     return;
641
642   /* Skip sections that we are ignoring.  */
643   if (! process_section_p (section))
644     return;
645
646   name = bfd_get_section_name (abfd, section);
647   len = (int) strlen (name);
648   if (len > *longest_so_far)
649     *longest_so_far = len;
650 }
651
652 static void
653 dump_headers (bfd *abfd)
654 {
655   /* The default width of 13 is just an arbitrary choice.  */
656   int max_section_name_length = 13;
657   int bfd_vma_width;
658
659 #ifndef BFD64
660   bfd_vma_width = 10;
661 #else
662   /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses.  */
663   if (bfd_get_arch_size (abfd) == 32)
664     bfd_vma_width = 10;
665   else
666     bfd_vma_width = 18;
667 #endif
668
669   printf (_("Sections:\n"));
670
671   if (wide_output)
672     bfd_map_over_sections (abfd, find_longest_section_name,
673                            &max_section_name_length);
674
675   printf (_("Idx %-*s Size      %-*s%-*sFile off  Algn"),
676           max_section_name_length, "Name",
677           bfd_vma_width, "VMA",
678           bfd_vma_width, "LMA");
679
680   if (wide_output)
681     printf (_("  Flags"));
682   printf ("\n");
683
684   bfd_map_over_sections (abfd, dump_section_header,
685                          &max_section_name_length);
686 }
687 \f
688 static asymbol **
689 slurp_symtab (bfd *abfd)
690 {
691   asymbol **sy = NULL;
692   long storage;
693
694   if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
695     {
696       symcount = 0;
697       return NULL;
698     }
699
700   storage = bfd_get_symtab_upper_bound (abfd);
701   if (storage < 0)
702     {
703       non_fatal (_("failed to read symbol table from: %s"), bfd_get_filename (abfd));
704       bfd_fatal (_("error message was"));
705     }
706   if (storage)
707     {
708       off_t filesize = bfd_get_file_size (abfd);
709
710       /* qv PR 24707.  */
711       if (filesize > 0 && filesize < storage)
712         {
713           bfd_nonfatal_message (bfd_get_filename (abfd), abfd, NULL,
714                                 _("error: symbol table size (%#lx) is larger than filesize (%#lx)"),
715                         storage, (long) filesize);
716           exit_status = 1;
717           symcount = 0;
718           return NULL;
719         }
720
721       sy = (asymbol **) xmalloc (storage);
722     }
723
724   symcount = bfd_canonicalize_symtab (abfd, sy);
725   if (symcount < 0)
726     bfd_fatal (bfd_get_filename (abfd));
727   return sy;
728 }
729
730 /* Read in the dynamic symbols.  */
731
732 static asymbol **
733 slurp_dynamic_symtab (bfd *abfd)
734 {
735   asymbol **sy = NULL;
736   long storage;
737
738   storage = bfd_get_dynamic_symtab_upper_bound (abfd);
739   if (storage < 0)
740     {
741       if (!(bfd_get_file_flags (abfd) & DYNAMIC))
742         {
743           non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
744           exit_status = 1;
745           dynsymcount = 0;
746           return NULL;
747         }
748
749       bfd_fatal (bfd_get_filename (abfd));
750     }
751   if (storage)
752     sy = (asymbol **) xmalloc (storage);
753
754   dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
755   if (dynsymcount < 0)
756     bfd_fatal (bfd_get_filename (abfd));
757   return sy;
758 }
759
760 /* Some symbol names are significant and should be kept in the
761    table of sorted symbol names, even if they are marked as
762    debugging/section symbols.  */
763
764 static bfd_boolean
765 is_significant_symbol_name (const char * name)
766 {
767   return strncmp (name, ".plt", 4) == 0 || strcmp (name, ".got") == 0;
768 }
769
770 /* Filter out (in place) symbols that are useless for disassembly.
771    COUNT is the number of elements in SYMBOLS.
772    Return the number of useful symbols.  */
773
774 static long
775 remove_useless_symbols (asymbol **symbols, long count)
776 {
777   asymbol **in_ptr = symbols, **out_ptr = symbols;
778
779   while (--count >= 0)
780     {
781       asymbol *sym = *in_ptr++;
782
783       if (sym->name == NULL || sym->name[0] == '\0')
784         continue;
785       if ((sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
786           && ! is_significant_symbol_name (sym->name))
787         continue;
788       if (bfd_is_und_section (sym->section)
789           || bfd_is_com_section (sym->section))
790         continue;
791
792       *out_ptr++ = sym;
793     }
794   return out_ptr - symbols;
795 }
796
797 /* Sort symbols into value order.  */
798
799 static int
800 compare_symbols (const void *ap, const void *bp)
801 {
802   const asymbol *a = * (const asymbol **) ap;
803   const asymbol *b = * (const asymbol **) bp;
804   const char *an;
805   const char *bn;
806   size_t anl;
807   size_t bnl;
808   bfd_boolean af;
809   bfd_boolean bf;
810   flagword aflags;
811   flagword bflags;
812
813   if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
814     return 1;
815   else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
816     return -1;
817
818   if (a->section > b->section)
819     return 1;
820   else if (a->section < b->section)
821     return -1;
822
823   an = bfd_asymbol_name (a);
824   bn = bfd_asymbol_name (b);
825   anl = strlen (an);
826   bnl = strlen (bn);
827
828   /* The symbols gnu_compiled and gcc2_compiled convey no real
829      information, so put them after other symbols with the same value.  */
830   af = (strstr (an, "gnu_compiled") != NULL
831         || strstr (an, "gcc2_compiled") != NULL);
832   bf = (strstr (bn, "gnu_compiled") != NULL
833         || strstr (bn, "gcc2_compiled") != NULL);
834
835   if (af && ! bf)
836     return 1;
837   if (! af && bf)
838     return -1;
839
840   /* We use a heuristic for the file name, to try to sort it after
841      more useful symbols.  It may not work on non Unix systems, but it
842      doesn't really matter; the only difference is precisely which
843      symbol names get printed.  */
844
845 #define file_symbol(s, sn, snl)                 \
846   (((s)->flags & BSF_FILE) != 0                 \
847    || ((sn)[(snl) - 2] == '.'                   \
848        && ((sn)[(snl) - 1] == 'o'               \
849            || (sn)[(snl) - 1] == 'a')))
850
851   af = file_symbol (a, an, anl);
852   bf = file_symbol (b, bn, bnl);
853
854   if (af && ! bf)
855     return 1;
856   if (! af && bf)
857     return -1;
858
859   /* Try to sort global symbols before local symbols before function
860      symbols before debugging symbols.  */
861
862   aflags = a->flags;
863   bflags = b->flags;
864
865   if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
866     {
867       if ((aflags & BSF_DEBUGGING) != 0)
868         return 1;
869       else
870         return -1;
871     }
872   if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
873     {
874       if ((aflags & BSF_FUNCTION) != 0)
875         return -1;
876       else
877         return 1;
878     }
879   if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
880     {
881       if ((aflags & BSF_LOCAL) != 0)
882         return 1;
883       else
884         return -1;
885     }
886   if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
887     {
888       if ((aflags & BSF_GLOBAL) != 0)
889         return -1;
890       else
891         return 1;
892     }
893
894   if (bfd_get_flavour (bfd_asymbol_bfd (a)) == bfd_target_elf_flavour
895       && bfd_get_flavour (bfd_asymbol_bfd (b)) == bfd_target_elf_flavour)
896     {
897       bfd_vma asz, bsz;
898
899       asz = 0;
900       if ((a->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
901         asz = ((elf_symbol_type *) a)->internal_elf_sym.st_size;
902       bsz = 0;
903       if ((b->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
904         bsz = ((elf_symbol_type *) b)->internal_elf_sym.st_size;
905       if (asz != bsz)
906         return asz > bsz ? -1 : 1;
907     }
908
909   /* Symbols that start with '.' might be section names, so sort them
910      after symbols that don't start with '.'.  */
911   if (an[0] == '.' && bn[0] != '.')
912     return 1;
913   if (an[0] != '.' && bn[0] == '.')
914     return -1;
915
916   /* Finally, if we can't distinguish them in any other way, try to
917      get consistent results by sorting the symbols by name.  */
918   return strcmp (an, bn);
919 }
920
921 /* Sort relocs into address order.  */
922
923 static int
924 compare_relocs (const void *ap, const void *bp)
925 {
926   const arelent *a = * (const arelent **) ap;
927   const arelent *b = * (const arelent **) bp;
928
929   if (a->address > b->address)
930     return 1;
931   else if (a->address < b->address)
932     return -1;
933
934   /* So that associated relocations tied to the same address show up
935      in the correct order, we don't do any further sorting.  */
936   if (a > b)
937     return 1;
938   else if (a < b)
939     return -1;
940   else
941     return 0;
942 }
943
944 /* Print an address (VMA) to the output stream in INFO.
945    If SKIP_ZEROES is TRUE, omit leading zeroes.  */
946
947 static void
948 objdump_print_value (bfd_vma vma, struct disassemble_info *inf,
949                      bfd_boolean skip_zeroes)
950 {
951   char buf[30];
952   char *p;
953   struct objdump_disasm_info *aux;
954
955   aux = (struct objdump_disasm_info *) inf->application_data;
956   bfd_sprintf_vma (aux->abfd, buf, vma);
957   if (! skip_zeroes)
958     p = buf;
959   else
960     {
961       for (p = buf; *p == '0'; ++p)
962         ;
963       if (*p == '\0')
964         --p;
965     }
966   (*inf->fprintf_func) (inf->stream, "%s", p);
967 }
968
969 /* Print the name of a symbol.  */
970
971 static void
972 objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
973                        asymbol *sym)
974 {
975   char *alloc;
976   const char *name, *version_string = NULL;
977   bfd_boolean hidden = FALSE;
978
979   alloc = NULL;
980   name = bfd_asymbol_name (sym);
981   if (do_demangle && name[0] != '\0')
982     {
983       /* Demangle the name.  */
984       alloc = bfd_demangle (abfd, name, demangle_flags);
985       if (alloc != NULL)
986         name = alloc;
987     }
988
989   if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
990     version_string = bfd_get_symbol_version_string (abfd, sym, &hidden);
991
992   if (bfd_is_und_section (bfd_get_section (sym)))
993     hidden = TRUE;
994
995   name = sanitize_string (name);
996
997   if (inf != NULL)
998     {
999       (*inf->fprintf_func) (inf->stream, "%s", name);
1000       if (version_string && *version_string != '\0')
1001         (*inf->fprintf_func) (inf->stream, hidden ? "@%s" : "@@%s",
1002                               version_string);
1003     }
1004   else
1005     {
1006       printf ("%s", name);
1007       if (version_string && *version_string != '\0')
1008         printf (hidden ? "@%s" : "@@%s", version_string);
1009     }
1010
1011   if (alloc != NULL)
1012     free (alloc);
1013 }
1014
1015 static inline bfd_boolean
1016 sym_ok (bfd_boolean               want_section,
1017         bfd *                     abfd ATTRIBUTE_UNUSED,
1018         long                      place,
1019         asection *                sec,
1020         struct disassemble_info * inf)
1021 {
1022   if (want_section)
1023     {
1024       /* Note - we cannot just compare section pointers because they could
1025          be different, but the same...  Ie the symbol that we are trying to
1026          find could have come from a separate debug info file.  Under such
1027          circumstances the symbol will be associated with a section in the
1028          debug info file, whilst the section we want is in a normal file.
1029          So the section pointers will be different, but the section names
1030          will be the same.  */
1031       if (strcmp (bfd_section_name (abfd, sorted_syms[place]->section),
1032                   bfd_section_name (abfd, sec)) != 0)
1033         return FALSE;
1034     }
1035
1036   return inf->symbol_is_valid (sorted_syms[place], inf);
1037 }
1038
1039 /* Locate a symbol given a bfd and a section (from INFO->application_data),
1040    and a VMA.  If INFO->application_data->require_sec is TRUE, then always
1041    require the symbol to be in the section.  Returns NULL if there is no
1042    suitable symbol.  If PLACE is not NULL, then *PLACE is set to the index
1043    of the symbol in sorted_syms.  */
1044
1045 static asymbol *
1046 find_symbol_for_address (bfd_vma vma,
1047                          struct disassemble_info *inf,
1048                          long *place)
1049 {
1050   /* @@ Would it speed things up to cache the last two symbols returned,
1051      and maybe their address ranges?  For many processors, only one memory
1052      operand can be present at a time, so the 2-entry cache wouldn't be
1053      constantly churned by code doing heavy memory accesses.  */
1054
1055   /* Indices in `sorted_syms'.  */
1056   long min = 0;
1057   long max_count = sorted_symcount;
1058   long thisplace;
1059   struct objdump_disasm_info *aux;
1060   bfd *abfd;
1061   asection *sec;
1062   unsigned int opb;
1063   bfd_boolean want_section;
1064   long rel_count;
1065
1066   if (sorted_symcount < 1)
1067     return NULL;
1068
1069   aux = (struct objdump_disasm_info *) inf->application_data;
1070   abfd = aux->abfd;
1071   sec = aux->sec;
1072   opb = inf->octets_per_byte;
1073
1074   /* Perform a binary search looking for the closest symbol to the
1075      required value.  We are searching the range (min, max_count].  */
1076   while (min + 1 < max_count)
1077     {
1078       asymbol *sym;
1079
1080       thisplace = (max_count + min) / 2;
1081       sym = sorted_syms[thisplace];
1082
1083       if (bfd_asymbol_value (sym) > vma)
1084         max_count = thisplace;
1085       else if (bfd_asymbol_value (sym) < vma)
1086         min = thisplace;
1087       else
1088         {
1089           min = thisplace;
1090           break;
1091         }
1092     }
1093
1094   /* The symbol we want is now in min, the low end of the range we
1095      were searching.  If there are several symbols with the same
1096      value, we want the first (non-section/non-debugging) one.  */
1097   thisplace = min;
1098   while (thisplace > 0
1099          && (bfd_asymbol_value (sorted_syms[thisplace])
1100              == bfd_asymbol_value (sorted_syms[thisplace - 1]))
1101          && ((sorted_syms[thisplace - 1]->flags
1102               & (BSF_SECTION_SYM | BSF_DEBUGGING)) == 0)
1103          )
1104     --thisplace;
1105
1106   /* Prefer a symbol in the current section if we have multple symbols
1107      with the same value, as can occur with overlays or zero size
1108      sections.  */
1109   min = thisplace;
1110   while (min < max_count
1111          && (bfd_asymbol_value (sorted_syms[min])
1112              == bfd_asymbol_value (sorted_syms[thisplace])))
1113     {
1114       if (sym_ok (TRUE, abfd, min, sec, inf))
1115         {
1116           thisplace = min;
1117
1118           if (place != NULL)
1119             *place = thisplace;
1120
1121           return sorted_syms[thisplace];
1122         }
1123       ++min;
1124     }
1125
1126   /* If the file is relocatable, and the symbol could be from this
1127      section, prefer a symbol from this section over symbols from
1128      others, even if the other symbol's value might be closer.
1129
1130      Note that this may be wrong for some symbol references if the
1131      sections have overlapping memory ranges, but in that case there's
1132      no way to tell what's desired without looking at the relocation
1133      table.
1134
1135      Also give the target a chance to reject symbols.  */
1136   want_section = (aux->require_sec
1137                   || ((abfd->flags & HAS_RELOC) != 0
1138                       && vma >= bfd_get_section_vma (abfd, sec)
1139                       && vma < (bfd_get_section_vma (abfd, sec)
1140                                 + bfd_section_size (abfd, sec) / opb)));
1141   
1142   if (! sym_ok (want_section, abfd, thisplace, sec, inf))
1143     {
1144       long i;
1145       long newplace = sorted_symcount;
1146
1147       for (i = min - 1; i >= 0; i--)
1148         {
1149           if (sym_ok (want_section, abfd, i, sec, inf))
1150             {
1151               if (newplace == sorted_symcount)
1152                 newplace = i;
1153
1154               if (bfd_asymbol_value (sorted_syms[i])
1155                   != bfd_asymbol_value (sorted_syms[newplace]))
1156                 break;
1157
1158               /* Remember this symbol and keep searching until we reach
1159                  an earlier address.  */
1160               newplace = i;
1161             }
1162         }
1163
1164       if (newplace != sorted_symcount)
1165         thisplace = newplace;
1166       else
1167         {
1168           /* We didn't find a good symbol with a smaller value.
1169              Look for one with a larger value.  */
1170           for (i = thisplace + 1; i < sorted_symcount; i++)
1171             {
1172               if (sym_ok (want_section, abfd, i, sec, inf))
1173                 {
1174                   thisplace = i;
1175                   break;
1176                 }
1177             }
1178         }
1179
1180       if (! sym_ok (want_section, abfd, thisplace, sec, inf))
1181         /* There is no suitable symbol.  */
1182         return NULL;
1183     }
1184
1185   /* If we have not found an exact match for the specified address
1186      and we have dynamic relocations available, then we can produce
1187      a better result by matching a relocation to the address and
1188      using the symbol associated with that relocation.  */
1189   rel_count = aux->dynrelcount;
1190   if (!want_section
1191       && sorted_syms[thisplace]->value != vma
1192       && rel_count > 0
1193       && aux->dynrelbuf != NULL
1194       && aux->dynrelbuf[0]->address <= vma
1195       && aux->dynrelbuf[rel_count - 1]->address >= vma
1196       /* If we have matched a synthetic symbol, then stick with that.  */
1197       && (sorted_syms[thisplace]->flags & BSF_SYNTHETIC) == 0)
1198     {
1199       arelent **  rel_low;
1200       arelent **  rel_high;
1201
1202       rel_low = aux->dynrelbuf;
1203       rel_high = rel_low + rel_count - 1;
1204       while (rel_low <= rel_high)
1205         {
1206           arelent **rel_mid = &rel_low[(rel_high - rel_low) / 2];
1207           arelent * rel = *rel_mid;
1208
1209           if (rel->address == vma)
1210             {
1211               /* Absolute relocations do not provide a more helpful
1212                  symbolic address.  Find a non-absolute relocation
1213                  with the same address.  */
1214               arelent **rel_vma = rel_mid;
1215               for (rel_mid--;
1216                    rel_mid >= rel_low && rel_mid[0]->address == vma;
1217                    rel_mid--)
1218                 rel_vma = rel_mid;
1219
1220               for (; rel_vma <= rel_high && rel_vma[0]->address == vma;
1221                    rel_vma++)
1222                 {
1223                   rel = *rel_vma;
1224                   if (rel->sym_ptr_ptr != NULL
1225                       && ! bfd_is_abs_section ((* rel->sym_ptr_ptr)->section))
1226                     {
1227                       if (place != NULL)
1228                         * place = thisplace;
1229                       return * rel->sym_ptr_ptr;
1230                     }
1231                 }
1232               break;
1233             }
1234
1235           if (vma < rel->address)
1236             rel_high = rel_mid;
1237           else if (vma >= rel_mid[1]->address)
1238             rel_low = rel_mid + 1;
1239           else
1240             break;
1241         }
1242     }
1243
1244   if (place != NULL)
1245     *place = thisplace;
1246
1247   return sorted_syms[thisplace];
1248 }
1249
1250 /* Print an address and the offset to the nearest symbol.  */
1251
1252 static void
1253 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
1254                              bfd_vma vma, struct disassemble_info *inf,
1255                              bfd_boolean skip_zeroes)
1256 {
1257   objdump_print_value (vma, inf, skip_zeroes);
1258
1259   if (sym == NULL)
1260     {
1261       bfd_vma secaddr;
1262
1263       (*inf->fprintf_func) (inf->stream, " <%s",
1264                             sanitize_string (bfd_get_section_name (abfd, sec)));
1265       secaddr = bfd_get_section_vma (abfd, sec);
1266       if (vma < secaddr)
1267         {
1268           (*inf->fprintf_func) (inf->stream, "-0x");
1269           objdump_print_value (secaddr - vma, inf, TRUE);
1270         }
1271       else if (vma > secaddr)
1272         {
1273           (*inf->fprintf_func) (inf->stream, "+0x");
1274           objdump_print_value (vma - secaddr, inf, TRUE);
1275         }
1276       (*inf->fprintf_func) (inf->stream, ">");
1277     }
1278   else
1279     {
1280       (*inf->fprintf_func) (inf->stream, " <");
1281
1282       objdump_print_symname (abfd, inf, sym);
1283
1284       if (bfd_asymbol_value (sym) == vma)
1285         ;
1286       /* Undefined symbols in an executables and dynamic objects do not have
1287          a value associated with them, so it does not make sense to display
1288          an offset relative to them.  Normally we would not be provided with
1289          this kind of symbol, but the target backend might choose to do so,
1290          and the code in find_symbol_for_address might return an as yet
1291          unresolved symbol associated with a dynamic reloc.  */
1292       else if ((bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
1293                && bfd_is_und_section (sym->section))
1294         ;
1295       else if (bfd_asymbol_value (sym) > vma)
1296         {
1297           (*inf->fprintf_func) (inf->stream, "-0x");
1298           objdump_print_value (bfd_asymbol_value (sym) - vma, inf, TRUE);
1299         }
1300       else if (vma > bfd_asymbol_value (sym))
1301         {
1302           (*inf->fprintf_func) (inf->stream, "+0x");
1303           objdump_print_value (vma - bfd_asymbol_value (sym), inf, TRUE);
1304         }
1305
1306       (*inf->fprintf_func) (inf->stream, ">");
1307     }
1308
1309   if (display_file_offsets)
1310     inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1311                         (long int)(sec->filepos + (vma - sec->vma)));
1312 }
1313
1314 /* Print an address (VMA), symbolically if possible.
1315    If SKIP_ZEROES is TRUE, don't output leading zeroes.  */
1316
1317 static void
1318 objdump_print_addr (bfd_vma vma,
1319                     struct disassemble_info *inf,
1320                     bfd_boolean skip_zeroes)
1321 {
1322   struct objdump_disasm_info *aux;
1323   asymbol *sym = NULL;
1324   bfd_boolean skip_find = FALSE;
1325
1326   aux = (struct objdump_disasm_info *) inf->application_data;
1327
1328   if (sorted_symcount < 1)
1329     {
1330       (*inf->fprintf_func) (inf->stream, "0x");
1331       objdump_print_value (vma, inf, skip_zeroes);
1332
1333       if (display_file_offsets)
1334         inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1335                            (long int)(aux->sec->filepos + (vma - aux->sec->vma)));
1336       return;
1337     }
1338
1339   if (aux->reloc != NULL
1340       && aux->reloc->sym_ptr_ptr != NULL
1341       && * aux->reloc->sym_ptr_ptr != NULL)
1342     {
1343       sym = * aux->reloc->sym_ptr_ptr;
1344
1345       /* Adjust the vma to the reloc.  */
1346       vma += bfd_asymbol_value (sym);
1347
1348       if (bfd_is_und_section (bfd_get_section (sym)))
1349         skip_find = TRUE;
1350     }
1351
1352   if (!skip_find)
1353     sym = find_symbol_for_address (vma, inf, NULL);
1354
1355   objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, inf,
1356                                skip_zeroes);
1357 }
1358
1359 /* Print VMA to INFO.  This function is passed to the disassembler
1360    routine.  */
1361
1362 static void
1363 objdump_print_address (bfd_vma vma, struct disassemble_info *inf)
1364 {
1365   objdump_print_addr (vma, inf, ! prefix_addresses);
1366 }
1367
1368 /* Determine if the given address has a symbol associated with it.  */
1369
1370 static int
1371 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
1372 {
1373   asymbol * sym;
1374
1375   sym = find_symbol_for_address (vma, inf, NULL);
1376
1377   return (sym != NULL && (bfd_asymbol_value (sym) == vma));
1378 }
1379
1380 /* Hold the last function name and the last line number we displayed
1381    in a disassembly.  */
1382
1383 static char *prev_functionname;
1384 static unsigned int prev_line;
1385 static unsigned int prev_discriminator;
1386
1387 /* We keep a list of all files that we have seen when doing a
1388    disassembly with source, so that we know how much of the file to
1389    display.  This can be important for inlined functions.  */
1390
1391 struct print_file_list
1392 {
1393   struct print_file_list *next;
1394   const char *filename;
1395   const char *modname;
1396   const char *map;
1397   size_t mapsize;
1398   const char **linemap;
1399   unsigned maxline;
1400   unsigned last_line;
1401   unsigned max_printed;
1402   int first;
1403 };
1404
1405 static struct print_file_list *print_files;
1406
1407 /* The number of preceding context lines to show when we start
1408    displaying a file for the first time.  */
1409
1410 #define SHOW_PRECEDING_CONTEXT_LINES (5)
1411
1412 /* Read a complete file into memory.  */
1413
1414 static const char *
1415 slurp_file (const char *fn, size_t *size, struct stat *fst)
1416 {
1417 #ifdef HAVE_MMAP
1418   int ps = getpagesize ();
1419   size_t msize;
1420 #endif
1421   const char *map;
1422   int fd = open (fn, O_RDONLY | O_BINARY);
1423
1424   if (fd < 0)
1425     return NULL;
1426   if (fstat (fd, fst) < 0)
1427     {
1428       close (fd);
1429       return NULL;
1430     }
1431   *size = fst->st_size;
1432 #ifdef HAVE_MMAP
1433   msize = (*size + ps - 1) & ~(ps - 1);
1434   map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
1435   if (map != (char *) -1L)
1436     {
1437       close (fd);
1438       return map;
1439     }
1440 #endif
1441   map = (const char *) malloc (*size);
1442   if (!map || (size_t) read (fd, (char *) map, *size) != *size)
1443     {
1444       free ((void *) map);
1445       map = NULL;
1446     }
1447   close (fd);
1448   return map;
1449 }
1450
1451 #define line_map_decrease 5
1452
1453 /* Precompute array of lines for a mapped file. */
1454
1455 static const char **
1456 index_file (const char *map, size_t size, unsigned int *maxline)
1457 {
1458   const char *p, *lstart, *end;
1459   int chars_per_line = 45; /* First iteration will use 40.  */
1460   unsigned int lineno;
1461   const char **linemap = NULL;
1462   unsigned long line_map_size = 0;
1463
1464   lineno = 0;
1465   lstart = map;
1466   end = map + size;
1467
1468   for (p = map; p < end; p++)
1469     {
1470       if (*p == '\n')
1471         {
1472           if (p + 1 < end && p[1] == '\r')
1473             p++;
1474         }
1475       else if (*p == '\r')
1476         {
1477           if (p + 1 < end && p[1] == '\n')
1478             p++;
1479         }
1480       else
1481         continue;
1482
1483       /* End of line found.  */
1484
1485       if (linemap == NULL || line_map_size < lineno + 1)
1486         {
1487           unsigned long newsize;
1488
1489           chars_per_line -= line_map_decrease;
1490           if (chars_per_line <= 1)
1491             chars_per_line = 1;
1492           line_map_size = size / chars_per_line + 1;
1493           if (line_map_size < lineno + 1)
1494             line_map_size = lineno + 1;
1495           newsize = line_map_size * sizeof (char *);
1496           linemap = (const char **) xrealloc (linemap, newsize);
1497         }
1498
1499       linemap[lineno++] = lstart;
1500       lstart = p + 1;
1501     }
1502
1503   *maxline = lineno;
1504   return linemap;
1505 }
1506
1507 /* Tries to open MODNAME, and if successful adds a node to print_files
1508    linked list and returns that node.  Returns NULL on failure.  */
1509
1510 static struct print_file_list *
1511 try_print_file_open (const char *origname, const char *modname, struct stat *fst)
1512 {
1513   struct print_file_list *p;
1514
1515   p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
1516
1517   p->map = slurp_file (modname, &p->mapsize, fst);
1518   if (p->map == NULL)
1519     {
1520       free (p);
1521       return NULL;
1522     }
1523
1524   p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1525   p->last_line = 0;
1526   p->max_printed = 0;
1527   p->filename = origname;
1528   p->modname = modname;
1529   p->next = print_files;
1530   p->first = 1;
1531   print_files = p;
1532   return p;
1533 }
1534
1535 /* If the source file, as described in the symtab, is not found
1536    try to locate it in one of the paths specified with -I
1537    If found, add location to print_files linked list.  */
1538
1539 static struct print_file_list *
1540 update_source_path (const char *filename, bfd *abfd)
1541 {
1542   struct print_file_list *p;
1543   const char *fname;
1544   struct stat fst;
1545   int i;
1546
1547   p = try_print_file_open (filename, filename, &fst);
1548   if (p == NULL)
1549     {
1550       if (include_path_count == 0)
1551         return NULL;
1552
1553       /* Get the name of the file.  */
1554       fname = lbasename (filename);
1555
1556       /* If file exists under a new path, we need to add it to the list
1557          so that show_line knows about it.  */
1558       for (i = 0; i < include_path_count; i++)
1559         {
1560           char *modname = concat (include_paths[i], "/", fname,
1561                                   (const char *) 0);
1562
1563           p = try_print_file_open (filename, modname, &fst);
1564           if (p)
1565             break;
1566
1567           free (modname);
1568         }
1569     }
1570
1571   if (p != NULL)
1572     {
1573       long mtime = bfd_get_mtime (abfd);
1574
1575       if (fst.st_mtime > mtime)
1576         warn (_("source file %s is more recent than object file\n"),
1577               filename);
1578     }
1579
1580   return p;
1581 }
1582
1583 /* Print a source file line.  */
1584
1585 static void
1586 print_line (struct print_file_list *p, unsigned int linenum)
1587 {
1588   const char *l;
1589   size_t len;
1590
1591   --linenum;
1592   if (linenum >= p->maxline)
1593     return;
1594   l = p->linemap [linenum];
1595   /* Test fwrite return value to quiet glibc warning.  */
1596   len = strcspn (l, "\n\r");
1597   if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1598     putchar ('\n');
1599 }
1600
1601 /* Print a range of source code lines. */
1602
1603 static void
1604 dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1605 {
1606   if (p->map == NULL)
1607     return;
1608   while (start <= end)
1609     {
1610       print_line (p, start);
1611       start++;
1612     }
1613 }
1614
1615 /* Show the line number, or the source line, in a disassembly
1616    listing.  */
1617
1618 static void
1619 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1620 {
1621   const char *filename;
1622   const char *functionname;
1623   unsigned int linenumber;
1624   unsigned int discriminator;
1625   bfd_boolean reloc;
1626   char *path = NULL;
1627
1628   if (! with_line_numbers && ! with_source_code)
1629     return;
1630
1631   if (! bfd_find_nearest_line_discriminator (abfd, section, syms, addr_offset,
1632                                              &filename, &functionname,
1633                                              &linenumber, &discriminator))
1634     return;
1635
1636   if (filename != NULL && *filename == '\0')
1637     filename = NULL;
1638   if (functionname != NULL && *functionname == '\0')
1639     functionname = NULL;
1640
1641   if (filename
1642       && IS_ABSOLUTE_PATH (filename)
1643       && prefix)
1644     {
1645       char *path_up;
1646       const char *fname = filename;
1647
1648       path = xmalloc (prefix_length + PATH_MAX + 1);
1649
1650       if (prefix_length)
1651         memcpy (path, prefix, prefix_length);
1652       path_up = path + prefix_length;
1653
1654       /* Build relocated filename, stripping off leading directories
1655          from the initial filename if requested.  */
1656       if (prefix_strip > 0)
1657         {
1658           int level = 0;
1659           const char *s;
1660
1661           /* Skip selected directory levels.  */
1662           for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
1663             if (IS_DIR_SEPARATOR(*s))
1664               {
1665                 fname = s;
1666                 level++;
1667               }
1668         }
1669
1670       /* Update complete filename.  */
1671       strncpy (path_up, fname, PATH_MAX);
1672       path_up[PATH_MAX] = '\0';
1673
1674       filename = path;
1675       reloc = TRUE;
1676     }
1677   else
1678     reloc = FALSE;
1679
1680   if (with_line_numbers)
1681     {
1682       if (functionname != NULL
1683           && (prev_functionname == NULL
1684               || strcmp (functionname, prev_functionname) != 0))
1685         {
1686           printf ("%s():\n", sanitize_string (functionname));
1687           prev_line = -1;
1688         }
1689       if (linenumber > 0
1690           && (linenumber != prev_line
1691               || discriminator != prev_discriminator))
1692         {
1693           if (discriminator > 0)
1694             printf ("%s:%u (discriminator %u)\n",
1695                     filename == NULL ? "???" : sanitize_string (filename),
1696                     linenumber, discriminator);
1697           else
1698             printf ("%s:%u\n", filename == NULL
1699                     ? "???" : sanitize_string (filename),
1700                     linenumber);
1701         }
1702       if (unwind_inlines)
1703         {
1704           const char *filename2;
1705           const char *functionname2;
1706           unsigned line2;
1707
1708           while (bfd_find_inliner_info (abfd, &filename2, &functionname2,
1709                                         &line2))
1710             {
1711               printf ("inlined by %s:%u",
1712                       sanitize_string (filename2), line2);
1713               printf (" (%s)\n", sanitize_string (functionname2));
1714             }
1715         }
1716     }
1717
1718   if (with_source_code
1719       && filename != NULL
1720       && linenumber > 0)
1721     {
1722       struct print_file_list **pp, *p;
1723       unsigned l;
1724
1725       for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1726         if (filename_cmp ((*pp)->filename, filename) == 0)
1727           break;
1728       p = *pp;
1729
1730       if (p == NULL)
1731         {
1732           if (reloc)
1733             filename = xstrdup (filename);
1734           p = update_source_path (filename, abfd);
1735         }
1736
1737       if (p != NULL && linenumber != p->last_line)
1738         {
1739           if (file_start_context && p->first)
1740             l = 1;
1741           else
1742             {
1743               l = linenumber - SHOW_PRECEDING_CONTEXT_LINES;
1744               if (l >= linenumber)
1745                 l = 1;
1746               if (p->max_printed >= l)
1747                 {
1748                   if (p->max_printed < linenumber)
1749                     l = p->max_printed + 1;
1750                   else
1751                     l = linenumber;
1752                 }
1753             }
1754           dump_lines (p, l, linenumber);
1755           if (p->max_printed < linenumber)
1756             p->max_printed = linenumber;
1757           p->last_line = linenumber;
1758           p->first = 0;
1759         }
1760     }
1761
1762   if (functionname != NULL
1763       && (prev_functionname == NULL
1764           || strcmp (functionname, prev_functionname) != 0))
1765     {
1766       if (prev_functionname != NULL)
1767         free (prev_functionname);
1768       prev_functionname = (char *) xmalloc (strlen (functionname) + 1);
1769       strcpy (prev_functionname, functionname);
1770     }
1771
1772   if (linenumber > 0 && linenumber != prev_line)
1773     prev_line = linenumber;
1774
1775   if (discriminator != prev_discriminator)
1776     prev_discriminator = discriminator;
1777
1778   if (path)
1779     free (path);
1780 }
1781
1782 /* Pseudo FILE object for strings.  */
1783 typedef struct
1784 {
1785   char *buffer;
1786   size_t pos;
1787   size_t alloc;
1788 } SFILE;
1789
1790 /* sprintf to a "stream".  */
1791
1792 static int ATTRIBUTE_PRINTF_2
1793 objdump_sprintf (SFILE *f, const char *format, ...)
1794 {
1795   size_t n;
1796   va_list args;
1797
1798   while (1)
1799     {
1800       size_t space = f->alloc - f->pos;
1801
1802       va_start (args, format);
1803       n = vsnprintf (f->buffer + f->pos, space, format, args);
1804       va_end (args);
1805
1806       if (space > n)
1807         break;
1808
1809       f->alloc = (f->alloc + n) * 2;
1810       f->buffer = (char *) xrealloc (f->buffer, f->alloc);
1811     }
1812   f->pos += n;
1813
1814   return n;
1815 }
1816
1817 /* The number of zeroes we want to see before we start skipping them.
1818    The number is arbitrarily chosen.  */
1819
1820 #define DEFAULT_SKIP_ZEROES 8
1821
1822 /* The number of zeroes to skip at the end of a section.  If the
1823    number of zeroes at the end is between SKIP_ZEROES_AT_END and
1824    SKIP_ZEROES, they will be disassembled.  If there are fewer than
1825    SKIP_ZEROES_AT_END, they will be skipped.  This is a heuristic
1826    attempt to avoid disassembling zeroes inserted by section
1827    alignment.  */
1828
1829 #define DEFAULT_SKIP_ZEROES_AT_END 3
1830
1831 /* Disassemble some data in memory between given values.  */
1832
1833 static void
1834 disassemble_bytes (struct disassemble_info * inf,
1835                    disassembler_ftype        disassemble_fn,
1836                    bfd_boolean               insns,
1837                    bfd_byte *                data,
1838                    bfd_vma                   start_offset,
1839                    bfd_vma                   stop_offset,
1840                    bfd_vma                   rel_offset,
1841                    arelent ***               relppp,
1842                    arelent **                relppend)
1843 {
1844   struct objdump_disasm_info *aux;
1845   asection *section;
1846   int octets_per_line;
1847   int skip_addr_chars;
1848   bfd_vma addr_offset;
1849   unsigned int opb = inf->octets_per_byte;
1850   unsigned int skip_zeroes = inf->skip_zeroes;
1851   unsigned int skip_zeroes_at_end = inf->skip_zeroes_at_end;
1852   int octets = opb;
1853   SFILE sfile;
1854
1855   aux = (struct objdump_disasm_info *) inf->application_data;
1856   section = aux->sec;
1857
1858   sfile.alloc = 120;
1859   sfile.buffer = (char *) xmalloc (sfile.alloc);
1860   sfile.pos = 0;
1861
1862   if (insn_width)
1863     octets_per_line = insn_width;
1864   else if (insns)
1865     octets_per_line = 4;
1866   else
1867     octets_per_line = 16;
1868
1869   /* Figure out how many characters to skip at the start of an
1870      address, to make the disassembly look nicer.  We discard leading
1871      zeroes in chunks of 4, ensuring that there is always a leading
1872      zero remaining.  */
1873   skip_addr_chars = 0;
1874   if (! prefix_addresses)
1875     {
1876       char buf[30];
1877
1878       bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1879
1880       while (buf[skip_addr_chars] == '0')
1881         ++skip_addr_chars;
1882
1883       /* Don't discard zeros on overflow.  */
1884       if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1885         skip_addr_chars = 0;
1886
1887       if (skip_addr_chars != 0)
1888         skip_addr_chars = (skip_addr_chars - 1) & -4;
1889     }
1890
1891   inf->insn_info_valid = 0;
1892
1893   addr_offset = start_offset;
1894   while (addr_offset < stop_offset)
1895     {
1896       bfd_vma z;
1897       bfd_boolean need_nl = FALSE;
1898       int previous_octets;
1899
1900       /* Remember the length of the previous instruction.  */
1901       previous_octets = octets;
1902       octets = 0;
1903
1904       /* Make sure we don't use relocs from previous instructions.  */
1905       aux->reloc = NULL;
1906
1907       /* If we see more than SKIP_ZEROES octets of zeroes, we just
1908          print `...'.  */
1909       for (z = addr_offset * opb; z < stop_offset * opb; z++)
1910         if (data[z] != 0)
1911           break;
1912       if (! disassemble_zeroes
1913           && (inf->insn_info_valid == 0
1914               || inf->branch_delay_insns == 0)
1915           && (z - addr_offset * opb >= skip_zeroes
1916               || (z == stop_offset * opb &&
1917                   z - addr_offset * opb < skip_zeroes_at_end)))
1918         {
1919           /* If there are more nonzero octets to follow, we only skip
1920              zeroes in multiples of 4, to try to avoid running over
1921              the start of an instruction which happens to start with
1922              zero.  */
1923           if (z != stop_offset * opb)
1924             z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1925
1926           octets = z - addr_offset * opb;
1927
1928           /* If we are going to display more data, and we are displaying
1929              file offsets, then tell the user how many zeroes we skip
1930              and the file offset from where we resume dumping.  */
1931           if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1932             printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1933                     octets / opb,
1934                     (unsigned long) (section->filepos
1935                                      + (addr_offset + (octets / opb))));
1936           else
1937             printf ("\t...\n");
1938         }
1939       else
1940         {
1941           char buf[50];
1942           int bpc = 0;
1943           int pb = 0;
1944
1945           if (with_line_numbers || with_source_code)
1946             show_line (aux->abfd, section, addr_offset);
1947
1948           if (! prefix_addresses)
1949             {
1950               char *s;
1951
1952               bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1953               for (s = buf + skip_addr_chars; *s == '0'; s++)
1954                 *s = ' ';
1955               if (*s == '\0')
1956                 *--s = '0';
1957               printf ("%s:\t", buf + skip_addr_chars);
1958             }
1959           else
1960             {
1961               aux->require_sec = TRUE;
1962               objdump_print_address (section->vma + addr_offset, inf);
1963               aux->require_sec = FALSE;
1964               putchar (' ');
1965             }
1966
1967           if (insns)
1968             {
1969               sfile.pos = 0;
1970               inf->fprintf_func = (fprintf_ftype) objdump_sprintf;
1971               inf->stream = &sfile;
1972               inf->bytes_per_line = 0;
1973               inf->bytes_per_chunk = 0;
1974               inf->flags = ((disassemble_all ? DISASSEMBLE_DATA : 0)
1975                             | (wide_output ? WIDE_OUTPUT : 0));
1976               if (machine)
1977                 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
1978
1979               if (inf->disassembler_needs_relocs
1980                   && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1981                   && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1982                   && *relppp < relppend)
1983                 {
1984                   bfd_signed_vma distance_to_rel;
1985
1986                   distance_to_rel = (**relppp)->address
1987                     - (rel_offset + addr_offset);
1988
1989                   /* Check to see if the current reloc is associated with
1990                      the instruction that we are about to disassemble.  */
1991                   if (distance_to_rel == 0
1992                       /* FIXME: This is wrong.  We are trying to catch
1993                          relocs that are addressed part way through the
1994                          current instruction, as might happen with a packed
1995                          VLIW instruction.  Unfortunately we do not know the
1996                          length of the current instruction since we have not
1997                          disassembled it yet.  Instead we take a guess based
1998                          upon the length of the previous instruction.  The
1999                          proper solution is to have a new target-specific
2000                          disassembler function which just returns the length
2001                          of an instruction at a given address without trying
2002                          to display its disassembly. */
2003                       || (distance_to_rel > 0
2004                           && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
2005                     {
2006                       inf->flags |= INSN_HAS_RELOC;
2007                       aux->reloc = **relppp;
2008                     }
2009                 }
2010
2011               if (! disassemble_all
2012                   && (section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
2013                   == (SEC_CODE | SEC_HAS_CONTENTS))
2014                 /* Set a stop_vma so that the disassembler will not read
2015                    beyond the next symbol.  We assume that symbols appear on
2016                    the boundaries between instructions.  We only do this when
2017                    disassembling code of course, and when -D is in effect.  */
2018                 inf->stop_vma = section->vma + stop_offset;
2019
2020               inf->stop_offset = stop_offset;
2021               octets = (*disassemble_fn) (section->vma + addr_offset, inf);
2022
2023               inf->stop_vma = 0;
2024               inf->fprintf_func = (fprintf_ftype) fprintf;
2025               inf->stream = stdout;
2026               if (insn_width == 0 && inf->bytes_per_line != 0)
2027                 octets_per_line = inf->bytes_per_line;
2028               if (octets < (int) opb)
2029                 {
2030                   if (sfile.pos)
2031                     printf ("%s\n", sfile.buffer);
2032                   if (octets >= 0)
2033                     {
2034                       non_fatal (_("disassemble_fn returned length %d"),
2035                                  octets);
2036                       exit_status = 1;
2037                     }
2038                   break;
2039                 }
2040             }
2041           else
2042             {
2043               bfd_vma j;
2044
2045               octets = octets_per_line;
2046               if (addr_offset + octets / opb > stop_offset)
2047                 octets = (stop_offset - addr_offset) * opb;
2048
2049               for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
2050                 {
2051                   if (ISPRINT (data[j]))
2052                     buf[j - addr_offset * opb] = data[j];
2053                   else
2054                     buf[j - addr_offset * opb] = '.';
2055                 }
2056               buf[j - addr_offset * opb] = '\0';
2057             }
2058
2059           if (prefix_addresses
2060               ? show_raw_insn > 0
2061               : show_raw_insn >= 0)
2062             {
2063               bfd_vma j;
2064
2065               /* If ! prefix_addresses and ! wide_output, we print
2066                  octets_per_line octets per line.  */
2067               pb = octets;
2068               if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
2069                 pb = octets_per_line;
2070
2071               if (inf->bytes_per_chunk)
2072                 bpc = inf->bytes_per_chunk;
2073               else
2074                 bpc = 1;
2075
2076               for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
2077                 {
2078                   /* PR 21580: Check for a buffer ending early.  */
2079                   if (j + bpc <= stop_offset * opb)
2080                     {
2081                       int k;
2082
2083                       if (inf->display_endian == BFD_ENDIAN_LITTLE)
2084                         {
2085                           for (k = bpc - 1; k >= 0; k--)
2086                             printf ("%02x", (unsigned) data[j + k]);
2087                         }
2088                       else
2089                         {
2090                           for (k = 0; k < bpc; k++)
2091                             printf ("%02x", (unsigned) data[j + k]);
2092                         }
2093                     }
2094                   putchar (' ');
2095                 }
2096
2097               for (; pb < octets_per_line; pb += bpc)
2098                 {
2099                   int k;
2100
2101                   for (k = 0; k < bpc; k++)
2102                     printf ("  ");
2103                   putchar (' ');
2104                 }
2105
2106               /* Separate raw data from instruction by extra space.  */
2107               if (insns)
2108                 putchar ('\t');
2109               else
2110                 printf ("    ");
2111             }
2112
2113           if (! insns)
2114             printf ("%s", buf);
2115           else if (sfile.pos)
2116             printf ("%s", sfile.buffer);
2117
2118           if (prefix_addresses
2119               ? show_raw_insn > 0
2120               : show_raw_insn >= 0)
2121             {
2122               while (pb < octets)
2123                 {
2124                   bfd_vma j;
2125                   char *s;
2126
2127                   putchar ('\n');
2128                   j = addr_offset * opb + pb;
2129
2130                   bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
2131                   for (s = buf + skip_addr_chars; *s == '0'; s++)
2132                     *s = ' ';
2133                   if (*s == '\0')
2134                     *--s = '0';
2135                   printf ("%s:\t", buf + skip_addr_chars);
2136
2137                   pb += octets_per_line;
2138                   if (pb > octets)
2139                     pb = octets;
2140                   for (; j < addr_offset * opb + pb; j += bpc)
2141                     {
2142                       /* PR 21619: Check for a buffer ending early.  */
2143                       if (j + bpc <= stop_offset * opb)
2144                         {
2145                           int k;
2146
2147                           if (inf->display_endian == BFD_ENDIAN_LITTLE)
2148                             {
2149                               for (k = bpc - 1; k >= 0; k--)
2150                                 printf ("%02x", (unsigned) data[j + k]);
2151                             }
2152                           else
2153                             {
2154                               for (k = 0; k < bpc; k++)
2155                                 printf ("%02x", (unsigned) data[j + k]);
2156                             }
2157                         }
2158                       putchar (' ');
2159                     }
2160                 }
2161             }
2162
2163           if (!wide_output)
2164             putchar ('\n');
2165           else
2166             need_nl = TRUE;
2167         }
2168
2169       while ((*relppp) < relppend
2170              && (**relppp)->address < rel_offset + addr_offset + octets / opb)
2171         {
2172           if (dump_reloc_info || dump_dynamic_reloc_info)
2173             {
2174               arelent *q;
2175
2176               q = **relppp;
2177
2178               if (wide_output)
2179                 putchar ('\t');
2180               else
2181                 printf ("\t\t\t");
2182
2183               objdump_print_value (section->vma - rel_offset + q->address,
2184                                    inf, TRUE);
2185
2186               if (q->howto == NULL)
2187                 printf (": *unknown*\t");
2188               else if (q->howto->name)
2189                 printf (": %s\t", q->howto->name);
2190               else
2191                 printf (": %d\t", q->howto->type);
2192
2193               if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
2194                 printf ("*unknown*");
2195               else
2196                 {
2197                   const char *sym_name;
2198
2199                   sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
2200                   if (sym_name != NULL && *sym_name != '\0')
2201                     objdump_print_symname (aux->abfd, inf, *q->sym_ptr_ptr);
2202                   else
2203                     {
2204                       asection *sym_sec;
2205
2206                       sym_sec = bfd_get_section (*q->sym_ptr_ptr);
2207                       sym_name = bfd_get_section_name (aux->abfd, sym_sec);
2208                       if (sym_name == NULL || *sym_name == '\0')
2209                         sym_name = "*unknown*";
2210                       printf ("%s", sanitize_string (sym_name));
2211                     }
2212                 }
2213
2214               if (q->addend)
2215                 {
2216                   bfd_signed_vma addend = q->addend;
2217                   if (addend < 0)
2218                     {
2219                       printf ("-0x");
2220                       addend = -addend;
2221                     }
2222                   else
2223                     printf ("+0x");
2224                   objdump_print_value (addend, inf, TRUE);
2225                 }
2226
2227               printf ("\n");
2228               need_nl = FALSE;
2229             }
2230           ++(*relppp);
2231         }
2232
2233       if (need_nl)
2234         printf ("\n");
2235
2236       addr_offset += octets / opb;
2237     }
2238
2239   free (sfile.buffer);
2240 }
2241
2242 static void
2243 disassemble_section (bfd *abfd, asection *section, void *inf)
2244 {
2245   const struct elf_backend_data * bed;
2246   bfd_vma                      sign_adjust = 0;
2247   struct disassemble_info *    pinfo = (struct disassemble_info *) inf;
2248   struct objdump_disasm_info * paux;
2249   unsigned int                 opb = pinfo->octets_per_byte;
2250   bfd_byte *                   data = NULL;
2251   bfd_size_type                datasize = 0;
2252   arelent **                   rel_pp = NULL;
2253   arelent **                   rel_ppstart = NULL;
2254   arelent **                   rel_ppend;
2255   bfd_vma                      stop_offset;
2256   asymbol *                    sym = NULL;
2257   long                         place = 0;
2258   long                         rel_count;
2259   bfd_vma                      rel_offset;
2260   unsigned long                addr_offset;
2261   bfd_boolean                  do_print;
2262   enum loop_control
2263   {
2264    stop_offset_reached,
2265    function_sym,
2266    next_sym
2267   } loop_until;
2268
2269   /* Sections that do not contain machine
2270      code are not normally disassembled.  */
2271   if (! disassemble_all
2272       && only_list == NULL
2273       && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
2274           != (SEC_CODE | SEC_HAS_CONTENTS)))
2275     return;
2276
2277   if (! process_section_p (section))
2278     return;
2279
2280   datasize = bfd_get_section_size (section);
2281   if (datasize == 0)
2282     return;
2283
2284   if (start_address == (bfd_vma) -1
2285       || start_address < section->vma)
2286     addr_offset = 0;
2287   else
2288     addr_offset = start_address - section->vma;
2289
2290   if (stop_address == (bfd_vma) -1)
2291     stop_offset = datasize / opb;
2292   else
2293     {
2294       if (stop_address < section->vma)
2295         stop_offset = 0;
2296       else
2297         stop_offset = stop_address - section->vma;
2298       if (stop_offset > datasize / opb)
2299         stop_offset = datasize / opb;
2300     }
2301
2302   if (addr_offset >= stop_offset)
2303     return;
2304
2305   /* Decide which set of relocs to use.  Load them if necessary.  */
2306   paux = (struct objdump_disasm_info *) pinfo->application_data;
2307   if (paux->dynrelbuf && dump_dynamic_reloc_info)
2308     {
2309       rel_pp = paux->dynrelbuf;
2310       rel_count = paux->dynrelcount;
2311       /* Dynamic reloc addresses are absolute, non-dynamic are section
2312          relative.  REL_OFFSET specifies the reloc address corresponding
2313          to the start of this section.  */
2314       rel_offset = section->vma;
2315     }
2316   else
2317     {
2318       rel_count = 0;
2319       rel_pp = NULL;
2320       rel_offset = 0;
2321
2322       if ((section->flags & SEC_RELOC) != 0
2323           && (dump_reloc_info || pinfo->disassembler_needs_relocs))
2324         {
2325           long relsize;
2326
2327           relsize = bfd_get_reloc_upper_bound (abfd, section);
2328           if (relsize < 0)
2329             bfd_fatal (bfd_get_filename (abfd));
2330
2331           if (relsize > 0)
2332             {
2333               rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
2334               rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
2335               if (rel_count < 0)
2336                 bfd_fatal (bfd_get_filename (abfd));
2337
2338               /* Sort the relocs by address.  */
2339               qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
2340             }
2341         }
2342     }
2343   rel_ppend = rel_pp + rel_count;
2344
2345   if (!bfd_malloc_and_get_section (abfd, section, &data))
2346     {
2347       non_fatal (_("Reading section %s failed because: %s"),
2348                  section->name, bfd_errmsg (bfd_get_error ()));
2349       return;
2350     }
2351
2352   paux->sec = section;
2353   pinfo->buffer = data;
2354   pinfo->buffer_vma = section->vma;
2355   pinfo->buffer_length = datasize;
2356   pinfo->section = section;
2357
2358   /* Skip over the relocs belonging to addresses below the
2359      start address.  */
2360   while (rel_pp < rel_ppend
2361          && (*rel_pp)->address < rel_offset + addr_offset)
2362     ++rel_pp;
2363
2364   printf (_("\nDisassembly of section %s:\n"), sanitize_string (section->name));
2365
2366   /* Find the nearest symbol forwards from our current position.  */
2367   paux->require_sec = TRUE;
2368   sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
2369                                              (struct disassemble_info *) inf,
2370                                              &place);
2371   paux->require_sec = FALSE;
2372
2373   /* PR 9774: If the target used signed addresses then we must make
2374      sure that we sign extend the value that we calculate for 'addr'
2375      in the loop below.  */
2376   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2377       && (bed = get_elf_backend_data (abfd)) != NULL
2378       && bed->sign_extend_vma)
2379     sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
2380
2381   /* Disassemble a block of instructions up to the address associated with
2382      the symbol we have just found.  Then print the symbol and find the
2383      next symbol on.  Repeat until we have disassembled the entire section
2384      or we have reached the end of the address range we are interested in.  */
2385   do_print = paux->symbol == NULL;
2386   loop_until = stop_offset_reached;
2387
2388   while (addr_offset < stop_offset)
2389     {
2390       bfd_vma addr;
2391       asymbol *nextsym;
2392       bfd_vma nextstop_offset;
2393       bfd_boolean insns;
2394
2395       addr = section->vma + addr_offset;
2396       addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
2397
2398       if (sym != NULL && bfd_asymbol_value (sym) <= addr)
2399         {
2400           int x;
2401
2402           for (x = place;
2403                (x < sorted_symcount
2404                 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
2405                ++x)
2406             continue;
2407
2408           pinfo->symbols = sorted_syms + place;
2409           pinfo->num_symbols = x - place;
2410           pinfo->symtab_pos = place;
2411         }
2412       else
2413         {
2414           pinfo->symbols = NULL;
2415           pinfo->num_symbols = 0;
2416           pinfo->symtab_pos = -1;
2417         }
2418
2419       /* If we are only disassembling from a specific symbol,
2420          check to see if we should start or stop displaying.  */
2421       if (sym && paux->symbol)
2422         {
2423           if (do_print)
2424             {
2425               /* See if we should stop printing.  */
2426               switch (loop_until)
2427                 {
2428                 case function_sym:
2429                   if (sym->flags & BSF_FUNCTION)
2430                     do_print = FALSE;
2431                   break;
2432
2433                 case stop_offset_reached:
2434                   /* Handled by the while loop.  */
2435                   break;
2436
2437                 case next_sym:
2438                   /* FIXME: There is an implicit assumption here
2439                      that the name of sym is different from
2440                      paux->symbol.  */
2441                   if (! bfd_is_local_label (abfd, sym))
2442                     do_print = FALSE;
2443                   break;
2444                 }
2445             }
2446           else
2447             {
2448               const char * name = bfd_asymbol_name (sym);
2449               char * alloc = NULL;
2450
2451               if (do_demangle && name[0] != '\0')
2452                 {
2453                   /* Demangle the name.  */
2454                   alloc = bfd_demangle (abfd, name, demangle_flags);
2455                   if (alloc != NULL)
2456                     name = alloc;
2457                 }
2458
2459               /* We are not currently printing.  Check to see
2460                  if the current symbol matches the requested symbol.  */
2461               if (streq (name, paux->symbol))
2462                 {
2463                   do_print = TRUE;
2464
2465                   if (sym->flags & BSF_FUNCTION)
2466                     {
2467                       if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2468                           && ((elf_symbol_type *) sym)->internal_elf_sym.st_size > 0)
2469                         {
2470                           /* Sym is a function symbol with a size associated
2471                              with it.  Turn on automatic disassembly for the
2472                              next VALUE bytes.  */
2473                           stop_offset = addr_offset
2474                             + ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
2475                           loop_until = stop_offset_reached;
2476                         }
2477                       else
2478                         {
2479                           /* Otherwise we need to tell the loop heuristic to
2480                              loop until the next function symbol is encountered.  */
2481                           loop_until = function_sym;
2482                         }
2483                     }
2484                   else
2485                     {
2486                       /* Otherwise loop until the next symbol is encountered.  */
2487                       loop_until = next_sym;
2488                     }
2489                 }
2490
2491               free (alloc);
2492             }
2493         }
2494
2495       if (! prefix_addresses && do_print)
2496         {
2497           pinfo->fprintf_func (pinfo->stream, "\n");
2498           objdump_print_addr_with_sym (abfd, section, sym, addr,
2499                                        pinfo, FALSE);
2500           pinfo->fprintf_func (pinfo->stream, ":\n");
2501         }
2502
2503       if (sym != NULL && bfd_asymbol_value (sym) > addr)
2504         nextsym = sym;
2505       else if (sym == NULL)
2506         nextsym = NULL;
2507       else
2508         {
2509 #define is_valid_next_sym(SYM) \
2510   (strcmp (bfd_section_name (abfd, (SYM)->section), bfd_section_name (abfd, section)) == 0 \
2511    && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
2512    && pinfo->symbol_is_valid (SYM, pinfo))
2513
2514           /* Search forward for the next appropriate symbol in
2515              SECTION.  Note that all the symbols are sorted
2516              together into one big array, and that some sections
2517              may have overlapping addresses.  */
2518           while (place < sorted_symcount
2519                  && ! is_valid_next_sym (sorted_syms [place]))
2520             ++place;
2521
2522           if (place >= sorted_symcount)
2523             nextsym = NULL;
2524           else
2525             nextsym = sorted_syms[place];
2526         }
2527
2528       if (sym != NULL && bfd_asymbol_value (sym) > addr)
2529         nextstop_offset = bfd_asymbol_value (sym) - section->vma;
2530       else if (nextsym == NULL)
2531         nextstop_offset = stop_offset;
2532       else
2533         nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
2534
2535       if (nextstop_offset > stop_offset
2536           || nextstop_offset <= addr_offset)
2537         nextstop_offset = stop_offset;
2538
2539       /* If a symbol is explicitly marked as being an object
2540          rather than a function, just dump the bytes without
2541          disassembling them.  */
2542       if (disassemble_all
2543           || sym == NULL
2544           || sym->section != section
2545           || bfd_asymbol_value (sym) > addr
2546           || ((sym->flags & BSF_OBJECT) == 0
2547               && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
2548                   == NULL)
2549               && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
2550                   == NULL))
2551           || (sym->flags & BSF_FUNCTION) != 0)
2552         insns = TRUE;
2553       else
2554         insns = FALSE;
2555
2556       if (do_print)
2557         disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2558                            addr_offset, nextstop_offset,
2559                            rel_offset, &rel_pp, rel_ppend);
2560
2561       addr_offset = nextstop_offset;
2562       sym = nextsym;
2563     }
2564
2565   free (data);
2566
2567   if (rel_ppstart != NULL)
2568     free (rel_ppstart);
2569 }
2570
2571 /* Disassemble the contents of an object file.  */
2572
2573 static void
2574 disassemble_data (bfd *abfd)
2575 {
2576   struct disassemble_info disasm_info;
2577   struct objdump_disasm_info aux;
2578   long i;
2579
2580   print_files = NULL;
2581   prev_functionname = NULL;
2582   prev_line = -1;
2583   prev_discriminator = 0;
2584
2585   /* We make a copy of syms to sort.  We don't want to sort syms
2586      because that will screw up the relocs.  */
2587   sorted_symcount = symcount ? symcount : dynsymcount;
2588   sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2589                                       * sizeof (asymbol *));
2590   memcpy (sorted_syms, symcount ? syms : dynsyms,
2591           sorted_symcount * sizeof (asymbol *));
2592
2593   sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2594
2595   for (i = 0; i < synthcount; ++i)
2596     {
2597       sorted_syms[sorted_symcount] = synthsyms + i;
2598       ++sorted_symcount;
2599     }
2600
2601   /* Sort the symbols into section and symbol order.  */
2602   qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2603
2604   init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
2605
2606   disasm_info.application_data = (void *) &aux;
2607   aux.abfd = abfd;
2608   aux.require_sec = FALSE;
2609   aux.dynrelbuf = NULL;
2610   aux.dynrelcount = 0;
2611   aux.reloc = NULL;
2612   aux.symbol = disasm_sym;
2613
2614   disasm_info.print_address_func = objdump_print_address;
2615   disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2616
2617   if (machine != NULL)
2618     {
2619       const bfd_arch_info_type *inf = bfd_scan_arch (machine);
2620
2621       if (inf == NULL)
2622         fatal (_("can't use supplied machine %s"), machine);
2623
2624       abfd->arch_info = inf;
2625     }
2626
2627   if (endian != BFD_ENDIAN_UNKNOWN)
2628     {
2629       struct bfd_target *xvec;
2630
2631       xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
2632       memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2633       xvec->byteorder = endian;
2634       abfd->xvec = xvec;
2635     }
2636
2637   /* Use libopcodes to locate a suitable disassembler.  */
2638   aux.disassemble_fn = disassembler (bfd_get_arch (abfd),
2639                                      bfd_big_endian (abfd),
2640                                      bfd_get_mach (abfd), abfd);
2641   if (!aux.disassemble_fn)
2642     {
2643       non_fatal (_("can't disassemble for architecture %s\n"),
2644                  bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2645       exit_status = 1;
2646       return;
2647     }
2648
2649   disasm_info.flavour = bfd_get_flavour (abfd);
2650   disasm_info.arch = bfd_get_arch (abfd);
2651   disasm_info.mach = bfd_get_mach (abfd);
2652   disasm_info.disassembler_options = disassembler_options;
2653   disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2654   disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2655   disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2656   disasm_info.disassembler_needs_relocs = FALSE;
2657
2658   if (bfd_big_endian (abfd))
2659     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2660   else if (bfd_little_endian (abfd))
2661     disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2662   else
2663     /* ??? Aborting here seems too drastic.  We could default to big or little
2664        instead.  */
2665     disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2666
2667   /* Allow the target to customize the info structure.  */
2668   disassemble_init_for_target (& disasm_info);
2669
2670   /* Pre-load the dynamic relocs as we may need them during the disassembly.  */
2671     {
2672       long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2673
2674       if (relsize < 0 && dump_dynamic_reloc_info)
2675         bfd_fatal (bfd_get_filename (abfd));
2676
2677       if (relsize > 0)
2678         {
2679           aux.dynrelbuf = (arelent **) xmalloc (relsize);
2680           aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2681                                                             aux.dynrelbuf,
2682                                                             dynsyms);
2683           if (aux.dynrelcount < 0)
2684             bfd_fatal (bfd_get_filename (abfd));
2685
2686           /* Sort the relocs by address.  */
2687           qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2688                  compare_relocs);
2689         }
2690     }
2691   disasm_info.symtab = sorted_syms;
2692   disasm_info.symtab_size = sorted_symcount;
2693
2694   bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2695
2696   if (aux.dynrelbuf != NULL)
2697     free (aux.dynrelbuf);
2698   free (sorted_syms);
2699 }
2700 \f
2701 static bfd_boolean
2702 load_specific_debug_section (enum dwarf_section_display_enum debug,
2703                              asection *sec, void *file)
2704 {
2705   struct dwarf_section *section = &debug_displays [debug].section;
2706   bfd *abfd = (bfd *) file;
2707   bfd_byte *contents;
2708   bfd_size_type amt;
2709   size_t alloced;
2710
2711   if (section->start != NULL)
2712     {
2713       /* If it is already loaded, do nothing.  */
2714       if (streq (section->filename, bfd_get_filename (abfd)))
2715         return TRUE;
2716       free (section->start);
2717     }
2718
2719   section->filename = bfd_get_filename (abfd);
2720   section->reloc_info = NULL;
2721   section->num_relocs = 0;
2722   section->address = bfd_get_section_vma (abfd, sec);
2723   section->user_data = sec;
2724   section->size = bfd_get_section_size (sec);
2725   /* PR 24360: On 32-bit hosts sizeof (size_t) < sizeof (bfd_size_type). */
2726   alloced = amt = section->size + 1;
2727   if (alloced != amt || alloced == 0)
2728     {
2729       section->start = NULL;
2730       free_debug_section (debug);
2731       printf (_("\nSection '%s' has an invalid size: %#llx.\n"),
2732               sanitize_string (section->name),
2733               (unsigned long long) section->size);
2734       return FALSE;
2735     }
2736   section->start = contents = malloc (alloced);
2737   if (section->start == NULL
2738       || !bfd_get_full_section_contents (abfd, sec, &contents))
2739     {
2740       free_debug_section (debug);
2741       printf (_("\nCan't get contents for section '%s'.\n"),
2742               sanitize_string (section->name));
2743       return FALSE;
2744     }
2745   /* Ensure any string section has a terminating NUL.  */
2746   section->start[section->size] = 0;
2747
2748   if (is_relocatable && debug_displays [debug].relocate)
2749     {
2750       long         reloc_size;
2751       bfd_boolean  ret;
2752
2753       bfd_cache_section_contents (sec, section->start);
2754
2755       ret = bfd_simple_get_relocated_section_contents (abfd,
2756                                                        sec,
2757                                                        section->start,
2758                                                        syms) != NULL;
2759
2760       if (! ret)
2761         {
2762           free_debug_section (debug);
2763           printf (_("\nCan't get contents for section '%s'.\n"),
2764                   sanitize_string (section->name));
2765           return FALSE;
2766         }
2767
2768       reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
2769       if (reloc_size > 0)
2770         {
2771           unsigned long reloc_count;
2772           arelent **relocs;
2773
2774           relocs = (arelent **) xmalloc (reloc_size);
2775
2776           reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
2777           if (reloc_count == 0)
2778             free (relocs);
2779           else
2780             {
2781               section->reloc_info = relocs;
2782               section->num_relocs = reloc_count;
2783             }
2784         }
2785     }
2786
2787   return TRUE;
2788 }
2789
2790 bfd_boolean
2791 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
2792 {
2793   arelent ** relocs;
2794   arelent * rp;
2795
2796   if (dsec == NULL || dsec->reloc_info == NULL)
2797     return FALSE;
2798
2799   relocs = (arelent **) dsec->reloc_info;
2800
2801   for (; (rp = * relocs) != NULL; ++ relocs)
2802     if (rp->address == offset)
2803       return TRUE;
2804
2805   return FALSE;
2806 }
2807
2808 bfd_boolean
2809 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2810 {
2811   struct dwarf_section *section = &debug_displays [debug].section;
2812   bfd *abfd = (bfd *) file;
2813   asection *sec;
2814
2815   /* If it is already loaded, do nothing.  */
2816   if (section->start != NULL)
2817     {
2818       if (streq (section->filename, bfd_get_filename (abfd)))
2819         return TRUE;
2820     }
2821
2822   /* Locate the debug section.  */
2823   sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2824   if (sec != NULL)
2825     section->name = section->uncompressed_name;
2826   else
2827     {
2828       sec = bfd_get_section_by_name (abfd, section->compressed_name);
2829       if (sec != NULL)
2830         section->name = section->compressed_name;
2831     }
2832   if (sec == NULL)
2833     return FALSE;
2834
2835   return load_specific_debug_section (debug, sec, file);
2836 }
2837
2838 void
2839 free_debug_section (enum dwarf_section_display_enum debug)
2840 {
2841   struct dwarf_section *section = &debug_displays [debug].section;
2842
2843   if (section->start == NULL)
2844     return;
2845
2846   /* PR 17512: file: 0f67f69d.  */
2847   if (section->user_data != NULL)
2848     {
2849       asection * sec = (asection *) section->user_data;
2850
2851       /* If we are freeing contents that are also pointed to by the BFD
2852          library's section structure then make sure to update those pointers
2853          too.  Otherwise, the next time we try to load data for this section
2854          we can end up using a stale pointer.  */
2855       if (section->start == sec->contents)
2856         {
2857           sec->contents = NULL;
2858           sec->flags &= ~ SEC_IN_MEMORY;
2859           sec->compress_status = COMPRESS_SECTION_NONE;
2860         }
2861     }
2862
2863   free ((char *) section->start);
2864   section->start = NULL;
2865   section->address = 0;
2866   section->size = 0;
2867 }
2868
2869 void
2870 close_debug_file (void * file)
2871 {
2872   bfd * abfd = (bfd *) file;
2873
2874   bfd_close (abfd);
2875 }
2876
2877 void *
2878 open_debug_file (const char * pathname)
2879 {
2880   bfd * data;
2881
2882   data = bfd_openr (pathname, NULL);
2883   if (data == NULL)
2884     return NULL;
2885
2886   if (! bfd_check_format (data, bfd_object))
2887     return NULL;
2888   
2889   return data;
2890 }
2891
2892 static void
2893 dump_dwarf_section (bfd *abfd, asection *section,
2894                     void *arg ATTRIBUTE_UNUSED)
2895 {
2896   const char *name = bfd_get_section_name (abfd, section);
2897   const char *match;
2898   int i;
2899
2900   if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2901     match = ".debug_info";
2902   else
2903     match = name;
2904
2905   for (i = 0; i < max; i++)
2906     if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2907          || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2908         && debug_displays [i].enabled != NULL
2909         && *debug_displays [i].enabled)
2910       {
2911         struct dwarf_section *sec = &debug_displays [i].section;
2912
2913         if (strcmp (sec->uncompressed_name, match) == 0)
2914           sec->name = sec->uncompressed_name;
2915         else
2916           sec->name = sec->compressed_name;
2917         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2918                                          section, abfd))
2919           {
2920             debug_displays [i].display (sec, abfd);
2921
2922             if (i != info && i != abbrev)
2923               free_debug_section ((enum dwarf_section_display_enum) i);
2924           }
2925         break;
2926       }
2927 }
2928
2929 /* Dump the dwarf debugging information.  */
2930
2931 static void
2932 dump_dwarf (bfd *abfd)
2933 {
2934   /* The byte_get pointer should have been set at the start of dump_bfd().  */
2935   if (byte_get == NULL)
2936     {
2937       warn (_("File %s does not contain any dwarf debug information\n"),
2938             bfd_get_filename (abfd));
2939       return;
2940     }
2941
2942   is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2943
2944   eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
2945
2946   switch (bfd_get_arch (abfd))
2947     {
2948     case bfd_arch_i386:
2949       switch (bfd_get_mach (abfd))
2950         {
2951         case bfd_mach_x86_64:
2952         case bfd_mach_x86_64_intel_syntax:
2953         case bfd_mach_x86_64_nacl:
2954         case bfd_mach_x64_32:
2955         case bfd_mach_x64_32_intel_syntax:
2956         case bfd_mach_x64_32_nacl:
2957           init_dwarf_regnames_x86_64 ();
2958           break;
2959
2960         default:
2961           init_dwarf_regnames_i386 ();
2962           break;
2963         }
2964       break;
2965
2966     case bfd_arch_iamcu:
2967       init_dwarf_regnames_iamcu ();
2968       break;
2969
2970     case bfd_arch_aarch64:
2971       init_dwarf_regnames_aarch64();
2972       break;
2973
2974     case bfd_arch_s390:
2975       init_dwarf_regnames_s390 ();
2976       break;
2977
2978     case bfd_arch_riscv:
2979       init_dwarf_regnames_riscv ();
2980       break;
2981
2982     case bfd_arch_s12z:
2983       /* S12Z has a 24 bit address space.  But the only known
2984          producer of dwarf_info encodes addresses into 32 bits.  */
2985       eh_addr_size = 4;
2986       break;
2987
2988     default:
2989       break;
2990     }
2991
2992   bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2993 }
2994 \f
2995 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2996    it.  Return NULL on failure.   */
2997
2998 static bfd_byte *
2999 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr,
3000                     bfd_size_type *entsize_ptr)
3001 {
3002   asection *stabsect;
3003   bfd_byte *contents;
3004
3005   stabsect = bfd_get_section_by_name (abfd, sect_name);
3006   if (stabsect == NULL)
3007     {
3008       printf (_("No %s section present\n\n"),
3009               sanitize_string (sect_name));
3010       return FALSE;
3011     }
3012
3013   if (!bfd_malloc_and_get_section (abfd, stabsect, &contents))
3014     {
3015       non_fatal (_("reading %s section of %s failed: %s"),
3016                  sect_name, bfd_get_filename (abfd),
3017                  bfd_errmsg (bfd_get_error ()));
3018       exit_status = 1;
3019       free (contents);
3020       return NULL;
3021     }
3022
3023   *size_ptr = bfd_section_size (abfd, stabsect);
3024   if (entsize_ptr)
3025     *entsize_ptr = stabsect->entsize;
3026
3027   return contents;
3028 }
3029
3030 /* Stabs entries use a 12 byte format:
3031      4 byte string table index
3032      1 byte stab type
3033      1 byte stab other field
3034      2 byte stab desc field
3035      4 byte stab value
3036    FIXME: This will have to change for a 64 bit object format.  */
3037
3038 #define STRDXOFF  (0)
3039 #define TYPEOFF   (4)
3040 #define OTHEROFF  (5)
3041 #define DESCOFF   (6)
3042 #define VALOFF    (8)
3043 #define STABSIZE (12)
3044
3045 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
3046    using string table section STRSECT_NAME (in `strtab').  */
3047
3048 static void
3049 print_section_stabs (bfd *abfd,
3050                      const char *stabsect_name,
3051                      unsigned *string_offset_ptr)
3052 {
3053   int i;
3054   unsigned file_string_table_offset = 0;
3055   unsigned next_file_string_table_offset = *string_offset_ptr;
3056   bfd_byte *stabp, *stabs_end;
3057
3058   stabp = stabs;
3059   stabs_end = stabp + stab_size;
3060
3061   printf (_("Contents of %s section:\n\n"), sanitize_string (stabsect_name));
3062   printf ("Symnum n_type n_othr n_desc n_value  n_strx String\n");
3063
3064   /* Loop through all symbols and print them.
3065
3066      We start the index at -1 because there is a dummy symbol on
3067      the front of stabs-in-{coff,elf} sections that supplies sizes.  */
3068   for (i = -1; stabp <= stabs_end - STABSIZE; stabp += STABSIZE, i++)
3069     {
3070       const char *name;
3071       unsigned long strx;
3072       unsigned char type, other;
3073       unsigned short desc;
3074       bfd_vma value;
3075
3076       strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
3077       type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
3078       other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
3079       desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
3080       value = bfd_h_get_32 (abfd, stabp + VALOFF);
3081
3082       printf ("\n%-6d ", i);
3083       /* Either print the stab name, or, if unnamed, print its number
3084          again (makes consistent formatting for tools like awk).  */
3085       name = bfd_get_stab_name (type);
3086       if (name != NULL)
3087         printf ("%-6s", sanitize_string (name));
3088       else if (type == N_UNDF)
3089         printf ("HdrSym");
3090       else
3091         printf ("%-6d", type);
3092       printf (" %-6d %-6d ", other, desc);
3093       bfd_printf_vma (abfd, value);
3094       printf (" %-6lu", strx);
3095
3096       /* Symbols with type == 0 (N_UNDF) specify the length of the
3097          string table associated with this file.  We use that info
3098          to know how to relocate the *next* file's string table indices.  */
3099       if (type == N_UNDF)
3100         {
3101           file_string_table_offset = next_file_string_table_offset;
3102           next_file_string_table_offset += value;
3103         }
3104       else
3105         {
3106           bfd_size_type amt = strx + file_string_table_offset;
3107
3108           /* Using the (possibly updated) string table offset, print the
3109              string (if any) associated with this symbol.  */
3110           if (amt < stabstr_size)
3111             /* PR 17512: file: 079-79389-0.001:0.1.
3112                FIXME: May need to sanitize this string before displaying.  */
3113             printf (" %.*s", (int)(stabstr_size - amt), strtab + amt);
3114           else
3115             printf (" *");
3116         }
3117     }
3118   printf ("\n\n");
3119   *string_offset_ptr = next_file_string_table_offset;
3120 }
3121
3122 typedef struct
3123 {
3124   const char * section_name;
3125   const char * string_section_name;
3126   unsigned string_offset;
3127 }
3128 stab_section_names;
3129
3130 static void
3131 find_stabs_section (bfd *abfd, asection *section, void *names)
3132 {
3133   int len;
3134   stab_section_names * sought = (stab_section_names *) names;
3135
3136   /* Check for section names for which stabsect_name is a prefix, to
3137      handle .stab.N, etc.  */
3138   len = strlen (sought->section_name);
3139
3140   /* If the prefix matches, and the files section name ends with a
3141      nul or a digit, then we match.  I.e., we want either an exact
3142      match or a section followed by a number.  */
3143   if (strncmp (sought->section_name, section->name, len) == 0
3144       && (section->name[len] == 0
3145           || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
3146     {
3147       if (strtab == NULL)
3148         strtab = read_section_stabs (abfd, sought->string_section_name,
3149                                      &stabstr_size, NULL);
3150
3151       if (strtab)
3152         {
3153           stabs = read_section_stabs (abfd, section->name, &stab_size, NULL);
3154           if (stabs)
3155             print_section_stabs (abfd, section->name, &sought->string_offset);
3156         }
3157     }
3158 }
3159
3160 static void
3161 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
3162 {
3163   stab_section_names s;
3164
3165   s.section_name = stabsect_name;
3166   s.string_section_name = strsect_name;
3167   s.string_offset = 0;
3168
3169   bfd_map_over_sections (abfd, find_stabs_section, & s);
3170
3171   free (strtab);
3172   strtab = NULL;
3173 }
3174
3175 /* Dump the any sections containing stabs debugging information.  */
3176
3177 static void
3178 dump_stabs (bfd *abfd)
3179 {
3180   dump_stabs_section (abfd, ".stab", ".stabstr");
3181   dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
3182   dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
3183
3184   /* For Darwin.  */
3185   dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
3186
3187   dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
3188 }
3189 \f
3190 static void
3191 dump_bfd_header (bfd *abfd)
3192 {
3193   char *comma = "";
3194
3195   printf (_("architecture: %s, "),
3196           bfd_printable_arch_mach (bfd_get_arch (abfd),
3197                                    bfd_get_mach (abfd)));
3198   printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
3199
3200 #define PF(x, y)    if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
3201   PF (HAS_RELOC, "HAS_RELOC");
3202   PF (EXEC_P, "EXEC_P");
3203   PF (HAS_LINENO, "HAS_LINENO");
3204   PF (HAS_DEBUG, "HAS_DEBUG");
3205   PF (HAS_SYMS, "HAS_SYMS");
3206   PF (HAS_LOCALS, "HAS_LOCALS");
3207   PF (DYNAMIC, "DYNAMIC");
3208   PF (WP_TEXT, "WP_TEXT");
3209   PF (D_PAGED, "D_PAGED");
3210   PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
3211   printf (_("\nstart address 0x"));
3212   bfd_printf_vma (abfd, abfd->start_address);
3213   printf ("\n");
3214 }
3215 \f
3216
3217 /* Formatting callback function passed to ctf_dump.  Returns either the pointer
3218    it is passed, or a pointer to newly-allocated storage, in which case
3219    dump_ctf() will free it when it no longer needs it.  */
3220
3221 static char *
3222 dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
3223                        char *s, void *arg)
3224 {
3225   const char *blanks = arg;
3226   char *new_s;
3227
3228   if (asprintf (&new_s, "%s%s", blanks, s) < 0)
3229     return s;
3230   return new_s;
3231 }
3232
3233 /* Make a ctfsect suitable for ctf_bfdopen_ctfsect().  */
3234 static ctf_sect_t
3235 make_ctfsect (const char *name, bfd_byte *data,
3236               bfd_size_type size)
3237 {
3238   ctf_sect_t ctfsect;
3239
3240   ctfsect.cts_name = name;
3241   ctfsect.cts_entsize = 1;
3242   ctfsect.cts_size = size;
3243   ctfsect.cts_data = data;
3244
3245   return ctfsect;
3246 }
3247
3248 /* Dump one CTF archive member.  */
3249
3250 static int
3251 dump_ctf_archive_member (ctf_file_t *ctf, const char *name, void *arg)
3252 {
3253   ctf_file_t *parent = (ctf_file_t *) arg;
3254   const char *things[] = {"Labels", "Data objects", "Function objects",
3255                           "Variables", "Types", "Strings", ""};
3256   const char **thing;
3257   size_t i;
3258
3259   /* Only print out the name of non-default-named archive members.
3260      The name .ctf appears everywhere, even for things that aren't
3261      really archives, so printing it out is liable to be confusing.  */
3262   if (strcmp (name, ".ctf") != 0)
3263     printf (_("\nCTF archive member: %s:\n"), sanitize_string (name));
3264
3265   ctf_import (ctf, parent);
3266   for (i = 1, thing = things; *thing[0]; thing++, i++)
3267     {
3268       ctf_dump_state_t *s = NULL;
3269       char *item;
3270
3271       printf ("\n  %s:\n", *thing);
3272       while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
3273                                (void *) "    ")) != NULL)
3274         {
3275           printf ("%s\n", item);
3276           free (item);
3277         }
3278
3279       if (ctf_errno (ctf))
3280         {
3281           non_fatal (_("Iteration failed: %s, %s\n"), *thing,
3282                    ctf_errmsg (ctf_errno (ctf)));
3283           break;
3284         }
3285     }
3286   return 0;
3287 }
3288
3289 /* Dump the CTF debugging information.  */
3290
3291 static void
3292 dump_ctf (bfd *abfd, const char *sect_name, const char *parent_name)
3293 {
3294   ctf_archive_t *ctfa, *parenta = NULL;
3295   bfd_byte *ctfdata, *parentdata = NULL;
3296   bfd_size_type ctfsize, parentsize;
3297   ctf_sect_t ctfsect;
3298   ctf_file_t *parent = NULL;
3299   int err;
3300
3301   if ((ctfdata = read_section_stabs (abfd, sect_name, &ctfsize, NULL)) == NULL)
3302       bfd_fatal (bfd_get_filename (abfd));
3303
3304   if (parent_name
3305       && (parentdata = read_section_stabs (abfd, parent_name, &parentsize,
3306                                            NULL)) == NULL)
3307       bfd_fatal (bfd_get_filename (abfd));
3308
3309   /* Load the CTF file and dump it.  */
3310
3311   ctfsect = make_ctfsect (sect_name, ctfdata, ctfsize);
3312   if ((ctfa = ctf_bfdopen_ctfsect (abfd, &ctfsect, &err)) == NULL)
3313     {
3314       non_fatal (_("CTF open failure: %s\n"), ctf_errmsg (err));
3315       bfd_fatal (bfd_get_filename (abfd));
3316     }
3317
3318   if (parentdata)
3319     {
3320       ctfsect = make_ctfsect (parent_name, parentdata, parentsize);
3321       if ((parenta = ctf_bfdopen_ctfsect (abfd, &ctfsect, &err)) == NULL)
3322         {
3323           non_fatal (_("CTF open failure: %s\n"), ctf_errmsg (err));
3324           bfd_fatal (bfd_get_filename (abfd));
3325         }
3326
3327       /* Assume that the applicable parent archive member is the default one.
3328          (This is what all known implementations are expected to do, if they
3329          put CTFs and their parents in archives together.)  */
3330       if ((parent = ctf_arc_open_by_name (parenta, NULL, &err)) == NULL)
3331         {
3332           non_fatal (_("CTF open failure: %s\n"), ctf_errmsg (err));
3333           bfd_fatal (bfd_get_filename (abfd));
3334         }
3335     }
3336
3337   printf (_("Contents of CTF section %s:\n"), sanitize_string (sect_name));
3338
3339   ctf_archive_iter (ctfa, dump_ctf_archive_member, parent);
3340   ctf_file_close (parent);
3341   ctf_close (ctfa);
3342   ctf_close (parenta);
3343   free (parentdata);
3344   free (ctfdata);
3345 }
3346
3347 \f
3348 static void
3349 dump_bfd_private_header (bfd *abfd)
3350 {
3351   if (!bfd_print_private_bfd_data (abfd, stdout))
3352     non_fatal (_("warning: private headers incomplete: %s"),
3353                bfd_errmsg (bfd_get_error ()));
3354 }
3355
3356 static void
3357 dump_target_specific (bfd *abfd)
3358 {
3359   const struct objdump_private_desc * const *desc;
3360   struct objdump_private_option *opt;
3361   char *e, *b;
3362
3363   /* Find the desc.  */
3364   for (desc = objdump_private_vectors; *desc != NULL; desc++)
3365     if ((*desc)->filter (abfd))
3366       break;
3367
3368   if (*desc == NULL)
3369     {
3370       non_fatal (_("option -P/--private not supported by this file"));
3371       return;
3372     }
3373
3374   /* Clear all options.  */
3375   for (opt = (*desc)->options; opt->name; opt++)
3376     opt->selected = FALSE;
3377
3378   /* Decode options.  */
3379   b = dump_private_options;
3380   do
3381     {
3382       e = strchr (b, ',');
3383
3384       if (e)
3385         *e = 0;
3386
3387       for (opt = (*desc)->options; opt->name; opt++)
3388         if (strcmp (opt->name, b) == 0)
3389           {
3390             opt->selected = TRUE;
3391             break;
3392           }
3393       if (opt->name == NULL)
3394         non_fatal (_("target specific dump '%s' not supported"), b);
3395
3396       if (e)
3397         {
3398           *e = ',';
3399           b = e + 1;
3400         }
3401     }
3402   while (e != NULL);
3403
3404   /* Dump.  */
3405   (*desc)->dump (abfd);
3406 }
3407 \f
3408 /* Display a section in hexadecimal format with associated characters.
3409    Each line prefixed by the zero padded address.  */
3410
3411 static void
3412 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
3413 {
3414   bfd_byte *data = NULL;
3415   bfd_size_type datasize;
3416   bfd_vma addr_offset;
3417   bfd_vma start_offset;
3418   bfd_vma stop_offset;
3419   unsigned int opb = bfd_octets_per_byte (abfd);
3420   /* Bytes per line.  */
3421   const int onaline = 16;
3422   char buf[64];
3423   int count;
3424   int width;
3425
3426   if ((section->flags & SEC_HAS_CONTENTS) == 0)
3427     return;
3428
3429   if (! process_section_p (section))
3430     return;
3431
3432   if ((datasize = bfd_section_size (abfd, section)) == 0)
3433     return;
3434
3435   /* Compute the address range to display.  */
3436   if (start_address == (bfd_vma) -1
3437       || start_address < section->vma)
3438     start_offset = 0;
3439   else
3440     start_offset = start_address - section->vma;
3441
3442   if (stop_address == (bfd_vma) -1)
3443     stop_offset = datasize / opb;
3444   else
3445     {
3446       if (stop_address < section->vma)
3447         stop_offset = 0;
3448       else
3449         stop_offset = stop_address - section->vma;
3450
3451       if (stop_offset > datasize / opb)
3452         stop_offset = datasize / opb;
3453     }
3454
3455   if (start_offset >= stop_offset)
3456     return;
3457
3458   printf (_("Contents of section %s:"), sanitize_string (section->name));
3459   if (display_file_offsets)
3460     printf (_("  (Starting at file offset: 0x%lx)"),
3461             (unsigned long) (section->filepos + start_offset));
3462   printf ("\n");
3463
3464   if (!bfd_get_full_section_contents (abfd, section, &data))
3465     {
3466       non_fatal (_("Reading section %s failed because: %s"),
3467                  section->name, bfd_errmsg (bfd_get_error ()));
3468       return;
3469     }
3470
3471   width = 4;
3472
3473   bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
3474   if (strlen (buf) >= sizeof (buf))
3475     abort ();
3476
3477   count = 0;
3478   while (buf[count] == '0' && buf[count+1] != '\0')
3479     count++;
3480   count = strlen (buf) - count;
3481   if (count > width)
3482     width = count;
3483
3484   bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
3485   if (strlen (buf) >= sizeof (buf))
3486     abort ();
3487
3488   count = 0;
3489   while (buf[count] == '0' && buf[count+1] != '\0')
3490     count++;
3491   count = strlen (buf) - count;
3492   if (count > width)
3493     width = count;
3494
3495   for (addr_offset = start_offset;
3496        addr_offset < stop_offset; addr_offset += onaline / opb)
3497     {
3498       bfd_size_type j;
3499
3500       bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
3501       count = strlen (buf);
3502       if ((size_t) count >= sizeof (buf))
3503         abort ();
3504
3505       putchar (' ');
3506       while (count < width)
3507         {
3508           putchar ('0');
3509           count++;
3510         }
3511       fputs (buf + count - width, stdout);
3512       putchar (' ');
3513
3514       for (j = addr_offset * opb;
3515            j < addr_offset * opb + onaline; j++)
3516         {
3517           if (j < stop_offset * opb)
3518             printf ("%02x", (unsigned) (data[j]));
3519           else
3520             printf ("  ");
3521           if ((j & 3) == 3)
3522             printf (" ");
3523         }
3524
3525       printf (" ");
3526       for (j = addr_offset * opb;
3527            j < addr_offset * opb + onaline; j++)
3528         {
3529           if (j >= stop_offset * opb)
3530             printf (" ");
3531           else
3532             printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
3533         }
3534       putchar ('\n');
3535     }
3536   free (data);
3537 }
3538
3539 /* Actually display the various requested regions.  */
3540
3541 static void
3542 dump_data (bfd *abfd)
3543 {
3544   bfd_map_over_sections (abfd, dump_section, NULL);
3545 }
3546
3547 /* Should perhaps share code and display with nm?  */
3548
3549 static void
3550 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
3551 {
3552   asymbol **current;
3553   long max_count;
3554   long count;
3555
3556   if (dynamic)
3557     {
3558       current = dynsyms;
3559       max_count = dynsymcount;
3560       printf ("DYNAMIC SYMBOL TABLE:\n");
3561     }
3562   else
3563     {
3564       current = syms;
3565       max_count = symcount;
3566       printf ("SYMBOL TABLE:\n");
3567     }
3568
3569   if (max_count == 0)
3570     printf (_("no symbols\n"));
3571
3572   for (count = 0; count < max_count; count++)
3573     {
3574       bfd *cur_bfd;
3575
3576       if (*current == NULL)
3577         printf (_("no information for symbol number %ld\n"), count);
3578
3579       else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
3580         printf (_("could not determine the type of symbol number %ld\n"),
3581                 count);
3582
3583       else if (process_section_p ((* current)->section)
3584                && (dump_special_syms
3585                    || !bfd_is_target_special_symbol (cur_bfd, *current)))
3586         {
3587           const char *name = (*current)->name;
3588
3589           if (do_demangle && name != NULL && *name != '\0')
3590             {
3591               char *alloc;
3592
3593               /* If we want to demangle the name, we demangle it
3594                  here, and temporarily clobber it while calling
3595                  bfd_print_symbol.  FIXME: This is a gross hack.  */
3596               alloc = bfd_demangle (cur_bfd, name, demangle_flags);
3597               if (alloc != NULL)
3598                 (*current)->name = alloc;
3599               bfd_print_symbol (cur_bfd, stdout, *current,
3600                                 bfd_print_symbol_all);
3601               if (alloc != NULL)
3602                 {
3603                   (*current)->name = name;
3604                   free (alloc);
3605                 }
3606             }
3607           else
3608             bfd_print_symbol (cur_bfd, stdout, *current,
3609                               bfd_print_symbol_all);
3610           printf ("\n");
3611         }
3612
3613       current++;
3614     }
3615   printf ("\n\n");
3616 }
3617 \f
3618 static void
3619 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
3620 {
3621   arelent **p;
3622   char *last_filename, *last_functionname;
3623   unsigned int last_line;
3624   unsigned int last_discriminator;
3625
3626   /* Get column headers lined up reasonably.  */
3627   {
3628     static int width;
3629
3630     if (width == 0)
3631       {
3632         char buf[30];
3633
3634         bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
3635         width = strlen (buf) - 7;
3636       }
3637     printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
3638   }
3639
3640   last_filename = NULL;
3641   last_functionname = NULL;
3642   last_line = 0;
3643   last_discriminator = 0;
3644
3645   for (p = relpp; relcount && *p != NULL; p++, relcount--)
3646     {
3647       arelent *q = *p;
3648       const char *filename, *functionname;
3649       unsigned int linenumber;
3650       unsigned int discriminator;
3651       const char *sym_name;
3652       const char *section_name;
3653       bfd_vma addend2 = 0;
3654
3655       if (start_address != (bfd_vma) -1
3656           && q->address < start_address)
3657         continue;
3658       if (stop_address != (bfd_vma) -1
3659           && q->address > stop_address)
3660         continue;
3661
3662       if (with_line_numbers
3663           && sec != NULL
3664           && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
3665                                                   &filename, &functionname,
3666                                                   &linenumber, &discriminator))
3667         {
3668           if (functionname != NULL
3669               && (last_functionname == NULL
3670                   || strcmp (functionname, last_functionname) != 0))
3671             {
3672               printf ("%s():\n", sanitize_string (functionname));
3673               if (last_functionname != NULL)
3674                 free (last_functionname);
3675               last_functionname = xstrdup (functionname);
3676             }
3677
3678           if (linenumber > 0
3679               && (linenumber != last_line
3680                   || (filename != NULL
3681                       && last_filename != NULL
3682                       && filename_cmp (filename, last_filename) != 0)
3683                   || (discriminator != last_discriminator)))
3684             {
3685               if (discriminator > 0)
3686                 printf ("%s:%u\n", filename == NULL ? "???" :
3687                         sanitize_string (filename), linenumber);
3688               else
3689                 printf ("%s:%u (discriminator %u)\n",
3690                         filename == NULL ? "???" : sanitize_string (filename),
3691                         linenumber, discriminator);
3692               last_line = linenumber;
3693               last_discriminator = discriminator;
3694               if (last_filename != NULL)
3695                 free (last_filename);
3696               if (filename == NULL)
3697                 last_filename = NULL;
3698               else
3699                 last_filename = xstrdup (filename);
3700             }
3701         }
3702
3703       if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
3704         {
3705           sym_name = (*(q->sym_ptr_ptr))->name;
3706           section_name = (*(q->sym_ptr_ptr))->section->name;
3707         }
3708       else
3709         {
3710           sym_name = NULL;
3711           section_name = NULL;
3712         }
3713
3714       bfd_printf_vma (abfd, q->address);
3715       if (q->howto == NULL)
3716         printf (" *unknown*         ");
3717       else if (q->howto->name)
3718         {
3719           const char *name = q->howto->name;
3720
3721           /* R_SPARC_OLO10 relocations contain two addends.
3722              But because 'arelent' lacks enough storage to
3723              store them both, the 64-bit ELF Sparc backend
3724              records this as two relocations.  One R_SPARC_LO10
3725              and one R_SPARC_13, both pointing to the same
3726              address.  This is merely so that we have some
3727              place to store both addend fields.
3728
3729              Undo this transformation, otherwise the output
3730              will be confusing.  */
3731           if (abfd->xvec->flavour == bfd_target_elf_flavour
3732               && elf_tdata(abfd)->elf_header->e_machine == EM_SPARCV9
3733               && relcount > 1
3734               && !strcmp (q->howto->name, "R_SPARC_LO10"))
3735             {
3736               arelent *q2 = *(p + 1);
3737               if (q2 != NULL
3738                   && q2->howto
3739                   && q->address == q2->address
3740                   && !strcmp (q2->howto->name, "R_SPARC_13"))
3741                 {
3742                   name = "R_SPARC_OLO10";
3743                   addend2 = q2->addend;
3744                   p++;
3745                 }
3746             }
3747           printf (" %-16s  ", name);
3748         }
3749       else
3750         printf (" %-16d  ", q->howto->type);
3751
3752       if (sym_name)
3753         {
3754           objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
3755         }
3756       else
3757         {
3758           if (section_name == NULL)
3759             section_name = "*unknown*";
3760           printf ("[%s]", sanitize_string (section_name));
3761         }
3762
3763       if (q->addend)
3764         {
3765           bfd_signed_vma addend = q->addend;
3766           if (addend < 0)
3767             {
3768               printf ("-0x");
3769               addend = -addend;
3770             }
3771           else
3772             printf ("+0x");
3773           bfd_printf_vma (abfd, addend);
3774         }
3775       if (addend2)
3776         {
3777           printf ("+0x");
3778           bfd_printf_vma (abfd, addend2);
3779         }
3780
3781       printf ("\n");
3782     }
3783
3784   if (last_filename != NULL)
3785     free (last_filename);
3786   if (last_functionname != NULL)
3787     free (last_functionname);
3788 }
3789
3790 static void
3791 dump_relocs_in_section (bfd *abfd,
3792                         asection *section,
3793                         void *dummy ATTRIBUTE_UNUSED)
3794 {
3795   arelent **relpp = NULL;
3796   long relcount;
3797   long relsize;
3798
3799   if (   bfd_is_abs_section (section)
3800       || bfd_is_und_section (section)
3801       || bfd_is_com_section (section)
3802       || (! process_section_p (section))
3803       || ((section->flags & SEC_RELOC) == 0))
3804     return;
3805
3806   printf ("RELOCATION RECORDS FOR [%s]:", sanitize_string (section->name));
3807
3808   relsize = bfd_get_reloc_upper_bound (abfd, section);
3809   if (relsize == 0)
3810     {
3811       printf (" (none)\n\n");
3812       return;
3813     }
3814
3815   if (relsize < 0)
3816     relcount = relsize;
3817   else
3818     {
3819       relpp = (arelent **) xmalloc (relsize);
3820       relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
3821     }
3822
3823   if (relcount < 0)
3824     {
3825       printf ("\n");
3826       non_fatal (_("failed to read relocs in: %s"),
3827                  sanitize_string (bfd_get_filename (abfd)));
3828       bfd_fatal (_("error message was"));
3829     }
3830   else if (relcount == 0)
3831     printf (" (none)\n\n");
3832   else
3833     {
3834       printf ("\n");
3835       dump_reloc_set (abfd, section, relpp, relcount);
3836       printf ("\n\n");
3837     }
3838   free (relpp);
3839 }
3840
3841 static void
3842 dump_relocs (bfd *abfd)
3843 {
3844   bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
3845 }
3846
3847 static void
3848 dump_dynamic_relocs (bfd *abfd)
3849 {
3850   long relsize;
3851   arelent **relpp;
3852   long relcount;
3853
3854   relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3855   if (relsize < 0)
3856     bfd_fatal (bfd_get_filename (abfd));
3857
3858   printf ("DYNAMIC RELOCATION RECORDS");
3859
3860   if (relsize == 0)
3861     printf (" (none)\n\n");
3862   else
3863     {
3864       relpp = (arelent **) xmalloc (relsize);
3865       relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
3866
3867       if (relcount < 0)
3868         bfd_fatal (bfd_get_filename (abfd));
3869       else if (relcount == 0)
3870         printf (" (none)\n\n");
3871       else
3872         {
3873           printf ("\n");
3874           dump_reloc_set (abfd, NULL, relpp, relcount);
3875           printf ("\n\n");
3876         }
3877       free (relpp);
3878     }
3879 }
3880
3881 /* Creates a table of paths, to search for source files.  */
3882
3883 static void
3884 add_include_path (const char *path)
3885 {
3886   if (path[0] == 0)
3887     return;
3888   include_path_count++;
3889   include_paths = (const char **)
3890       xrealloc (include_paths, include_path_count * sizeof (*include_paths));
3891 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3892   if (path[1] == ':' && path[2] == 0)
3893     path = concat (path, ".", (const char *) 0);
3894 #endif
3895   include_paths[include_path_count - 1] = path;
3896 }
3897
3898 static void
3899 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
3900                   asection *section,
3901                   void *arg)
3902 {
3903   if ((section->flags & SEC_DEBUGGING) == 0)
3904     {
3905       bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
3906       section->vma += adjust_section_vma;
3907       if (*has_reloc_p)
3908         section->lma += adjust_section_vma;
3909     }
3910 }
3911
3912 /* Return the sign-extended form of an ARCH_SIZE sized VMA.  */
3913
3914 static bfd_vma
3915 sign_extend_address (bfd *abfd ATTRIBUTE_UNUSED,
3916                      bfd_vma vma,
3917                      unsigned arch_size)
3918 {
3919   bfd_vma mask;
3920   mask = (bfd_vma) 1 << (arch_size - 1);
3921   return (((vma & ((mask << 1) - 1)) ^ mask) - mask);
3922 }
3923
3924 /* Dump selected contents of ABFD.  */
3925
3926 static void
3927 dump_bfd (bfd *abfd, bfd_boolean is_mainfile)
3928 {
3929   const struct elf_backend_data * bed;
3930
3931   if (bfd_big_endian (abfd))
3932     byte_get = byte_get_big_endian;
3933   else if (bfd_little_endian (abfd))
3934     byte_get = byte_get_little_endian;
3935   else
3936     byte_get = NULL;
3937
3938   /* Load any separate debug information files.
3939      We do this now and without checking do_follow_links because separate
3940      debug info files may contain symbol tables that we will need when
3941      displaying information about the main file.  Any memory allocated by
3942      load_separate_debug_files will be released when we call
3943      free_debug_memory below.
3944      
3945      The test on is_mainfile is there because the chain of separate debug
3946      info files is a global variable shared by all invocations of dump_bfd.  */
3947   if (is_mainfile)
3948     {
3949       load_separate_debug_files (abfd, bfd_get_filename (abfd));
3950
3951       /* If asked to do so, recursively dump the separate files.  */
3952       if (do_follow_links)
3953         {
3954           separate_info * i;
3955
3956           for (i = first_separate_info; i != NULL; i = i->next)
3957             dump_bfd (i->handle, FALSE);
3958         }
3959     }
3960
3961   /* Adjust user-specified start and stop limits for targets that use
3962      signed addresses.  */
3963   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
3964       && (bed = get_elf_backend_data (abfd)) != NULL
3965       && bed->sign_extend_vma)
3966     {
3967       start_address = sign_extend_address (abfd, start_address,
3968                                            bed->s->arch_size);
3969       stop_address = sign_extend_address (abfd, stop_address,
3970                                           bed->s->arch_size);
3971     }
3972
3973   /* If we are adjusting section VMA's, change them all now.  Changing
3974      the BFD information is a hack.  However, we must do it, or
3975      bfd_find_nearest_line will not do the right thing.  */
3976   if (adjust_section_vma != 0)
3977     {
3978       bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3979       bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
3980     }
3981
3982   if (! dump_debugging_tags && ! suppress_bfd_header)
3983     printf (_("\n%s:     file format %s\n"),
3984             sanitize_string (bfd_get_filename (abfd)),
3985             abfd->xvec->name);
3986   if (dump_ar_hdrs)
3987     print_arelt_descr (stdout, abfd, TRUE, FALSE);
3988   if (dump_file_header)
3989     dump_bfd_header (abfd);
3990   if (dump_private_headers)
3991     dump_bfd_private_header (abfd);
3992   if (dump_private_options != NULL)
3993     dump_target_specific (abfd);
3994   if (! dump_debugging_tags && ! suppress_bfd_header)
3995     putchar ('\n');
3996
3997   if (dump_symtab
3998       || dump_reloc_info
3999       || disassemble
4000       || dump_debugging
4001       || dump_dwarf_section_info)
4002     {
4003       syms = slurp_symtab (abfd);
4004
4005       /* If following links, load any symbol tables from the linked files as well.  */
4006       if (do_follow_links && is_mainfile)
4007         {
4008           separate_info * i;
4009
4010           for (i = first_separate_info; i != NULL; i = i->next)
4011             {
4012               asymbol **  extra_syms;
4013               long        old_symcount = symcount;
4014               
4015               extra_syms = slurp_symtab (i->handle);
4016
4017               if (extra_syms)
4018                 {
4019                   if (old_symcount == 0)
4020                     {
4021                       syms = extra_syms;
4022                     }
4023                   else
4024                     {
4025                       syms = xrealloc (syms, (symcount + old_symcount) * sizeof (asymbol *));
4026                       memcpy (syms + old_symcount,
4027                               extra_syms,
4028                               symcount * sizeof (asymbol *));
4029                     }
4030                 }
4031
4032               symcount += old_symcount;
4033             }
4034         }
4035     }
4036
4037   if (dump_section_headers)
4038     dump_headers (abfd);
4039
4040   if (dump_dynamic_symtab || dump_dynamic_reloc_info
4041       || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
4042     dynsyms = slurp_dynamic_symtab (abfd);
4043
4044   if (disassemble)
4045     {
4046       synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
4047                                              dynsymcount, dynsyms, &synthsyms);
4048       if (synthcount < 0)
4049         synthcount = 0;
4050     }
4051
4052   if (dump_symtab)
4053     dump_symbols (abfd, FALSE);
4054   if (dump_dynamic_symtab)
4055     dump_symbols (abfd, TRUE);
4056   if (dump_dwarf_section_info)
4057     dump_dwarf (abfd);
4058   if (dump_ctf_section_info)
4059     dump_ctf (abfd, dump_ctf_section_name, dump_ctf_parent_name);
4060   if (dump_stab_section_info)
4061     dump_stabs (abfd);
4062   if (dump_reloc_info && ! disassemble)
4063     dump_relocs (abfd);
4064   if (dump_dynamic_reloc_info && ! disassemble)
4065     dump_dynamic_relocs (abfd);
4066   if (dump_section_contents)
4067     dump_data (abfd);
4068   if (disassemble)
4069     disassemble_data (abfd);
4070
4071   if (dump_debugging)
4072     {
4073       void *dhandle;
4074
4075       dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
4076       if (dhandle != NULL)
4077         {
4078           if (!print_debugging_info (stdout, dhandle, abfd, syms,
4079                                      bfd_demangle,
4080                                      dump_debugging_tags ? TRUE : FALSE))
4081             {
4082               non_fatal (_("%s: printing debugging information failed"),
4083                          bfd_get_filename (abfd));
4084               exit_status = 1;
4085             }
4086
4087           free (dhandle);
4088         }
4089       /* PR 6483: If there was no STABS debug info in the file, try
4090          DWARF instead.  */
4091       else if (! dump_dwarf_section_info)
4092         {
4093           dwarf_select_sections_all ();
4094           dump_dwarf (abfd);
4095         }
4096     }
4097
4098   if (syms)
4099     {
4100       free (syms);
4101       syms = NULL;
4102     }
4103
4104   if (dynsyms)
4105     {
4106       free (dynsyms);
4107       dynsyms = NULL;
4108     }
4109
4110   if (synthsyms)
4111     {
4112       free (synthsyms);
4113       synthsyms = NULL;
4114     }
4115
4116   symcount = 0;
4117   dynsymcount = 0;
4118   synthcount = 0;
4119
4120   if (is_mainfile)
4121     free_debug_memory ();
4122 }
4123
4124 static void
4125 display_object_bfd (bfd *abfd)
4126 {
4127   char **matching;
4128
4129   if (bfd_check_format_matches (abfd, bfd_object, &matching))
4130     {
4131       dump_bfd (abfd, TRUE);
4132       return;
4133     }
4134
4135   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
4136     {
4137       nonfatal (bfd_get_filename (abfd));
4138       list_matching_formats (matching);
4139       free (matching);
4140       return;
4141     }
4142
4143   if (bfd_get_error () != bfd_error_file_not_recognized)
4144     {
4145       nonfatal (bfd_get_filename (abfd));
4146       return;
4147     }
4148
4149   if (bfd_check_format_matches (abfd, bfd_core, &matching))
4150     {
4151       dump_bfd (abfd, TRUE);
4152       return;
4153     }
4154
4155   nonfatal (bfd_get_filename (abfd));
4156
4157   if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
4158     {
4159       list_matching_formats (matching);
4160       free (matching);
4161     }
4162 }
4163
4164 static void
4165 display_any_bfd (bfd *file, int level)
4166 {
4167   /* Decompress sections unless dumping the section contents.  */
4168   if (!dump_section_contents)
4169     file->flags |= BFD_DECOMPRESS;
4170
4171   /* If the file is an archive, process all of its elements.  */
4172   if (bfd_check_format (file, bfd_archive))
4173     {
4174       bfd *arfile = NULL;
4175       bfd *last_arfile = NULL;
4176
4177       if (level == 0)
4178         printf (_("In archive %s:\n"), sanitize_string (bfd_get_filename (file)));
4179       else if (level > 100)
4180         {
4181           /* Prevent corrupted files from spinning us into an
4182              infinite loop.  100 is an arbitrary heuristic.  */
4183           fatal (_("Archive nesting is too deep"));
4184           return;
4185         }
4186       else
4187         printf (_("In nested archive %s:\n"),
4188                 sanitize_string (bfd_get_filename (file)));
4189
4190       for (;;)
4191         {
4192           bfd_set_error (bfd_error_no_error);
4193
4194           arfile = bfd_openr_next_archived_file (file, arfile);
4195           if (arfile == NULL)
4196             {
4197               if (bfd_get_error () != bfd_error_no_more_archived_files)
4198                 nonfatal (bfd_get_filename (file));
4199               break;
4200             }
4201
4202           display_any_bfd (arfile, level + 1);
4203
4204           if (last_arfile != NULL)
4205             {
4206               bfd_close (last_arfile);
4207               /* PR 17512: file: ac585d01.  */
4208               if (arfile == last_arfile)
4209                 {
4210                   last_arfile = NULL;
4211                   break;
4212                 }
4213             }
4214           last_arfile = arfile;
4215         }
4216
4217       if (last_arfile != NULL)
4218         bfd_close (last_arfile);
4219     }
4220   else
4221     display_object_bfd (file);
4222 }
4223
4224 static void
4225 display_file (char *filename, char *target, bfd_boolean last_file)
4226 {
4227   bfd *file;
4228
4229   if (get_file_size (filename) < 1)
4230     {
4231       exit_status = 1;
4232       return;
4233     }
4234
4235   file = bfd_openr (filename, target);
4236   if (file == NULL)
4237     {
4238       nonfatal (filename);
4239       return;
4240     }
4241
4242   display_any_bfd (file, 0);
4243
4244   /* This is an optimization to improve the speed of objdump, especially when
4245      dumping a file with lots of associated debug informatiom.  Calling
4246      bfd_close on such a file can take a non-trivial amount of time as there
4247      are lots of lists to walk and buffers to free.  This is only really
4248      necessary however if we are about to load another file and we need the
4249      memory back.  Otherwise, if we are about to exit, then we can save (a lot
4250      of) time by only doing a quick close, and allowing the OS to reclaim the
4251      memory for us.  */
4252   if (! last_file)
4253     bfd_close (file);
4254   else
4255     bfd_close_all_done (file);
4256 }
4257 \f
4258 int
4259 main (int argc, char **argv)
4260 {
4261   int c;
4262   char *target = default_target;
4263   bfd_boolean seenflag = FALSE;
4264
4265 #if defined (HAVE_SETLOCALE)
4266 #if defined (HAVE_LC_MESSAGES)
4267   setlocale (LC_MESSAGES, "");
4268 #endif
4269   setlocale (LC_CTYPE, "");
4270 #endif
4271
4272   bindtextdomain (PACKAGE, LOCALEDIR);
4273   textdomain (PACKAGE);
4274
4275   program_name = *argv;
4276   xmalloc_set_program_name (program_name);
4277   bfd_set_error_program_name (program_name);
4278
4279   START_PROGRESS (program_name, 0);
4280
4281   expandargv (&argc, &argv);
4282
4283   if (bfd_init () != BFD_INIT_MAGIC)
4284     fatal (_("fatal error: libbfd ABI mismatch"));
4285   set_default_bfd_target ();
4286
4287   while ((c = getopt_long (argc, argv,
4288                            "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
4289                            long_options, (int *) 0))
4290          != EOF)
4291     {
4292       switch (c)
4293         {
4294         case 0:
4295           break;                /* We've been given a long option.  */
4296         case 'm':
4297           machine = optarg;
4298           break;
4299         case 'M':
4300           {
4301             char *options;
4302             if (disassembler_options)
4303               /* Ignore potential memory leak for now.  */
4304               options = concat (disassembler_options, ",",
4305                                 optarg, (const char *) NULL);
4306             else
4307               options = optarg;
4308             disassembler_options = remove_whitespace_and_extra_commas (options);
4309           }
4310           break;
4311         case 'j':
4312           add_only (optarg);
4313           break;
4314         case 'F':
4315           display_file_offsets = TRUE;
4316           break;
4317         case 'l':
4318           with_line_numbers = TRUE;
4319           break;
4320         case 'b':
4321           target = optarg;
4322           break;
4323         case 'C':
4324           do_demangle = TRUE;
4325           if (optarg != NULL)
4326             {
4327               enum demangling_styles style;
4328
4329               style = cplus_demangle_name_to_style (optarg);
4330               if (style == unknown_demangling)
4331                 fatal (_("unknown demangling style `%s'"),
4332                        optarg);
4333
4334               cplus_demangle_set_style (style);
4335             }
4336           break;
4337         case OPTION_RECURSE_LIMIT:
4338           demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
4339           break;
4340         case OPTION_NO_RECURSE_LIMIT:
4341           demangle_flags |= DMGL_NO_RECURSE_LIMIT;
4342           break;
4343         case 'w':
4344           do_wide = wide_output = TRUE;
4345           break;
4346         case OPTION_ADJUST_VMA:
4347           adjust_section_vma = parse_vma (optarg, "--adjust-vma");
4348           break;
4349         case OPTION_START_ADDRESS:
4350           start_address = parse_vma (optarg, "--start-address");
4351           if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
4352             fatal (_("error: the start address should be before the end address"));
4353           break;
4354         case OPTION_STOP_ADDRESS:
4355           stop_address = parse_vma (optarg, "--stop-address");
4356           if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
4357             fatal (_("error: the stop address should be after the start address"));
4358           break;
4359         case OPTION_PREFIX:
4360           prefix = optarg;
4361           prefix_length = strlen (prefix);
4362           /* Remove an unnecessary trailing '/' */
4363           while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
4364             prefix_length--;
4365           break;
4366         case OPTION_PREFIX_STRIP:
4367           prefix_strip = atoi (optarg);
4368           if (prefix_strip < 0)
4369             fatal (_("error: prefix strip must be non-negative"));
4370           break;
4371         case OPTION_INSN_WIDTH:
4372           insn_width = strtoul (optarg, NULL, 0);
4373           if (insn_width <= 0)
4374             fatal (_("error: instruction width must be positive"));
4375           break;
4376         case OPTION_INLINES:
4377           unwind_inlines = TRUE;
4378           break;
4379         case 'E':
4380           if (strcmp (optarg, "B") == 0)
4381             endian = BFD_ENDIAN_BIG;
4382           else if (strcmp (optarg, "L") == 0)
4383             endian = BFD_ENDIAN_LITTLE;
4384           else
4385             {
4386               nonfatal (_("unrecognized -E option"));
4387               usage (stderr, 1);
4388             }
4389           break;
4390         case OPTION_ENDIAN:
4391           if (strncmp (optarg, "big", strlen (optarg)) == 0)
4392             endian = BFD_ENDIAN_BIG;
4393           else if (strncmp (optarg, "little", strlen (optarg)) == 0)
4394             endian = BFD_ENDIAN_LITTLE;
4395           else
4396             {
4397               non_fatal (_("unrecognized --endian type `%s'"), optarg);
4398               exit_status = 1;
4399               usage (stderr, 1);
4400             }
4401           break;
4402
4403         case 'f':
4404           dump_file_header = TRUE;
4405           seenflag = TRUE;
4406           break;
4407         case 'i':
4408           formats_info = TRUE;
4409           seenflag = TRUE;
4410           break;
4411         case 'I':
4412           add_include_path (optarg);
4413           break;
4414         case 'p':
4415           dump_private_headers = TRUE;
4416           seenflag = TRUE;
4417           break;
4418         case 'P':
4419           dump_private_options = optarg;
4420           seenflag = TRUE;
4421           break;
4422         case 'x':
4423           dump_private_headers = TRUE;
4424           dump_symtab = TRUE;
4425           dump_reloc_info = TRUE;
4426           dump_file_header = TRUE;
4427           dump_ar_hdrs = TRUE;
4428           dump_section_headers = TRUE;
4429           seenflag = TRUE;
4430           break;
4431         case 't':
4432           dump_symtab = TRUE;
4433           seenflag = TRUE;
4434           break;
4435         case 'T':
4436           dump_dynamic_symtab = TRUE;
4437           seenflag = TRUE;
4438           break;
4439         case 'd':
4440           disassemble = TRUE;
4441           seenflag = TRUE;
4442           disasm_sym = optarg;
4443           break;
4444         case 'z':
4445           disassemble_zeroes = TRUE;
4446           break;
4447         case 'D':
4448           disassemble = TRUE;
4449           disassemble_all = TRUE;
4450           seenflag = TRUE;
4451           break;
4452         case 'S':
4453           disassemble = TRUE;
4454           with_source_code = TRUE;
4455           seenflag = TRUE;
4456           break;
4457         case 'g':
4458           dump_debugging = 1;
4459           seenflag = TRUE;
4460           break;
4461         case 'e':
4462           dump_debugging = 1;
4463           dump_debugging_tags = 1;
4464           do_demangle = TRUE;
4465           seenflag = TRUE;
4466           break;
4467         case 'W':
4468           dump_dwarf_section_info = TRUE;
4469           seenflag = TRUE;
4470           if (optarg)
4471             dwarf_select_sections_by_letters (optarg);
4472           else
4473             dwarf_select_sections_all ();
4474           break;
4475         case OPTION_DWARF:
4476           dump_dwarf_section_info = TRUE;
4477           seenflag = TRUE;
4478           if (optarg)
4479             dwarf_select_sections_by_names (optarg);
4480           else
4481             dwarf_select_sections_all ();
4482           break;
4483         case OPTION_DWARF_DEPTH:
4484           {
4485             char *cp;
4486             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4487           }
4488           break;
4489         case OPTION_DWARF_START:
4490           {
4491             char *cp;
4492             dwarf_start_die = strtoul (optarg, & cp, 0);
4493             suppress_bfd_header = 1;
4494           }
4495           break;
4496         case OPTION_DWARF_CHECK:
4497           dwarf_check = TRUE;
4498           break;
4499         case OPTION_CTF:
4500           dump_ctf_section_info = TRUE;
4501           dump_ctf_section_name = xstrdup (optarg);
4502           seenflag = TRUE;
4503           break;
4504         case OPTION_CTF_PARENT:
4505           dump_ctf_parent_name = xstrdup (optarg);
4506           break;
4507         case 'G':
4508           dump_stab_section_info = TRUE;
4509           seenflag = TRUE;
4510           break;
4511         case 's':
4512           dump_section_contents = TRUE;
4513           seenflag = TRUE;
4514           break;
4515         case 'r':
4516           dump_reloc_info = TRUE;
4517           seenflag = TRUE;
4518           break;
4519         case 'R':
4520           dump_dynamic_reloc_info = TRUE;
4521           seenflag = TRUE;
4522           break;
4523         case 'a':
4524           dump_ar_hdrs = TRUE;
4525           seenflag = TRUE;
4526           break;
4527         case 'h':
4528           dump_section_headers = TRUE;
4529           seenflag = TRUE;
4530           break;
4531         case 'v':
4532         case 'V':
4533           show_version = TRUE;
4534           seenflag = TRUE;
4535           break;
4536
4537         case 'H':
4538           usage (stdout, 0);
4539           /* No need to set seenflag or to break - usage() does not return.  */
4540         default:
4541           usage (stderr, 1);
4542         }
4543     }
4544
4545   if (show_version)
4546     print_version ("objdump");
4547
4548   if (!seenflag)
4549     usage (stderr, 2);
4550
4551   if (formats_info)
4552     exit_status = display_info ();
4553   else
4554     {
4555       if (optind == argc)
4556         display_file ("a.out", target, TRUE);
4557       else
4558         for (; optind < argc;)
4559           {
4560             display_file (argv[optind], target, optind == argc - 1);
4561             optind++;
4562           }
4563     }
4564
4565   free_only_list ();
4566   free (dump_ctf_section_name);
4567   free (dump_ctf_parent_name);
4568
4569   END_PROGRESS (program_name);
4570
4571   return exit_status;
4572 }