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