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