1 /* objdump.c -- dump information about an object file.
2 Copyright (C) 1990-2024 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
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)
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.
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. */
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.
29 The flow of execution is as follows:
31 1. Command line arguments are checked for control switches and the
32 information to be displayed is selected.
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.
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
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.
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. */
57 #include "demanguse.h"
60 #include "sframe-api.h"
62 #include "safe-ctype.h"
64 #include "libiberty.h"
66 #include "filenames.h"
75 #ifdef HAVE_LIBDEBUGINFOD
76 #include <elfutils/debuginfod.h>
79 /* Internal headers for the ELF .stab-dump code - sorry. */
80 #define BYTES_IN_WORD 32
81 #include "aout/aout64.h"
84 static int exit_status
= 0;
86 static char *default_target
= NULL
; /* Default at runtime. */
88 /* The following variables are set based on arguments passed on the
90 static int show_version
= 0; /* Show the version number. */
91 static int dump_section_contents
; /* -s */
92 static int dump_section_headers
; /* -h */
93 static bool dump_file_header
; /* -f */
94 static int dump_symtab
; /* -t */
95 static int dump_dynamic_symtab
; /* -T */
96 static int dump_reloc_info
; /* -r */
97 static int dump_dynamic_reloc_info
; /* -R */
98 static int dump_ar_hdrs
; /* -a */
99 static int dump_private_headers
; /* -p */
100 static char *dump_private_options
; /* -P */
101 static int no_addresses
; /* --no-addresses */
102 static int prefix_addresses
; /* --prefix-addresses */
103 static int with_line_numbers
; /* -l */
104 static bool with_source_code
; /* -S */
105 static int show_raw_insn
; /* --show-raw-insn */
106 static int dump_dwarf_section_info
; /* --dwarf */
107 static int dump_stab_section_info
; /* --stabs */
108 static int dump_ctf_section_info
; /* --ctf */
109 static char *dump_ctf_section_name
;
110 static char *dump_ctf_parent_name
; /* --ctf-parent */
111 static int dump_sframe_section_info
; /* --sframe */
112 static char *dump_sframe_section_name
;
113 static int do_demangle
; /* -C, --demangle */
114 static bool disassemble
; /* -d */
115 static bool disassemble_all
; /* -D */
116 static int disassemble_zeroes
; /* --disassemble-zeroes */
117 static bool formats_info
; /* -i */
118 int wide_output
; /* -w */
119 static int insn_width
; /* --insn-width */
120 static bfd_vma start_address
= (bfd_vma
) -1; /* --start-address */
121 static bfd_vma stop_address
= (bfd_vma
) -1; /* --stop-address */
122 static int dump_debugging
; /* --debugging */
123 static int dump_debugging_tags
; /* --debugging-tags */
124 static int suppress_bfd_header
;
125 static int dump_special_syms
= 0; /* --special-syms */
126 static bfd_vma adjust_section_vma
= 0; /* --adjust-vma */
127 static int file_start_context
= 0; /* --file-start-context */
128 static bool display_file_offsets
; /* -F */
129 static const char *prefix
; /* --prefix */
130 static int prefix_strip
; /* --prefix-strip */
131 static size_t prefix_length
;
132 static bool unwind_inlines
; /* --inlines. */
133 static const char * disasm_sym
; /* Disassembly start symbol. */
134 static const char * source_comment
; /* --source_comment. */
135 static bool visualize_jumps
= false; /* --visualize-jumps. */
136 static bool color_output
= false; /* --visualize-jumps=color. */
137 static bool extended_color_output
= false; /* --visualize-jumps=extended-color. */
138 static int process_links
= false; /* --process-links. */
139 static int show_all_symbols
; /* --show-all-symbols. */
140 static bool decompressed_dumps
= false; /* -Z, --decompress. */
142 static enum color_selection
144 on_if_terminal_output
,
145 on
, /* --disassembler-color=color. */
146 off
, /* --disassembler-color=off. */
147 extended
/* --disassembler-color=extended-color. */
148 } disassembler_color
=
149 #if DEFAULT_FOR_COLORED_DISASSEMBLY
150 on_if_terminal_output
;
155 static int dump_any_debugging
;
156 static int demangle_flags
= DMGL_ANSI
| DMGL_PARAMS
;
158 /* This is reset to false each time we enter the disassembler, and set true
159 when the disassembler emits something in the dis_style_comment_start
160 style. Once this is true, all further output on that line is done in
161 the comment style. This only has an effect when disassembler coloring
163 static bool disassembler_in_comment
= false;
165 /* A structure to record the sections mentioned in -j switches. */
168 const char *name
; /* The name of the section. */
169 bool seen
; /* A flag to indicate that the section has been found in one or more input files. */
170 struct only
*next
; /* Pointer to the next structure in the list. */
172 /* Pointer to an array of 'only' structures.
173 This pointer is NULL if the -j switch has not been used. */
174 static struct only
* only_list
= NULL
;
176 /* Variables for handling include file path table. */
177 static const char **include_paths
;
178 static int include_path_count
;
180 /* Extra info to pass to the section disassembler and address printing
182 struct objdump_disasm_info
186 disassembler_ftype disassemble_fn
;
191 /* Architecture to disassemble for, or default if NULL. */
192 static char *machine
= NULL
;
194 /* Target specific options to the disassembler. */
195 static char *disassembler_options
= NULL
;
197 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
198 static enum bfd_endian endian
= BFD_ENDIAN_UNKNOWN
;
200 /* The symbol table. */
201 static asymbol
**syms
;
203 /* Number of symbols in `syms'. */
204 static long symcount
= 0;
206 /* The sorted symbol table. */
207 static asymbol
**sorted_syms
;
209 /* Number of symbols in `sorted_syms'. */
210 static long sorted_symcount
= 0;
212 /* The dynamic symbol table. */
213 static asymbol
**dynsyms
;
215 /* The synthetic symbol table. */
216 static asymbol
*synthsyms
;
217 static long synthcount
= 0;
219 /* Number of symbols in `dynsyms'. */
220 static long dynsymcount
= 0;
222 static bfd_byte
*stabs
;
223 static bfd_size_type stab_size
;
225 static bfd_byte
*strtab
;
226 static bfd_size_type stabstr_size
;
228 /* Handlers for -P/--private. */
229 static const struct objdump_private_desc
* const objdump_private_vectors
[] =
231 OBJDUMP_PRIVATE_VECTORS
235 /* The list of detected jumps inside a function. */
236 static struct jump_info
*detected_jumps
= NULL
;
238 typedef enum unicode_display_type
246 } unicode_display_type
;
248 static unicode_display_type unicode_display
= unicode_default
;
250 static void usage (FILE *, int) ATTRIBUTE_NORETURN
;
252 usage (FILE *stream
, int status
)
254 fprintf (stream
, _("Usage: %s <option(s)> <file(s)>\n"), program_name
);
255 fprintf (stream
, _(" Display information from object <file(s)>.\n"));
256 fprintf (stream
, _(" At least one of the following switches must be given:\n"));
257 fprintf (stream
, _("\
258 -a, --archive-headers Display archive header information\n"));
259 fprintf (stream
, _("\
260 -f, --file-headers Display the contents of the overall file header\n"));
261 fprintf (stream
, _("\
262 -p, --private-headers Display object format specific file header contents\n"));
263 fprintf (stream
, _("\
264 -P, --private=OPT,OPT... Display object format specific contents\n"));
265 fprintf (stream
, _("\
266 -h, --[section-]headers Display the contents of the section headers\n"));
267 fprintf (stream
, _("\
268 -x, --all-headers Display the contents of all headers\n"));
269 fprintf (stream
, _("\
270 -d, --disassemble Display assembler contents of executable sections\n"));
271 fprintf (stream
, _("\
272 -D, --disassemble-all Display assembler contents of all sections\n"));
273 fprintf (stream
, _("\
274 --disassemble=<sym> Display assembler contents from <sym>\n"));
275 fprintf (stream
, _("\
276 -S, --source Intermix source code with disassembly\n"));
277 fprintf (stream
, _("\
278 --source-comment[=<txt>] Prefix lines of source code with <txt>\n"));
279 fprintf (stream
, _("\
280 -s, --full-contents Display the full contents of all sections requested\n"));
281 fprintf (stream
, _("\
282 -Z, --decompress Decompress section(s) before displaying their contents\n"));
283 fprintf (stream
, _("\
284 -g, --debugging Display debug information in object file\n"));
285 fprintf (stream
, _("\
286 -e, --debugging-tags Display debug information using ctags style\n"));
287 fprintf (stream
, _("\
288 -G, --stabs Display (in raw form) any STABS info in the file\n"));
289 fprintf (stream
, _("\
290 -W, --dwarf[a/=abbrev, A/=addr, r/=aranges, c/=cu_index, L/=decodedline,\n\
291 f/=frames, F/=frames-interp, g/=gdb_index, i/=info, o/=loc,\n\
292 m/=macro, p/=pubnames, t/=pubtypes, R/=Ranges, l/=rawline,\n\
293 s/=str, O/=str-offsets, u/=trace_abbrev, T/=trace_aranges,\n\
295 Display the contents of DWARF debug sections\n"));
296 fprintf (stream
, _("\
297 -Wk,--dwarf=links Display the contents of sections that link to\n\
298 separate debuginfo files\n"));
299 #if DEFAULT_FOR_FOLLOW_LINKS
300 fprintf (stream
, _("\
301 -WK,--dwarf=follow-links\n\
302 Follow links to separate debug info files (default)\n"));
303 fprintf (stream
, _("\
304 -WN,--dwarf=no-follow-links\n\
305 Do not follow links to separate debug info files\n"));
307 fprintf (stream
, _("\
308 -WK,--dwarf=follow-links\n\
309 Follow links to separate debug info files\n"));
310 fprintf (stream
, _("\
311 -WN,--dwarf=no-follow-links\n\
312 Do not follow links to separate debug info files\n\
315 #if HAVE_LIBDEBUGINFOD
316 fprintf (stream
, _("\
317 -WD --dwarf=use-debuginfod\n\
318 When following links, also query debuginfod servers (default)\n"));
319 fprintf (stream
, _("\
320 -WE --dwarf=do-not-use-debuginfod\n\
321 When following links, do not query debuginfod servers\n"));
323 fprintf (stream
, _("\
324 -L, --process-links Display the contents of non-debug sections in\n\
325 separate debuginfo files. (Implies -WK)\n"));
327 fprintf (stream
, _("\
328 --ctf[=SECTION] Display CTF info from SECTION, (default `.ctf')\n"));
330 fprintf (stream
, _("\
331 --sframe[=SECTION] Display SFrame info from SECTION, (default '.sframe')\n"));
332 fprintf (stream
, _("\
333 -t, --syms Display the contents of the symbol table(s)\n"));
334 fprintf (stream
, _("\
335 -T, --dynamic-syms Display the contents of the dynamic symbol table\n"));
336 fprintf (stream
, _("\
337 -r, --reloc Display the relocation entries in the file\n"));
338 fprintf (stream
, _("\
339 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n"));
340 fprintf (stream
, _("\
341 @<file> Read options from <file>\n"));
342 fprintf (stream
, _("\
343 -v, --version Display this program's version number\n"));
344 fprintf (stream
, _("\
345 -i, --info List object formats and architectures supported\n"));
346 fprintf (stream
, _("\
347 -H, --help Display this information\n"));
351 const struct objdump_private_desc
* const *desc
;
353 fprintf (stream
, _("\n The following switches are optional:\n"));
354 fprintf (stream
, _("\
355 -b, --target=BFDNAME Specify the target object format as BFDNAME\n"));
356 fprintf (stream
, _("\
357 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n"));
358 fprintf (stream
, _("\
359 -j, --section=NAME Only display information for section NAME\n"));
360 fprintf (stream
, _("\
361 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n"));
362 fprintf (stream
, _("\
363 -EB --endian=big Assume big endian format when disassembling\n"));
364 fprintf (stream
, _("\
365 -EL --endian=little Assume little endian format when disassembling\n"));
366 fprintf (stream
, _("\
367 --file-start-context Include context from start of file (with -S)\n"));
368 fprintf (stream
, _("\
369 -I, --include=DIR Add DIR to search list for source files\n"));
370 fprintf (stream
, _("\
371 -l, --line-numbers Include line numbers and filenames in output\n"));
372 fprintf (stream
, _("\
373 -F, --file-offsets Include file offsets when displaying information\n"));
374 fprintf (stream
, _("\
375 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n"));
376 display_demangler_styles (stream
, _("\
378 fprintf (stream
, _("\
379 --recurse-limit Enable a limit on recursion whilst demangling\n\
381 fprintf (stream
, _("\
382 --no-recurse-limit Disable a limit on recursion whilst demangling\n"));
383 fprintf (stream
, _("\
384 -w, --wide Format output for more than 80 columns\n"));
385 fprintf (stream
, _("\
386 -U[d|l|i|x|e|h] Controls the display of UTF-8 unicode characters\n\
387 --unicode=[default|locale|invalid|hex|escape|highlight]\n"));
388 fprintf (stream
, _("\
389 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n"));
390 fprintf (stream
, _("\
391 --start-address=ADDR Only process data whose address is >= ADDR\n"));
392 fprintf (stream
, _("\
393 --stop-address=ADDR Only process data whose address is < ADDR\n"));
394 fprintf (stream
, _("\
395 --no-addresses Do not print address alongside disassembly\n"));
396 fprintf (stream
, _("\
397 --prefix-addresses Print complete address alongside disassembly\n"));
398 fprintf (stream
, _("\
399 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n"));
400 fprintf (stream
, _("\
401 --insn-width=WIDTH Display WIDTH bytes on a single line for -d\n"));
402 fprintf (stream
, _("\
403 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n"));
404 fprintf (stream
, _("\
405 --show-all-symbols When disassembling, display all symbols at a given address\n"));
406 fprintf (stream
, _("\
407 --special-syms Include special symbols in symbol dumps\n"));
408 fprintf (stream
, _("\
409 --inlines Print all inlines for source line (with -l)\n"));
410 fprintf (stream
, _("\
411 --prefix=PREFIX Add PREFIX to absolute paths for -S\n"));
412 fprintf (stream
, _("\
413 --prefix-strip=LEVEL Strip initial directory names for -S\n"));
414 fprintf (stream
, _("\
415 --dwarf-depth=N Do not display DIEs at depth N or greater\n"));
416 fprintf (stream
, _("\
417 --dwarf-start=N Display DIEs starting at offset N\n"));
418 fprintf (stream
, _("\
419 --dwarf-check Make additional dwarf consistency checks.\n"));
421 fprintf (stream
, _("\
422 --ctf-parent=NAME Use CTF archive member NAME as the CTF parent\n"));
424 fprintf (stream
, _("\
425 --visualize-jumps Visualize jumps by drawing ASCII art lines\n"));
426 fprintf (stream
, _("\
427 --visualize-jumps=color Use colors in the ASCII art\n"));
428 fprintf (stream
, _("\
429 --visualize-jumps=extended-color\n\
430 Use extended 8-bit color codes\n"));
431 fprintf (stream
, _("\
432 --visualize-jumps=off Disable jump visualization\n"));
433 #if DEFAULT_FOR_COLORED_DISASSEMBLY
434 fprintf (stream
, _("\
435 --disassembler-color=off Disable disassembler color output.\n"));
436 fprintf (stream
, _("\
437 --disassembler-color=terminal Enable disassembler color output if displaying on a terminal. (default)\n"));
439 fprintf (stream
, _("\
440 --disassembler-color=off Disable disassembler color output. (default)\n"));
441 fprintf (stream
, _("\
442 --disassembler-color=terminal Enable disassembler color output if displaying on a terminal.\n"));
444 fprintf (stream
, _("\
445 --disassembler-color=on Enable disassembler color output.\n"));
446 fprintf (stream
, _("\
447 --disassembler-color=extended Use 8-bit colors in disassembler output.\n\n"));
449 list_supported_targets (program_name
, stream
);
450 list_supported_architectures (program_name
, stream
);
452 disassembler_usage (stream
);
454 if (objdump_private_vectors
[0] != NULL
)
457 _("\nOptions supported for -P/--private switch:\n"));
458 for (desc
= objdump_private_vectors
; *desc
!= NULL
; desc
++)
459 (*desc
)->help (stream
);
462 if (REPORT_BUGS_TO
[0] && status
== 0)
463 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
467 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
471 OPTION_START_ADDRESS
,
481 OPTION_RECURSE_LIMIT
,
482 OPTION_NO_RECURSE_LIMIT
,
484 OPTION_SOURCE_COMMENT
,
490 OPTION_VISUALIZE_JUMPS
,
491 OPTION_DISASSEMBLER_COLOR
494 static struct option long_options
[]=
496 {"adjust-vma", required_argument
, NULL
, OPTION_ADJUST_VMA
},
497 {"all-headers", no_argument
, NULL
, 'x'},
498 {"architecture", required_argument
, NULL
, 'm'},
499 {"archive-headers", no_argument
, NULL
, 'a'},
501 {"ctf", optional_argument
, NULL
, OPTION_CTF
},
502 {"ctf-parent", required_argument
, NULL
, OPTION_CTF_PARENT
},
504 {"debugging", no_argument
, NULL
, 'g'},
505 {"debugging-tags", no_argument
, NULL
, 'e'},
506 {"decompress", no_argument
, NULL
, 'Z'},
507 {"demangle", optional_argument
, NULL
, 'C'},
508 {"disassemble", optional_argument
, NULL
, 'd'},
509 {"disassemble-all", no_argument
, NULL
, 'D'},
510 {"disassemble-zeroes", no_argument
, NULL
, 'z'},
511 {"disassembler-options", required_argument
, NULL
, 'M'},
512 {"dwarf", optional_argument
, NULL
, OPTION_DWARF
},
513 {"dwarf-check", no_argument
, 0, OPTION_DWARF_CHECK
},
514 {"dwarf-depth", required_argument
, 0, OPTION_DWARF_DEPTH
},
515 {"dwarf-start", required_argument
, 0, OPTION_DWARF_START
},
516 {"dynamic-reloc", no_argument
, NULL
, 'R'},
517 {"dynamic-syms", no_argument
, NULL
, 'T'},
518 {"endian", required_argument
, NULL
, OPTION_ENDIAN
},
519 {"file-headers", no_argument
, NULL
, 'f'},
520 {"file-offsets", no_argument
, NULL
, 'F'},
521 {"file-start-context", no_argument
, &file_start_context
, 1},
522 {"full-contents", no_argument
, NULL
, 's'},
523 {"headers", no_argument
, NULL
, 'h'},
524 {"help", no_argument
, NULL
, 'H'},
525 {"include", required_argument
, NULL
, 'I'},
526 {"info", no_argument
, NULL
, 'i'},
527 {"inlines", no_argument
, 0, OPTION_INLINES
},
528 {"insn-width", required_argument
, NULL
, OPTION_INSN_WIDTH
},
529 {"line-numbers", no_argument
, NULL
, 'l'},
530 {"no-addresses", no_argument
, &no_addresses
, 1},
531 {"no-recurse-limit", no_argument
, NULL
, OPTION_NO_RECURSE_LIMIT
},
532 {"no-recursion-limit", no_argument
, NULL
, OPTION_NO_RECURSE_LIMIT
},
533 {"no-show-raw-insn", no_argument
, &show_raw_insn
, -1},
534 {"prefix", required_argument
, NULL
, OPTION_PREFIX
},
535 {"prefix-addresses", no_argument
, &prefix_addresses
, 1},
536 {"prefix-strip", required_argument
, NULL
, OPTION_PREFIX_STRIP
},
537 {"private", required_argument
, NULL
, 'P'},
538 {"private-headers", no_argument
, NULL
, 'p'},
539 {"process-links", no_argument
, &process_links
, true},
540 {"recurse-limit", no_argument
, NULL
, OPTION_RECURSE_LIMIT
},
541 {"recursion-limit", no_argument
, NULL
, OPTION_RECURSE_LIMIT
},
542 {"reloc", no_argument
, NULL
, 'r'},
543 {"section", required_argument
, NULL
, 'j'},
544 {"section-headers", no_argument
, NULL
, 'h'},
545 {"sframe", optional_argument
, NULL
, OPTION_SFRAME
},
546 {"show-all-symbols", no_argument
, &show_all_symbols
, 1},
547 {"show-raw-insn", no_argument
, &show_raw_insn
, 1},
548 {"source", no_argument
, NULL
, 'S'},
549 {"source-comment", optional_argument
, NULL
, OPTION_SOURCE_COMMENT
},
550 {"special-syms", no_argument
, &dump_special_syms
, 1},
551 {"stabs", no_argument
, NULL
, 'G'},
552 {"start-address", required_argument
, NULL
, OPTION_START_ADDRESS
},
553 {"stop-address", required_argument
, NULL
, OPTION_STOP_ADDRESS
},
554 {"syms", no_argument
, NULL
, 't'},
555 {"target", required_argument
, NULL
, 'b'},
556 {"unicode", required_argument
, NULL
, 'U'},
557 {"version", no_argument
, NULL
, 'V'},
558 {"visualize-jumps", optional_argument
, 0, OPTION_VISUALIZE_JUMPS
},
559 {"wide", no_argument
, NULL
, 'w'},
560 {"disassembler-color", required_argument
, NULL
, OPTION_DISASSEMBLER_COLOR
},
561 {NULL
, no_argument
, NULL
, 0}
565 my_bfd_nonfatal (const char *msg
)
571 /* Convert a potential UTF-8 encoded sequence in IN into characters in OUT.
572 The conversion format is controlled by the unicode_display variable.
573 Returns the number of characters added to OUT.
574 Returns the number of bytes consumed from IN in CONSUMED.
575 Always consumes at least one byte and displays at least one character. */
578 display_utf8 (const unsigned char * in
, char * out
, unsigned int * consumed
)
580 char * orig_out
= out
;
581 unsigned int nchars
= 0;
584 if (unicode_display
== unicode_default
)
590 if ((in
[1] & 0xc0) != 0x80)
593 if ((in
[0] & 0x20) == 0)
599 if ((in
[2] & 0xc0) != 0x80)
602 if ((in
[0] & 0x10) == 0)
608 if ((in
[3] & 0xc0) != 0x80)
614 switch (unicode_display
)
617 /* Copy the bytes into the output buffer as is. */
618 memcpy (out
, in
, nchars
);
622 case unicode_invalid
:
624 *out
++ = unicode_display
== unicode_hex
? '<' : '{';
627 for (j
= 0; j
< nchars
; j
++)
628 out
+= sprintf (out
, "%02x", in
[j
]);
629 *out
++ = unicode_display
== unicode_hex
? '>' : '}';
632 case unicode_highlight
:
634 out
+= sprintf (out
, "\x1B[31;47m"); /* Red. */
640 out
+= sprintf (out
, "\\u%02x%02x",
641 ((in
[0] & 0x1c) >> 2),
642 ((in
[0] & 0x03) << 6) | (in
[1] & 0x3f));
646 out
+= sprintf (out
, "\\u%02x%02x",
647 ((in
[0] & 0x0f) << 4) | ((in
[1] & 0x3c) >> 2),
648 ((in
[1] & 0x03) << 6) | ((in
[2] & 0x3f)));
652 out
+= sprintf (out
, "\\u%02x%02x%02x",
653 ((in
[0] & 0x07) << 6) | ((in
[1] & 0x3c) >> 2),
654 ((in
[1] & 0x03) << 6) | ((in
[2] & 0x3c) >> 2),
655 ((in
[2] & 0x03) << 6) | ((in
[3] & 0x3f)));
662 if (unicode_display
== unicode_highlight
&& isatty (1))
663 out
+= sprintf (out
, "\x1B[0m"); /* Default colour. */
672 return out
- orig_out
;
675 /* Not a valid UTF-8 sequence. */
681 /* Returns a version of IN with any control characters
682 replaced by escape sequences. Uses a static buffer
685 If unicode display is enabled, then also handles the
686 conversion of unicode characters. */
689 sanitize_string (const char * in
)
691 static char * buffer
= NULL
;
692 static size_t buffer_len
= 0;
693 const char * original
= in
;
700 /* See if any conversion is necessary. In the majority
701 of cases it will not be needed. */
704 unsigned char c
= *in
++;
712 if (unicode_display
!= unicode_default
&& c
>= 0xc0)
717 /* Copy the input, translating as needed. */
719 /* For 2 char unicode, max out is 12 (colour escapes) + 6, ie. 9 per in
720 For hex, max out is 8 for 2 char unicode, ie. 4 per in.
721 3 and 4 char unicode produce less output for input. */
722 size_t max_needed
= strlen (in
) * 9 + 1;
723 if (buffer_len
< max_needed
)
725 buffer_len
= max_needed
;
727 buffer
= xmalloc (buffer_len
);
733 unsigned char c
= *in
++;
743 else if (unicode_display
!= unicode_default
&& c
>= 0xc0)
745 unsigned int num_consumed
;
747 out
+= display_utf8 ((const unsigned char *) --in
, out
, &num_consumed
);
760 /* Returns TRUE if the specified section should be dumped. */
763 process_section_p (asection
* section
)
767 if (only_list
== NULL
)
770 for (only
= only_list
; only
; only
= only
->next
)
771 if (strcmp (only
->name
, section
->name
) == 0)
780 /* Add an entry to the 'only' list. */
783 add_only (char * name
)
787 /* First check to make sure that we do not
788 already have an entry for this name. */
789 for (only
= only_list
; only
; only
= only
->next
)
790 if (strcmp (only
->name
, name
) == 0)
793 only
= xmalloc (sizeof * only
);
796 only
->next
= only_list
;
800 /* Release the memory used by the 'only' list.
801 PR 11225: Issue a warning message for unseen sections.
802 Only do this if none of the sections were seen. This is mainly to support
803 tools like the GAS testsuite where an object file is dumped with a list of
804 generic section names known to be present in a range of different file
808 free_only_list (void)
810 bool at_least_one_seen
= false;
814 if (only_list
== NULL
)
817 for (only
= only_list
; only
; only
= only
->next
)
820 at_least_one_seen
= true;
824 for (only
= only_list
; only
; only
= next
)
826 if (! at_least_one_seen
)
828 non_fatal (_("section '%s' mentioned in a -j option, "
829 "but not found in any input file"),
840 dump_section_header (bfd
*abfd
, asection
*section
, void *data
)
843 unsigned int opb
= bfd_octets_per_byte (abfd
, section
);
844 int longest_section_name
= *((int *) data
);
846 /* Ignore linker created section. See elfNN_ia64_object_p in
848 if (section
->flags
& SEC_LINKER_CREATED
)
851 /* PR 10413: Skip sections that we are ignoring. */
852 if (! process_section_p (section
))
855 printf ("%3d %-*s %08lx ", section
->index
, longest_section_name
,
856 sanitize_string (bfd_section_name (section
)),
857 (unsigned long) bfd_section_size (section
) / opb
);
858 bfd_printf_vma (abfd
, bfd_section_vma (section
));
860 bfd_printf_vma (abfd
, section
->lma
);
861 printf (" %08lx 2**%u", (unsigned long) section
->filepos
,
862 bfd_section_alignment (section
));
868 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
870 PF (SEC_HAS_CONTENTS
, "CONTENTS");
871 PF (SEC_ALLOC
, "ALLOC");
872 PF (SEC_CONSTRUCTOR
, "CONSTRUCTOR");
873 PF (SEC_LOAD
, "LOAD");
874 PF (SEC_RELOC
, "RELOC");
875 PF (SEC_READONLY
, "READONLY");
876 PF (SEC_CODE
, "CODE");
877 PF (SEC_DATA
, "DATA");
879 PF (SEC_DEBUGGING
, "DEBUGGING");
880 PF (SEC_NEVER_LOAD
, "NEVER_LOAD");
881 PF (SEC_EXCLUDE
, "EXCLUDE");
882 PF (SEC_SORT_ENTRIES
, "SORT_ENTRIES");
883 if (bfd_get_arch (abfd
) == bfd_arch_tic54x
)
885 PF (SEC_TIC54X_BLOCK
, "BLOCK");
886 PF (SEC_TIC54X_CLINK
, "CLINK");
888 PF (SEC_SMALL_DATA
, "SMALL_DATA");
889 if (bfd_get_flavour (abfd
) == bfd_target_coff_flavour
)
891 PF (SEC_COFF_SHARED
, "SHARED");
892 PF (SEC_COFF_NOREAD
, "NOREAD");
894 else if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
896 PF (SEC_ELF_OCTETS
, "OCTETS");
897 PF (SEC_ELF_PURECODE
, "PURECODE");
899 PF (SEC_THREAD_LOCAL
, "THREAD_LOCAL");
900 PF (SEC_GROUP
, "GROUP");
901 if (bfd_get_arch (abfd
) == bfd_arch_mep
)
903 PF (SEC_MEP_VLIW
, "VLIW");
906 if ((section
->flags
& SEC_LINK_ONCE
) != 0)
909 struct coff_comdat_info
*comdat
;
911 switch (section
->flags
& SEC_LINK_DUPLICATES
)
915 case SEC_LINK_DUPLICATES_DISCARD
:
916 ls
= "LINK_ONCE_DISCARD";
918 case SEC_LINK_DUPLICATES_ONE_ONLY
:
919 ls
= "LINK_ONCE_ONE_ONLY";
921 case SEC_LINK_DUPLICATES_SAME_SIZE
:
922 ls
= "LINK_ONCE_SAME_SIZE";
924 case SEC_LINK_DUPLICATES_SAME_CONTENTS
:
925 ls
= "LINK_ONCE_SAME_CONTENTS";
928 printf ("%s%s", comma
, ls
);
930 comdat
= bfd_coff_get_comdat_section (abfd
, section
);
932 printf (" (COMDAT %s %ld)", comdat
->name
, comdat
->symbol
);
937 if (bfd_is_section_compressed (abfd
, section
))
938 printf ("%sCOMPRESSED", comma
);
944 /* Called on each SECTION in ABFD, update the int variable pointed to by
945 DATA which contains the string length of the longest section name. */
948 find_longest_section_name (bfd
*abfd ATTRIBUTE_UNUSED
,
949 asection
*section
, void *data
)
951 int *longest_so_far
= (int *) data
;
955 /* Ignore linker created section. */
956 if (section
->flags
& SEC_LINKER_CREATED
)
959 /* Skip sections that we are ignoring. */
960 if (! process_section_p (section
))
963 name
= bfd_section_name (section
);
964 len
= (int) strlen (name
);
965 if (len
> *longest_so_far
)
966 *longest_so_far
= len
;
970 dump_headers (bfd
*abfd
)
972 /* The default width of 13 is just an arbitrary choice. */
973 int max_section_name_length
= 13;
979 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
980 if (bfd_get_arch_size (abfd
) == 32)
986 printf (_("Sections:\n"));
989 bfd_map_over_sections (abfd
, find_longest_section_name
,
990 &max_section_name_length
);
992 printf (_("Idx %-*s Size %-*s%-*sFile off Algn"),
993 max_section_name_length
, "Name",
994 bfd_vma_width
, "VMA",
995 bfd_vma_width
, "LMA");
998 printf (_(" Flags"));
1001 bfd_map_over_sections (abfd
, dump_section_header
,
1002 &max_section_name_length
);
1006 slurp_symtab (bfd
*abfd
)
1009 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
1012 long storage
= bfd_get_symtab_upper_bound (abfd
);
1015 non_fatal (_("failed to read symbol table from: %s"),
1016 bfd_get_filename (abfd
));
1017 my_bfd_nonfatal (_("error message was"));
1023 asymbol
**sy
= (asymbol
**) xmalloc (storage
);
1024 symcount
= bfd_canonicalize_symtab (abfd
, sy
);
1027 my_bfd_nonfatal (bfd_get_filename (abfd
));
1035 /* Read in the dynamic symbols. */
1038 slurp_dynamic_symtab (bfd
*abfd
)
1041 long storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
1044 if (!(bfd_get_file_flags (abfd
) & DYNAMIC
))
1046 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd
));
1051 my_bfd_nonfatal (bfd_get_filename (abfd
));
1057 asymbol
**sy
= (asymbol
**) xmalloc (storage
);
1058 dynsymcount
= bfd_canonicalize_dynamic_symtab (abfd
, sy
);
1059 if (dynsymcount
< 0)
1061 my_bfd_nonfatal (bfd_get_filename (abfd
));
1069 /* Some symbol names are significant and should be kept in the
1070 table of sorted symbol names, even if they are marked as
1071 debugging/section symbols. */
1074 is_significant_symbol_name (const char * name
)
1076 return startswith (name
, ".plt") || startswith (name
, ".got");
1079 /* Filter out (in place) symbols that are useless for disassembly.
1080 COUNT is the number of elements in SYMBOLS.
1081 Return the number of useful symbols. */
1084 remove_useless_symbols (asymbol
**symbols
, long count
)
1086 asymbol
**in_ptr
= symbols
, **out_ptr
= symbols
;
1088 while (--count
>= 0)
1090 asymbol
*sym
= *in_ptr
++;
1092 if (sym
->name
== NULL
|| sym
->name
[0] == '\0')
1094 if ((sym
->flags
& (BSF_DEBUGGING
| BSF_SECTION_SYM
))
1095 && ! is_significant_symbol_name (sym
->name
))
1097 if (bfd_is_und_section (sym
->section
)
1098 || bfd_is_com_section (sym
->section
))
1103 return out_ptr
- symbols
;
1106 static const asection
*compare_section
;
1108 /* Sort symbols into value order. */
1111 compare_symbols (const void *ap
, const void *bp
)
1113 const asymbol
*a
= * (const asymbol
**) ap
;
1114 const asymbol
*b
= * (const asymbol
**) bp
;
1119 bool as
, af
, bs
, bf
;
1123 if (bfd_asymbol_value (a
) > bfd_asymbol_value (b
))
1125 else if (bfd_asymbol_value (a
) < bfd_asymbol_value (b
))
1128 /* Prefer symbols from the section currently being disassembled.
1129 Don't sort symbols from other sections by section, since there
1130 isn't much reason to prefer one section over another otherwise.
1131 See sym_ok comment for why we compare by section name. */
1132 as
= strcmp (compare_section
->name
, a
->section
->name
) == 0;
1133 bs
= strcmp (compare_section
->name
, b
->section
->name
) == 0;
1139 an
= bfd_asymbol_name (a
);
1140 bn
= bfd_asymbol_name (b
);
1144 /* The symbols gnu_compiled and gcc2_compiled convey no real
1145 information, so put them after other symbols with the same value. */
1146 af
= (strstr (an
, "gnu_compiled") != NULL
1147 || strstr (an
, "gcc2_compiled") != NULL
);
1148 bf
= (strstr (bn
, "gnu_compiled") != NULL
1149 || strstr (bn
, "gcc2_compiled") != NULL
);
1156 /* We use a heuristic for the file name, to try to sort it after
1157 more useful symbols. It may not work on non Unix systems, but it
1158 doesn't really matter; the only difference is precisely which
1159 symbol names get printed. */
1161 #define file_symbol(s, sn, snl) \
1162 (((s)->flags & BSF_FILE) != 0 \
1164 && (sn)[(snl) - 2] == '.' \
1165 && ((sn)[(snl) - 1] == 'o' \
1166 || (sn)[(snl) - 1] == 'a')))
1168 af
= file_symbol (a
, an
, anl
);
1169 bf
= file_symbol (b
, bn
, bnl
);
1176 /* Sort function and object symbols before global symbols before
1177 local symbols before section symbols before debugging symbols. */
1182 if ((aflags
& BSF_DEBUGGING
) != (bflags
& BSF_DEBUGGING
))
1184 if ((aflags
& BSF_DEBUGGING
) != 0)
1189 if ((aflags
& BSF_SECTION_SYM
) != (bflags
& BSF_SECTION_SYM
))
1191 if ((aflags
& BSF_SECTION_SYM
) != 0)
1196 if ((aflags
& BSF_FUNCTION
) != (bflags
& BSF_FUNCTION
))
1198 if ((aflags
& BSF_FUNCTION
) != 0)
1203 if ((aflags
& BSF_OBJECT
) != (bflags
& BSF_OBJECT
))
1205 if ((aflags
& BSF_OBJECT
) != 0)
1210 if ((aflags
& BSF_LOCAL
) != (bflags
& BSF_LOCAL
))
1212 if ((aflags
& BSF_LOCAL
) != 0)
1217 if ((aflags
& BSF_GLOBAL
) != (bflags
& BSF_GLOBAL
))
1219 if ((aflags
& BSF_GLOBAL
) != 0)
1225 /* Sort larger size ELF symbols before smaller. See PR20337. */
1227 if ((a
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) == 0
1228 && bfd_get_flavour (bfd_asymbol_bfd (a
)) == bfd_target_elf_flavour
)
1229 asz
= ((elf_symbol_type
*) a
)->internal_elf_sym
.st_size
;
1231 if ((b
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) == 0
1232 && bfd_get_flavour (bfd_asymbol_bfd (b
)) == bfd_target_elf_flavour
)
1233 bsz
= ((elf_symbol_type
*) b
)->internal_elf_sym
.st_size
;
1235 return asz
> bsz
? -1 : 1;
1237 /* Symbols that start with '.' might be section names, so sort them
1238 after symbols that don't start with '.'. */
1239 if (an
[0] == '.' && bn
[0] != '.')
1241 if (an
[0] != '.' && bn
[0] == '.')
1244 /* Finally, if we can't distinguish them in any other way, try to
1245 get consistent results by sorting the symbols by name. */
1246 return strcmp (an
, bn
);
1249 /* Sort relocs into address order. */
1252 compare_relocs (const void *ap
, const void *bp
)
1254 const arelent
*a
= * (const arelent
**) ap
;
1255 const arelent
*b
= * (const arelent
**) bp
;
1257 if (a
->address
> b
->address
)
1259 else if (a
->address
< b
->address
)
1262 /* So that associated relocations tied to the same address show up
1263 in the correct order, we don't do any further sorting. */
1272 /* Print an address (VMA) to the output stream in INFO.
1273 If SKIP_ZEROES is TRUE, omit leading zeroes. */
1276 objdump_print_value (bfd_vma vma
, struct disassemble_info
*inf
,
1281 struct objdump_disasm_info
*aux
;
1283 aux
= (struct objdump_disasm_info
*) inf
->application_data
;
1284 bfd_sprintf_vma (aux
->abfd
, buf
, vma
);
1289 for (p
= buf
; *p
== '0'; ++p
)
1294 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_address
, "%s", p
);
1297 /* Print the name of a symbol. */
1300 objdump_print_symname (bfd
*abfd
, struct disassemble_info
*inf
,
1304 const char *name
, *version_string
= NULL
;
1305 bool hidden
= false;
1308 name
= bfd_asymbol_name (sym
);
1309 if (do_demangle
&& name
[0] != '\0')
1311 /* Demangle the name. */
1312 alloc
= bfd_demangle (abfd
, name
, demangle_flags
);
1317 if ((sym
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) == 0)
1318 version_string
= bfd_get_symbol_version_string (abfd
, sym
, true,
1321 if (bfd_is_und_section (bfd_asymbol_section (sym
)))
1324 name
= sanitize_string (name
);
1328 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_symbol
, "%s", name
);
1329 if (version_string
&& *version_string
!= '\0')
1330 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_symbol
,
1331 hidden
? "@%s" : "@@%s",
1336 printf ("%s", name
);
1337 if (version_string
&& *version_string
!= '\0')
1338 printf (hidden
? "@%s" : "@@%s", version_string
);
1346 sym_ok (bool want_section
,
1347 bfd
*abfd ATTRIBUTE_UNUSED
,
1350 struct disassemble_info
*inf
)
1354 /* NB: An object file can have different sections with the same
1355 section name. Compare compare section pointers if they have
1357 if (sorted_syms
[place
]->section
->owner
== sec
->owner
1358 && sorted_syms
[place
]->section
!= sec
)
1361 /* Note - we cannot just compare section pointers because they could
1362 be different, but the same... Ie the symbol that we are trying to
1363 find could have come from a separate debug info file. Under such
1364 circumstances the symbol will be associated with a section in the
1365 debug info file, whilst the section we want is in a normal file.
1366 So the section pointers will be different, but the section names
1367 will be the same. */
1368 if (strcmp (bfd_section_name (sorted_syms
[place
]->section
),
1369 bfd_section_name (sec
)) != 0)
1373 return inf
->symbol_is_valid (sorted_syms
[place
], inf
);
1376 /* Locate a symbol given a bfd and a section (from INFO->application_data),
1377 and a VMA. If INFO->application_data->require_sec is TRUE, then always
1378 require the symbol to be in the section. Returns NULL if there is no
1379 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
1380 of the symbol in sorted_syms. */
1383 find_symbol_for_address (bfd_vma vma
,
1384 struct disassemble_info
*inf
,
1387 /* @@ Would it speed things up to cache the last two symbols returned,
1388 and maybe their address ranges? For many processors, only one memory
1389 operand can be present at a time, so the 2-entry cache wouldn't be
1390 constantly churned by code doing heavy memory accesses. */
1392 /* Indices in `sorted_syms'. */
1394 long max_count
= sorted_symcount
;
1396 struct objdump_disasm_info
*aux
;
1403 if (sorted_symcount
< 1)
1406 aux
= (struct objdump_disasm_info
*) inf
->application_data
;
1409 opb
= inf
->octets_per_byte
;
1411 /* Perform a binary search looking for the closest symbol to the
1412 required value. We are searching the range (min, max_count]. */
1413 while (min
+ 1 < max_count
)
1417 thisplace
= (max_count
+ min
) / 2;
1418 sym
= sorted_syms
[thisplace
];
1420 if (bfd_asymbol_value (sym
) > vma
)
1421 max_count
= thisplace
;
1422 else if (bfd_asymbol_value (sym
) < vma
)
1431 /* The symbol we want is now in min, the low end of the range we
1432 were searching. If there are several symbols with the same
1433 value, we want the first one. */
1435 while (thisplace
> 0
1436 && (bfd_asymbol_value (sorted_syms
[thisplace
])
1437 == bfd_asymbol_value (sorted_syms
[thisplace
- 1])))
1440 /* Prefer a symbol in the current section if we have multple symbols
1441 with the same value, as can occur with overlays or zero size
1444 while (min
< max_count
1445 && (bfd_asymbol_value (sorted_syms
[min
])
1446 == bfd_asymbol_value (sorted_syms
[thisplace
])))
1448 if (sym_ok (true, abfd
, min
, sec
, inf
))
1455 return sorted_syms
[thisplace
];
1460 /* If the file is relocatable, and the symbol could be from this
1461 section, prefer a symbol from this section over symbols from
1462 others, even if the other symbol's value might be closer.
1464 Note that this may be wrong for some symbol references if the
1465 sections have overlapping memory ranges, but in that case there's
1466 no way to tell what's desired without looking at the relocation
1469 Also give the target a chance to reject symbols. */
1470 want_section
= (aux
->require_sec
1471 || ((abfd
->flags
& HAS_RELOC
) != 0
1472 && vma
>= bfd_section_vma (sec
)
1473 && vma
< (bfd_section_vma (sec
)
1474 + bfd_section_size (sec
) / opb
)));
1476 if (! sym_ok (want_section
, abfd
, thisplace
, sec
, inf
))
1479 long newplace
= sorted_symcount
;
1481 for (i
= min
- 1; i
>= 0; i
--)
1483 if (sym_ok (want_section
, abfd
, i
, sec
, inf
))
1485 if (newplace
== sorted_symcount
)
1488 if (bfd_asymbol_value (sorted_syms
[i
])
1489 != bfd_asymbol_value (sorted_syms
[newplace
]))
1492 /* Remember this symbol and keep searching until we reach
1493 an earlier address. */
1498 if (newplace
!= sorted_symcount
)
1499 thisplace
= newplace
;
1502 /* We didn't find a good symbol with a smaller value.
1503 Look for one with a larger value. */
1504 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
1506 if (sym_ok (want_section
, abfd
, i
, sec
, inf
))
1514 if (! sym_ok (want_section
, abfd
, thisplace
, sec
, inf
))
1515 /* There is no suitable symbol. */
1519 /* If we have not found an exact match for the specified address
1520 and we have dynamic relocations available, then we can produce
1521 a better result by matching a relocation to the address and
1522 using the symbol associated with that relocation. */
1523 rel_count
= inf
->dynrelcount
;
1525 && sorted_syms
[thisplace
]->value
!= vma
1527 && inf
->dynrelbuf
!= NULL
1528 && inf
->dynrelbuf
[0]->address
<= vma
1529 && inf
->dynrelbuf
[rel_count
- 1]->address
>= vma
1530 /* If we have matched a synthetic symbol, then stick with that. */
1531 && (sorted_syms
[thisplace
]->flags
& BSF_SYNTHETIC
) == 0)
1534 arelent
** rel_high
;
1536 rel_low
= inf
->dynrelbuf
;
1537 rel_high
= rel_low
+ rel_count
- 1;
1538 while (rel_low
<= rel_high
)
1540 arelent
**rel_mid
= &rel_low
[(rel_high
- rel_low
) / 2];
1541 arelent
* rel
= *rel_mid
;
1543 if (rel
->address
== vma
)
1545 /* Absolute relocations do not provide a more helpful
1546 symbolic address. Find a non-absolute relocation
1547 with the same address. */
1548 arelent
**rel_vma
= rel_mid
;
1550 rel_mid
>= rel_low
&& rel_mid
[0]->address
== vma
;
1554 for (; rel_vma
<= rel_high
&& rel_vma
[0]->address
== vma
;
1558 if (rel
->sym_ptr_ptr
!= NULL
1559 && ! bfd_is_abs_section ((* rel
->sym_ptr_ptr
)->section
))
1562 * place
= thisplace
;
1563 return * rel
->sym_ptr_ptr
;
1569 if (vma
< rel
->address
)
1571 else if (vma
>= rel_mid
[1]->address
)
1572 rel_low
= rel_mid
+ 1;
1581 return sorted_syms
[thisplace
];
1584 /* Print an address and the offset to the nearest symbol. */
1587 objdump_print_addr_with_sym (bfd
*abfd
, asection
*sec
, asymbol
*sym
,
1588 bfd_vma vma
, struct disassemble_info
*inf
,
1593 objdump_print_value (vma
, inf
, skip_zeroes
);
1594 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_text
, " ");
1601 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_text
,"<");
1602 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_symbol
, "%s",
1603 sanitize_string (bfd_section_name (sec
)));
1604 secaddr
= bfd_section_vma (sec
);
1607 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_immediate
,
1609 objdump_print_value (secaddr
- vma
, inf
, true);
1611 else if (vma
> secaddr
)
1613 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_immediate
, "+0x");
1614 objdump_print_value (vma
- secaddr
, inf
, true);
1616 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_text
, ">");
1620 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_text
, "<");
1622 objdump_print_symname (abfd
, inf
, sym
);
1624 if (bfd_asymbol_value (sym
) == vma
)
1626 /* Undefined symbols in an executables and dynamic objects do not have
1627 a value associated with them, so it does not make sense to display
1628 an offset relative to them. Normally we would not be provided with
1629 this kind of symbol, but the target backend might choose to do so,
1630 and the code in find_symbol_for_address might return an as yet
1631 unresolved symbol associated with a dynamic reloc. */
1632 else if ((bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
1633 && bfd_is_und_section (sym
->section
))
1635 else if (bfd_asymbol_value (sym
) > vma
)
1637 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_immediate
,"-0x");
1638 objdump_print_value (bfd_asymbol_value (sym
) - vma
, inf
, true);
1640 else if (vma
> bfd_asymbol_value (sym
))
1642 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_immediate
, "+0x");
1643 objdump_print_value (vma
- bfd_asymbol_value (sym
), inf
, true);
1646 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_text
, ">");
1649 if (display_file_offsets
)
1650 inf
->fprintf_styled_func (inf
->stream
, dis_style_text
,
1651 _(" (File Offset: 0x%lx)"),
1652 (long int)(sec
->filepos
+ (vma
- sec
->vma
)));
1655 /* Displays all symbols in the sorted symbol table starting at PLACE
1656 which match the address VMA. Assumes that show_all_symbols == true. */
1659 display_extra_syms (long place
,
1661 struct disassemble_info
*inf
)
1663 struct objdump_disasm_info
*aux
= (struct objdump_disasm_info
*) inf
->application_data
;
1670 for (; place
< sorted_symcount
; place
++)
1672 asymbol
*sym
= sorted_syms
[place
];
1674 if (bfd_asymbol_value (sym
) != vma
)
1677 if (! inf
->symbol_is_valid (sym
, inf
))
1680 if (first
&& ! do_wide
)
1681 inf
->fprintf_styled_func (inf
->stream
, dis_style_immediate
, ",\n\t<");
1683 inf
->fprintf_styled_func (inf
->stream
, dis_style_immediate
, ", <");
1685 objdump_print_symname (aux
->abfd
, inf
, sym
);
1686 inf
->fprintf_styled_func (inf
->stream
, dis_style_immediate
, ">");
1691 /* Print an address (VMA), symbolically if possible.
1692 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
1695 objdump_print_addr (bfd_vma vma
,
1696 struct disassemble_info
*inf
,
1699 struct objdump_disasm_info
*aux
;
1700 asymbol
*sym
= NULL
;
1701 bool skip_find
= false;
1704 aux
= (struct objdump_disasm_info
*) inf
->application_data
;
1706 if (sorted_symcount
< 1)
1710 (*inf
->fprintf_styled_func
) (inf
->stream
, dis_style_address
, "0x");
1711 objdump_print_value (vma
, inf
, skip_zeroes
);
1714 if (display_file_offsets
)
1715 inf
->fprintf_styled_func (inf
->stream
, dis_style_text
,
1716 _(" (File Offset: 0x%lx)"),
1717 (long int) (inf
->section
->filepos
1718 + (vma
- inf
->section
->vma
)));
1722 if (aux
->reloc
!= NULL
1723 && aux
->reloc
->sym_ptr_ptr
!= NULL
1724 && * aux
->reloc
->sym_ptr_ptr
!= NULL
)
1726 sym
= * aux
->reloc
->sym_ptr_ptr
;
1728 /* Adjust the vma to the reloc. */
1729 vma
+= bfd_asymbol_value (sym
);
1731 if (bfd_is_und_section (bfd_asymbol_section (sym
)))
1736 sym
= find_symbol_for_address (vma
, inf
, &place
);
1738 objdump_print_addr_with_sym (aux
->abfd
, inf
->section
, sym
, vma
, inf
,
1741 /* If requested, display any extra symbols at this address. */
1742 if (sym
== NULL
|| ! show_all_symbols
)
1746 display_extra_syms (place
+ 1, vma
, inf
);
1748 /* If we found an absolute symbol in the reloc (ie: "*ABS*+0x....")
1749 and there is a valid symbol at the address contained in the absolute symbol
1750 then display any extra symbols that match this address. This helps
1751 particularly with relocations for PLT entries. */
1752 if (startswith (sym
->name
, BFD_ABS_SECTION_NAME
"+"))
1754 bfd_vma addr
= strtoul (sym
->name
+ strlen (BFD_ABS_SECTION_NAME
"+"), NULL
, 0);
1756 if (addr
&& addr
!= vma
)
1758 sym
= find_symbol_for_address (addr
, inf
, &place
);
1761 display_extra_syms (place
, addr
, inf
);
1766 /* Print VMA to INFO. This function is passed to the disassembler
1770 objdump_print_address (bfd_vma vma
, struct disassemble_info
*inf
)
1772 objdump_print_addr (vma
, inf
, ! prefix_addresses
);
1775 /* Determine if the given address has a symbol associated with it. */
1778 objdump_symbol_at_address (bfd_vma vma
, struct disassemble_info
* inf
)
1782 sym
= find_symbol_for_address (vma
, inf
, NULL
);
1783 if (sym
!= NULL
&& bfd_asymbol_value (sym
) == vma
)
1789 /* Hold the last function name and the last line number we displayed
1790 in a disassembly. */
1792 static char *prev_functionname
;
1793 static unsigned int prev_line
;
1794 static unsigned int prev_discriminator
;
1796 /* We keep a list of all files that we have seen when doing a
1797 disassembly with source, so that we know how much of the file to
1798 display. This can be important for inlined functions. */
1800 struct print_file_list
1802 struct print_file_list
*next
;
1803 const char *filename
;
1804 const char *modname
;
1807 const char **linemap
;
1810 unsigned max_printed
;
1814 static struct print_file_list
*print_files
;
1816 /* The number of preceding context lines to show when we start
1817 displaying a file for the first time. */
1819 #define SHOW_PRECEDING_CONTEXT_LINES (5)
1821 #if HAVE_LIBDEBUGINFOD
1822 /* Return a hex string represention of the build-id. */
1825 get_build_id (void * data
)
1828 char * build_id_str
;
1829 bfd
* abfd
= (bfd
*) data
;
1830 const struct bfd_build_id
* build_id
;
1832 build_id
= abfd
->build_id
;
1833 if (build_id
== NULL
)
1836 build_id_str
= malloc (build_id
->size
* 2 + 1);
1837 if (build_id_str
== NULL
)
1840 for (i
= 0; i
< build_id
->size
; i
++)
1841 sprintf (build_id_str
+ (i
* 2), "%02x", build_id
->data
[i
]);
1842 build_id_str
[build_id
->size
* 2] = '\0';
1844 return (unsigned char *) build_id_str
;
1847 /* Search for a separate debug file matching ABFD's build-id. */
1850 find_separate_debug (const bfd
* abfd
)
1852 const struct bfd_build_id
* build_id
= abfd
->build_id
;
1853 separate_info
* i
= first_separate_info
;
1855 if (build_id
== NULL
|| i
== NULL
)
1860 const bfd
* i_bfd
= (bfd
*) i
->handle
;
1862 if (abfd
!= NULL
&& i_bfd
->build_id
!= NULL
)
1864 const unsigned char * data
= i_bfd
->build_id
->data
;
1865 size_t size
= i_bfd
->build_id
->size
;
1867 if (size
== build_id
->size
1868 && memcmp (data
, build_id
->data
, size
) == 0)
1869 return (bfd
*) i
->handle
;
1878 /* Search for a separate debug file matching ABFD's .gnu_debugaltlink
1882 find_alt_debug (const bfd
* abfd
)
1887 struct dwarf_section
* section
;
1888 const struct bfd_build_id
* build_id
= abfd
->build_id
;
1889 separate_info
* i
= first_separate_info
;
1893 || !load_debug_section (gnu_debugaltlink
, (void *) abfd
))
1896 section
= &debug_displays
[gnu_debugaltlink
].section
;
1897 if (section
== NULL
)
1900 name
= (const char *) section
->start
;
1901 namelen
= strnlen (name
, section
->size
) + 1;
1904 if (namelen
>= section
->size
)
1907 id_len
= section
->size
- namelen
;
1911 /* Compare the .gnu_debugaltlink build-id with the build-ids of the
1912 known separate_info files. */
1915 const bfd
* i_bfd
= (bfd
*) i
->handle
;
1917 if (i_bfd
!= NULL
&& i_bfd
->build_id
!= NULL
)
1919 const unsigned char * data
= i_bfd
->build_id
->data
;
1920 size_t size
= i_bfd
->build_id
->size
;
1923 && memcmp (section
->start
+ namelen
, data
, size
) == 0)
1924 return (bfd
*) i
->handle
;
1933 #endif /* HAVE_LIBDEBUGINFOD */
1935 /* Reads the contents of file FN into memory. Returns a pointer to the buffer.
1936 Also returns the size of the buffer in SIZE_RETURN and a filled out
1937 stat structure in FST_RETURN. Returns NULL upon failure. */
1940 slurp_file (const char * fn
,
1941 size_t * size_return
,
1942 struct stat
* fst_return
,
1943 bfd
* abfd ATTRIBUTE_UNUSED
)
1953 if (fn
== NULL
|| * fn
== 0 || size_return
== NULL
|| fst_return
== NULL
)
1956 fd
= open (fn
, O_RDONLY
| O_BINARY
);
1958 #if HAVE_LIBDEBUGINFOD
1959 if (fd
< 0 && use_debuginfod
&& fn
[0] == '/' && abfd
!= NULL
)
1961 unsigned char *build_id
= get_build_id (abfd
);
1965 debuginfod_client
*client
= debuginfod_begin ();
1969 fd
= debuginfod_find_source (client
, build_id
, 0, fn
, NULL
);
1970 debuginfod_end (client
);
1980 if (fstat (fd
, fst_return
) < 0)
1986 *size_return
= fst_return
->st_size
;
1989 ps
= getpagesize ();
1990 msize
= (*size_return
+ ps
- 1) & ~(ps
- 1);
1991 map
= mmap (NULL
, msize
, PROT_READ
, MAP_SHARED
, fd
, 0);
1992 if (map
!= (char *) -1L)
1999 map
= (const char *) malloc (*size_return
);
2000 if (!map
|| (size_t) read (fd
, (char *) map
, *size_return
) != *size_return
)
2002 free ((void *) map
);
2009 #define line_map_decrease 5
2011 /* Precompute array of lines for a mapped file. */
2013 static const char **
2014 index_file (const char *map
, size_t size
, unsigned int *maxline
)
2016 const char *p
, *lstart
, *end
;
2017 int chars_per_line
= 45; /* First iteration will use 40. */
2018 unsigned int lineno
;
2019 const char **linemap
= NULL
;
2020 unsigned long line_map_size
= 0;
2026 for (p
= map
; p
< end
; p
++)
2030 if (p
+ 1 < end
&& p
[1] == '\r')
2033 else if (*p
== '\r')
2035 if (p
+ 1 < end
&& p
[1] == '\n')
2041 /* End of line found. */
2043 if (linemap
== NULL
|| line_map_size
< lineno
+ 1)
2045 unsigned long newsize
;
2047 chars_per_line
-= line_map_decrease
;
2048 if (chars_per_line
<= 1)
2050 line_map_size
= size
/ chars_per_line
+ 1;
2051 if (line_map_size
< lineno
+ 1)
2052 line_map_size
= lineno
+ 1;
2053 newsize
= line_map_size
* sizeof (char *);
2054 linemap
= (const char **) xrealloc (linemap
, newsize
);
2057 linemap
[lineno
++] = lstart
;
2065 /* Tries to open MODNAME, and if successful adds a node to print_files
2066 linked list and returns that node. Also fills in the stat structure
2067 pointed to by FST_RETURN. Returns NULL on failure. */
2069 static struct print_file_list
*
2070 try_print_file_open (const char * origname
,
2071 const char * modname
,
2072 struct stat
* fst_return
,
2075 struct print_file_list
*p
;
2077 p
= (struct print_file_list
*) xmalloc (sizeof (struct print_file_list
));
2079 p
->map
= slurp_file (modname
, &p
->mapsize
, fst_return
, abfd
);
2086 p
->linemap
= index_file (p
->map
, p
->mapsize
, &p
->maxline
);
2089 p
->filename
= origname
;
2090 p
->modname
= modname
;
2091 p
->next
= print_files
;
2097 /* If the source file, as described in the symtab, is not found
2098 try to locate it in one of the paths specified with -I
2099 If found, add location to print_files linked list. */
2101 static struct print_file_list
*
2102 update_source_path (const char *filename
, bfd
*abfd
)
2104 struct print_file_list
*p
;
2109 p
= try_print_file_open (filename
, filename
, &fst
, abfd
);
2112 if (include_path_count
== 0)
2115 /* Get the name of the file. */
2116 fname
= lbasename (filename
);
2118 /* If file exists under a new path, we need to add it to the list
2119 so that show_line knows about it. */
2120 for (i
= 0; i
< include_path_count
; i
++)
2122 char *modname
= concat (include_paths
[i
], "/", fname
,
2125 p
= try_print_file_open (filename
, modname
, &fst
, abfd
);
2135 long mtime
= bfd_get_mtime (abfd
);
2137 if (fst
.st_mtime
> mtime
)
2138 warn (_("source file %s is more recent than object file\n"),
2145 /* Print a source file line. */
2148 print_line (struct print_file_list
*p
, unsigned int linenum
)
2153 if (linenum
>= p
->maxline
)
2155 l
= p
->linemap
[linenum
];
2156 if (source_comment
!= NULL
&& strlen (l
) > 0)
2157 printf ("%s", source_comment
);
2158 len
= strcspn (l
, "\n\r");
2159 /* Test fwrite return value to quiet glibc warning. */
2160 if (len
== 0 || fwrite (l
, len
, 1, stdout
) == 1)
2164 /* Print a range of source code lines. */
2167 dump_lines (struct print_file_list
*p
, unsigned int start
, unsigned int end
)
2175 print_line (p
, start
);
2180 /* Show the line number, or the source line, in a disassembly
2184 show_line (bfd
*abfd
, asection
*section
, bfd_vma addr_offset
)
2186 const char *filename
;
2187 const char *functionname
;
2188 unsigned int linenumber
;
2189 unsigned int discriminator
;
2193 if (! with_line_numbers
&& ! with_source_code
)
2196 #ifdef HAVE_LIBDEBUGINFOD
2199 const char *alt_filename
= NULL
;
2205 /* PR 29075: Check for separate debuginfo and .gnu_debugaltlink files.
2206 They need to be passed to bfd_find_nearest_line_with_alt in case they
2207 were downloaded from debuginfod. Otherwise libbfd will attempt to
2208 search for them and fail to locate them. */
2209 debug_bfd
= find_separate_debug (abfd
);
2210 if (debug_bfd
== NULL
)
2213 alt_bfd
= find_alt_debug (debug_bfd
);
2214 if (alt_bfd
!= NULL
)
2215 alt_filename
= bfd_get_filename (alt_bfd
);
2220 bfd_set_error (bfd_error_no_error
);
2221 if (! bfd_find_nearest_line_with_alt (debug_bfd
, alt_filename
,
2223 addr_offset
, &filename
,
2224 &functionname
, &linenumber
,
2227 if (bfd_get_error () == bfd_error_no_error
)
2229 if (! bfd_find_nearest_line_discriminator (abfd
, section
, syms
,
2230 addr_offset
, &filename
,
2231 &functionname
, &linenumber
,
2237 if (! bfd_find_nearest_line_discriminator (abfd
, section
, syms
, addr_offset
,
2238 &filename
, &functionname
,
2239 &linenumber
, &discriminator
))
2243 if (filename
!= NULL
&& *filename
== '\0')
2245 if (functionname
!= NULL
&& *functionname
== '\0')
2246 functionname
= NULL
;
2249 && IS_ABSOLUTE_PATH (filename
)
2253 const char *fname
= filename
;
2255 path
= xmalloc (prefix_length
+ 1 + strlen (filename
));
2258 memcpy (path
, prefix
, prefix_length
);
2259 path_up
= path
+ prefix_length
;
2261 /* Build relocated filename, stripping off leading directories
2262 from the initial filename if requested. */
2263 if (prefix_strip
> 0)
2268 /* Skip selected directory levels. */
2269 for (s
= fname
+ 1; *s
!= '\0' && level
< prefix_strip
; s
++)
2270 if (IS_DIR_SEPARATOR (*s
))
2277 /* Update complete filename. */
2278 strcpy (path_up
, fname
);
2286 if (with_line_numbers
)
2288 if (functionname
!= NULL
2289 && (prev_functionname
== NULL
2290 || strcmp (functionname
, prev_functionname
) != 0))
2292 char *demangle_alloc
= NULL
;
2293 if (do_demangle
&& functionname
[0] != '\0')
2295 /* Demangle the name. */
2296 demangle_alloc
= bfd_demangle (abfd
, functionname
,
2300 /* Demangling adds trailing parens, so don't print those. */
2301 if (demangle_alloc
!= NULL
)
2302 printf ("%s:\n", sanitize_string (demangle_alloc
));
2304 printf ("%s():\n", sanitize_string (functionname
));
2307 free (demangle_alloc
);
2310 && (linenumber
!= prev_line
2311 || discriminator
!= prev_discriminator
))
2313 if (discriminator
> 0)
2314 printf ("%s:%u (discriminator %u)\n",
2315 filename
== NULL
? "???" : sanitize_string (filename
),
2316 linenumber
, discriminator
);
2318 printf ("%s:%u\n", filename
== NULL
2319 ? "???" : sanitize_string (filename
),
2324 const char *filename2
;
2325 const char *functionname2
;
2328 while (bfd_find_inliner_info (abfd
, &filename2
, &functionname2
,
2331 printf ("inlined by %s:%u",
2332 sanitize_string (filename2
), line2
);
2333 printf (" (%s)\n", sanitize_string (functionname2
));
2338 if (with_source_code
2342 struct print_file_list
**pp
, *p
;
2345 for (pp
= &print_files
; *pp
!= NULL
; pp
= &(*pp
)->next
)
2346 if (filename_cmp ((*pp
)->filename
, filename
) == 0)
2353 filename
= xstrdup (filename
);
2354 p
= update_source_path (filename
, abfd
);
2357 if (p
!= NULL
&& linenumber
!= p
->last_line
)
2359 if (file_start_context
&& p
->first
)
2363 l
= linenumber
- SHOW_PRECEDING_CONTEXT_LINES
;
2364 if (l
>= linenumber
)
2366 if (p
->max_printed
>= l
)
2368 if (p
->max_printed
< linenumber
)
2369 l
= p
->max_printed
+ 1;
2374 dump_lines (p
, l
, linenumber
);
2375 if (p
->max_printed
< linenumber
)
2376 p
->max_printed
= linenumber
;
2377 p
->last_line
= linenumber
;
2382 if (functionname
!= NULL
2383 && (prev_functionname
== NULL
2384 || strcmp (functionname
, prev_functionname
) != 0))
2386 if (prev_functionname
!= NULL
)
2387 free (prev_functionname
);
2388 prev_functionname
= (char *) xmalloc (strlen (functionname
) + 1);
2389 strcpy (prev_functionname
, functionname
);
2392 if (linenumber
> 0 && linenumber
!= prev_line
)
2393 prev_line
= linenumber
;
2395 if (discriminator
!= prev_discriminator
)
2396 prev_discriminator
= discriminator
;
2402 /* Pseudo FILE object for strings. */
2410 /* sprintf to a "stream". */
2412 static int ATTRIBUTE_PRINTF_2
2413 objdump_sprintf (SFILE
*f
, const char *format
, ...)
2420 size_t space
= f
->alloc
- f
->pos
;
2422 va_start (args
, format
);
2423 n
= vsnprintf (f
->buffer
+ f
->pos
, space
, format
, args
);
2429 f
->alloc
= (f
->alloc
+ n
) * 2;
2430 f
->buffer
= (char *) xrealloc (f
->buffer
, f
->alloc
);
2437 /* Return an integer greater than, or equal to zero, representing the color
2438 for STYLE, or -1 if no color should be used. */
2441 objdump_color_for_disassembler_style (enum disassembler_style style
)
2445 if (style
== dis_style_comment_start
)
2446 disassembler_in_comment
= true;
2448 if (disassembler_color
== on
)
2450 if (disassembler_in_comment
)
2455 case dis_style_symbol
:
2458 case dis_style_assembler_directive
:
2459 case dis_style_sub_mnemonic
:
2460 case dis_style_mnemonic
:
2463 case dis_style_register
:
2466 case dis_style_address
:
2467 case dis_style_address_offset
:
2468 case dis_style_immediate
:
2472 case dis_style_text
:
2477 else if (disassembler_color
== extended
)
2479 if (disassembler_in_comment
)
2484 case dis_style_symbol
:
2487 case dis_style_assembler_directive
:
2488 case dis_style_sub_mnemonic
:
2489 case dis_style_mnemonic
:
2492 case dis_style_register
:
2495 case dis_style_address
:
2496 case dis_style_address_offset
:
2497 case dis_style_immediate
:
2501 case dis_style_text
:
2506 else if (disassembler_color
!= off
)
2507 bfd_fatal (_("disassembly color not correctly selected"));
2512 /* Like objdump_sprintf, but add in escape sequences to highlight the
2513 content according to STYLE. */
2515 static int ATTRIBUTE_PRINTF_3
2516 objdump_styled_sprintf (SFILE
*f
, enum disassembler_style style
,
2517 const char *format
, ...)
2521 int color
= objdump_color_for_disassembler_style (style
);
2527 size_t space
= f
->alloc
- f
->pos
;
2529 if (disassembler_color
== on
)
2530 n
= snprintf (f
->buffer
+ f
->pos
, space
, "\033[%dm", color
);
2532 n
= snprintf (f
->buffer
+ f
->pos
, space
, "\033[38;5;%dm", color
);
2536 f
->alloc
= (f
->alloc
+ n
) * 2;
2537 f
->buffer
= (char *) xrealloc (f
->buffer
, f
->alloc
);
2544 size_t space
= f
->alloc
- f
->pos
;
2546 va_start (args
, format
);
2547 n
= vsnprintf (f
->buffer
+ f
->pos
, space
, format
, args
);
2553 f
->alloc
= (f
->alloc
+ n
) * 2;
2554 f
->buffer
= (char *) xrealloc (f
->buffer
, f
->alloc
);
2562 size_t space
= f
->alloc
- f
->pos
;
2564 n
= snprintf (f
->buffer
+ f
->pos
, space
, "\033[0m");
2569 f
->alloc
= (f
->alloc
+ n
) * 2;
2570 f
->buffer
= (char *) xrealloc (f
->buffer
, f
->alloc
);
2578 /* We discard the styling information here. This function is only used
2579 when objdump is printing auxiliary information, the symbol headers, and
2580 disassembly address, or the bytes of the disassembled instruction. We
2581 don't (currently) apply styling to any of this stuff, so, for now, just
2582 print the content with no additional style added. */
2584 static int ATTRIBUTE_PRINTF_3
2585 fprintf_styled (FILE *f
, enum disassembler_style style ATTRIBUTE_UNUSED
,
2586 const char *fmt
, ...)
2592 res
= vfprintf (f
, fmt
, ap
);
2598 /* Code for generating (colored) diagrams of control flow start and end
2601 /* Structure used to store the properties of a jump. */
2605 /* The next jump, or NULL if this is the last object. */
2606 struct jump_info
*next
;
2607 /* The previous jump, or NULL if this is the first object. */
2608 struct jump_info
*prev
;
2609 /* The start addresses of the jump. */
2612 /* The list of start addresses. */
2614 /* The number of elements. */
2616 /* The maximum number of elements that fit into the array. */
2619 /* The end address of the jump. */
2621 /* The drawing level of the jump. */
2625 /* Construct a jump object for a jump from start
2626 to end with the corresponding level. */
2628 static struct jump_info
*
2629 jump_info_new (bfd_vma start
, bfd_vma end
, int level
)
2631 struct jump_info
*result
= xmalloc (sizeof (struct jump_info
));
2633 result
->next
= NULL
;
2634 result
->prev
= NULL
;
2635 result
->start
.addresses
= xmalloc (sizeof (bfd_vma
*) * 2);
2636 result
->start
.addresses
[0] = start
;
2637 result
->start
.count
= 1;
2638 result
->start
.max_count
= 2;
2640 result
->level
= level
;
2645 /* Free a jump object and return the next object
2646 or NULL if this was the last one. */
2648 static struct jump_info
*
2649 jump_info_free (struct jump_info
*ji
)
2651 struct jump_info
*result
= NULL
;
2656 if (ji
->start
.addresses
)
2657 free (ji
->start
.addresses
);
2664 /* Get the smallest value of all start and end addresses. */
2667 jump_info_min_address (const struct jump_info
*ji
)
2669 bfd_vma min_address
= ji
->end
;
2672 for (i
= ji
->start
.count
; i
-- > 0;)
2673 if (ji
->start
.addresses
[i
] < min_address
)
2674 min_address
= ji
->start
.addresses
[i
];
2678 /* Get the largest value of all start and end addresses. */
2681 jump_info_max_address (const struct jump_info
*ji
)
2683 bfd_vma max_address
= ji
->end
;
2686 for (i
= ji
->start
.count
; i
-- > 0;)
2687 if (ji
->start
.addresses
[i
] > max_address
)
2688 max_address
= ji
->start
.addresses
[i
];
2692 /* Get the target address of a jump. */
2695 jump_info_end_address (const struct jump_info
*ji
)
2700 /* Test if an address is one of the start addresses of a jump. */
2703 jump_info_is_start_address (const struct jump_info
*ji
, bfd_vma address
)
2705 bool result
= false;
2708 for (i
= ji
->start
.count
; i
-- > 0;)
2709 if (address
== ji
->start
.addresses
[i
])
2718 /* Test if an address is the target address of a jump. */
2721 jump_info_is_end_address (const struct jump_info
*ji
, bfd_vma address
)
2723 return (address
== ji
->end
);
2726 /* Get the difference between the smallest and largest address of a jump. */
2729 jump_info_size (const struct jump_info
*ji
)
2731 return jump_info_max_address (ji
) - jump_info_min_address (ji
);
2734 /* Unlink a jump object from a list. */
2737 jump_info_unlink (struct jump_info
*node
,
2738 struct jump_info
**base
)
2741 node
->next
->prev
= node
->prev
;
2743 node
->prev
->next
= node
->next
;
2750 /* Insert unlinked jump info node into a list. */
2753 jump_info_insert (struct jump_info
*node
,
2754 struct jump_info
*target
,
2755 struct jump_info
**base
)
2757 node
->next
= target
;
2758 node
->prev
= target
->prev
;
2759 target
->prev
= node
;
2761 node
->prev
->next
= node
;
2766 /* Add unlinked node to the front of a list. */
2769 jump_info_add_front (struct jump_info
*node
,
2770 struct jump_info
**base
)
2774 node
->next
->prev
= node
;
2779 /* Move linked node to target position. */
2782 jump_info_move_linked (struct jump_info
*node
,
2783 struct jump_info
*target
,
2784 struct jump_info
**base
)
2787 jump_info_unlink (node
, base
);
2788 /* Insert node at target position. */
2789 jump_info_insert (node
, target
, base
);
2792 /* Test if two jumps intersect. */
2795 jump_info_intersect (const struct jump_info
*a
,
2796 const struct jump_info
*b
)
2798 return ((jump_info_max_address (a
) >= jump_info_min_address (b
))
2799 && (jump_info_min_address (a
) <= jump_info_max_address (b
)));
2802 /* Merge two compatible jump info objects. */
2805 jump_info_merge (struct jump_info
**base
)
2807 struct jump_info
*a
;
2809 for (a
= *base
; a
; a
= a
->next
)
2811 struct jump_info
*b
;
2813 for (b
= a
->next
; b
; b
= b
->next
)
2815 /* Merge both jumps into one. */
2816 if (a
->end
== b
->end
)
2818 /* Reallocate addresses. */
2819 size_t needed_size
= a
->start
.count
+ b
->start
.count
;
2822 if (needed_size
> a
->start
.max_count
)
2824 a
->start
.max_count
+= b
->start
.max_count
;
2825 a
->start
.addresses
=
2826 xrealloc (a
->start
.addresses
,
2827 a
->start
.max_count
* sizeof (bfd_vma
*));
2830 /* Append start addresses. */
2831 for (i
= 0; i
< b
->start
.count
; ++i
)
2832 a
->start
.addresses
[a
->start
.count
++] =
2833 b
->start
.addresses
[i
];
2835 /* Remove and delete jump. */
2836 struct jump_info
*tmp
= b
->prev
;
2837 jump_info_unlink (b
, base
);
2845 /* Sort jumps by their size and starting point using a stable
2846 minsort. This could be improved if sorting performance is
2847 an issue, for example by using mergesort. */
2850 jump_info_sort (struct jump_info
**base
)
2852 struct jump_info
*current_element
= *base
;
2854 while (current_element
)
2856 struct jump_info
*best_match
= current_element
;
2857 struct jump_info
*runner
= current_element
->next
;
2858 bfd_vma best_size
= jump_info_size (best_match
);
2862 bfd_vma runner_size
= jump_info_size (runner
);
2864 if ((runner_size
< best_size
)
2865 || ((runner_size
== best_size
)
2866 && (jump_info_min_address (runner
)
2867 < jump_info_min_address (best_match
))))
2869 best_match
= runner
;
2870 best_size
= runner_size
;
2873 runner
= runner
->next
;
2876 if (best_match
== current_element
)
2877 current_element
= current_element
->next
;
2879 jump_info_move_linked (best_match
, current_element
, base
);
2883 /* Visualize all jumps at a given address. */
2886 jump_info_visualize_address (bfd_vma address
,
2889 uint8_t *color_buffer
)
2891 struct jump_info
*ji
= detected_jumps
;
2892 size_t len
= (max_level
+ 1) * 3;
2894 /* Clear line buffer. */
2895 memset (line_buffer
, ' ', len
);
2896 memset (color_buffer
, 0, len
);
2898 /* Iterate over jumps and add their ASCII art. */
2901 /* Discard jumps that are never needed again. */
2902 if (jump_info_max_address (ji
) < address
)
2904 struct jump_info
*tmp
= ji
;
2907 jump_info_unlink (tmp
, &detected_jumps
);
2908 jump_info_free (tmp
);
2912 /* This jump intersects with the current address. */
2913 if (jump_info_min_address (ji
) <= address
)
2915 /* Hash target address to get an even
2916 distribution between all values. */
2917 bfd_vma hash_address
= jump_info_end_address (ji
);
2918 uint8_t color
= iterative_hash_object (hash_address
, 0);
2919 /* Fetch line offset. */
2920 int offset
= (max_level
- ji
->level
) * 3;
2922 /* Draw start line. */
2923 if (jump_info_is_start_address (ji
, address
))
2925 size_t i
= offset
+ 1;
2927 for (; i
< len
- 1; ++i
)
2928 if (line_buffer
[i
] == ' ')
2930 line_buffer
[i
] = '-';
2931 color_buffer
[i
] = color
;
2934 if (line_buffer
[i
] == ' ')
2936 line_buffer
[i
] = '-';
2937 color_buffer
[i
] = color
;
2939 else if (line_buffer
[i
] == '>')
2941 line_buffer
[i
] = 'X';
2942 color_buffer
[i
] = color
;
2945 if (line_buffer
[offset
] == ' ')
2947 if (address
<= ji
->end
)
2948 line_buffer
[offset
] =
2949 (jump_info_min_address (ji
) == address
) ? '/': '+';
2951 line_buffer
[offset
] =
2952 (jump_info_max_address (ji
) == address
) ? '\\': '+';
2953 color_buffer
[offset
] = color
;
2956 /* Draw jump target. */
2957 else if (jump_info_is_end_address (ji
, address
))
2959 size_t i
= offset
+ 1;
2961 for (; i
< len
- 1; ++i
)
2962 if (line_buffer
[i
] == ' ')
2964 line_buffer
[i
] = '-';
2965 color_buffer
[i
] = color
;
2968 if (line_buffer
[i
] == ' ')
2970 line_buffer
[i
] = '>';
2971 color_buffer
[i
] = color
;
2973 else if (line_buffer
[i
] == '-')
2975 line_buffer
[i
] = 'X';
2976 color_buffer
[i
] = color
;
2979 if (line_buffer
[offset
] == ' ')
2981 if (jump_info_min_address (ji
) < address
)
2982 line_buffer
[offset
] =
2983 (jump_info_max_address (ji
) > address
) ? '>' : '\\';
2985 line_buffer
[offset
] = '/';
2986 color_buffer
[offset
] = color
;
2989 /* Draw intermediate line segment. */
2990 else if (line_buffer
[offset
] == ' ')
2992 line_buffer
[offset
] = '|';
2993 color_buffer
[offset
] = color
;
3001 /* Clone of disassemble_bytes to detect jumps inside a function. */
3002 /* FIXME: is this correct? Can we strip it down even further? */
3004 static struct jump_info
*
3005 disassemble_jumps (struct disassemble_info
* inf
,
3006 disassembler_ftype disassemble_fn
,
3007 bfd_vma start_offset
,
3008 bfd_vma stop_offset
,
3011 arelent
** relppend
)
3013 struct objdump_disasm_info
*aux
;
3014 struct jump_info
*jumps
= NULL
;
3016 bfd_vma addr_offset
;
3017 unsigned int opb
= inf
->octets_per_byte
;
3021 aux
= (struct objdump_disasm_info
*) inf
->application_data
;
3022 section
= inf
->section
;
3025 sfile
.buffer
= (char *) xmalloc (sfile
.alloc
);
3028 inf
->insn_info_valid
= 0;
3029 disassemble_set_printf (inf
, &sfile
, (fprintf_ftype
) objdump_sprintf
,
3030 (fprintf_styled_ftype
) objdump_styled_sprintf
);
3032 addr_offset
= start_offset
;
3033 while (addr_offset
< stop_offset
)
3035 int previous_octets
;
3037 /* Remember the length of the previous instruction. */
3038 previous_octets
= octets
;
3042 inf
->bytes_per_line
= 0;
3043 inf
->bytes_per_chunk
= 0;
3044 inf
->flags
= ((disassemble_all
? DISASSEMBLE_DATA
: 0)
3045 | (wide_output
? WIDE_OUTPUT
: 0));
3047 inf
->flags
|= USER_SPECIFIED_MACHINE_TYPE
;
3049 if (inf
->disassembler_needs_relocs
3050 && (bfd_get_file_flags (aux
->abfd
) & EXEC_P
) == 0
3051 && (bfd_get_file_flags (aux
->abfd
) & DYNAMIC
) == 0
3052 && relpp
< relppend
)
3054 bfd_signed_vma distance_to_rel
;
3056 distance_to_rel
= (*relpp
)->address
- (rel_offset
+ addr_offset
);
3058 /* Check to see if the current reloc is associated with
3059 the instruction that we are about to disassemble. */
3060 if (distance_to_rel
== 0
3061 /* FIXME: This is wrong. We are trying to catch
3062 relocs that are addressed part way through the
3063 current instruction, as might happen with a packed
3064 VLIW instruction. Unfortunately we do not know the
3065 length of the current instruction since we have not
3066 disassembled it yet. Instead we take a guess based
3067 upon the length of the previous instruction. The
3068 proper solution is to have a new target-specific
3069 disassembler function which just returns the length
3070 of an instruction at a given address without trying
3071 to display its disassembly. */
3072 || (distance_to_rel
> 0
3073 && distance_to_rel
< (bfd_signed_vma
) (previous_octets
/ opb
)))
3075 inf
->flags
|= INSN_HAS_RELOC
;
3079 if (! disassemble_all
3080 && (section
->flags
& (SEC_CODE
| SEC_HAS_CONTENTS
))
3081 == (SEC_CODE
| SEC_HAS_CONTENTS
))
3082 /* Set a stop_vma so that the disassembler will not read
3083 beyond the next symbol. We assume that symbols appear on
3084 the boundaries between instructions. We only do this when
3085 disassembling code of course, and when -D is in effect. */
3086 inf
->stop_vma
= section
->vma
+ stop_offset
;
3088 inf
->stop_offset
= stop_offset
;
3090 /* Extract jump information. */
3091 inf
->insn_info_valid
= 0;
3092 disassembler_in_comment
= false;
3093 octets
= (*disassemble_fn
) (section
->vma
+ addr_offset
, inf
);
3094 /* Test if a jump was detected. */
3095 if (inf
->insn_info_valid
3096 && ((inf
->insn_type
== dis_branch
)
3097 || (inf
->insn_type
== dis_condbranch
)
3098 || (inf
->insn_type
== dis_jsr
)
3099 || (inf
->insn_type
== dis_condjsr
))
3100 && (inf
->target
>= section
->vma
+ start_offset
)
3101 && (inf
->target
< section
->vma
+ stop_offset
))
3103 struct jump_info
*ji
=
3104 jump_info_new (section
->vma
+ addr_offset
, inf
->target
, -1);
3105 jump_info_add_front (ji
, &jumps
);
3110 addr_offset
+= octets
/ opb
;
3113 disassemble_set_printf (inf
, (void *) stdout
, (fprintf_ftype
) fprintf
,
3114 (fprintf_styled_ftype
) fprintf_styled
);
3115 free (sfile
.buffer
);
3118 jump_info_merge (&jumps
);
3119 /* Process jumps. */
3120 jump_info_sort (&jumps
);
3122 /* Group jumps by level. */
3123 struct jump_info
*last_jump
= jumps
;
3128 /* The last jump is part of the next group. */
3129 struct jump_info
*base
= last_jump
;
3130 /* Increment level. */
3131 base
->level
= ++max_level
;
3133 /* Find jumps that can be combined on the same
3134 level, with the largest jumps tested first.
3135 This has the advantage that large jumps are on
3136 lower levels and do not intersect with small
3137 jumps that get grouped on higher levels. */
3138 struct jump_info
*exchange_item
= last_jump
->next
;
3139 struct jump_info
*it
= exchange_item
;
3141 for (; it
; it
= it
->next
)
3143 /* Test if the jump intersects with any
3144 jump from current group. */
3146 struct jump_info
*it_collision
;
3148 for (it_collision
= base
;
3149 it_collision
!= exchange_item
;
3150 it_collision
= it_collision
->next
)
3152 /* This jump intersects so we leave it out. */
3153 if (jump_info_intersect (it_collision
, it
))
3160 /* Add jump to group. */
3163 /* Move current element to the front. */
3164 if (it
!= exchange_item
)
3166 struct jump_info
*save
= it
->prev
;
3167 jump_info_move_linked (it
, exchange_item
, &jumps
);
3173 last_jump
= exchange_item
;
3174 exchange_item
= exchange_item
->next
;
3176 last_jump
->level
= max_level
;
3180 /* Move to next group. */
3181 last_jump
= exchange_item
;
3187 /* The number of zeroes we want to see before we start skipping them.
3188 The number is arbitrarily chosen. */
3190 #define DEFAULT_SKIP_ZEROES 8
3192 /* The number of zeroes to skip at the end of a section. If the
3193 number of zeroes at the end is between SKIP_ZEROES_AT_END and
3194 SKIP_ZEROES, they will be disassembled. If there are fewer than
3195 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
3196 attempt to avoid disassembling zeroes inserted by section
3199 #define DEFAULT_SKIP_ZEROES_AT_END 3
3202 null_print (const void * stream ATTRIBUTE_UNUSED
, const char * format ATTRIBUTE_UNUSED
, ...)
3207 /* Like null_print, but takes the extra STYLE argument. As this is not
3208 going to print anything, the extra argument is just ignored. */
3211 null_styled_print (const void * stream ATTRIBUTE_UNUSED
,
3212 enum disassembler_style style ATTRIBUTE_UNUSED
,
3213 const char * format ATTRIBUTE_UNUSED
, ...)
3218 /* Print out jump visualization. */
3221 print_jump_visualisation (bfd_vma addr
, int max_level
, char *line_buffer
,
3222 uint8_t *color_buffer
)
3227 jump_info_visualize_address (addr
, max_level
, line_buffer
, color_buffer
);
3229 size_t line_buffer_size
= strlen (line_buffer
);
3230 char last_color
= 0;
3233 for (i
= 0; i
<= line_buffer_size
; ++i
)
3237 uint8_t color
= (i
< line_buffer_size
) ? color_buffer
[i
]: 0;
3239 if (color
!= last_color
)
3242 if (extended_color_output
)
3243 /* Use extended 8bit color, but
3244 do not choose dark colors. */
3245 printf ("\033[38;5;%dm", 124 + (color
% 108));
3247 /* Use simple terminal colors. */
3248 printf ("\033[%dm", 31 + (color
% 7));
3255 putchar ((i
< line_buffer_size
) ? line_buffer
[i
]: ' ');
3259 /* Disassemble some data in memory between given values. */
3262 disassemble_bytes (struct disassemble_info
*inf
,
3263 disassembler_ftype disassemble_fn
,
3266 bfd_vma start_offset
,
3267 bfd_vma stop_offset
,
3272 struct objdump_disasm_info
*aux
;
3274 unsigned int octets_per_line
;
3275 unsigned int skip_addr_chars
;
3276 bfd_vma addr_offset
;
3277 unsigned int opb
= inf
->octets_per_byte
;
3278 unsigned int skip_zeroes
= inf
->skip_zeroes
;
3279 unsigned int skip_zeroes_at_end
= inf
->skip_zeroes_at_end
;
3283 aux
= (struct objdump_disasm_info
*) inf
->application_data
;
3284 section
= inf
->section
;
3287 sfile
.buffer
= (char *) xmalloc (sfile
.alloc
);
3291 octets_per_line
= insn_width
;
3293 octets_per_line
= 4;
3295 octets_per_line
= 16;
3297 /* Figure out how many characters to skip at the start of an
3298 address, to make the disassembly look nicer. We discard leading
3299 zeroes in chunks of 4, ensuring that there is always a leading
3301 skip_addr_chars
= 0;
3302 if (!no_addresses
&& !prefix_addresses
)
3306 bfd_sprintf_vma (aux
->abfd
, buf
, section
->vma
+ section
->size
/ opb
);
3308 while (buf
[skip_addr_chars
] == '0')
3311 /* Don't discard zeros on overflow. */
3312 if (buf
[skip_addr_chars
] == '\0' && section
->vma
!= 0)
3313 skip_addr_chars
= 0;
3315 if (skip_addr_chars
!= 0)
3316 skip_addr_chars
= (skip_addr_chars
- 1) & -4;
3319 inf
->insn_info_valid
= 0;
3321 /* Determine maximum level. */
3322 uint8_t *color_buffer
= NULL
;
3323 char *line_buffer
= NULL
;
3326 /* Some jumps were detected. */
3329 struct jump_info
*ji
;
3331 /* Find maximum jump level. */
3332 for (ji
= detected_jumps
; ji
; ji
= ji
->next
)
3334 if (ji
->level
> max_level
)
3335 max_level
= ji
->level
;
3338 /* Allocate buffers. */
3339 size_t len
= (max_level
+ 1) * 3 + 1;
3340 line_buffer
= xmalloc (len
);
3341 line_buffer
[len
- 1] = 0;
3342 color_buffer
= xmalloc (len
);
3343 color_buffer
[len
- 1] = 0;
3346 addr_offset
= start_offset
;
3347 while (addr_offset
< stop_offset
)
3349 bool need_nl
= false;
3353 /* Make sure we don't use relocs from previous instructions. */
3356 /* If we see more than SKIP_ZEROES octets of zeroes, we just
3358 if (! disassemble_zeroes
)
3359 for (; addr_offset
* opb
+ octets
< stop_offset
* opb
; octets
++)
3360 if (data
[addr_offset
* opb
+ octets
] != 0)
3362 if (! disassemble_zeroes
3363 && (inf
->insn_info_valid
== 0
3364 || inf
->branch_delay_insns
== 0)
3365 && (octets
>= skip_zeroes
3366 || (addr_offset
* opb
+ octets
== stop_offset
* opb
3367 && octets
< skip_zeroes_at_end
)))
3369 /* If there are more nonzero octets to follow, we only skip
3370 zeroes in multiples of 4, to try to avoid running over
3371 the start of an instruction which happens to start with
3373 if (addr_offset
* opb
+ octets
!= stop_offset
* opb
)
3376 /* If we are going to display more data, and we are displaying
3377 file offsets, then tell the user how many zeroes we skip
3378 and the file offset from where we resume dumping. */
3379 if (display_file_offsets
3380 && addr_offset
+ octets
/ opb
< stop_offset
)
3381 printf (_("\t... (skipping %lu zeroes, "
3382 "resuming at file offset: 0x%lx)\n"),
3383 (unsigned long) (octets
/ opb
),
3384 (unsigned long) (section
->filepos
3385 + addr_offset
+ octets
/ opb
));
3392 unsigned int bpc
= 0;
3393 unsigned int pb
= 0;
3395 if (with_line_numbers
|| with_source_code
)
3396 show_line (aux
->abfd
, section
, addr_offset
);
3400 else if (!prefix_addresses
)
3404 bfd_sprintf_vma (aux
->abfd
, buf
, section
->vma
+ addr_offset
);
3405 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
3409 printf ("%s:\t", buf
+ skip_addr_chars
);
3413 aux
->require_sec
= true;
3414 objdump_print_address (section
->vma
+ addr_offset
, inf
);
3415 aux
->require_sec
= false;
3419 print_jump_visualisation (section
->vma
+ addr_offset
,
3420 max_level
, line_buffer
,
3428 disassemble_set_printf
3429 (inf
, &sfile
, (fprintf_ftype
) objdump_sprintf
,
3430 (fprintf_styled_ftype
) objdump_styled_sprintf
);
3431 inf
->bytes_per_line
= 0;
3432 inf
->bytes_per_chunk
= 0;
3433 inf
->flags
= ((disassemble_all
? DISASSEMBLE_DATA
: 0)
3434 | (wide_output
? WIDE_OUTPUT
: 0));
3436 inf
->flags
|= USER_SPECIFIED_MACHINE_TYPE
;
3438 if (inf
->disassembler_needs_relocs
3439 && (bfd_get_file_flags (aux
->abfd
) & EXEC_P
) == 0
3440 && (bfd_get_file_flags (aux
->abfd
) & DYNAMIC
) == 0
3441 && relpp
< relppend
)
3443 bfd_signed_vma distance_to_rel
;
3444 int max_reloc_offset
3445 = aux
->abfd
->arch_info
->max_reloc_offset_into_insn
;
3447 distance_to_rel
= ((*relpp
)->address
- rel_offset
3451 if (distance_to_rel
> 0
3452 && (max_reloc_offset
< 0
3453 || distance_to_rel
<= max_reloc_offset
))
3455 /* This reloc *might* apply to the current insn,
3456 starting somewhere inside it. Discover the length
3457 of the current insn so that the check below will
3460 insn_size
= insn_width
;
3463 /* We find the length by calling the dissassembler
3464 function with a dummy print handler. This should
3465 work unless the disassembler is not expecting to
3466 be called multiple times for the same address.
3468 This does mean disassembling the instruction
3469 twice, but we only do this when there is a high
3470 probability that there is a reloc that will
3471 affect the instruction. */
3472 disassemble_set_printf
3473 (inf
, inf
->stream
, (fprintf_ftype
) null_print
,
3474 (fprintf_styled_ftype
) null_styled_print
);
3475 insn_size
= disassemble_fn (section
->vma
3476 + addr_offset
, inf
);
3477 disassemble_set_printf
3479 (fprintf_ftype
) objdump_sprintf
,
3480 (fprintf_styled_ftype
) objdump_styled_sprintf
);
3484 /* Check to see if the current reloc is associated with
3485 the instruction that we are about to disassemble. */
3486 if (distance_to_rel
== 0
3487 || (distance_to_rel
> 0
3488 && distance_to_rel
< insn_size
/ (int) opb
))
3490 inf
->flags
|= INSN_HAS_RELOC
;
3491 aux
->reloc
= *relpp
;
3495 if (! disassemble_all
3496 && ((section
->flags
& (SEC_CODE
| SEC_HAS_CONTENTS
))
3497 == (SEC_CODE
| SEC_HAS_CONTENTS
)))
3498 /* Set a stop_vma so that the disassembler will not read
3499 beyond the next symbol. We assume that symbols appear on
3500 the boundaries between instructions. We only do this when
3501 disassembling code of course, and when -D is in effect. */
3502 inf
->stop_vma
= section
->vma
+ stop_offset
;
3504 inf
->stop_offset
= stop_offset
;
3505 disassembler_in_comment
= false;
3506 insn_size
= (*disassemble_fn
) (section
->vma
+ addr_offset
, inf
);
3510 disassemble_set_printf (inf
, stdout
, (fprintf_ftype
) fprintf
,
3511 (fprintf_styled_ftype
) fprintf_styled
);
3512 if (insn_width
== 0 && inf
->bytes_per_line
!= 0)
3513 octets_per_line
= inf
->bytes_per_line
;
3514 if (insn_size
< (int) opb
)
3517 printf ("%s\n", sfile
.buffer
);
3520 non_fatal (_("disassemble_fn returned length %d"),
3531 octets
= octets_per_line
;
3532 if (addr_offset
+ octets
/ opb
> stop_offset
)
3533 octets
= (stop_offset
- addr_offset
) * opb
;
3535 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ octets
; ++j
)
3537 if (ISPRINT (data
[j
]))
3538 buf
[j
- addr_offset
* opb
] = data
[j
];
3540 buf
[j
- addr_offset
* opb
] = '.';
3542 buf
[j
- addr_offset
* opb
] = '\0';
3545 if (prefix_addresses
3547 : show_raw_insn
>= 0)
3551 /* If ! prefix_addresses and ! wide_output, we print
3552 octets_per_line octets per line. */
3554 if (pb
> octets_per_line
&& ! prefix_addresses
&& ! wide_output
)
3555 pb
= octets_per_line
;
3557 if (inf
->bytes_per_chunk
)
3558 bpc
= inf
->bytes_per_chunk
;
3562 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
3564 /* PR 21580: Check for a buffer ending early. */
3565 if (j
+ bpc
<= stop_offset
* opb
)
3569 if (inf
->display_endian
== BFD_ENDIAN_LITTLE
)
3571 for (k
= bpc
; k
-- != 0; )
3572 printf ("%02x", (unsigned) data
[j
+ k
]);
3576 for (k
= 0; k
< bpc
; k
++)
3577 printf ("%02x", (unsigned) data
[j
+ k
]);
3583 for (; pb
< octets_per_line
; pb
+= bpc
)
3587 for (k
= 0; k
< bpc
; k
++)
3592 /* Separate raw data from instruction by extra space. */
3602 printf ("%s", sfile
.buffer
);
3604 if (prefix_addresses
3606 : show_raw_insn
>= 0)
3614 j
= addr_offset
* opb
+ pb
;
3620 bfd_sprintf_vma (aux
->abfd
, buf
, section
->vma
+ j
/ opb
);
3621 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
3625 printf ("%s:\t", buf
+ skip_addr_chars
);
3628 print_jump_visualisation (section
->vma
+ j
/ opb
,
3629 max_level
, line_buffer
,
3632 pb
+= octets_per_line
;
3635 for (; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
3637 /* PR 21619: Check for a buffer ending early. */
3638 if (j
+ bpc
<= stop_offset
* opb
)
3642 if (inf
->display_endian
== BFD_ENDIAN_LITTLE
)
3644 for (k
= bpc
; k
-- != 0; )
3645 printf ("%02x", (unsigned) data
[j
+ k
]);
3649 for (k
= 0; k
< bpc
; k
++)
3650 printf ("%02x", (unsigned) data
[j
+ k
]);
3664 while (relpp
< relppend
3665 && (*relpp
)->address
< rel_offset
+ addr_offset
+ octets
/ opb
)
3667 if (dump_reloc_info
|| dump_dynamic_reloc_info
)
3680 objdump_print_value (section
->vma
- rel_offset
+ q
->address
,
3685 if (q
->howto
== NULL
)
3686 printf ("*unknown*\t");
3687 else if (q
->howto
->name
)
3688 printf ("%s\t", q
->howto
->name
);
3690 printf ("%d\t", q
->howto
->type
);
3692 if (q
->sym_ptr_ptr
== NULL
|| *q
->sym_ptr_ptr
== NULL
)
3693 printf ("*unknown*");
3696 const char *sym_name
;
3698 sym_name
= bfd_asymbol_name (*q
->sym_ptr_ptr
);
3699 if (sym_name
!= NULL
&& *sym_name
!= '\0')
3700 objdump_print_symname (aux
->abfd
, inf
, *q
->sym_ptr_ptr
);
3705 sym_sec
= bfd_asymbol_section (*q
->sym_ptr_ptr
);
3706 sym_name
= bfd_section_name (sym_sec
);
3707 if (sym_name
== NULL
|| *sym_name
== '\0')
3708 sym_name
= "*unknown*";
3709 printf ("%s", sanitize_string (sym_name
));
3715 bfd_vma addend
= q
->addend
;
3716 if ((bfd_signed_vma
) addend
< 0)
3723 objdump_print_value (addend
, inf
, true);
3735 addr_offset
+= octets
/ opb
;
3738 free (sfile
.buffer
);
3740 free (color_buffer
);
3744 disassemble_section (bfd
*abfd
, asection
*section
, void *inf
)
3746 const struct elf_backend_data
*bed
;
3747 bfd_vma sign_adjust
= 0;
3748 struct disassemble_info
*pinfo
= (struct disassemble_info
*) inf
;
3749 struct objdump_disasm_info
*paux
;
3750 unsigned int opb
= pinfo
->octets_per_byte
;
3751 bfd_byte
*data
= NULL
;
3752 bfd_size_type datasize
= 0;
3753 arelent
**rel_pp
= NULL
;
3754 arelent
**rel_ppstart
= NULL
;
3755 arelent
**rel_ppend
;
3756 bfd_vma stop_offset
;
3757 asymbol
*sym
= NULL
;
3761 unsigned long addr_offset
;
3765 stop_offset_reached
,
3770 if (only_list
== NULL
)
3772 /* Sections that do not contain machine
3773 code are not normally disassembled. */
3774 if ((section
->flags
& SEC_HAS_CONTENTS
) == 0)
3777 if (! disassemble_all
3778 && (section
->flags
& SEC_CODE
) == 0)
3781 else if (!process_section_p (section
))
3784 datasize
= bfd_section_size (section
);
3788 if (start_address
== (bfd_vma
) -1
3789 || start_address
< section
->vma
)
3792 addr_offset
= start_address
- section
->vma
;
3794 if (stop_address
== (bfd_vma
) -1)
3795 stop_offset
= datasize
/ opb
;
3798 if (stop_address
< section
->vma
)
3801 stop_offset
= stop_address
- section
->vma
;
3802 if (stop_offset
> datasize
/ opb
)
3803 stop_offset
= datasize
/ opb
;
3806 if (addr_offset
>= stop_offset
)
3809 /* Decide which set of relocs to use. Load them if necessary. */
3810 paux
= (struct objdump_disasm_info
*) pinfo
->application_data
;
3811 if (pinfo
->dynrelbuf
&& dump_dynamic_reloc_info
)
3813 rel_pp
= pinfo
->dynrelbuf
;
3814 rel_count
= pinfo
->dynrelcount
;
3815 /* Dynamic reloc addresses are absolute, non-dynamic are section
3816 relative. REL_OFFSET specifies the reloc address corresponding
3817 to the start of this section. */
3818 rel_offset
= section
->vma
;
3826 if ((section
->flags
& SEC_RELOC
) != 0
3827 && (dump_reloc_info
|| pinfo
->disassembler_needs_relocs
))
3831 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
3833 my_bfd_nonfatal (bfd_get_filename (abfd
));
3837 rel_pp
= (arelent
**) xmalloc (relsize
);
3838 rel_count
= bfd_canonicalize_reloc (abfd
, section
, rel_pp
, syms
);
3841 my_bfd_nonfatal (bfd_get_filename (abfd
));
3846 else if (rel_count
> 1)
3847 /* Sort the relocs by address. */
3848 qsort (rel_pp
, rel_count
, sizeof (arelent
*), compare_relocs
);
3849 rel_ppstart
= rel_pp
;
3853 rel_ppend
= PTR_ADD (rel_pp
, rel_count
);
3855 if (!bfd_malloc_and_get_section (abfd
, section
, &data
))
3857 non_fatal (_("Reading section %s failed because: %s"),
3858 section
->name
, bfd_errmsg (bfd_get_error ()));
3863 pinfo
->buffer
= data
;
3864 pinfo
->buffer_vma
= section
->vma
;
3865 pinfo
->buffer_length
= datasize
;
3866 pinfo
->section
= section
;
3868 /* Sort the symbols into value and section order. */
3869 compare_section
= section
;
3870 if (sorted_symcount
> 1)
3871 qsort (sorted_syms
, sorted_symcount
, sizeof (asymbol
*), compare_symbols
);
3873 printf (_("\nDisassembly of section %s:\n"), sanitize_string (section
->name
));
3875 /* Find the nearest symbol forwards from our current position. */
3876 paux
->require_sec
= true;
3877 sym
= (asymbol
*) find_symbol_for_address (section
->vma
+ addr_offset
,
3878 (struct disassemble_info
*) inf
,
3880 paux
->require_sec
= false;
3882 /* PR 9774: If the target used signed addresses then we must make
3883 sure that we sign extend the value that we calculate for 'addr'
3884 in the loop below. */
3885 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
3886 && (bed
= get_elf_backend_data (abfd
)) != NULL
3887 && bed
->sign_extend_vma
)
3888 sign_adjust
= (bfd_vma
) 1 << (bed
->s
->arch_size
- 1);
3890 /* Disassemble a block of instructions up to the address associated with
3891 the symbol we have just found. Then print the symbol and find the
3892 next symbol on. Repeat until we have disassembled the entire section
3893 or we have reached the end of the address range we are interested in. */
3894 do_print
= paux
->symbol
== NULL
;
3895 loop_until
= stop_offset_reached
;
3897 while (addr_offset
< stop_offset
)
3901 bfd_vma nextstop_offset
;
3904 /* Skip over the relocs belonging to addresses below the
3906 while (rel_pp
< rel_ppend
3907 && (*rel_pp
)->address
< rel_offset
+ addr_offset
)
3910 addr
= section
->vma
+ addr_offset
;
3911 addr
= ((addr
& ((sign_adjust
<< 1) - 1)) ^ sign_adjust
) - sign_adjust
;
3913 if (sym
!= NULL
&& bfd_asymbol_value (sym
) <= addr
)
3918 (x
< sorted_symcount
3919 && (bfd_asymbol_value (sorted_syms
[x
]) <= addr
));
3923 pinfo
->symbols
= sorted_syms
+ place
;
3924 pinfo
->num_symbols
= x
- place
;
3925 pinfo
->symtab_pos
= place
;
3929 pinfo
->symbols
= NULL
;
3930 pinfo
->num_symbols
= 0;
3931 pinfo
->symtab_pos
= -1;
3934 /* If we are only disassembling from a specific symbol,
3935 check to see if we should start or stop displaying. */
3936 if (sym
&& paux
->symbol
)
3940 /* See if we should stop printing. */
3944 if (sym
->flags
& BSF_FUNCTION
)
3948 case stop_offset_reached
:
3949 /* Handled by the while loop. */
3953 /* FIXME: There is an implicit assumption here
3954 that the name of sym is different from
3956 if (! bfd_is_local_label (abfd
, sym
))
3963 const char * name
= bfd_asymbol_name (sym
);
3964 char * alloc
= NULL
;
3966 if (do_demangle
&& name
[0] != '\0')
3968 /* Demangle the name. */
3969 alloc
= bfd_demangle (abfd
, name
, demangle_flags
);
3974 /* We are not currently printing. Check to see
3975 if the current symbol matches the requested symbol. */
3976 if (streq (name
, paux
->symbol
)
3977 && bfd_asymbol_value (sym
) <= addr
)
3981 loop_until
= next_sym
;
3982 if (sym
->flags
& BSF_FUNCTION
)
3984 loop_until
= function_sym
;
3986 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
3988 bfd_size_type fsize
=
3989 ((elf_symbol_type
*) sym
)->internal_elf_sym
.st_size
;
3991 bfd_asymbol_value (sym
) - section
->vma
+ fsize
;
3992 if (fend
> addr_offset
&& fend
<= stop_offset
)
3994 /* Sym is a function symbol with a valid
3995 size associated with it. Disassemble
3996 to the end of the function. */
3998 loop_until
= stop_offset_reached
;
4008 if (! prefix_addresses
&& do_print
)
4010 pinfo
->fprintf_func (pinfo
->stream
, "\n");
4011 objdump_print_addr_with_sym (abfd
, section
, sym
, addr
,
4013 pinfo
->fprintf_func (pinfo
->stream
, ":\n");
4015 if (sym
!= NULL
&& show_all_symbols
)
4017 for (++place
; place
< sorted_symcount
; place
++)
4019 sym
= sorted_syms
[place
];
4021 if (bfd_asymbol_value (sym
) != addr
)
4023 if (! pinfo
->symbol_is_valid (sym
, pinfo
))
4025 if (strcmp (bfd_section_name (sym
->section
), bfd_section_name (section
)) != 0)
4028 objdump_print_addr_with_sym (abfd
, section
, sym
, addr
, pinfo
, false);
4029 pinfo
->fprintf_func (pinfo
->stream
, ":\n");
4034 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > addr
)
4036 else if (sym
== NULL
)
4040 #define is_valid_next_sym(SYM) \
4041 (strcmp (bfd_section_name ((SYM)->section), bfd_section_name (section)) == 0 \
4042 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
4043 && pinfo->symbol_is_valid (SYM, pinfo))
4045 /* Search forward for the next appropriate symbol in
4046 SECTION. Note that all the symbols are sorted
4047 together into one big array, and that some sections
4048 may have overlapping addresses. */
4049 while (place
< sorted_symcount
4050 && ! is_valid_next_sym (sorted_syms
[place
]))
4053 if (place
>= sorted_symcount
)
4056 nextsym
= sorted_syms
[place
];
4059 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > addr
)
4060 nextstop_offset
= bfd_asymbol_value (sym
) - section
->vma
;
4061 else if (nextsym
== NULL
)
4062 nextstop_offset
= stop_offset
;
4064 nextstop_offset
= bfd_asymbol_value (nextsym
) - section
->vma
;
4066 if (nextstop_offset
> stop_offset
4067 || nextstop_offset
<= addr_offset
)
4068 nextstop_offset
= stop_offset
;
4070 /* If a symbol is explicitly marked as being an object
4071 rather than a function, just dump the bytes without
4072 disassembling them. */
4075 || sym
->section
!= section
4076 || bfd_asymbol_value (sym
) > addr
4077 || ((sym
->flags
& BSF_OBJECT
) == 0
4078 && (strstr (bfd_asymbol_name (sym
), "gnu_compiled")
4080 && (strstr (bfd_asymbol_name (sym
), "gcc2_compiled")
4082 || (sym
->flags
& BSF_FUNCTION
) != 0)
4089 /* Resolve symbol name. */
4090 if (visualize_jumps
&& abfd
&& sym
&& sym
->name
)
4092 struct disassemble_info di
;
4095 sf
.alloc
= strlen (sym
->name
) + 40;
4096 sf
.buffer
= (char*) xmalloc (sf
.alloc
);
4098 disassemble_set_printf
4099 (&di
, &sf
, (fprintf_ftype
) objdump_sprintf
,
4100 (fprintf_styled_ftype
) objdump_styled_sprintf
);
4102 objdump_print_symname (abfd
, &di
, sym
);
4104 /* Fetch jump information. */
4105 detected_jumps
= disassemble_jumps (pinfo
, paux
->disassemble_fn
,
4106 addr_offset
, nextstop_offset
,
4107 rel_offset
, rel_pp
, rel_ppend
);
4108 /* Free symbol name. */
4112 /* Add jumps to output. */
4113 disassemble_bytes (pinfo
, paux
->disassemble_fn
, insns
, data
,
4114 addr_offset
, nextstop_offset
,
4115 rel_offset
, rel_pp
, rel_ppend
);
4118 while (detected_jumps
)
4120 detected_jumps
= jump_info_free (detected_jumps
);
4124 addr_offset
= nextstop_offset
;
4132 /* Disassemble the contents of an object file. */
4135 disassemble_data (bfd
*abfd
)
4137 struct disassemble_info disasm_info
;
4138 struct objdump_disasm_info aux
;
4142 prev_functionname
= NULL
;
4144 prev_discriminator
= 0;
4146 /* We make a copy of syms to sort. We don't want to sort syms
4147 because that will screw up the relocs. */
4148 sorted_symcount
= symcount
? symcount
: dynsymcount
;
4149 sorted_syms
= (asymbol
**) xmalloc ((sorted_symcount
+ synthcount
)
4150 * sizeof (asymbol
*));
4151 if (sorted_symcount
!= 0)
4153 memcpy (sorted_syms
, symcount
? syms
: dynsyms
,
4154 sorted_symcount
* sizeof (asymbol
*));
4156 sorted_symcount
= remove_useless_symbols (sorted_syms
, sorted_symcount
);
4159 for (i
= 0; i
< synthcount
; ++i
)
4161 sorted_syms
[sorted_symcount
] = synthsyms
+ i
;
4165 init_disassemble_info (&disasm_info
, stdout
, (fprintf_ftype
) fprintf
,
4166 (fprintf_styled_ftype
) fprintf_styled
);
4167 disasm_info
.application_data
= (void *) &aux
;
4169 aux
.require_sec
= false;
4170 disasm_info
.dynrelbuf
= NULL
;
4171 disasm_info
.dynrelcount
= 0;
4173 aux
.symbol
= disasm_sym
;
4175 disasm_info
.print_address_func
= objdump_print_address
;
4176 disasm_info
.symbol_at_address_func
= objdump_symbol_at_address
;
4178 if (machine
!= NULL
)
4180 const bfd_arch_info_type
*inf
= bfd_scan_arch (machine
);
4184 non_fatal (_("can't use supplied machine %s"), machine
);
4188 abfd
->arch_info
= inf
;
4191 if (endian
!= BFD_ENDIAN_UNKNOWN
)
4193 struct bfd_target
*xvec
;
4195 xvec
= (struct bfd_target
*) xmalloc (sizeof (struct bfd_target
));
4196 memcpy (xvec
, abfd
->xvec
, sizeof (struct bfd_target
));
4197 xvec
->byteorder
= endian
;
4201 /* Use libopcodes to locate a suitable disassembler. */
4202 aux
.disassemble_fn
= disassembler (bfd_get_arch (abfd
),
4203 bfd_big_endian (abfd
),
4204 bfd_get_mach (abfd
), abfd
);
4205 if (!aux
.disassemble_fn
)
4207 non_fatal (_("can't disassemble for architecture %s\n"),
4208 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0));
4214 disasm_info
.flavour
= bfd_get_flavour (abfd
);
4215 disasm_info
.arch
= bfd_get_arch (abfd
);
4216 disasm_info
.mach
= bfd_get_mach (abfd
);
4217 disasm_info
.disassembler_options
= disassembler_options
;
4218 disasm_info
.octets_per_byte
= bfd_octets_per_byte (abfd
, NULL
);
4219 disasm_info
.skip_zeroes
= DEFAULT_SKIP_ZEROES
;
4220 disasm_info
.skip_zeroes_at_end
= DEFAULT_SKIP_ZEROES_AT_END
;
4221 disasm_info
.disassembler_needs_relocs
= false;
4223 if (bfd_big_endian (abfd
))
4224 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_BIG
;
4225 else if (bfd_little_endian (abfd
))
4226 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_LITTLE
;
4228 /* ??? Aborting here seems too drastic. We could default to big or little
4230 disasm_info
.endian
= BFD_ENDIAN_UNKNOWN
;
4232 disasm_info
.endian_code
= disasm_info
.endian
;
4234 /* Allow the target to customize the info structure. */
4235 disassemble_init_for_target (& disasm_info
);
4237 /* Pre-load the dynamic relocs as we may need them during the disassembly. */
4238 long relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
4242 disasm_info
.dynrelbuf
= (arelent
**) xmalloc (relsize
);
4243 disasm_info
.dynrelcount
4244 = bfd_canonicalize_dynamic_reloc (abfd
, disasm_info
.dynrelbuf
, dynsyms
);
4245 if (disasm_info
.dynrelcount
< 0)
4247 my_bfd_nonfatal (bfd_get_filename (abfd
));
4248 free (disasm_info
.dynrelbuf
);
4249 disasm_info
.dynrelbuf
= NULL
;
4250 disasm_info
.dynrelcount
= 0;
4252 else if (disasm_info
.dynrelcount
> 1)
4253 /* Sort the relocs by address. */
4254 qsort (disasm_info
.dynrelbuf
, disasm_info
.dynrelcount
,
4255 sizeof (arelent
*), compare_relocs
);
4258 disasm_info
.symtab
= sorted_syms
;
4259 disasm_info
.symtab_size
= sorted_symcount
;
4261 bfd_map_over_sections (abfd
, disassemble_section
, & disasm_info
);
4263 free (disasm_info
.dynrelbuf
);
4264 disasm_info
.dynrelbuf
= NULL
;
4266 disassemble_free_target (&disasm_info
);
4270 load_specific_debug_section (enum dwarf_section_display_enum debug
,
4271 asection
*sec
, void *file
)
4273 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
4274 bfd
*abfd
= (bfd
*) file
;
4280 if (section
->start
!= NULL
)
4282 /* If it is already loaded, do nothing. */
4283 if (streq (section
->filename
, bfd_get_filename (abfd
)))
4285 free (section
->start
);
4288 section
->filename
= bfd_get_filename (abfd
);
4289 section
->reloc_info
= NULL
;
4290 section
->num_relocs
= 0;
4291 section
->address
= bfd_section_vma (sec
);
4292 section
->size
= bfd_section_size (sec
);
4293 /* PR 24360: On 32-bit hosts sizeof (size_t) < sizeof (bfd_size_type). */
4294 alloced
= amt
= section
->size
+ 1;
4297 || (bfd_get_size (abfd
) != 0 && alloced
>= bfd_get_size (abfd
)))
4299 section
->start
= NULL
;
4300 free_debug_section (debug
);
4301 printf (_("\nSection '%s' has an invalid size: %#" PRIx64
".\n"),
4302 sanitize_string (section
->name
),
4307 section
->start
= contents
= xmalloc (alloced
);
4308 /* Ensure any string section has a terminating NUL. */
4309 section
->start
[section
->size
] = 0;
4311 if ((abfd
->flags
& (EXEC_P
| DYNAMIC
)) == 0
4312 && debug_displays
[debug
].relocate
)
4314 ret
= bfd_simple_get_relocated_section_contents (abfd
,
4320 long reloc_size
= bfd_get_reloc_upper_bound (abfd
, sec
);
4327 relocs
= (arelent
**) xmalloc (reloc_size
);
4329 reloc_count
= bfd_canonicalize_reloc (abfd
, sec
, relocs
, syms
);
4330 if (reloc_count
<= 0)
4334 section
->reloc_info
= relocs
;
4335 section
->num_relocs
= reloc_count
;
4341 ret
= bfd_get_full_section_contents (abfd
, sec
, &contents
);
4345 free_debug_section (debug
);
4346 printf (_("\nCan't get contents for section '%s'.\n"),
4347 sanitize_string (section
->name
));
4355 reloc_at (struct dwarf_section
* dsec
, uint64_t offset
)
4360 if (dsec
== NULL
|| dsec
->reloc_info
== NULL
)
4363 relocs
= (arelent
**) dsec
->reloc_info
;
4365 for (; (rp
= * relocs
) != NULL
; ++ relocs
)
4366 if (rp
->address
== offset
)
4373 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
4375 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
4376 bfd
*abfd
= (bfd
*) file
;
4380 if (!dump_any_debugging
)
4383 /* If it is already loaded, do nothing. */
4384 if (section
->start
!= NULL
)
4386 if (streq (section
->filename
, bfd_get_filename (abfd
)))
4389 /* Locate the debug section. */
4390 name
= section
->uncompressed_name
;
4391 sec
= bfd_get_section_by_name (abfd
, name
);
4394 name
= section
->compressed_name
;
4396 sec
= bfd_get_section_by_name (abfd
, name
);
4400 name
= section
->xcoff_name
;
4402 sec
= bfd_get_section_by_name (abfd
, name
);
4407 section
->name
= name
;
4408 return load_specific_debug_section (debug
, sec
, file
);
4412 free_debug_section (enum dwarf_section_display_enum debug
)
4414 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
4416 free ((char *) section
->start
);
4417 section
->start
= NULL
;
4418 section
->address
= 0;
4420 free ((char*) section
->reloc_info
);
4421 section
->reloc_info
= NULL
;
4422 section
->num_relocs
= 0;
4426 close_debug_file (void * file
)
4428 bfd
* abfd
= (bfd
*) file
;
4434 open_debug_file (const char * pathname
)
4438 data
= bfd_openr (pathname
, NULL
);
4442 if (! bfd_check_format (data
, bfd_object
))
4449 dump_dwarf_section (bfd
*abfd
, asection
*section
,
4452 const char *name
= bfd_section_name (section
);
4455 bool is_mainfile
= *(bool *) arg
;
4460 if (!is_mainfile
&& !process_links
4461 && (section
->flags
& SEC_DEBUGGING
) == 0)
4464 if (startswith (name
, ".gnu.linkonce.wi."))
4465 match
= ".debug_info";
4469 for (i
= 0; i
< max
; i
++)
4470 if ((strcmp (debug_displays
[i
].section
.uncompressed_name
, match
) == 0
4471 || strcmp (debug_displays
[i
].section
.compressed_name
, match
) == 0
4472 || strcmp (debug_displays
[i
].section
.xcoff_name
, match
) == 0)
4473 && debug_displays
[i
].enabled
!= NULL
4474 && *debug_displays
[i
].enabled
)
4476 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
4478 if (strcmp (sec
->uncompressed_name
, match
) == 0)
4479 sec
->name
= sec
->uncompressed_name
;
4480 else if (strcmp (sec
->compressed_name
, match
) == 0)
4481 sec
->name
= sec
->compressed_name
;
4483 sec
->name
= sec
->xcoff_name
;
4484 if (load_specific_debug_section ((enum dwarf_section_display_enum
) i
,
4487 debug_displays
[i
].display (sec
, abfd
);
4489 if (i
!= info
&& i
!= abbrev
)
4490 free_debug_section ((enum dwarf_section_display_enum
) i
);
4496 /* Dump the dwarf debugging information. */
4499 dump_dwarf (bfd
*abfd
, bool is_mainfile
)
4501 /* The byte_get pointer should have been set at the start of dump_bfd(). */
4502 if (byte_get
== NULL
)
4504 warn (_("File %s does not contain any dwarf debug information\n"),
4505 bfd_get_filename (abfd
));
4509 switch (bfd_get_arch (abfd
))
4512 /* S12Z has a 24 bit address space. But the only known
4513 producer of dwarf_info encodes addresses into 32 bits. */
4518 eh_addr_size
= bfd_arch_bits_per_address (abfd
) / 8;
4522 init_dwarf_regnames_by_bfd_arch_and_mach (bfd_get_arch (abfd
),
4523 bfd_get_mach (abfd
));
4525 bfd_map_over_sections (abfd
, dump_dwarf_section
, (void *) &is_mainfile
);
4528 /* Read ABFD's section SECT_NAME into *CONTENTS, and return a pointer to
4529 the section. Return NULL on failure. */
4532 read_section (bfd
*abfd
, const char *sect_name
, bfd_byte
**contents
)
4537 sec
= bfd_get_section_by_name (abfd
, sect_name
);
4540 printf (_("No %s section present\n\n"), sanitize_string (sect_name
));
4544 if ((bfd_section_flags (sec
) & SEC_HAS_CONTENTS
) == 0)
4545 bfd_set_error (bfd_error_no_contents
);
4546 else if (bfd_malloc_and_get_section (abfd
, sec
, contents
))
4549 non_fatal (_("reading %s section of %s failed: %s"),
4550 sect_name
, bfd_get_filename (abfd
),
4551 bfd_errmsg (bfd_get_error ()));
4556 /* Stabs entries use a 12 byte format:
4557 4 byte string table index
4559 1 byte stab other field
4560 2 byte stab desc field
4562 FIXME: This will have to change for a 64 bit object format. */
4564 #define STRDXOFF (0)
4566 #define OTHEROFF (5)
4569 #define STABSIZE (12)
4571 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
4572 using string table section STRSECT_NAME (in `strtab'). */
4575 print_section_stabs (bfd
*abfd
,
4576 const char *stabsect_name
,
4577 unsigned *string_offset_ptr
)
4580 unsigned file_string_table_offset
= 0;
4581 unsigned next_file_string_table_offset
= *string_offset_ptr
;
4582 bfd_byte
*stabp
, *stabs_end
;
4585 stabs_end
= PTR_ADD (stabp
, stab_size
);
4587 printf (_("Contents of %s section:\n\n"), sanitize_string (stabsect_name
));
4588 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
4590 /* Loop through all symbols and print them.
4592 We start the index at -1 because there is a dummy symbol on
4593 the front of stabs-in-{coff,elf} sections that supplies sizes. */
4594 for (i
= -1; (size_t) (stabs_end
- stabp
) >= STABSIZE
; stabp
+= STABSIZE
, i
++)
4598 unsigned char type
, other
;
4599 unsigned short desc
;
4602 strx
= bfd_h_get_32 (abfd
, stabp
+ STRDXOFF
);
4603 type
= bfd_h_get_8 (abfd
, stabp
+ TYPEOFF
);
4604 other
= bfd_h_get_8 (abfd
, stabp
+ OTHEROFF
);
4605 desc
= bfd_h_get_16 (abfd
, stabp
+ DESCOFF
);
4606 value
= bfd_h_get_32 (abfd
, stabp
+ VALOFF
);
4608 printf ("\n%-6d ", i
);
4609 /* Either print the stab name, or, if unnamed, print its number
4610 again (makes consistent formatting for tools like awk). */
4611 name
= bfd_get_stab_name (type
);
4613 printf ("%-6s", sanitize_string (name
));
4614 else if (type
== N_UNDF
)
4617 printf ("%-6d", type
);
4618 printf (" %-6d %-6d ", other
, desc
);
4619 bfd_printf_vma (abfd
, value
);
4620 printf (" %-6lu", strx
);
4622 /* Symbols with type == 0 (N_UNDF) specify the length of the
4623 string table associated with this file. We use that info
4624 to know how to relocate the *next* file's string table indices. */
4627 file_string_table_offset
= next_file_string_table_offset
;
4628 next_file_string_table_offset
+= value
;
4632 bfd_size_type amt
= strx
+ file_string_table_offset
;
4634 /* Using the (possibly updated) string table offset, print the
4635 string (if any) associated with this symbol. */
4636 if (amt
< stabstr_size
)
4637 /* PR 17512: file: 079-79389-0.001:0.1.
4638 FIXME: May need to sanitize this string before displaying. */
4639 printf (" %.*s", (int)(stabstr_size
- amt
), strtab
+ amt
);
4645 *string_offset_ptr
= next_file_string_table_offset
;
4650 const char * section_name
;
4651 const char * string_section_name
;
4652 unsigned string_offset
;
4657 find_stabs_section (bfd
*abfd
, asection
*section
, void *names
)
4660 stab_section_names
* sought
= (stab_section_names
*) names
;
4662 /* Check for section names for which stabsect_name is a prefix, to
4663 handle .stab.N, etc. */
4664 len
= strlen (sought
->section_name
);
4666 /* If the prefix matches, and the files section name ends with a
4667 nul or a digit, then we match. I.e., we want either an exact
4668 match or a section followed by a number. */
4669 if (strncmp (sought
->section_name
, section
->name
, len
) == 0
4670 && (section
->name
[len
] == 0
4671 || (section
->name
[len
] == '.' && ISDIGIT (section
->name
[len
+ 1]))))
4676 s
= read_section (abfd
, sought
->string_section_name
, &strtab
);
4678 stabstr_size
= bfd_section_size (s
);
4683 s
= read_section (abfd
, section
->name
, &stabs
);
4686 stab_size
= bfd_section_size (s
);
4687 print_section_stabs (abfd
, section
->name
, &sought
->string_offset
);
4695 dump_stabs_section (bfd
*abfd
, char *stabsect_name
, char *strsect_name
)
4697 stab_section_names s
;
4699 s
.section_name
= stabsect_name
;
4700 s
.string_section_name
= strsect_name
;
4701 s
.string_offset
= 0;
4703 bfd_map_over_sections (abfd
, find_stabs_section
, & s
);
4709 /* Dump the any sections containing stabs debugging information. */
4712 dump_stabs (bfd
*abfd
)
4714 dump_stabs_section (abfd
, ".stab", ".stabstr");
4715 dump_stabs_section (abfd
, ".stab.excl", ".stab.exclstr");
4716 dump_stabs_section (abfd
, ".stab.index", ".stab.indexstr");
4719 dump_stabs_section (abfd
, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
4721 dump_stabs_section (abfd
, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
4725 dump_bfd_header (bfd
*abfd
)
4729 printf (_("architecture: %s, "),
4730 bfd_printable_arch_mach (bfd_get_arch (abfd
),
4731 bfd_get_mach (abfd
)));
4732 printf (_("flags 0x%08x:\n"), abfd
->flags
& ~BFD_FLAGS_FOR_BFD_USE_MASK
);
4734 #define PF(x, y) if (abfd->flags & x) {printf ("%s%s", comma, y); comma=", ";}
4735 PF (HAS_RELOC
, "HAS_RELOC");
4736 PF (EXEC_P
, "EXEC_P");
4737 PF (HAS_LINENO
, "HAS_LINENO");
4738 PF (HAS_DEBUG
, "HAS_DEBUG");
4739 PF (HAS_SYMS
, "HAS_SYMS");
4740 PF (HAS_LOCALS
, "HAS_LOCALS");
4741 PF (DYNAMIC
, "DYNAMIC");
4742 PF (WP_TEXT
, "WP_TEXT");
4743 PF (D_PAGED
, "D_PAGED");
4744 PF (BFD_IS_RELAXABLE
, "BFD_IS_RELAXABLE");
4745 printf (_("\nstart address 0x"));
4746 bfd_printf_vma (abfd
, abfd
->start_address
);
4751 #ifdef ENABLE_LIBCTF
4752 /* Formatting callback function passed to ctf_dump. Returns either the pointer
4753 it is passed, or a pointer to newly-allocated storage, in which case
4754 dump_ctf() will free it when it no longer needs it. */
4757 dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED
,
4760 const char *blanks
= arg
;
4763 if (asprintf (&new_s
, "%s%s", blanks
, s
) < 0)
4768 /* Make a ctfsect suitable for ctf_bfdopen_ctfsect(). */
4770 make_ctfsect (const char *name
, bfd_byte
*data
,
4775 ctfsect
.cts_name
= name
;
4776 ctfsect
.cts_entsize
= 1;
4777 ctfsect
.cts_size
= size
;
4778 ctfsect
.cts_data
= data
;
4783 /* Dump CTF errors/warnings. */
4785 dump_ctf_errs (ctf_dict_t
*fp
)
4787 ctf_next_t
*it
= NULL
;
4792 /* Dump accumulated errors and warnings. */
4793 while ((errtext
= ctf_errwarning_next (fp
, &it
, &is_warning
, &err
)) != NULL
)
4795 non_fatal (_("%s: %s"), is_warning
? _("warning"): _("error"),
4799 if (err
!= ECTF_NEXT_END
)
4801 non_fatal (_("CTF error: cannot get CTF errors: `%s'"),
4806 /* Dump one CTF archive member. */
4809 dump_ctf_archive_member (ctf_dict_t
*ctf
, const char *name
, ctf_dict_t
*parent
,
4812 const char *things
[] = {"Header", "Labels", "Data objects",
4813 "Function objects", "Variables", "Types", "Strings",
4818 /* Don't print out the name of the default-named archive member if it appears
4819 first in the list. The name .ctf appears everywhere, even for things that
4820 aren't really archives, so printing it out is liable to be confusing; also,
4821 the common case by far is for only one archive member to exist, and hiding
4822 it in that case seems worthwhile. */
4824 if (strcmp (name
, ".ctf") != 0 || member
!= 0)
4825 printf (_("\nCTF archive member: %s:\n"), sanitize_string (name
));
4827 if (ctf_parent_name (ctf
) != NULL
)
4828 ctf_import (ctf
, parent
);
4830 for (i
= 0, thing
= things
; *thing
[0]; thing
++, i
++)
4832 ctf_dump_state_t
*s
= NULL
;
4835 printf ("\n %s:\n", *thing
);
4836 while ((item
= ctf_dump (ctf
, &s
, i
, dump_ctf_indent_lines
,
4837 (void *) " ")) != NULL
)
4839 printf ("%s\n", item
);
4843 if (ctf_errno (ctf
))
4845 non_fatal (_("Iteration failed: %s, %s"), *thing
,
4846 ctf_errmsg (ctf_errno (ctf
)));
4851 dump_ctf_errs (ctf
);
4854 /* Dump the CTF debugging information. */
4857 dump_ctf (bfd
*abfd
, const char *sect_name
, const char *parent_name
)
4860 ctf_archive_t
*ctfa
= NULL
;
4865 ctf_next_t
*i
= NULL
;
4870 if (sect_name
== NULL
)
4873 sec
= read_section (abfd
, sect_name
, &ctfdata
);
4876 my_bfd_nonfatal (bfd_get_filename (abfd
));
4880 /* Load the CTF file and dump it. Preload the parent dict, since it will
4881 need to be imported into every child in turn. */
4883 ctfsect
= make_ctfsect (sect_name
, ctfdata
, bfd_section_size (sec
));
4884 if ((ctfa
= ctf_bfdopen_ctfsect (abfd
, &ctfsect
, &err
)) == NULL
)
4886 dump_ctf_errs (NULL
);
4887 non_fatal (_("CTF open failure: %s"), ctf_errmsg (err
));
4888 my_bfd_nonfatal (bfd_get_filename (abfd
));
4893 if ((parent
= ctf_dict_open (ctfa
, parent_name
, &err
)) == NULL
)
4895 dump_ctf_errs (NULL
);
4896 non_fatal (_("CTF open failure: %s"), ctf_errmsg (err
));
4897 my_bfd_nonfatal (bfd_get_filename (abfd
));
4903 printf (_("Contents of CTF section %s:\n"), sanitize_string (sect_name
));
4905 while ((fp
= ctf_archive_next (ctfa
, &i
, &name
, 0, &err
)) != NULL
)
4906 dump_ctf_archive_member (fp
, name
, parent
, member
++);
4907 if (err
!= ECTF_NEXT_END
)
4909 dump_ctf_errs (NULL
);
4910 non_fatal (_("CTF archive member open failure: %s"), ctf_errmsg (err
));
4911 my_bfd_nonfatal (bfd_get_filename (abfd
));
4913 ctf_dict_close (parent
);
4919 dump_ctf (bfd
*abfd ATTRIBUTE_UNUSED
, const char *sect_name ATTRIBUTE_UNUSED
,
4920 const char *parent_name ATTRIBUTE_UNUSED
) {}
4924 dump_section_sframe (bfd
*abfd ATTRIBUTE_UNUSED
,
4925 const char * sect_name
)
4928 sframe_decoder_ctx
*sfd_ctx
= NULL
;
4929 bfd_size_type sf_size
;
4930 bfd_byte
*sframe_data
;
4934 if (sect_name
== NULL
)
4935 sect_name
= ".sframe";
4937 sec
= read_section (abfd
, sect_name
, &sframe_data
);
4940 my_bfd_nonfatal (bfd_get_filename (abfd
));
4943 sf_size
= bfd_section_size (sec
);
4944 sf_vma
= bfd_section_vma (sec
);
4946 /* Decode the contents of the section. */
4947 sfd_ctx
= sframe_decode ((const char*)sframe_data
, sf_size
, &err
);
4950 my_bfd_nonfatal (bfd_get_filename (abfd
));
4955 printf (_("Contents of the SFrame section %s:"),
4956 sanitize_string (sect_name
));
4957 /* Dump the contents as text. */
4958 dump_sframe (sfd_ctx
, sf_vma
);
4960 sframe_decoder_free (&sfd_ctx
);
4966 dump_bfd_private_header (bfd
*abfd
)
4968 if (!bfd_print_private_bfd_data (abfd
, stdout
))
4969 non_fatal (_("warning: private headers incomplete: %s"),
4970 bfd_errmsg (bfd_get_error ()));
4974 dump_target_specific (bfd
*abfd
)
4976 const struct objdump_private_desc
* const *desc
;
4977 struct objdump_private_option
*opt
;
4980 /* Find the desc. */
4981 for (desc
= objdump_private_vectors
; *desc
!= NULL
; desc
++)
4982 if ((*desc
)->filter (abfd
))
4987 non_fatal (_("option -P/--private not supported by this file"));
4991 /* Clear all options. */
4992 for (opt
= (*desc
)->options
; opt
->name
; opt
++)
4993 opt
->selected
= false;
4995 /* Decode options. */
4996 b
= dump_private_options
;
4999 e
= strchr (b
, ',');
5004 for (opt
= (*desc
)->options
; opt
->name
; opt
++)
5005 if (strcmp (opt
->name
, b
) == 0)
5007 opt
->selected
= true;
5010 if (opt
->name
== NULL
)
5011 non_fatal (_("target specific dump '%s' not supported"), b
);
5022 (*desc
)->dump (abfd
);
5025 /* Display a section in hexadecimal format with associated characters.
5026 Each line prefixed by the zero padded address. */
5029 dump_section (bfd
*abfd
, asection
*section
, void *dummy ATTRIBUTE_UNUSED
)
5031 bfd_byte
*data
= NULL
;
5032 bfd_size_type datasize
;
5033 bfd_vma addr_offset
;
5034 bfd_vma start_offset
;
5035 bfd_vma stop_offset
;
5036 unsigned int opb
= bfd_octets_per_byte (abfd
, section
);
5037 /* Bytes per line. */
5038 const int onaline
= 16;
5043 if (only_list
== NULL
)
5045 if ((section
->flags
& SEC_HAS_CONTENTS
) == 0)
5048 else if (!process_section_p (section
))
5051 if ((datasize
= bfd_section_size (section
)) == 0)
5054 /* Compute the address range to display. */
5055 if (start_address
== (bfd_vma
) -1
5056 || start_address
< section
->vma
)
5059 start_offset
= start_address
- section
->vma
;
5061 if (stop_address
== (bfd_vma
) -1)
5062 stop_offset
= datasize
/ opb
;
5065 if (stop_address
< section
->vma
)
5068 stop_offset
= stop_address
- section
->vma
;
5070 if (stop_offset
> datasize
/ opb
)
5071 stop_offset
= datasize
/ opb
;
5074 if (start_offset
>= stop_offset
)
5077 printf (_("Contents of section %s:"), sanitize_string (section
->name
));
5078 if (display_file_offsets
)
5079 printf (_(" (Starting at file offset: 0x%lx)"),
5080 (unsigned long) (section
->filepos
+ start_offset
));
5083 if (bfd_is_section_compressed (abfd
, section
) && ! decompressed_dumps
)
5084 printf (_(" NOTE: This section is compressed, but its contents have NOT been expanded for this dump.\n"));
5086 if (!bfd_get_full_section_contents (abfd
, section
, &data
))
5088 non_fatal (_("Reading section %s failed because: %s"),
5089 section
->name
, bfd_errmsg (bfd_get_error ()));
5095 bfd_sprintf_vma (abfd
, buf
, start_offset
+ section
->vma
);
5096 if (strlen (buf
) >= sizeof (buf
))
5100 while (buf
[count
] == '0' && buf
[count
+1] != '\0')
5102 count
= strlen (buf
) - count
;
5106 bfd_sprintf_vma (abfd
, buf
, stop_offset
+ section
->vma
- 1);
5107 if (strlen (buf
) >= sizeof (buf
))
5111 while (buf
[count
] == '0' && buf
[count
+1] != '\0')
5113 count
= strlen (buf
) - count
;
5117 for (addr_offset
= start_offset
;
5118 addr_offset
< stop_offset
; addr_offset
+= onaline
/ opb
)
5122 bfd_sprintf_vma (abfd
, buf
, (addr_offset
+ section
->vma
));
5123 count
= strlen (buf
);
5124 if ((size_t) count
>= sizeof (buf
))
5128 while (count
< width
)
5133 fputs (buf
+ count
- width
, stdout
);
5136 for (j
= addr_offset
* opb
;
5137 j
< addr_offset
* opb
+ onaline
; j
++)
5139 if (j
< stop_offset
* opb
)
5140 printf ("%02x", (unsigned) (data
[j
]));
5148 for (j
= addr_offset
* opb
;
5149 j
< addr_offset
* opb
+ onaline
; j
++)
5151 if (j
>= stop_offset
* opb
)
5154 printf ("%c", ISPRINT (data
[j
]) ? data
[j
] : '.');
5161 /* Actually display the various requested regions. */
5164 dump_data (bfd
*abfd
)
5166 bfd_map_over_sections (abfd
, dump_section
, NULL
);
5169 /* Should perhaps share code and display with nm? */
5172 dump_symbols (bfd
*abfd ATTRIBUTE_UNUSED
, bool dynamic
)
5181 max_count
= dynsymcount
;
5182 printf ("DYNAMIC SYMBOL TABLE:\n");
5187 max_count
= symcount
;
5188 printf ("SYMBOL TABLE:\n");
5192 printf (_("no symbols\n"));
5194 for (count
= 0; count
< max_count
; count
++)
5198 if (*current
== NULL
)
5199 printf (_("no information for symbol number %ld\n"), count
);
5201 else if ((cur_bfd
= bfd_asymbol_bfd (*current
)) == NULL
)
5202 printf (_("could not determine the type of symbol number %ld\n"),
5205 else if (process_section_p ((* current
)->section
)
5206 && (dump_special_syms
5207 || !bfd_is_target_special_symbol (cur_bfd
, *current
)))
5209 const char *name
= (*current
)->name
;
5211 if (do_demangle
&& name
!= NULL
&& *name
!= '\0')
5215 /* If we want to demangle the name, we demangle it
5216 here, and temporarily clobber it while calling
5217 bfd_print_symbol. FIXME: This is a gross hack. */
5218 alloc
= bfd_demangle (cur_bfd
, name
, demangle_flags
);
5220 (*current
)->name
= alloc
;
5221 bfd_print_symbol (cur_bfd
, stdout
, *current
,
5222 bfd_print_symbol_all
);
5225 (*current
)->name
= name
;
5229 else if (unicode_display
!= unicode_default
5230 && name
!= NULL
&& *name
!= '\0')
5232 const char * sanitized_name
;
5234 /* If we want to sanitize the name, we do it here, and
5235 temporarily clobber it while calling bfd_print_symbol.
5236 FIXME: This is a gross hack. */
5237 sanitized_name
= sanitize_string (name
);
5238 if (sanitized_name
!= name
)
5239 (*current
)->name
= sanitized_name
;
5241 sanitized_name
= NULL
;
5242 bfd_print_symbol (cur_bfd
, stdout
, *current
,
5243 bfd_print_symbol_all
);
5244 if (sanitized_name
!= NULL
)
5245 (*current
)->name
= name
;
5248 bfd_print_symbol (cur_bfd
, stdout
, *current
,
5249 bfd_print_symbol_all
);
5259 dump_reloc_set (bfd
*abfd
, asection
*sec
, arelent
**relpp
, long relcount
)
5262 char *last_filename
, *last_functionname
;
5263 unsigned int last_line
;
5264 unsigned int last_discriminator
;
5266 /* Get column headers lined up reasonably. */
5274 bfd_sprintf_vma (abfd
, buf
, (bfd_vma
) -1);
5275 width
= strlen (buf
) - 7;
5277 printf ("OFFSET %*s TYPE %*s VALUE\n", width
, "", 12, "");
5280 last_filename
= NULL
;
5281 last_functionname
= NULL
;
5283 last_discriminator
= 0;
5285 for (p
= relpp
; relcount
&& *p
!= NULL
; p
++, relcount
--)
5288 const char *filename
, *functionname
;
5289 unsigned int linenumber
;
5290 unsigned int discriminator
;
5291 const char *sym_name
;
5292 const char *section_name
;
5293 bfd_vma addend2
= 0;
5295 if (start_address
!= (bfd_vma
) -1
5296 && q
->address
< start_address
)
5298 if (stop_address
!= (bfd_vma
) -1
5299 && q
->address
> stop_address
)
5302 if (with_line_numbers
5304 && bfd_find_nearest_line_discriminator (abfd
, sec
, syms
, q
->address
,
5305 &filename
, &functionname
,
5306 &linenumber
, &discriminator
))
5308 if (functionname
!= NULL
5309 && (last_functionname
== NULL
5310 || strcmp (functionname
, last_functionname
) != 0))
5312 printf ("%s():\n", sanitize_string (functionname
));
5313 if (last_functionname
!= NULL
)
5314 free (last_functionname
);
5315 last_functionname
= xstrdup (functionname
);
5319 && (linenumber
!= last_line
5320 || (filename
!= NULL
5321 && last_filename
!= NULL
5322 && filename_cmp (filename
, last_filename
) != 0)
5323 || (discriminator
!= last_discriminator
)))
5325 if (discriminator
> 0)
5326 printf ("%s:%u\n", filename
== NULL
? "???" :
5327 sanitize_string (filename
), linenumber
);
5329 printf ("%s:%u (discriminator %u)\n",
5330 filename
== NULL
? "???" : sanitize_string (filename
),
5331 linenumber
, discriminator
);
5332 last_line
= linenumber
;
5333 last_discriminator
= discriminator
;
5334 if (last_filename
!= NULL
)
5335 free (last_filename
);
5336 if (filename
== NULL
)
5337 last_filename
= NULL
;
5339 last_filename
= xstrdup (filename
);
5343 if (q
->sym_ptr_ptr
&& *q
->sym_ptr_ptr
)
5345 sym_name
= (*(q
->sym_ptr_ptr
))->name
;
5346 section_name
= (*(q
->sym_ptr_ptr
))->section
->name
;
5351 section_name
= NULL
;
5354 bfd_printf_vma (abfd
, q
->address
);
5355 if (q
->howto
== NULL
)
5356 printf (" *unknown* ");
5357 else if (q
->howto
->name
)
5359 const char *name
= q
->howto
->name
;
5361 /* R_SPARC_OLO10 relocations contain two addends.
5362 But because 'arelent' lacks enough storage to
5363 store them both, the 64-bit ELF Sparc backend
5364 records this as two relocations. One R_SPARC_LO10
5365 and one R_SPARC_13, both pointing to the same
5366 address. This is merely so that we have some
5367 place to store both addend fields.
5369 Undo this transformation, otherwise the output
5370 will be confusing. */
5371 if (abfd
->xvec
->flavour
== bfd_target_elf_flavour
5372 && elf_tdata (abfd
)->elf_header
->e_machine
== EM_SPARCV9
5374 && !strcmp (q
->howto
->name
, "R_SPARC_LO10"))
5376 arelent
*q2
= *(p
+ 1);
5379 && q
->address
== q2
->address
5380 && !strcmp (q2
->howto
->name
, "R_SPARC_13"))
5382 name
= "R_SPARC_OLO10";
5383 addend2
= q2
->addend
;
5387 printf (" %-16s ", name
);
5390 printf (" %-16d ", q
->howto
->type
);
5394 objdump_print_symname (abfd
, NULL
, *q
->sym_ptr_ptr
);
5398 if (section_name
== NULL
)
5399 section_name
= "*unknown*";
5400 printf ("[%s]", sanitize_string (section_name
));
5405 bfd_signed_vma addend
= q
->addend
;
5413 bfd_printf_vma (abfd
, addend
);
5418 bfd_printf_vma (abfd
, addend2
);
5424 if (last_filename
!= NULL
)
5425 free (last_filename
);
5426 if (last_functionname
!= NULL
)
5427 free (last_functionname
);
5431 dump_relocs_in_section (bfd
*abfd
,
5433 void *dummy ATTRIBUTE_UNUSED
)
5439 if ( bfd_is_abs_section (section
)
5440 || bfd_is_und_section (section
)
5441 || bfd_is_com_section (section
)
5442 || (! process_section_p (section
))
5443 || ((section
->flags
& SEC_RELOC
) == 0))
5446 printf ("RELOCATION RECORDS FOR [%s]:", sanitize_string (section
->name
));
5448 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
5451 printf (" (none)\n\n");
5462 relpp
= (arelent
**) xmalloc (relsize
);
5463 relcount
= bfd_canonicalize_reloc (abfd
, section
, relpp
, syms
);
5469 non_fatal (_("failed to read relocs in: %s"),
5470 sanitize_string (bfd_get_filename (abfd
)));
5471 my_bfd_nonfatal (_("error message was"));
5473 else if (relcount
== 0)
5474 printf (" (none)\n\n");
5478 dump_reloc_set (abfd
, section
, relpp
, relcount
);
5485 dump_relocs (bfd
*abfd
)
5487 bfd_map_over_sections (abfd
, dump_relocs_in_section
, NULL
);
5491 dump_dynamic_relocs (bfd
*abfd
)
5497 relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
5499 printf ("DYNAMIC RELOCATION RECORDS");
5503 printf (" (none)\n\n");
5514 relpp
= (arelent
**) xmalloc (relsize
);
5515 relcount
= bfd_canonicalize_dynamic_reloc (abfd
, relpp
, dynsyms
);
5521 non_fatal (_("failed to read relocs in: %s"),
5522 sanitize_string (bfd_get_filename (abfd
)));
5523 my_bfd_nonfatal (_("error message was"));
5525 else if (relcount
== 0)
5526 printf (" (none)\n\n");
5530 dump_reloc_set (abfd
, NULL
, relpp
, relcount
);
5536 /* Creates a table of paths, to search for source files. */
5539 add_include_path (const char *path
)
5543 include_path_count
++;
5544 include_paths
= (const char **)
5545 xrealloc (include_paths
, include_path_count
* sizeof (*include_paths
));
5546 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5547 if (path
[1] == ':' && path
[2] == 0)
5548 path
= concat (path
, ".", (const char *) 0);
5550 include_paths
[include_path_count
- 1] = path
;
5554 adjust_addresses (bfd
*abfd ATTRIBUTE_UNUSED
,
5558 if ((section
->flags
& SEC_DEBUGGING
) == 0)
5560 bool *has_reloc_p
= (bool *) arg
;
5561 section
->vma
+= adjust_section_vma
;
5563 section
->lma
+= adjust_section_vma
;
5567 /* Return the sign-extended form of an ARCH_SIZE sized VMA. */
5570 sign_extend_address (bfd
*abfd ATTRIBUTE_UNUSED
,
5575 mask
= (bfd_vma
) 1 << (arch_size
- 1);
5576 return (((vma
& ((mask
<< 1) - 1)) ^ mask
) - mask
);
5580 might_need_separate_debug_info (bool is_mainfile
)
5582 /* We do not follow links from debug info files. */
5586 /* Since do_follow_links might be enabled by default, only treat it as an
5587 indication that separate files should be loaded if setting it was a
5588 deliberate user action. */
5589 if (DEFAULT_FOR_FOLLOW_LINKS
== 0 && do_follow_links
)
5592 if (process_links
|| dump_symtab
|| dump_debugging
5593 || dump_dwarf_section_info
|| with_source_code
)
5599 /* Dump selected contents of ABFD. */
5602 dump_bfd (bfd
*abfd
, bool is_mainfile
)
5604 const struct elf_backend_data
* bed
;
5606 if (bfd_big_endian (abfd
))
5607 byte_get
= byte_get_big_endian
;
5608 else if (bfd_little_endian (abfd
))
5609 byte_get
= byte_get_little_endian
;
5613 /* Load any separate debug information files. */
5614 if (byte_get
!= NULL
&& might_need_separate_debug_info (is_mainfile
))
5616 load_separate_debug_files (abfd
, bfd_get_filename (abfd
));
5618 /* If asked to do so, recursively dump the separate files. */
5619 if (do_follow_links
)
5623 for (i
= first_separate_info
; i
!= NULL
; i
= i
->next
)
5624 dump_bfd (i
->handle
, false);
5628 /* Adjust user-specified start and stop limits for targets that use
5629 signed addresses. */
5630 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
5631 && (bed
= get_elf_backend_data (abfd
)) != NULL
5632 && bed
->sign_extend_vma
)
5634 start_address
= sign_extend_address (abfd
, start_address
,
5636 stop_address
= sign_extend_address (abfd
, stop_address
,
5640 /* If we are adjusting section VMA's, change them all now. Changing
5641 the BFD information is a hack. However, we must do it, or
5642 bfd_find_nearest_line will not do the right thing. */
5643 if (adjust_section_vma
!= 0)
5645 bool has_reloc
= (abfd
->flags
& HAS_RELOC
);
5646 bfd_map_over_sections (abfd
, adjust_addresses
, &has_reloc
);
5649 if (is_mainfile
|| process_links
)
5651 if (! dump_debugging_tags
&& ! suppress_bfd_header
)
5652 printf (_("\n%s: file format %s\n"),
5653 sanitize_string (bfd_get_filename (abfd
)),
5656 print_arelt_descr (stdout
, abfd
, true, false);
5657 if (dump_file_header
)
5658 dump_bfd_header (abfd
);
5659 if (dump_private_headers
)
5660 dump_bfd_private_header (abfd
);
5661 if (dump_private_options
!= NULL
)
5662 dump_target_specific (abfd
);
5663 if (! dump_debugging_tags
&& ! suppress_bfd_header
)
5671 || dump_dwarf_section_info
)
5673 syms
= slurp_symtab (abfd
);
5675 /* If following links, load any symbol tables from the linked files as well. */
5676 if (do_follow_links
&& is_mainfile
)
5680 for (i
= first_separate_info
; i
!= NULL
; i
= i
->next
)
5682 asymbol
** extra_syms
;
5683 long old_symcount
= symcount
;
5685 extra_syms
= slurp_symtab (i
->handle
);
5689 if (old_symcount
== 0)
5695 syms
= xrealloc (syms
, ((symcount
+ old_symcount
+ 1)
5696 * sizeof (asymbol
*)));
5697 memcpy (syms
+ old_symcount
,
5699 (symcount
+ 1) * sizeof (asymbol
*));
5703 symcount
+= old_symcount
;
5708 if (is_mainfile
|| process_links
)
5710 if (dump_section_headers
)
5711 dump_headers (abfd
);
5713 if (dump_dynamic_symtab
|| dump_dynamic_reloc_info
5714 || (disassemble
&& bfd_get_dynamic_symtab_upper_bound (abfd
) > 0))
5715 dynsyms
= slurp_dynamic_symtab (abfd
);
5719 synthcount
= bfd_get_synthetic_symtab (abfd
, symcount
, syms
,
5720 dynsymcount
, dynsyms
,
5727 dump_symbols (abfd
, false);
5728 if (dump_dynamic_symtab
)
5729 dump_symbols (abfd
, true);
5731 if (dump_dwarf_section_info
)
5732 dump_dwarf (abfd
, is_mainfile
);
5733 if (is_mainfile
|| process_links
)
5735 if (dump_ctf_section_info
)
5736 dump_ctf (abfd
, dump_ctf_section_name
, dump_ctf_parent_name
);
5737 if (dump_sframe_section_info
)
5738 dump_section_sframe (abfd
, dump_sframe_section_name
);
5739 if (dump_stab_section_info
)
5741 if (dump_reloc_info
&& ! disassemble
)
5743 if (dump_dynamic_reloc_info
&& ! disassemble
)
5744 dump_dynamic_relocs (abfd
);
5745 if (dump_section_contents
)
5748 disassemble_data (abfd
);
5755 dhandle
= read_debugging_info (abfd
, syms
, symcount
, true);
5756 if (dhandle
!= NULL
)
5758 if (!print_debugging_info (stdout
, dhandle
, abfd
, syms
,
5760 dump_debugging_tags
!= 0))
5762 non_fatal (_("%s: printing debugging information failed"),
5763 bfd_get_filename (abfd
));
5767 /* PR 6483: If there was no STABS debug info in the file, try
5769 else if (! dump_dwarf_section_info
)
5771 dwarf_select_sections_all ();
5772 dump_dwarf (abfd
, is_mainfile
);
5799 free_debug_memory ();
5803 display_object_bfd (bfd
*abfd
)
5807 if (bfd_check_format_matches (abfd
, bfd_object
, &matching
))
5809 dump_bfd (abfd
, true);
5813 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
5815 my_bfd_nonfatal (bfd_get_filename (abfd
));
5816 list_matching_formats (matching
);
5820 if (bfd_get_error () != bfd_error_file_not_recognized
)
5822 my_bfd_nonfatal (bfd_get_filename (abfd
));
5826 if (bfd_check_format_matches (abfd
, bfd_core
, &matching
))
5828 dump_bfd (abfd
, true);
5832 my_bfd_nonfatal (bfd_get_filename (abfd
));
5834 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
5835 list_matching_formats (matching
);
5839 display_any_bfd (bfd
*file
, int level
)
5841 /* Decompress sections unless dumping the section contents. */
5842 if (!dump_section_contents
|| decompressed_dumps
)
5843 file
->flags
|= BFD_DECOMPRESS
;
5845 /* If the file is an archive, process all of its elements. */
5846 if (bfd_check_format (file
, bfd_archive
))
5849 bfd
*last_arfile
= NULL
;
5852 printf (_("In archive %s:\n"), sanitize_string (bfd_get_filename (file
)));
5853 else if (level
> 100)
5855 /* Prevent corrupted files from spinning us into an
5856 infinite loop. 100 is an arbitrary heuristic. */
5857 non_fatal (_("Archive nesting is too deep"));
5862 printf (_("In nested archive %s:\n"),
5863 sanitize_string (bfd_get_filename (file
)));
5867 bfd_set_error (bfd_error_no_error
);
5869 arfile
= bfd_openr_next_archived_file (file
, arfile
);
5872 if (bfd_get_error () != bfd_error_no_more_archived_files
)
5873 my_bfd_nonfatal (bfd_get_filename (file
));
5877 display_any_bfd (arfile
, level
+ 1);
5879 if (last_arfile
!= NULL
)
5881 bfd_close (last_arfile
);
5882 /* PR 17512: file: ac585d01. */
5883 if (arfile
== last_arfile
)
5889 last_arfile
= arfile
;
5892 if (last_arfile
!= NULL
)
5893 bfd_close (last_arfile
);
5896 display_object_bfd (file
);
5900 display_file (char *filename
, char *target
, bool last_file
)
5904 if (get_file_size (filename
) < 1)
5910 file
= bfd_openr (filename
, target
);
5913 my_bfd_nonfatal (filename
);
5917 display_any_bfd (file
, 0);
5919 /* This is an optimization to improve the speed of objdump, especially when
5920 dumping a file with lots of associated debug informatiom. Calling
5921 bfd_close on such a file can take a non-trivial amount of time as there
5922 are lots of lists to walk and buffers to free. This is only really
5923 necessary however if we are about to load another file and we need the
5924 memory back. Otherwise, if we are about to exit, then we can save (a lot
5925 of) time by only doing a quick close, and allowing the OS to reclaim the
5930 bfd_close_all_done (file
);
5934 main (int argc
, char **argv
)
5937 char *target
= default_target
;
5938 bool seenflag
= false;
5940 #ifdef HAVE_LC_MESSAGES
5941 setlocale (LC_MESSAGES
, "");
5943 setlocale (LC_CTYPE
, "");
5945 bindtextdomain (PACKAGE
, LOCALEDIR
);
5946 textdomain (PACKAGE
);
5948 program_name
= *argv
;
5949 xmalloc_set_program_name (program_name
);
5950 bfd_set_error_program_name (program_name
);
5952 expandargv (&argc
, &argv
);
5954 if (bfd_init () != BFD_INIT_MAGIC
)
5955 fatal (_("fatal error: libbfd ABI mismatch"));
5956 set_default_bfd_target ();
5958 while ((c
= getopt_long (argc
, argv
,
5959 "CDE:FGHI:LM:P:RSTU:VW::Zab:defghij:lm:prstvwxz",
5960 long_options
, (int *) 0))
5966 break; /* We've been given a long option. */
5971 decompressed_dumps
= true;
5976 if (disassembler_options
)
5977 /* Ignore potential memory leak for now. */
5978 options
= concat (disassembler_options
, ",",
5979 optarg
, (const char *) NULL
);
5982 disassembler_options
= remove_whitespace_and_extra_commas (options
);
5989 display_file_offsets
= true;
5992 with_line_numbers
= true;
6001 enum demangling_styles style
;
6003 style
= cplus_demangle_name_to_style (optarg
);
6004 if (style
== unknown_demangling
)
6005 fatal (_("unknown demangling style `%s'"),
6008 cplus_demangle_set_style (style
);
6011 case OPTION_RECURSE_LIMIT
:
6012 demangle_flags
&= ~ DMGL_NO_RECURSE_LIMIT
;
6014 case OPTION_NO_RECURSE_LIMIT
:
6015 demangle_flags
|= DMGL_NO_RECURSE_LIMIT
;
6018 do_wide
= wide_output
= true;
6020 case OPTION_ADJUST_VMA
:
6021 adjust_section_vma
= parse_vma (optarg
, "--adjust-vma");
6023 case OPTION_START_ADDRESS
:
6024 start_address
= parse_vma (optarg
, "--start-address");
6025 if ((stop_address
!= (bfd_vma
) -1) && stop_address
<= start_address
)
6026 fatal (_("error: the start address should be before the end address"));
6028 case OPTION_STOP_ADDRESS
:
6029 stop_address
= parse_vma (optarg
, "--stop-address");
6030 if ((start_address
!= (bfd_vma
) -1) && stop_address
<= start_address
)
6031 fatal (_("error: the stop address should be after the start address"));
6035 prefix_length
= strlen (prefix
);
6036 /* Remove an unnecessary trailing '/' */
6037 while (IS_DIR_SEPARATOR (prefix
[prefix_length
- 1]))
6040 case OPTION_PREFIX_STRIP
:
6041 prefix_strip
= atoi (optarg
);
6042 if (prefix_strip
< 0)
6043 fatal (_("error: prefix strip must be non-negative"));
6045 case OPTION_INSN_WIDTH
:
6046 insn_width
= strtoul (optarg
, NULL
, 0);
6047 if (insn_width
<= 0)
6048 fatal (_("error: instruction width must be positive"));
6050 case OPTION_INLINES
:
6051 unwind_inlines
= true;
6053 case OPTION_VISUALIZE_JUMPS
:
6054 visualize_jumps
= true;
6055 color_output
= false;
6056 extended_color_output
= false;
6059 if (streq (optarg
, "color"))
6060 color_output
= true;
6061 else if (streq (optarg
, "extended-color"))
6063 color_output
= true;
6064 extended_color_output
= true;
6066 else if (streq (optarg
, "off"))
6067 visualize_jumps
= false;
6070 non_fatal (_("unrecognized argument to --visualize-option"));
6075 case OPTION_DISASSEMBLER_COLOR
:
6076 if (streq (optarg
, "off"))
6077 disassembler_color
= off
;
6078 else if (streq (optarg
, "terminal"))
6079 disassembler_color
= on_if_terminal_output
;
6080 else if (streq (optarg
, "color")
6081 || streq (optarg
, "colour")
6082 || streq (optarg
, "on"))
6083 disassembler_color
= on
;
6084 else if (streq (optarg
, "extended")
6085 || streq (optarg
, "extended-color")
6086 || streq (optarg
, "extended-colour"))
6087 disassembler_color
= extended
;
6090 non_fatal (_("unrecognized argument to --disassembler-color"));
6095 if (strcmp (optarg
, "B") == 0)
6096 endian
= BFD_ENDIAN_BIG
;
6097 else if (strcmp (optarg
, "L") == 0)
6098 endian
= BFD_ENDIAN_LITTLE
;
6101 non_fatal (_("unrecognized -E option"));
6106 if (strncmp (optarg
, "big", strlen (optarg
)) == 0)
6107 endian
= BFD_ENDIAN_BIG
;
6108 else if (strncmp (optarg
, "little", strlen (optarg
)) == 0)
6109 endian
= BFD_ENDIAN_LITTLE
;
6112 non_fatal (_("unrecognized --endian type `%s'"), optarg
);
6118 dump_file_header
= true;
6122 formats_info
= true;
6126 add_include_path (optarg
);
6129 dump_private_headers
= true;
6133 dump_private_options
= optarg
;
6137 dump_private_headers
= true;
6139 dump_reloc_info
= true;
6140 dump_file_header
= true;
6141 dump_ar_hdrs
= true;
6142 dump_section_headers
= true;
6150 dump_dynamic_symtab
= true;
6156 disasm_sym
= optarg
;
6159 disassemble_zeroes
= true;
6163 disassemble_all
= true;
6168 with_source_code
= true;
6171 case OPTION_SOURCE_COMMENT
:
6173 with_source_code
= true;
6176 source_comment
= xstrdup (sanitize_string (optarg
));
6178 source_comment
= xstrdup ("# ");
6186 dump_debugging_tags
= 1;
6191 process_links
= true;
6192 do_follow_links
= true;
6198 if (dwarf_select_sections_by_letters (optarg
))
6199 dump_dwarf_section_info
= true;
6203 dump_dwarf_section_info
= true;
6204 dwarf_select_sections_all ();
6211 if (dwarf_select_sections_by_names (optarg
))
6212 dump_dwarf_section_info
= true;
6216 dwarf_select_sections_all ();
6217 dump_dwarf_section_info
= true;
6220 case OPTION_DWARF_DEPTH
:
6223 dwarf_cutoff_level
= strtoul (optarg
, & cp
, 0);
6226 case OPTION_DWARF_START
:
6229 dwarf_start_die
= strtoul (optarg
, & cp
, 0);
6230 suppress_bfd_header
= 1;
6233 case OPTION_DWARF_CHECK
:
6236 #ifdef ENABLE_LIBCTF
6238 dump_ctf_section_info
= true;
6240 dump_ctf_section_name
= xstrdup (optarg
);
6243 case OPTION_CTF_PARENT
:
6244 dump_ctf_parent_name
= xstrdup (optarg
);
6248 dump_sframe_section_info
= true;
6250 dump_sframe_section_name
= xstrdup (optarg
);
6254 dump_stab_section_info
= true;
6258 dump_section_contents
= true;
6262 dump_reloc_info
= true;
6266 dump_dynamic_reloc_info
= true;
6270 dump_ar_hdrs
= true;
6274 dump_section_headers
= true;
6279 show_version
= true;
6284 if (streq (optarg
, "default") || streq (optarg
, "d"))
6285 unicode_display
= unicode_default
;
6286 else if (streq (optarg
, "locale") || streq (optarg
, "l"))
6287 unicode_display
= unicode_locale
;
6288 else if (streq (optarg
, "escape") || streq (optarg
, "e"))
6289 unicode_display
= unicode_escape
;
6290 else if (streq (optarg
, "invalid") || streq (optarg
, "i"))
6291 unicode_display
= unicode_invalid
;
6292 else if (streq (optarg
, "hex") || streq (optarg
, "x"))
6293 unicode_display
= unicode_hex
;
6294 else if (streq (optarg
, "highlight") || streq (optarg
, "h"))
6295 unicode_display
= unicode_highlight
;
6297 fatal (_("invalid argument to -U/--unicode: %s"), optarg
);
6302 /* No need to set seenflag or to break - usage() does not return. */
6308 if (disassembler_color
== on_if_terminal_output
)
6309 disassembler_color
= isatty (1) ? on
: off
;
6312 print_version ("objdump");
6317 dump_any_debugging
= (dump_debugging
6318 || dump_dwarf_section_info
6320 || with_source_code
);
6323 exit_status
= display_info ();
6327 display_file ("a.out", target
, true);
6329 for (; optind
< argc
;)
6331 display_file (argv
[optind
], target
, optind
== argc
- 1);
6337 free (dump_ctf_section_name
);
6338 free (dump_ctf_parent_name
);
6339 free ((void *) source_comment
);