Recognize the NT_ARM_SYSTEM_CALL register set
[binutils-gdb.git] / binutils / objdump.c
1 /* objdump.c -- dump information about an object file.
2 Copyright (C) 1990-2022 Free Software Foundation, Inc.
3
4 This file is part of GNU Binutils.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21
22 /* Objdump overview.
23
24 Objdump displays information about one or more object files, either on
25 their own, or inside libraries. It is commonly used as a disassembler,
26 but it can also display information about file headers, symbol tables,
27 relocations, debugging directives and more.
28
29 The flow of execution is as follows:
30
31 1. Command line arguments are checked for control switches and the
32 information to be displayed is selected.
33
34 2. Any remaining arguments are assumed to be object files, and they are
35 processed in order by display_bfd(). If the file is an archive each
36 of its elements is processed in turn.
37
38 3. The file's target architecture and binary file format are determined
39 by bfd_check_format(). If they are recognised, then dump_bfd() is
40 called.
41
42 4. dump_bfd() in turn calls separate functions to display the requested
43 item(s) of information(s). For example disassemble_data() is called if
44 a disassembly has been requested.
45
46 When disassembling the code loops through blocks of instructions bounded
47 by symbols, calling disassemble_bytes() on each block. The actual
48 disassembling is done by the libopcodes library, via a function pointer
49 supplied by the disassembler() function. */
50
51 #include "sysdep.h"
52 #include "bfd.h"
53 #include "elf-bfd.h"
54 #include "coff-bfd.h"
55 #include "progress.h"
56 #include "bucomm.h"
57 #include "elfcomm.h"
58 #include "demanguse.h"
59 #include "dwarf.h"
60 #include "ctf-api.h"
61 #include "getopt.h"
62 #include "safe-ctype.h"
63 #include "dis-asm.h"
64 #include "libiberty.h"
65 #include "demangle.h"
66 #include "filenames.h"
67 #include "debug.h"
68 #include "budbg.h"
69 #include "objdump.h"
70
71 #ifdef HAVE_MMAP
72 #include <sys/mman.h>
73 #endif
74
75 /* Internal headers for the ELF .stab-dump code - sorry. */
76 #define BYTES_IN_WORD 32
77 #include "aout/aout64.h"
78
79 /* Exit status. */
80 static int exit_status = 0;
81
82 static char *default_target = NULL; /* Default at runtime. */
83
84 /* The following variables are set based on arguments passed on the
85 command line. */
86 static int show_version = 0; /* Show the version number. */
87 static int dump_section_contents; /* -s */
88 static int dump_section_headers; /* -h */
89 static bool dump_file_header; /* -f */
90 static int dump_symtab; /* -t */
91 static int dump_dynamic_symtab; /* -T */
92 static int dump_reloc_info; /* -r */
93 static int dump_dynamic_reloc_info; /* -R */
94 static int dump_ar_hdrs; /* -a */
95 static int dump_private_headers; /* -p */
96 static char *dump_private_options; /* -P */
97 static int no_addresses; /* --no-addresses */
98 static int prefix_addresses; /* --prefix-addresses */
99 static int with_line_numbers; /* -l */
100 static bool with_source_code; /* -S */
101 static int show_raw_insn; /* --show-raw-insn */
102 static int dump_dwarf_section_info; /* --dwarf */
103 static int dump_stab_section_info; /* --stabs */
104 static int dump_ctf_section_info; /* --ctf */
105 static char *dump_ctf_section_name;
106 static char *dump_ctf_parent_name; /* --ctf-parent */
107 static int do_demangle; /* -C, --demangle */
108 static bool disassemble; /* -d */
109 static bool disassemble_all; /* -D */
110 static int disassemble_zeroes; /* --disassemble-zeroes */
111 static bool formats_info; /* -i */
112 static int wide_output; /* -w */
113 static int insn_width; /* --insn-width */
114 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
115 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
116 static int dump_debugging; /* --debugging */
117 static int dump_debugging_tags; /* --debugging-tags */
118 static int suppress_bfd_header;
119 static int dump_special_syms = 0; /* --special-syms */
120 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
121 static int file_start_context = 0; /* --file-start-context */
122 static bool display_file_offsets; /* -F */
123 static const char *prefix; /* --prefix */
124 static int prefix_strip; /* --prefix-strip */
125 static size_t prefix_length;
126 static bool unwind_inlines; /* --inlines. */
127 static const char * disasm_sym; /* Disassembly start symbol. */
128 static const char * source_comment; /* --source_comment. */
129 static bool visualize_jumps = false; /* --visualize-jumps. */
130 static bool color_output = false; /* --visualize-jumps=color. */
131 static bool extended_color_output = false; /* --visualize-jumps=extended-color. */
132 static int process_links = false; /* --process-links. */
133 static bool disassembler_color = false; /* --disassembler-color=color. */
134 static bool disassembler_extended_color = false; /* --disassembler-color=extended-color. */
135
136 static int dump_any_debugging;
137 static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
138
139 /* This is reset to false each time we enter the disassembler, and set true
140 when the disassembler emits something in the dis_style_comment_start
141 style. Once this is true, all further output on that line is done in
142 the comment style. This only has an effect when disassembler coloring
143 is turned on. */
144 static bool disassembler_in_comment = false;
145
146 /* A structure to record the sections mentioned in -j switches. */
147 struct only
148 {
149 const char *name; /* The name of the section. */
150 bool seen; /* A flag to indicate that the section has been found in one or more input files. */
151 struct only *next; /* Pointer to the next structure in the list. */
152 };
153 /* Pointer to an array of 'only' structures.
154 This pointer is NULL if the -j switch has not been used. */
155 static struct only * only_list = NULL;
156
157 /* Variables for handling include file path table. */
158 static const char **include_paths;
159 static int include_path_count;
160
161 /* Extra info to pass to the section disassembler and address printing
162 function. */
163 struct objdump_disasm_info
164 {
165 bfd *abfd;
166 bool require_sec;
167 disassembler_ftype disassemble_fn;
168 arelent *reloc;
169 const char *symbol;
170 };
171
172 /* Architecture to disassemble for, or default if NULL. */
173 static char *machine = NULL;
174
175 /* Target specific options to the disassembler. */
176 static char *disassembler_options = NULL;
177
178 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
179 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
180
181 /* The symbol table. */
182 static asymbol **syms;
183
184 /* Number of symbols in `syms'. */
185 static long symcount = 0;
186
187 /* The sorted symbol table. */
188 static asymbol **sorted_syms;
189
190 /* Number of symbols in `sorted_syms'. */
191 static long sorted_symcount = 0;
192
193 /* The dynamic symbol table. */
194 static asymbol **dynsyms;
195
196 /* The synthetic symbol table. */
197 static asymbol *synthsyms;
198 static long synthcount = 0;
199
200 /* Number of symbols in `dynsyms'. */
201 static long dynsymcount = 0;
202
203 static bfd_byte *stabs;
204 static bfd_size_type stab_size;
205
206 static bfd_byte *strtab;
207 static bfd_size_type stabstr_size;
208
209 /* Handlers for -P/--private. */
210 static const struct objdump_private_desc * const objdump_private_vectors[] =
211 {
212 OBJDUMP_PRIVATE_VECTORS
213 NULL
214 };
215
216 /* The list of detected jumps inside a function. */
217 static struct jump_info *detected_jumps = NULL;
218
219 typedef enum unicode_display_type
220 {
221 unicode_default = 0,
222 unicode_locale,
223 unicode_escape,
224 unicode_hex,
225 unicode_highlight,
226 unicode_invalid
227 } unicode_display_type;
228
229 static unicode_display_type unicode_display = unicode_default;
230 \f
231 static void usage (FILE *, int) ATTRIBUTE_NORETURN;
232 static void
233 usage (FILE *stream, int status)
234 {
235 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
236 fprintf (stream, _(" Display information from object <file(s)>.\n"));
237 fprintf (stream, _(" At least one of the following switches must be given:\n"));
238 fprintf (stream, _("\
239 -a, --archive-headers Display archive header information\n"));
240 fprintf (stream, _("\
241 -f, --file-headers Display the contents of the overall file header\n"));
242 fprintf (stream, _("\
243 -p, --private-headers Display object format specific file header contents\n"));
244 fprintf (stream, _("\
245 -P, --private=OPT,OPT... Display object format specific contents\n"));
246 fprintf (stream, _("\
247 -h, --[section-]headers Display the contents of the section headers\n"));
248 fprintf (stream, _("\
249 -x, --all-headers Display the contents of all headers\n"));
250 fprintf (stream, _("\
251 -d, --disassemble Display assembler contents of executable sections\n"));
252 fprintf (stream, _("\
253 -D, --disassemble-all Display assembler contents of all sections\n"));
254 fprintf (stream, _("\
255 --disassemble=<sym> Display assembler contents from <sym>\n"));
256 fprintf (stream, _("\
257 -S, --source Intermix source code with disassembly\n"));
258 fprintf (stream, _("\
259 --source-comment[=<txt>] Prefix lines of source code with <txt>\n"));
260 fprintf (stream, _("\
261 -s, --full-contents Display the full contents of all sections requested\n"));
262 fprintf (stream, _("\
263 -g, --debugging Display debug information in object file\n"));
264 fprintf (stream, _("\
265 -e, --debugging-tags Display debug information using ctags style\n"));
266 fprintf (stream, _("\
267 -G, --stabs Display (in raw form) any STABS info in the file\n"));
268 fprintf (stream, _("\
269 -W, --dwarf[a/=abbrev, A/=addr, r/=aranges, c/=cu_index, L/=decodedline,\n\
270 f/=frames, F/=frames-interp, g/=gdb_index, i/=info, o/=loc,\n\
271 m/=macro, p/=pubnames, t/=pubtypes, R/=Ranges, l/=rawline,\n\
272 s/=str, O/=str-offsets, u/=trace_abbrev, T/=trace_aranges,\n\
273 U/=trace_info]\n\
274 Display the contents of DWARF debug sections\n"));
275 fprintf (stream, _("\
276 -Wk,--dwarf=links Display the contents of sections that link to\n\
277 separate debuginfo files\n"));
278 #if DEFAULT_FOR_FOLLOW_LINKS
279 fprintf (stream, _("\
280 -WK,--dwarf=follow-links\n\
281 Follow links to separate debug info files (default)\n"));
282 fprintf (stream, _("\
283 -WN,--dwarf=no-follow-links\n\
284 Do not follow links to separate debug info files\n"));
285 #else
286 fprintf (stream, _("\
287 -WK,--dwarf=follow-links\n\
288 Follow links to separate debug info files\n"));
289 fprintf (stream, _("\
290 -WN,--dwarf=no-follow-links\n\
291 Do not follow links to separate debug info files\n\
292 (default)\n"));
293 #endif
294 #if HAVE_LIBDEBUGINFOD
295 fprintf (stream, _("\
296 -WD --dwarf=use-debuginfod\n\
297 When following links, also query debuginfod servers (default)\n"));
298 fprintf (stream, _("\
299 -WE --dwarf=do-not-use-debuginfod\n\
300 When following links, do not query debuginfod servers\n"));
301 #endif
302 fprintf (stream, _("\
303 -L, --process-links Display the contents of non-debug sections in\n\
304 separate debuginfo files. (Implies -WK)\n"));
305 #ifdef ENABLE_LIBCTF
306 fprintf (stream, _("\
307 --ctf[=SECTION] Display CTF info from SECTION, (default `.ctf')\n"));
308 #endif
309 fprintf (stream, _("\
310 -t, --syms Display the contents of the symbol table(s)\n"));
311 fprintf (stream, _("\
312 -T, --dynamic-syms Display the contents of the dynamic symbol table\n"));
313 fprintf (stream, _("\
314 -r, --reloc Display the relocation entries in the file\n"));
315 fprintf (stream, _("\
316 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n"));
317 fprintf (stream, _("\
318 @<file> Read options from <file>\n"));
319 fprintf (stream, _("\
320 -v, --version Display this program's version number\n"));
321 fprintf (stream, _("\
322 -i, --info List object formats and architectures supported\n"));
323 fprintf (stream, _("\
324 -H, --help Display this information\n"));
325
326 if (status != 2)
327 {
328 const struct objdump_private_desc * const *desc;
329
330 fprintf (stream, _("\n The following switches are optional:\n"));
331 fprintf (stream, _("\
332 -b, --target=BFDNAME Specify the target object format as BFDNAME\n"));
333 fprintf (stream, _("\
334 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n"));
335 fprintf (stream, _("\
336 -j, --section=NAME Only display information for section NAME\n"));
337 fprintf (stream, _("\
338 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n"));
339 fprintf (stream, _("\
340 -EB --endian=big Assume big endian format when disassembling\n"));
341 fprintf (stream, _("\
342 -EL --endian=little Assume little endian format when disassembling\n"));
343 fprintf (stream, _("\
344 --file-start-context Include context from start of file (with -S)\n"));
345 fprintf (stream, _("\
346 -I, --include=DIR Add DIR to search list for source files\n"));
347 fprintf (stream, _("\
348 -l, --line-numbers Include line numbers and filenames in output\n"));
349 fprintf (stream, _("\
350 -F, --file-offsets Include file offsets when displaying information\n"));
351 fprintf (stream, _("\
352 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n"));
353 display_demangler_styles (stream, _("\
354 STYLE can be "));
355 fprintf (stream, _("\
356 --recurse-limit Enable a limit on recursion whilst demangling\n\
357 (default)\n"));
358 fprintf (stream, _("\
359 --no-recurse-limit Disable a limit on recursion whilst demangling\n"));
360 fprintf (stream, _("\
361 -w, --wide Format output for more than 80 columns\n"));
362 fprintf (stream, _("\
363 -U[d|l|i|x|e|h] Controls the display of UTF-8 unicode characters\n\
364 --unicode=[default|locale|invalid|hex|escape|highlight]\n"));
365 fprintf (stream, _("\
366 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n"));
367 fprintf (stream, _("\
368 --start-address=ADDR Only process data whose address is >= ADDR\n"));
369 fprintf (stream, _("\
370 --stop-address=ADDR Only process data whose address is < ADDR\n"));
371 fprintf (stream, _("\
372 --no-addresses Do not print address alongside disassembly\n"));
373 fprintf (stream, _("\
374 --prefix-addresses Print complete address alongside disassembly\n"));
375 fprintf (stream, _("\
376 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n"));
377 fprintf (stream, _("\
378 --insn-width=WIDTH Display WIDTH bytes on a single line for -d\n"));
379 fprintf (stream, _("\
380 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n"));
381 fprintf (stream, _("\
382 --special-syms Include special symbols in symbol dumps\n"));
383 fprintf (stream, _("\
384 --inlines Print all inlines for source line (with -l)\n"));
385 fprintf (stream, _("\
386 --prefix=PREFIX Add PREFIX to absolute paths for -S\n"));
387 fprintf (stream, _("\
388 --prefix-strip=LEVEL Strip initial directory names for -S\n"));
389 fprintf (stream, _("\
390 --dwarf-depth=N Do not display DIEs at depth N or greater\n"));
391 fprintf (stream, _("\
392 --dwarf-start=N Display DIEs starting at offset N\n"));
393 fprintf (stream, _("\
394 --dwarf-check Make additional dwarf consistency checks.\n"));
395 #ifdef ENABLE_LIBCTF
396 fprintf (stream, _("\
397 --ctf-parent=NAME Use CTF archive member NAME as the CTF parent\n"));
398 #endif
399 fprintf (stream, _("\
400 --visualize-jumps Visualize jumps by drawing ASCII art lines\n"));
401 fprintf (stream, _("\
402 --visualize-jumps=color Use colors in the ASCII art\n"));
403 fprintf (stream, _("\
404 --visualize-jumps=extended-color\n\
405 Use extended 8-bit color codes\n"));
406 fprintf (stream, _("\
407 --visualize-jumps=off Disable jump visualization\n\n"));
408 fprintf (stream, _("\
409 --disassembler-color=off Disable disassembler color output.\n\n"));
410 fprintf (stream, _("\
411 --disassembler-color=color Use basic colors in disassembler output.\n\n"));
412
413 list_supported_targets (program_name, stream);
414 list_supported_architectures (program_name, stream);
415
416 disassembler_usage (stream);
417
418 if (objdump_private_vectors[0] != NULL)
419 {
420 fprintf (stream,
421 _("\nOptions supported for -P/--private switch:\n"));
422 for (desc = objdump_private_vectors; *desc != NULL; desc++)
423 (*desc)->help (stream);
424 }
425 }
426 if (REPORT_BUGS_TO[0] && status == 0)
427 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
428 exit (status);
429 }
430
431 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
432 enum option_values
433 {
434 OPTION_ENDIAN=150,
435 OPTION_START_ADDRESS,
436 OPTION_STOP_ADDRESS,
437 OPTION_DWARF,
438 OPTION_PREFIX,
439 OPTION_PREFIX_STRIP,
440 OPTION_INSN_WIDTH,
441 OPTION_ADJUST_VMA,
442 OPTION_DWARF_DEPTH,
443 OPTION_DWARF_CHECK,
444 OPTION_DWARF_START,
445 OPTION_RECURSE_LIMIT,
446 OPTION_NO_RECURSE_LIMIT,
447 OPTION_INLINES,
448 OPTION_SOURCE_COMMENT,
449 #ifdef ENABLE_LIBCTF
450 OPTION_CTF,
451 OPTION_CTF_PARENT,
452 #endif
453 OPTION_VISUALIZE_JUMPS,
454 OPTION_DISASSEMBLER_COLOR
455 };
456
457 static struct option long_options[]=
458 {
459 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
460 {"all-headers", no_argument, NULL, 'x'},
461 {"architecture", required_argument, NULL, 'm'},
462 {"archive-headers", no_argument, NULL, 'a'},
463 #ifdef ENABLE_LIBCTF
464 {"ctf", optional_argument, NULL, OPTION_CTF},
465 {"ctf-parent", required_argument, NULL, OPTION_CTF_PARENT},
466 #endif
467 {"debugging", no_argument, NULL, 'g'},
468 {"debugging-tags", no_argument, NULL, 'e'},
469 {"demangle", optional_argument, NULL, 'C'},
470 {"disassemble", optional_argument, NULL, 'd'},
471 {"disassemble-all", no_argument, NULL, 'D'},
472 {"disassemble-zeroes", no_argument, NULL, 'z'},
473 {"disassembler-options", required_argument, NULL, 'M'},
474 {"dwarf", optional_argument, NULL, OPTION_DWARF},
475 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
476 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
477 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
478 {"dynamic-reloc", no_argument, NULL, 'R'},
479 {"dynamic-syms", no_argument, NULL, 'T'},
480 {"endian", required_argument, NULL, OPTION_ENDIAN},
481 {"file-headers", no_argument, NULL, 'f'},
482 {"file-offsets", no_argument, NULL, 'F'},
483 {"file-start-context", no_argument, &file_start_context, 1},
484 {"full-contents", no_argument, NULL, 's'},
485 {"headers", no_argument, NULL, 'h'},
486 {"help", no_argument, NULL, 'H'},
487 {"include", required_argument, NULL, 'I'},
488 {"info", no_argument, NULL, 'i'},
489 {"inlines", no_argument, 0, OPTION_INLINES},
490 {"insn-width", required_argument, NULL, OPTION_INSN_WIDTH},
491 {"line-numbers", no_argument, NULL, 'l'},
492 {"no-addresses", no_argument, &no_addresses, 1},
493 {"no-recurse-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
494 {"no-recursion-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
495 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
496 {"prefix", required_argument, NULL, OPTION_PREFIX},
497 {"prefix-addresses", no_argument, &prefix_addresses, 1},
498 {"prefix-strip", required_argument, NULL, OPTION_PREFIX_STRIP},
499 {"private", required_argument, NULL, 'P'},
500 {"private-headers", no_argument, NULL, 'p'},
501 {"process-links", no_argument, &process_links, true},
502 {"recurse-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
503 {"recursion-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
504 {"reloc", no_argument, NULL, 'r'},
505 {"section", required_argument, NULL, 'j'},
506 {"section-headers", no_argument, NULL, 'h'},
507 {"show-raw-insn", no_argument, &show_raw_insn, 1},
508 {"source", no_argument, NULL, 'S'},
509 {"source-comment", optional_argument, NULL, OPTION_SOURCE_COMMENT},
510 {"special-syms", no_argument, &dump_special_syms, 1},
511 {"stabs", no_argument, NULL, 'G'},
512 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
513 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
514 {"syms", no_argument, NULL, 't'},
515 {"target", required_argument, NULL, 'b'},
516 {"unicode", required_argument, NULL, 'U'},
517 {"version", no_argument, NULL, 'V'},
518 {"visualize-jumps", optional_argument, 0, OPTION_VISUALIZE_JUMPS},
519 {"wide", no_argument, NULL, 'w'},
520 {"disassembler-color", required_argument, NULL, OPTION_DISASSEMBLER_COLOR},
521 {NULL, no_argument, NULL, 0}
522 };
523 \f
524 static void
525 nonfatal (const char *msg)
526 {
527 bfd_nonfatal (msg);
528 exit_status = 1;
529 }
530
531 /* Convert a potential UTF-8 encoded sequence in IN into characters in OUT.
532 The conversion format is controlled by the unicode_display variable.
533 Returns the number of characters added to OUT.
534 Returns the number of bytes consumed from IN in CONSUMED.
535 Always consumes at least one byte and displays at least one character. */
536
537 static unsigned int
538 display_utf8 (const unsigned char * in, char * out, unsigned int * consumed)
539 {
540 char * orig_out = out;
541 unsigned int nchars = 0;
542 unsigned int j;
543
544 if (unicode_display == unicode_default)
545 goto invalid;
546
547 if (in[0] < 0xc0)
548 goto invalid;
549
550 if ((in[1] & 0xc0) != 0x80)
551 goto invalid;
552
553 if ((in[0] & 0x20) == 0)
554 {
555 nchars = 2;
556 goto valid;
557 }
558
559 if ((in[2] & 0xc0) != 0x80)
560 goto invalid;
561
562 if ((in[0] & 0x10) == 0)
563 {
564 nchars = 3;
565 goto valid;
566 }
567
568 if ((in[3] & 0xc0) != 0x80)
569 goto invalid;
570
571 nchars = 4;
572
573 valid:
574 switch (unicode_display)
575 {
576 case unicode_locale:
577 /* Copy the bytes into the output buffer as is. */
578 memcpy (out, in, nchars);
579 out += nchars;
580 break;
581
582 case unicode_invalid:
583 case unicode_hex:
584 out += sprintf (out, "%c", unicode_display == unicode_hex ? '<' : '{');
585 out += sprintf (out, "0x");
586 for (j = 0; j < nchars; j++)
587 out += sprintf (out, "%02x", in [j]);
588 out += sprintf (out, "%c", unicode_display == unicode_hex ? '>' : '}');
589 break;
590
591 case unicode_highlight:
592 if (isatty (1))
593 out += sprintf (out, "\x1B[31;47m"); /* Red. */
594 /* Fall through. */
595 case unicode_escape:
596 switch (nchars)
597 {
598 case 2:
599 out += sprintf (out, "\\u%02x%02x",
600 ((in[0] & 0x1c) >> 2),
601 ((in[0] & 0x03) << 6) | (in[1] & 0x3f));
602 break;
603
604 case 3:
605 out += sprintf (out, "\\u%02x%02x",
606 ((in[0] & 0x0f) << 4) | ((in[1] & 0x3c) >> 2),
607 ((in[1] & 0x03) << 6) | ((in[2] & 0x3f)));
608 break;
609
610 case 4:
611 out += sprintf (out, "\\u%02x%02x%02x",
612 ((in[0] & 0x07) << 6) | ((in[1] & 0x3c) >> 2),
613 ((in[1] & 0x03) << 6) | ((in[2] & 0x3c) >> 2),
614 ((in[2] & 0x03) << 6) | ((in[3] & 0x3f)));
615 break;
616 default:
617 /* URG. */
618 break;
619 }
620
621 if (unicode_display == unicode_highlight && isatty (1))
622 out += sprintf (out, "\033[0m"); /* Default colour. */
623 break;
624
625 default:
626 /* URG */
627 break;
628 }
629
630 * consumed = nchars;
631 return out - orig_out;
632
633 invalid:
634 /* Not a valid UTF-8 sequence. */
635 *out = *in;
636 * consumed = 1;
637 return 1;
638 }
639
640 /* Returns a version of IN with any control characters
641 replaced by escape sequences. Uses a static buffer
642 if necessary.
643
644 If unicode display is enabled, then also handles the
645 conversion of unicode characters. */
646
647 static const char *
648 sanitize_string (const char * in)
649 {
650 static char * buffer = NULL;
651 static size_t buffer_len = 0;
652 const char * original = in;
653 char * out;
654
655 /* Paranoia. */
656 if (in == NULL)
657 return "";
658
659 /* See if any conversion is necessary. In the majority
660 of cases it will not be needed. */
661 do
662 {
663 unsigned char c = *in++;
664
665 if (c == 0)
666 return original;
667
668 if (ISCNTRL (c))
669 break;
670
671 if (unicode_display != unicode_default && c >= 0xc0)
672 break;
673 }
674 while (1);
675
676 /* Copy the input, translating as needed. */
677 in = original;
678 if (buffer_len < (strlen (in) * 9))
679 {
680 free ((void *) buffer);
681 buffer_len = strlen (in) * 9;
682 buffer = xmalloc (buffer_len + 1);
683 }
684
685 out = buffer;
686 do
687 {
688 unsigned char c = *in++;
689
690 if (c == 0)
691 break;
692
693 if (ISCNTRL (c))
694 {
695 *out++ = '^';
696 *out++ = c + 0x40;
697 }
698 else if (unicode_display != unicode_default && c >= 0xc0)
699 {
700 unsigned int num_consumed;
701
702 out += display_utf8 ((const unsigned char *)(in - 1), out, & num_consumed);
703 in += num_consumed - 1;
704 }
705 else
706 *out++ = c;
707 }
708 while (1);
709
710 *out = 0;
711 return buffer;
712 }
713
714 \f
715 /* Returns TRUE if the specified section should be dumped. */
716
717 static bool
718 process_section_p (asection * section)
719 {
720 struct only * only;
721
722 if (only_list == NULL)
723 return true;
724
725 for (only = only_list; only; only = only->next)
726 if (strcmp (only->name, section->name) == 0)
727 {
728 only->seen = true;
729 return true;
730 }
731
732 return false;
733 }
734
735 /* Add an entry to the 'only' list. */
736
737 static void
738 add_only (char * name)
739 {
740 struct only * only;
741
742 /* First check to make sure that we do not
743 already have an entry for this name. */
744 for (only = only_list; only; only = only->next)
745 if (strcmp (only->name, name) == 0)
746 return;
747
748 only = xmalloc (sizeof * only);
749 only->name = name;
750 only->seen = false;
751 only->next = only_list;
752 only_list = only;
753 }
754
755 /* Release the memory used by the 'only' list.
756 PR 11225: Issue a warning message for unseen sections.
757 Only do this if none of the sections were seen. This is mainly to support
758 tools like the GAS testsuite where an object file is dumped with a list of
759 generic section names known to be present in a range of different file
760 formats. */
761
762 static void
763 free_only_list (void)
764 {
765 bool at_least_one_seen = false;
766 struct only * only;
767 struct only * next;
768
769 if (only_list == NULL)
770 return;
771
772 for (only = only_list; only; only = only->next)
773 if (only->seen)
774 {
775 at_least_one_seen = true;
776 break;
777 }
778
779 for (only = only_list; only; only = next)
780 {
781 if (! at_least_one_seen)
782 {
783 non_fatal (_("section '%s' mentioned in a -j option, "
784 "but not found in any input file"),
785 only->name);
786 exit_status = 1;
787 }
788 next = only->next;
789 free (only);
790 }
791 }
792
793 \f
794 static void
795 dump_section_header (bfd *abfd, asection *section, void *data)
796 {
797 char *comma = "";
798 unsigned int opb = bfd_octets_per_byte (abfd, section);
799 int longest_section_name = *((int *) data);
800
801 /* Ignore linker created section. See elfNN_ia64_object_p in
802 bfd/elfxx-ia64.c. */
803 if (section->flags & SEC_LINKER_CREATED)
804 return;
805
806 /* PR 10413: Skip sections that we are ignoring. */
807 if (! process_section_p (section))
808 return;
809
810 printf ("%3d %-*s %08lx ", section->index, longest_section_name,
811 sanitize_string (bfd_section_name (section)),
812 (unsigned long) bfd_section_size (section) / opb);
813 bfd_printf_vma (abfd, bfd_section_vma (section));
814 printf (" ");
815 bfd_printf_vma (abfd, section->lma);
816 printf (" %08lx 2**%u", (unsigned long) section->filepos,
817 bfd_section_alignment (section));
818 if (! wide_output)
819 printf ("\n ");
820 printf (" ");
821
822 #define PF(x, y) \
823 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
824
825 PF (SEC_HAS_CONTENTS, "CONTENTS");
826 PF (SEC_ALLOC, "ALLOC");
827 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
828 PF (SEC_LOAD, "LOAD");
829 PF (SEC_RELOC, "RELOC");
830 PF (SEC_READONLY, "READONLY");
831 PF (SEC_CODE, "CODE");
832 PF (SEC_DATA, "DATA");
833 PF (SEC_ROM, "ROM");
834 PF (SEC_DEBUGGING, "DEBUGGING");
835 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
836 PF (SEC_EXCLUDE, "EXCLUDE");
837 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
838 if (bfd_get_arch (abfd) == bfd_arch_tic54x)
839 {
840 PF (SEC_TIC54X_BLOCK, "BLOCK");
841 PF (SEC_TIC54X_CLINK, "CLINK");
842 }
843 PF (SEC_SMALL_DATA, "SMALL_DATA");
844 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
845 {
846 PF (SEC_COFF_SHARED, "SHARED");
847 PF (SEC_COFF_NOREAD, "NOREAD");
848 }
849 else if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
850 {
851 PF (SEC_ELF_OCTETS, "OCTETS");
852 PF (SEC_ELF_PURECODE, "PURECODE");
853 }
854 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
855 PF (SEC_GROUP, "GROUP");
856 if (bfd_get_arch (abfd) == bfd_arch_mep)
857 {
858 PF (SEC_MEP_VLIW, "VLIW");
859 }
860
861 if ((section->flags & SEC_LINK_ONCE) != 0)
862 {
863 const char *ls;
864 struct coff_comdat_info *comdat;
865
866 switch (section->flags & SEC_LINK_DUPLICATES)
867 {
868 default:
869 abort ();
870 case SEC_LINK_DUPLICATES_DISCARD:
871 ls = "LINK_ONCE_DISCARD";
872 break;
873 case SEC_LINK_DUPLICATES_ONE_ONLY:
874 ls = "LINK_ONCE_ONE_ONLY";
875 break;
876 case SEC_LINK_DUPLICATES_SAME_SIZE:
877 ls = "LINK_ONCE_SAME_SIZE";
878 break;
879 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
880 ls = "LINK_ONCE_SAME_CONTENTS";
881 break;
882 }
883 printf ("%s%s", comma, ls);
884
885 comdat = bfd_coff_get_comdat_section (abfd, section);
886 if (comdat != NULL)
887 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
888
889 comma = ", ";
890 }
891
892 printf ("\n");
893 #undef PF
894 }
895
896 /* Called on each SECTION in ABFD, update the int variable pointed to by
897 DATA which contains the string length of the longest section name. */
898
899 static void
900 find_longest_section_name (bfd *abfd ATTRIBUTE_UNUSED,
901 asection *section, void *data)
902 {
903 int *longest_so_far = (int *) data;
904 const char *name;
905 int len;
906
907 /* Ignore linker created section. */
908 if (section->flags & SEC_LINKER_CREATED)
909 return;
910
911 /* Skip sections that we are ignoring. */
912 if (! process_section_p (section))
913 return;
914
915 name = bfd_section_name (section);
916 len = (int) strlen (name);
917 if (len > *longest_so_far)
918 *longest_so_far = len;
919 }
920
921 static void
922 dump_headers (bfd *abfd)
923 {
924 /* The default width of 13 is just an arbitrary choice. */
925 int max_section_name_length = 13;
926 int bfd_vma_width;
927
928 #ifndef BFD64
929 bfd_vma_width = 10;
930 #else
931 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
932 if (bfd_get_arch_size (abfd) == 32)
933 bfd_vma_width = 10;
934 else
935 bfd_vma_width = 18;
936 #endif
937
938 printf (_("Sections:\n"));
939
940 if (wide_output)
941 bfd_map_over_sections (abfd, find_longest_section_name,
942 &max_section_name_length);
943
944 printf (_("Idx %-*s Size %-*s%-*sFile off Algn"),
945 max_section_name_length, "Name",
946 bfd_vma_width, "VMA",
947 bfd_vma_width, "LMA");
948
949 if (wide_output)
950 printf (_(" Flags"));
951 printf ("\n");
952
953 bfd_map_over_sections (abfd, dump_section_header,
954 &max_section_name_length);
955 }
956 \f
957 static asymbol **
958 slurp_symtab (bfd *abfd)
959 {
960 asymbol **sy = NULL;
961 long storage;
962
963 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
964 {
965 symcount = 0;
966 return NULL;
967 }
968
969 storage = bfd_get_symtab_upper_bound (abfd);
970 if (storage < 0)
971 {
972 non_fatal (_("failed to read symbol table from: %s"), bfd_get_filename (abfd));
973 bfd_fatal (_("error message was"));
974 }
975
976 if (storage)
977 {
978 off_t filesize = bfd_get_file_size (abfd);
979
980 /* qv PR 24707. */
981 if (filesize > 0
982 && filesize < storage
983 /* The MMO file format supports its own special compression
984 technique, so its sections can be larger than the file size. */
985 && bfd_get_flavour (abfd) != bfd_target_mmo_flavour)
986 {
987 bfd_nonfatal_message (bfd_get_filename (abfd), abfd, NULL,
988 _("error: symbol table size (%#lx) "
989 "is larger than filesize (%#lx)"),
990 storage, (long) filesize);
991 exit_status = 1;
992 symcount = 0;
993 return NULL;
994 }
995
996 sy = (asymbol **) xmalloc (storage);
997 }
998
999 symcount = bfd_canonicalize_symtab (abfd, sy);
1000 if (symcount < 0)
1001 bfd_fatal (bfd_get_filename (abfd));
1002 return sy;
1003 }
1004
1005 /* Read in the dynamic symbols. */
1006
1007 static asymbol **
1008 slurp_dynamic_symtab (bfd *abfd)
1009 {
1010 asymbol **sy = NULL;
1011 long storage;
1012
1013 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
1014 if (storage < 0)
1015 {
1016 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
1017 {
1018 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
1019 exit_status = 1;
1020 dynsymcount = 0;
1021 return NULL;
1022 }
1023
1024 bfd_fatal (bfd_get_filename (abfd));
1025 }
1026
1027 if (storage)
1028 sy = (asymbol **) xmalloc (storage);
1029
1030 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
1031 if (dynsymcount < 0)
1032 bfd_fatal (bfd_get_filename (abfd));
1033 return sy;
1034 }
1035
1036 /* Some symbol names are significant and should be kept in the
1037 table of sorted symbol names, even if they are marked as
1038 debugging/section symbols. */
1039
1040 static bool
1041 is_significant_symbol_name (const char * name)
1042 {
1043 return startswith (name, ".plt") || startswith (name, ".got");
1044 }
1045
1046 /* Filter out (in place) symbols that are useless for disassembly.
1047 COUNT is the number of elements in SYMBOLS.
1048 Return the number of useful symbols. */
1049
1050 static long
1051 remove_useless_symbols (asymbol **symbols, long count)
1052 {
1053 asymbol **in_ptr = symbols, **out_ptr = symbols;
1054
1055 while (--count >= 0)
1056 {
1057 asymbol *sym = *in_ptr++;
1058
1059 if (sym->name == NULL || sym->name[0] == '\0')
1060 continue;
1061 if ((sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
1062 && ! is_significant_symbol_name (sym->name))
1063 continue;
1064 if (bfd_is_und_section (sym->section)
1065 || bfd_is_com_section (sym->section))
1066 continue;
1067
1068 *out_ptr++ = sym;
1069 }
1070 return out_ptr - symbols;
1071 }
1072
1073 static const asection *compare_section;
1074
1075 /* Sort symbols into value order. */
1076
1077 static int
1078 compare_symbols (const void *ap, const void *bp)
1079 {
1080 const asymbol *a = * (const asymbol **) ap;
1081 const asymbol *b = * (const asymbol **) bp;
1082 const char *an;
1083 const char *bn;
1084 size_t anl;
1085 size_t bnl;
1086 bool as, af, bs, bf;
1087 flagword aflags;
1088 flagword bflags;
1089
1090 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
1091 return 1;
1092 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
1093 return -1;
1094
1095 /* Prefer symbols from the section currently being disassembled.
1096 Don't sort symbols from other sections by section, since there
1097 isn't much reason to prefer one section over another otherwise.
1098 See sym_ok comment for why we compare by section name. */
1099 as = strcmp (compare_section->name, a->section->name) == 0;
1100 bs = strcmp (compare_section->name, b->section->name) == 0;
1101 if (as && !bs)
1102 return -1;
1103 if (!as && bs)
1104 return 1;
1105
1106 an = bfd_asymbol_name (a);
1107 bn = bfd_asymbol_name (b);
1108 anl = strlen (an);
1109 bnl = strlen (bn);
1110
1111 /* The symbols gnu_compiled and gcc2_compiled convey no real
1112 information, so put them after other symbols with the same value. */
1113 af = (strstr (an, "gnu_compiled") != NULL
1114 || strstr (an, "gcc2_compiled") != NULL);
1115 bf = (strstr (bn, "gnu_compiled") != NULL
1116 || strstr (bn, "gcc2_compiled") != NULL);
1117
1118 if (af && ! bf)
1119 return 1;
1120 if (! af && bf)
1121 return -1;
1122
1123 /* We use a heuristic for the file name, to try to sort it after
1124 more useful symbols. It may not work on non Unix systems, but it
1125 doesn't really matter; the only difference is precisely which
1126 symbol names get printed. */
1127
1128 #define file_symbol(s, sn, snl) \
1129 (((s)->flags & BSF_FILE) != 0 \
1130 || ((snl) > 2 \
1131 && (sn)[(snl) - 2] == '.' \
1132 && ((sn)[(snl) - 1] == 'o' \
1133 || (sn)[(snl) - 1] == 'a')))
1134
1135 af = file_symbol (a, an, anl);
1136 bf = file_symbol (b, bn, bnl);
1137
1138 if (af && ! bf)
1139 return 1;
1140 if (! af && bf)
1141 return -1;
1142
1143 /* Sort function and object symbols before global symbols before
1144 local symbols before section symbols before debugging symbols. */
1145
1146 aflags = a->flags;
1147 bflags = b->flags;
1148
1149 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
1150 {
1151 if ((aflags & BSF_DEBUGGING) != 0)
1152 return 1;
1153 else
1154 return -1;
1155 }
1156 if ((aflags & BSF_SECTION_SYM) != (bflags & BSF_SECTION_SYM))
1157 {
1158 if ((aflags & BSF_SECTION_SYM) != 0)
1159 return 1;
1160 else
1161 return -1;
1162 }
1163 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
1164 {
1165 if ((aflags & BSF_FUNCTION) != 0)
1166 return -1;
1167 else
1168 return 1;
1169 }
1170 if ((aflags & BSF_OBJECT) != (bflags & BSF_OBJECT))
1171 {
1172 if ((aflags & BSF_OBJECT) != 0)
1173 return -1;
1174 else
1175 return 1;
1176 }
1177 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
1178 {
1179 if ((aflags & BSF_LOCAL) != 0)
1180 return 1;
1181 else
1182 return -1;
1183 }
1184 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
1185 {
1186 if ((aflags & BSF_GLOBAL) != 0)
1187 return -1;
1188 else
1189 return 1;
1190 }
1191
1192 if (bfd_get_flavour (bfd_asymbol_bfd (a)) == bfd_target_elf_flavour
1193 && bfd_get_flavour (bfd_asymbol_bfd (b)) == bfd_target_elf_flavour)
1194 {
1195 bfd_vma asz, bsz;
1196
1197 asz = 0;
1198 if ((a->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
1199 asz = ((elf_symbol_type *) a)->internal_elf_sym.st_size;
1200 bsz = 0;
1201 if ((b->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
1202 bsz = ((elf_symbol_type *) b)->internal_elf_sym.st_size;
1203 if (asz != bsz)
1204 return asz > bsz ? -1 : 1;
1205 }
1206
1207 /* Symbols that start with '.' might be section names, so sort them
1208 after symbols that don't start with '.'. */
1209 if (an[0] == '.' && bn[0] != '.')
1210 return 1;
1211 if (an[0] != '.' && bn[0] == '.')
1212 return -1;
1213
1214 /* Finally, if we can't distinguish them in any other way, try to
1215 get consistent results by sorting the symbols by name. */
1216 return strcmp (an, bn);
1217 }
1218
1219 /* Sort relocs into address order. */
1220
1221 static int
1222 compare_relocs (const void *ap, const void *bp)
1223 {
1224 const arelent *a = * (const arelent **) ap;
1225 const arelent *b = * (const arelent **) bp;
1226
1227 if (a->address > b->address)
1228 return 1;
1229 else if (a->address < b->address)
1230 return -1;
1231
1232 /* So that associated relocations tied to the same address show up
1233 in the correct order, we don't do any further sorting. */
1234 if (a > b)
1235 return 1;
1236 else if (a < b)
1237 return -1;
1238 else
1239 return 0;
1240 }
1241
1242 /* Print an address (VMA) to the output stream in INFO.
1243 If SKIP_ZEROES is TRUE, omit leading zeroes. */
1244
1245 static void
1246 objdump_print_value (bfd_vma vma, struct disassemble_info *inf,
1247 bool skip_zeroes)
1248 {
1249 char buf[30];
1250 char *p;
1251 struct objdump_disasm_info *aux;
1252
1253 aux = (struct objdump_disasm_info *) inf->application_data;
1254 bfd_sprintf_vma (aux->abfd, buf, vma);
1255 if (! skip_zeroes)
1256 p = buf;
1257 else
1258 {
1259 for (p = buf; *p == '0'; ++p)
1260 ;
1261 if (*p == '\0')
1262 --p;
1263 }
1264 (*inf->fprintf_styled_func) (inf->stream, dis_style_address, "%s", p);
1265 }
1266
1267 /* Print the name of a symbol. */
1268
1269 static void
1270 objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
1271 asymbol *sym)
1272 {
1273 char *alloc;
1274 const char *name, *version_string = NULL;
1275 bool hidden = false;
1276
1277 alloc = NULL;
1278 name = bfd_asymbol_name (sym);
1279 if (do_demangle && name[0] != '\0')
1280 {
1281 /* Demangle the name. */
1282 alloc = bfd_demangle (abfd, name, demangle_flags);
1283 if (alloc != NULL)
1284 name = alloc;
1285 }
1286
1287 if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
1288 version_string = bfd_get_symbol_version_string (abfd, sym, true,
1289 &hidden);
1290
1291 if (bfd_is_und_section (bfd_asymbol_section (sym)))
1292 hidden = true;
1293
1294 name = sanitize_string (name);
1295
1296 if (inf != NULL)
1297 {
1298 (*inf->fprintf_styled_func) (inf->stream, dis_style_symbol, "%s", name);
1299 if (version_string && *version_string != '\0')
1300 (*inf->fprintf_styled_func) (inf->stream, dis_style_symbol,
1301 hidden ? "@%s" : "@@%s",
1302 version_string);
1303 }
1304 else
1305 {
1306 printf ("%s", name);
1307 if (version_string && *version_string != '\0')
1308 printf (hidden ? "@%s" : "@@%s", version_string);
1309 }
1310
1311 if (alloc != NULL)
1312 free (alloc);
1313 }
1314
1315 static inline bool
1316 sym_ok (bool want_section,
1317 bfd *abfd ATTRIBUTE_UNUSED,
1318 long place,
1319 asection *sec,
1320 struct disassemble_info *inf)
1321 {
1322 if (want_section)
1323 {
1324 /* NB: An object file can have different sections with the same
1325 section name. Compare compare section pointers if they have
1326 the same owner. */
1327 if (sorted_syms[place]->section->owner == sec->owner
1328 && sorted_syms[place]->section != sec)
1329 return false;
1330
1331 /* Note - we cannot just compare section pointers because they could
1332 be different, but the same... Ie the symbol that we are trying to
1333 find could have come from a separate debug info file. Under such
1334 circumstances the symbol will be associated with a section in the
1335 debug info file, whilst the section we want is in a normal file.
1336 So the section pointers will be different, but the section names
1337 will be the same. */
1338 if (strcmp (bfd_section_name (sorted_syms[place]->section),
1339 bfd_section_name (sec)) != 0)
1340 return false;
1341 }
1342
1343 return inf->symbol_is_valid (sorted_syms[place], inf);
1344 }
1345
1346 /* Locate a symbol given a bfd and a section (from INFO->application_data),
1347 and a VMA. If INFO->application_data->require_sec is TRUE, then always
1348 require the symbol to be in the section. Returns NULL if there is no
1349 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
1350 of the symbol in sorted_syms. */
1351
1352 static asymbol *
1353 find_symbol_for_address (bfd_vma vma,
1354 struct disassemble_info *inf,
1355 long *place)
1356 {
1357 /* @@ Would it speed things up to cache the last two symbols returned,
1358 and maybe their address ranges? For many processors, only one memory
1359 operand can be present at a time, so the 2-entry cache wouldn't be
1360 constantly churned by code doing heavy memory accesses. */
1361
1362 /* Indices in `sorted_syms'. */
1363 long min = 0;
1364 long max_count = sorted_symcount;
1365 long thisplace;
1366 struct objdump_disasm_info *aux;
1367 bfd *abfd;
1368 asection *sec;
1369 unsigned int opb;
1370 bool want_section;
1371 long rel_count;
1372
1373 if (sorted_symcount < 1)
1374 return NULL;
1375
1376 aux = (struct objdump_disasm_info *) inf->application_data;
1377 abfd = aux->abfd;
1378 sec = inf->section;
1379 opb = inf->octets_per_byte;
1380
1381 /* Perform a binary search looking for the closest symbol to the
1382 required value. We are searching the range (min, max_count]. */
1383 while (min + 1 < max_count)
1384 {
1385 asymbol *sym;
1386
1387 thisplace = (max_count + min) / 2;
1388 sym = sorted_syms[thisplace];
1389
1390 if (bfd_asymbol_value (sym) > vma)
1391 max_count = thisplace;
1392 else if (bfd_asymbol_value (sym) < vma)
1393 min = thisplace;
1394 else
1395 {
1396 min = thisplace;
1397 break;
1398 }
1399 }
1400
1401 /* The symbol we want is now in min, the low end of the range we
1402 were searching. If there are several symbols with the same
1403 value, we want the first one. */
1404 thisplace = min;
1405 while (thisplace > 0
1406 && (bfd_asymbol_value (sorted_syms[thisplace])
1407 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
1408 --thisplace;
1409
1410 /* Prefer a symbol in the current section if we have multple symbols
1411 with the same value, as can occur with overlays or zero size
1412 sections. */
1413 min = thisplace;
1414 while (min < max_count
1415 && (bfd_asymbol_value (sorted_syms[min])
1416 == bfd_asymbol_value (sorted_syms[thisplace])))
1417 {
1418 if (sym_ok (true, abfd, min, sec, inf))
1419 {
1420 thisplace = min;
1421
1422 if (place != NULL)
1423 *place = thisplace;
1424
1425 return sorted_syms[thisplace];
1426 }
1427 ++min;
1428 }
1429
1430 /* If the file is relocatable, and the symbol could be from this
1431 section, prefer a symbol from this section over symbols from
1432 others, even if the other symbol's value might be closer.
1433
1434 Note that this may be wrong for some symbol references if the
1435 sections have overlapping memory ranges, but in that case there's
1436 no way to tell what's desired without looking at the relocation
1437 table.
1438
1439 Also give the target a chance to reject symbols. */
1440 want_section = (aux->require_sec
1441 || ((abfd->flags & HAS_RELOC) != 0
1442 && vma >= bfd_section_vma (sec)
1443 && vma < (bfd_section_vma (sec)
1444 + bfd_section_size (sec) / opb)));
1445
1446 if (! sym_ok (want_section, abfd, thisplace, sec, inf))
1447 {
1448 long i;
1449 long newplace = sorted_symcount;
1450
1451 for (i = min - 1; i >= 0; i--)
1452 {
1453 if (sym_ok (want_section, abfd, i, sec, inf))
1454 {
1455 if (newplace == sorted_symcount)
1456 newplace = i;
1457
1458 if (bfd_asymbol_value (sorted_syms[i])
1459 != bfd_asymbol_value (sorted_syms[newplace]))
1460 break;
1461
1462 /* Remember this symbol and keep searching until we reach
1463 an earlier address. */
1464 newplace = i;
1465 }
1466 }
1467
1468 if (newplace != sorted_symcount)
1469 thisplace = newplace;
1470 else
1471 {
1472 /* We didn't find a good symbol with a smaller value.
1473 Look for one with a larger value. */
1474 for (i = thisplace + 1; i < sorted_symcount; i++)
1475 {
1476 if (sym_ok (want_section, abfd, i, sec, inf))
1477 {
1478 thisplace = i;
1479 break;
1480 }
1481 }
1482 }
1483
1484 if (! sym_ok (want_section, abfd, thisplace, sec, inf))
1485 /* There is no suitable symbol. */
1486 return NULL;
1487 }
1488
1489 /* If we have not found an exact match for the specified address
1490 and we have dynamic relocations available, then we can produce
1491 a better result by matching a relocation to the address and
1492 using the symbol associated with that relocation. */
1493 rel_count = inf->dynrelcount;
1494 if (!want_section
1495 && sorted_syms[thisplace]->value != vma
1496 && rel_count > 0
1497 && inf->dynrelbuf != NULL
1498 && inf->dynrelbuf[0]->address <= vma
1499 && inf->dynrelbuf[rel_count - 1]->address >= vma
1500 /* If we have matched a synthetic symbol, then stick with that. */
1501 && (sorted_syms[thisplace]->flags & BSF_SYNTHETIC) == 0)
1502 {
1503 arelent ** rel_low;
1504 arelent ** rel_high;
1505
1506 rel_low = inf->dynrelbuf;
1507 rel_high = rel_low + rel_count - 1;
1508 while (rel_low <= rel_high)
1509 {
1510 arelent **rel_mid = &rel_low[(rel_high - rel_low) / 2];
1511 arelent * rel = *rel_mid;
1512
1513 if (rel->address == vma)
1514 {
1515 /* Absolute relocations do not provide a more helpful
1516 symbolic address. Find a non-absolute relocation
1517 with the same address. */
1518 arelent **rel_vma = rel_mid;
1519 for (rel_mid--;
1520 rel_mid >= rel_low && rel_mid[0]->address == vma;
1521 rel_mid--)
1522 rel_vma = rel_mid;
1523
1524 for (; rel_vma <= rel_high && rel_vma[0]->address == vma;
1525 rel_vma++)
1526 {
1527 rel = *rel_vma;
1528 if (rel->sym_ptr_ptr != NULL
1529 && ! bfd_is_abs_section ((* rel->sym_ptr_ptr)->section))
1530 {
1531 if (place != NULL)
1532 * place = thisplace;
1533 return * rel->sym_ptr_ptr;
1534 }
1535 }
1536 break;
1537 }
1538
1539 if (vma < rel->address)
1540 rel_high = rel_mid;
1541 else if (vma >= rel_mid[1]->address)
1542 rel_low = rel_mid + 1;
1543 else
1544 break;
1545 }
1546 }
1547
1548 if (place != NULL)
1549 *place = thisplace;
1550
1551 return sorted_syms[thisplace];
1552 }
1553
1554 /* Print an address and the offset to the nearest symbol. */
1555
1556 static void
1557 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
1558 bfd_vma vma, struct disassemble_info *inf,
1559 bool skip_zeroes)
1560 {
1561 if (!no_addresses)
1562 {
1563 objdump_print_value (vma, inf, skip_zeroes);
1564 (*inf->fprintf_styled_func) (inf->stream, dis_style_text, " ");
1565 }
1566
1567 if (sym == NULL)
1568 {
1569 bfd_vma secaddr;
1570
1571 (*inf->fprintf_styled_func) (inf->stream, dis_style_text,"<");
1572 (*inf->fprintf_styled_func) (inf->stream, dis_style_symbol, "%s",
1573 sanitize_string (bfd_section_name (sec)));
1574 secaddr = bfd_section_vma (sec);
1575 if (vma < secaddr)
1576 {
1577 (*inf->fprintf_styled_func) (inf->stream, dis_style_immediate,
1578 "-0x");
1579 objdump_print_value (secaddr - vma, inf, true);
1580 }
1581 else if (vma > secaddr)
1582 {
1583 (*inf->fprintf_styled_func) (inf->stream, dis_style_immediate, "+0x");
1584 objdump_print_value (vma - secaddr, inf, true);
1585 }
1586 (*inf->fprintf_styled_func) (inf->stream, dis_style_text, ">");
1587 }
1588 else
1589 {
1590 (*inf->fprintf_styled_func) (inf->stream, dis_style_text, "<");
1591
1592 objdump_print_symname (abfd, inf, sym);
1593
1594 if (bfd_asymbol_value (sym) == vma)
1595 ;
1596 /* Undefined symbols in an executables and dynamic objects do not have
1597 a value associated with them, so it does not make sense to display
1598 an offset relative to them. Normally we would not be provided with
1599 this kind of symbol, but the target backend might choose to do so,
1600 and the code in find_symbol_for_address might return an as yet
1601 unresolved symbol associated with a dynamic reloc. */
1602 else if ((bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
1603 && bfd_is_und_section (sym->section))
1604 ;
1605 else if (bfd_asymbol_value (sym) > vma)
1606 {
1607 (*inf->fprintf_styled_func) (inf->stream, dis_style_immediate,"-0x");
1608 objdump_print_value (bfd_asymbol_value (sym) - vma, inf, true);
1609 }
1610 else if (vma > bfd_asymbol_value (sym))
1611 {
1612 (*inf->fprintf_styled_func) (inf->stream, dis_style_immediate, "+0x");
1613 objdump_print_value (vma - bfd_asymbol_value (sym), inf, true);
1614 }
1615
1616 (*inf->fprintf_styled_func) (inf->stream, dis_style_text, ">");
1617 }
1618
1619 if (display_file_offsets)
1620 inf->fprintf_styled_func (inf->stream, dis_style_text,
1621 _(" (File Offset: 0x%lx)"),
1622 (long int)(sec->filepos + (vma - sec->vma)));
1623 }
1624
1625 /* Print an address (VMA), symbolically if possible.
1626 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
1627
1628 static void
1629 objdump_print_addr (bfd_vma vma,
1630 struct disassemble_info *inf,
1631 bool skip_zeroes)
1632 {
1633 struct objdump_disasm_info *aux;
1634 asymbol *sym = NULL;
1635 bool skip_find = false;
1636
1637 aux = (struct objdump_disasm_info *) inf->application_data;
1638
1639 if (sorted_symcount < 1)
1640 {
1641 if (!no_addresses)
1642 {
1643 (*inf->fprintf_func) (inf->stream, "0x");
1644 objdump_print_value (vma, inf, skip_zeroes);
1645 }
1646
1647 if (display_file_offsets)
1648 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1649 (long int) (inf->section->filepos
1650 + (vma - inf->section->vma)));
1651 return;
1652 }
1653
1654 if (aux->reloc != NULL
1655 && aux->reloc->sym_ptr_ptr != NULL
1656 && * aux->reloc->sym_ptr_ptr != NULL)
1657 {
1658 sym = * aux->reloc->sym_ptr_ptr;
1659
1660 /* Adjust the vma to the reloc. */
1661 vma += bfd_asymbol_value (sym);
1662
1663 if (bfd_is_und_section (bfd_asymbol_section (sym)))
1664 skip_find = true;
1665 }
1666
1667 if (!skip_find)
1668 sym = find_symbol_for_address (vma, inf, NULL);
1669
1670 objdump_print_addr_with_sym (aux->abfd, inf->section, sym, vma, inf,
1671 skip_zeroes);
1672 }
1673
1674 /* Print VMA to INFO. This function is passed to the disassembler
1675 routine. */
1676
1677 static void
1678 objdump_print_address (bfd_vma vma, struct disassemble_info *inf)
1679 {
1680 objdump_print_addr (vma, inf, ! prefix_addresses);
1681 }
1682
1683 /* Determine if the given address has a symbol associated with it. */
1684
1685 static asymbol *
1686 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
1687 {
1688 asymbol * sym;
1689
1690 sym = find_symbol_for_address (vma, inf, NULL);
1691 if (sym != NULL && bfd_asymbol_value (sym) == vma)
1692 return sym;
1693
1694 return NULL;
1695 }
1696
1697 /* Hold the last function name and the last line number we displayed
1698 in a disassembly. */
1699
1700 static char *prev_functionname;
1701 static unsigned int prev_line;
1702 static unsigned int prev_discriminator;
1703
1704 /* We keep a list of all files that we have seen when doing a
1705 disassembly with source, so that we know how much of the file to
1706 display. This can be important for inlined functions. */
1707
1708 struct print_file_list
1709 {
1710 struct print_file_list *next;
1711 const char *filename;
1712 const char *modname;
1713 const char *map;
1714 size_t mapsize;
1715 const char **linemap;
1716 unsigned maxline;
1717 unsigned last_line;
1718 unsigned max_printed;
1719 int first;
1720 };
1721
1722 static struct print_file_list *print_files;
1723
1724 /* The number of preceding context lines to show when we start
1725 displaying a file for the first time. */
1726
1727 #define SHOW_PRECEDING_CONTEXT_LINES (5)
1728
1729 /* Read a complete file into memory. */
1730
1731 static const char *
1732 slurp_file (const char *fn, size_t *size, struct stat *fst)
1733 {
1734 #ifdef HAVE_MMAP
1735 int ps = getpagesize ();
1736 size_t msize;
1737 #endif
1738 const char *map;
1739 int fd = open (fn, O_RDONLY | O_BINARY);
1740
1741 if (fd < 0)
1742 return NULL;
1743 if (fstat (fd, fst) < 0)
1744 {
1745 close (fd);
1746 return NULL;
1747 }
1748 *size = fst->st_size;
1749 #ifdef HAVE_MMAP
1750 msize = (*size + ps - 1) & ~(ps - 1);
1751 map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
1752 if (map != (char *) -1L)
1753 {
1754 close (fd);
1755 return map;
1756 }
1757 #endif
1758 map = (const char *) malloc (*size);
1759 if (!map || (size_t) read (fd, (char *) map, *size) != *size)
1760 {
1761 free ((void *) map);
1762 map = NULL;
1763 }
1764 close (fd);
1765 return map;
1766 }
1767
1768 #define line_map_decrease 5
1769
1770 /* Precompute array of lines for a mapped file. */
1771
1772 static const char **
1773 index_file (const char *map, size_t size, unsigned int *maxline)
1774 {
1775 const char *p, *lstart, *end;
1776 int chars_per_line = 45; /* First iteration will use 40. */
1777 unsigned int lineno;
1778 const char **linemap = NULL;
1779 unsigned long line_map_size = 0;
1780
1781 lineno = 0;
1782 lstart = map;
1783 end = map + size;
1784
1785 for (p = map; p < end; p++)
1786 {
1787 if (*p == '\n')
1788 {
1789 if (p + 1 < end && p[1] == '\r')
1790 p++;
1791 }
1792 else if (*p == '\r')
1793 {
1794 if (p + 1 < end && p[1] == '\n')
1795 p++;
1796 }
1797 else
1798 continue;
1799
1800 /* End of line found. */
1801
1802 if (linemap == NULL || line_map_size < lineno + 1)
1803 {
1804 unsigned long newsize;
1805
1806 chars_per_line -= line_map_decrease;
1807 if (chars_per_line <= 1)
1808 chars_per_line = 1;
1809 line_map_size = size / chars_per_line + 1;
1810 if (line_map_size < lineno + 1)
1811 line_map_size = lineno + 1;
1812 newsize = line_map_size * sizeof (char *);
1813 linemap = (const char **) xrealloc (linemap, newsize);
1814 }
1815
1816 linemap[lineno++] = lstart;
1817 lstart = p + 1;
1818 }
1819
1820 *maxline = lineno;
1821 return linemap;
1822 }
1823
1824 /* Tries to open MODNAME, and if successful adds a node to print_files
1825 linked list and returns that node. Returns NULL on failure. */
1826
1827 static struct print_file_list *
1828 try_print_file_open (const char *origname, const char *modname, struct stat *fst)
1829 {
1830 struct print_file_list *p;
1831
1832 p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
1833
1834 p->map = slurp_file (modname, &p->mapsize, fst);
1835 if (p->map == NULL)
1836 {
1837 free (p);
1838 return NULL;
1839 }
1840
1841 p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1842 p->last_line = 0;
1843 p->max_printed = 0;
1844 p->filename = origname;
1845 p->modname = modname;
1846 p->next = print_files;
1847 p->first = 1;
1848 print_files = p;
1849 return p;
1850 }
1851
1852 /* If the source file, as described in the symtab, is not found
1853 try to locate it in one of the paths specified with -I
1854 If found, add location to print_files linked list. */
1855
1856 static struct print_file_list *
1857 update_source_path (const char *filename, bfd *abfd)
1858 {
1859 struct print_file_list *p;
1860 const char *fname;
1861 struct stat fst;
1862 int i;
1863
1864 p = try_print_file_open (filename, filename, &fst);
1865 if (p == NULL)
1866 {
1867 if (include_path_count == 0)
1868 return NULL;
1869
1870 /* Get the name of the file. */
1871 fname = lbasename (filename);
1872
1873 /* If file exists under a new path, we need to add it to the list
1874 so that show_line knows about it. */
1875 for (i = 0; i < include_path_count; i++)
1876 {
1877 char *modname = concat (include_paths[i], "/", fname,
1878 (const char *) 0);
1879
1880 p = try_print_file_open (filename, modname, &fst);
1881 if (p)
1882 break;
1883
1884 free (modname);
1885 }
1886 }
1887
1888 if (p != NULL)
1889 {
1890 long mtime = bfd_get_mtime (abfd);
1891
1892 if (fst.st_mtime > mtime)
1893 warn (_("source file %s is more recent than object file\n"),
1894 filename);
1895 }
1896
1897 return p;
1898 }
1899
1900 /* Print a source file line. */
1901
1902 static void
1903 print_line (struct print_file_list *p, unsigned int linenum)
1904 {
1905 const char *l;
1906 size_t len;
1907
1908 --linenum;
1909 if (linenum >= p->maxline)
1910 return;
1911 l = p->linemap [linenum];
1912 if (source_comment != NULL && strlen (l) > 0)
1913 printf ("%s", source_comment);
1914 len = strcspn (l, "\n\r");
1915 /* Test fwrite return value to quiet glibc warning. */
1916 if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1917 putchar ('\n');
1918 }
1919
1920 /* Print a range of source code lines. */
1921
1922 static void
1923 dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1924 {
1925 if (p->map == NULL)
1926 return;
1927 while (start <= end)
1928 {
1929 print_line (p, start);
1930 start++;
1931 }
1932 }
1933
1934 /* Show the line number, or the source line, in a disassembly
1935 listing. */
1936
1937 static void
1938 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1939 {
1940 const char *filename;
1941 const char *functionname;
1942 unsigned int linenumber;
1943 unsigned int discriminator;
1944 bool reloc;
1945 char *path = NULL;
1946
1947 if (! with_line_numbers && ! with_source_code)
1948 return;
1949
1950 if (! bfd_find_nearest_line_discriminator (abfd, section, syms, addr_offset,
1951 &filename, &functionname,
1952 &linenumber, &discriminator))
1953 return;
1954
1955 if (filename != NULL && *filename == '\0')
1956 filename = NULL;
1957 if (functionname != NULL && *functionname == '\0')
1958 functionname = NULL;
1959
1960 if (filename
1961 && IS_ABSOLUTE_PATH (filename)
1962 && prefix)
1963 {
1964 char *path_up;
1965 const char *fname = filename;
1966
1967 path = xmalloc (prefix_length + 1 + strlen (filename));
1968
1969 if (prefix_length)
1970 memcpy (path, prefix, prefix_length);
1971 path_up = path + prefix_length;
1972
1973 /* Build relocated filename, stripping off leading directories
1974 from the initial filename if requested. */
1975 if (prefix_strip > 0)
1976 {
1977 int level = 0;
1978 const char *s;
1979
1980 /* Skip selected directory levels. */
1981 for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
1982 if (IS_DIR_SEPARATOR (*s))
1983 {
1984 fname = s;
1985 level++;
1986 }
1987 }
1988
1989 /* Update complete filename. */
1990 strcpy (path_up, fname);
1991
1992 filename = path;
1993 reloc = true;
1994 }
1995 else
1996 reloc = false;
1997
1998 if (with_line_numbers)
1999 {
2000 if (functionname != NULL
2001 && (prev_functionname == NULL
2002 || strcmp (functionname, prev_functionname) != 0))
2003 {
2004 char *demangle_alloc = NULL;
2005 if (do_demangle && functionname[0] != '\0')
2006 {
2007 /* Demangle the name. */
2008 demangle_alloc = bfd_demangle (abfd, functionname,
2009 demangle_flags);
2010 }
2011
2012 /* Demangling adds trailing parens, so don't print those. */
2013 if (demangle_alloc != NULL)
2014 printf ("%s:\n", sanitize_string (demangle_alloc));
2015 else
2016 printf ("%s():\n", sanitize_string (functionname));
2017
2018 prev_line = -1;
2019 free (demangle_alloc);
2020 }
2021 if (linenumber > 0
2022 && (linenumber != prev_line
2023 || discriminator != prev_discriminator))
2024 {
2025 if (discriminator > 0)
2026 printf ("%s:%u (discriminator %u)\n",
2027 filename == NULL ? "???" : sanitize_string (filename),
2028 linenumber, discriminator);
2029 else
2030 printf ("%s:%u\n", filename == NULL
2031 ? "???" : sanitize_string (filename),
2032 linenumber);
2033 }
2034 if (unwind_inlines)
2035 {
2036 const char *filename2;
2037 const char *functionname2;
2038 unsigned line2;
2039
2040 while (bfd_find_inliner_info (abfd, &filename2, &functionname2,
2041 &line2))
2042 {
2043 printf ("inlined by %s:%u",
2044 sanitize_string (filename2), line2);
2045 printf (" (%s)\n", sanitize_string (functionname2));
2046 }
2047 }
2048 }
2049
2050 if (with_source_code
2051 && filename != NULL
2052 && linenumber > 0)
2053 {
2054 struct print_file_list **pp, *p;
2055 unsigned l;
2056
2057 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
2058 if (filename_cmp ((*pp)->filename, filename) == 0)
2059 break;
2060 p = *pp;
2061
2062 if (p == NULL)
2063 {
2064 if (reloc)
2065 filename = xstrdup (filename);
2066 p = update_source_path (filename, abfd);
2067 }
2068
2069 if (p != NULL && linenumber != p->last_line)
2070 {
2071 if (file_start_context && p->first)
2072 l = 1;
2073 else
2074 {
2075 l = linenumber - SHOW_PRECEDING_CONTEXT_LINES;
2076 if (l >= linenumber)
2077 l = 1;
2078 if (p->max_printed >= l)
2079 {
2080 if (p->max_printed < linenumber)
2081 l = p->max_printed + 1;
2082 else
2083 l = linenumber;
2084 }
2085 }
2086 dump_lines (p, l, linenumber);
2087 if (p->max_printed < linenumber)
2088 p->max_printed = linenumber;
2089 p->last_line = linenumber;
2090 p->first = 0;
2091 }
2092 }
2093
2094 if (functionname != NULL
2095 && (prev_functionname == NULL
2096 || strcmp (functionname, prev_functionname) != 0))
2097 {
2098 if (prev_functionname != NULL)
2099 free (prev_functionname);
2100 prev_functionname = (char *) xmalloc (strlen (functionname) + 1);
2101 strcpy (prev_functionname, functionname);
2102 }
2103
2104 if (linenumber > 0 && linenumber != prev_line)
2105 prev_line = linenumber;
2106
2107 if (discriminator != prev_discriminator)
2108 prev_discriminator = discriminator;
2109
2110 if (path)
2111 free (path);
2112 }
2113
2114 /* Pseudo FILE object for strings. */
2115 typedef struct
2116 {
2117 char *buffer;
2118 size_t pos;
2119 size_t alloc;
2120 } SFILE;
2121
2122 /* sprintf to a "stream". */
2123
2124 static int ATTRIBUTE_PRINTF_2
2125 objdump_sprintf (SFILE *f, const char *format, ...)
2126 {
2127 size_t n;
2128 va_list args;
2129
2130 while (1)
2131 {
2132 size_t space = f->alloc - f->pos;
2133
2134 va_start (args, format);
2135 n = vsnprintf (f->buffer + f->pos, space, format, args);
2136 va_end (args);
2137
2138 if (space > n)
2139 break;
2140
2141 f->alloc = (f->alloc + n) * 2;
2142 f->buffer = (char *) xrealloc (f->buffer, f->alloc);
2143 }
2144 f->pos += n;
2145
2146 return n;
2147 }
2148
2149 /* Return an integer greater than, or equal to zero, representing the color
2150 for STYLE, or -1 if no color should be used. */
2151
2152 static int
2153 objdump_color_for_disassembler_style (enum disassembler_style style)
2154 {
2155 int color = -1;
2156
2157 if (style == dis_style_comment_start)
2158 disassembler_in_comment = true;
2159
2160 if (disassembler_color)
2161 {
2162 if (disassembler_in_comment)
2163 return color;
2164
2165 switch (style)
2166 {
2167 case dis_style_symbol: color = 32; break;
2168 case dis_style_assembler_directive:
2169 case dis_style_mnemonic: color = 33; break;
2170 case dis_style_register: color = 34; break;
2171 case dis_style_address:
2172 case dis_style_address_offset:
2173 case dis_style_immediate: color = 35; break;
2174 default:
2175 case dis_style_text: color = -1; break;
2176 }
2177 }
2178 else if (disassembler_extended_color)
2179 {
2180 if (disassembler_in_comment)
2181 return 250;
2182
2183 switch (style)
2184 {
2185 case dis_style_symbol: color = 40; break;
2186 case dis_style_assembler_directive:
2187 case dis_style_mnemonic: color = 142; break;
2188 case dis_style_register: color = 27; break;
2189 case dis_style_address:
2190 case dis_style_address_offset:
2191 case dis_style_immediate: color = 134; break;
2192 default:
2193 case dis_style_text: color = -1; break;
2194 }
2195 }
2196
2197 return color;
2198 }
2199
2200 /* Like objdump_sprintf, but add in escape sequences to highlight the
2201 content according to STYLE. */
2202
2203 static int ATTRIBUTE_PRINTF_3
2204 objdump_styled_sprintf (SFILE *f, enum disassembler_style style,
2205 const char *format, ...)
2206 {
2207 size_t n;
2208 va_list args;
2209 int color = objdump_color_for_disassembler_style (style);
2210
2211 if (color >= 0)
2212 {
2213 while (1)
2214 {
2215 size_t space = f->alloc - f->pos;
2216
2217 if (disassembler_color)
2218 n = snprintf (f->buffer + f->pos, space, "\033[%dm", color);
2219 else
2220 n = snprintf (f->buffer + f->pos, space, "\033[38;5;%dm", color);
2221 if (space > n)
2222 break;
2223
2224 f->alloc = (f->alloc + n) * 2;
2225 f->buffer = (char *) xrealloc (f->buffer, f->alloc);
2226 }
2227 f->pos += n;
2228 }
2229
2230 while (1)
2231 {
2232 size_t space = f->alloc - f->pos;
2233
2234 va_start (args, format);
2235 n = vsnprintf (f->buffer + f->pos, space, format, args);
2236 va_end (args);
2237
2238 if (space > n)
2239 break;
2240
2241 f->alloc = (f->alloc + n) * 2;
2242 f->buffer = (char *) xrealloc (f->buffer, f->alloc);
2243 }
2244 f->pos += n;
2245
2246 if (color >= 0)
2247 {
2248 while (1)
2249 {
2250 size_t space = f->alloc - f->pos;
2251
2252 n = snprintf (f->buffer + f->pos, space, "\033[0m");
2253
2254 if (space > n)
2255 break;
2256
2257 f->alloc = (f->alloc + n) * 2;
2258 f->buffer = (char *) xrealloc (f->buffer, f->alloc);
2259 }
2260 f->pos += n;
2261 }
2262
2263 return n;
2264 }
2265
2266 /* We discard the styling information here. This function is only used
2267 when objdump is printing auxiliary information, the symbol headers, and
2268 disassembly address, or the bytes of the disassembled instruction. We
2269 don't (currently) apply styling to any of this stuff, so, for now, just
2270 print the content with no additional style added. */
2271
2272 static int ATTRIBUTE_PRINTF_3
2273 fprintf_styled (FILE *f, enum disassembler_style style ATTRIBUTE_UNUSED,
2274 const char *fmt, ...)
2275 {
2276 int res;
2277 va_list ap;
2278
2279 va_start (ap, fmt);
2280 res = vfprintf (f, fmt, ap);
2281 va_end (ap);
2282
2283 return res;
2284 }
2285
2286 /* Code for generating (colored) diagrams of control flow start and end
2287 points. */
2288
2289 /* Structure used to store the properties of a jump. */
2290
2291 struct jump_info
2292 {
2293 /* The next jump, or NULL if this is the last object. */
2294 struct jump_info *next;
2295 /* The previous jump, or NULL if this is the first object. */
2296 struct jump_info *prev;
2297 /* The start addresses of the jump. */
2298 struct
2299 {
2300 /* The list of start addresses. */
2301 bfd_vma *addresses;
2302 /* The number of elements. */
2303 size_t count;
2304 /* The maximum number of elements that fit into the array. */
2305 size_t max_count;
2306 } start;
2307 /* The end address of the jump. */
2308 bfd_vma end;
2309 /* The drawing level of the jump. */
2310 int level;
2311 };
2312
2313 /* Construct a jump object for a jump from start
2314 to end with the corresponding level. */
2315
2316 static struct jump_info *
2317 jump_info_new (bfd_vma start, bfd_vma end, int level)
2318 {
2319 struct jump_info *result = xmalloc (sizeof (struct jump_info));
2320
2321 result->next = NULL;
2322 result->prev = NULL;
2323 result->start.addresses = xmalloc (sizeof (bfd_vma *) * 2);
2324 result->start.addresses[0] = start;
2325 result->start.count = 1;
2326 result->start.max_count = 2;
2327 result->end = end;
2328 result->level = level;
2329
2330 return result;
2331 }
2332
2333 /* Free a jump object and return the next object
2334 or NULL if this was the last one. */
2335
2336 static struct jump_info *
2337 jump_info_free (struct jump_info *ji)
2338 {
2339 struct jump_info *result = NULL;
2340
2341 if (ji)
2342 {
2343 result = ji->next;
2344 if (ji->start.addresses)
2345 free (ji->start.addresses);
2346 free (ji);
2347 }
2348
2349 return result;
2350 }
2351
2352 /* Get the smallest value of all start and end addresses. */
2353
2354 static bfd_vma
2355 jump_info_min_address (const struct jump_info *ji)
2356 {
2357 bfd_vma min_address = ji->end;
2358 size_t i;
2359
2360 for (i = ji->start.count; i-- > 0;)
2361 if (ji->start.addresses[i] < min_address)
2362 min_address = ji->start.addresses[i];
2363 return min_address;
2364 }
2365
2366 /* Get the largest value of all start and end addresses. */
2367
2368 static bfd_vma
2369 jump_info_max_address (const struct jump_info *ji)
2370 {
2371 bfd_vma max_address = ji->end;
2372 size_t i;
2373
2374 for (i = ji->start.count; i-- > 0;)
2375 if (ji->start.addresses[i] > max_address)
2376 max_address = ji->start.addresses[i];
2377 return max_address;
2378 }
2379
2380 /* Get the target address of a jump. */
2381
2382 static bfd_vma
2383 jump_info_end_address (const struct jump_info *ji)
2384 {
2385 return ji->end;
2386 }
2387
2388 /* Test if an address is one of the start addresses of a jump. */
2389
2390 static bool
2391 jump_info_is_start_address (const struct jump_info *ji, bfd_vma address)
2392 {
2393 bool result = false;
2394 size_t i;
2395
2396 for (i = ji->start.count; i-- > 0;)
2397 if (address == ji->start.addresses[i])
2398 {
2399 result = true;
2400 break;
2401 }
2402
2403 return result;
2404 }
2405
2406 /* Test if an address is the target address of a jump. */
2407
2408 static bool
2409 jump_info_is_end_address (const struct jump_info *ji, bfd_vma address)
2410 {
2411 return (address == ji->end);
2412 }
2413
2414 /* Get the difference between the smallest and largest address of a jump. */
2415
2416 static bfd_vma
2417 jump_info_size (const struct jump_info *ji)
2418 {
2419 return jump_info_max_address (ji) - jump_info_min_address (ji);
2420 }
2421
2422 /* Unlink a jump object from a list. */
2423
2424 static void
2425 jump_info_unlink (struct jump_info *node,
2426 struct jump_info **base)
2427 {
2428 if (node->next)
2429 node->next->prev = node->prev;
2430 if (node->prev)
2431 node->prev->next = node->next;
2432 else
2433 *base = node->next;
2434 node->next = NULL;
2435 node->prev = NULL;
2436 }
2437
2438 /* Insert unlinked jump info node into a list. */
2439
2440 static void
2441 jump_info_insert (struct jump_info *node,
2442 struct jump_info *target,
2443 struct jump_info **base)
2444 {
2445 node->next = target;
2446 node->prev = target->prev;
2447 target->prev = node;
2448 if (node->prev)
2449 node->prev->next = node;
2450 else
2451 *base = node;
2452 }
2453
2454 /* Add unlinked node to the front of a list. */
2455
2456 static void
2457 jump_info_add_front (struct jump_info *node,
2458 struct jump_info **base)
2459 {
2460 node->next = *base;
2461 if (node->next)
2462 node->next->prev = node;
2463 node->prev = NULL;
2464 *base = node;
2465 }
2466
2467 /* Move linked node to target position. */
2468
2469 static void
2470 jump_info_move_linked (struct jump_info *node,
2471 struct jump_info *target,
2472 struct jump_info **base)
2473 {
2474 /* Unlink node. */
2475 jump_info_unlink (node, base);
2476 /* Insert node at target position. */
2477 jump_info_insert (node, target, base);
2478 }
2479
2480 /* Test if two jumps intersect. */
2481
2482 static bool
2483 jump_info_intersect (const struct jump_info *a,
2484 const struct jump_info *b)
2485 {
2486 return ((jump_info_max_address (a) >= jump_info_min_address (b))
2487 && (jump_info_min_address (a) <= jump_info_max_address (b)));
2488 }
2489
2490 /* Merge two compatible jump info objects. */
2491
2492 static void
2493 jump_info_merge (struct jump_info **base)
2494 {
2495 struct jump_info *a;
2496
2497 for (a = *base; a; a = a->next)
2498 {
2499 struct jump_info *b;
2500
2501 for (b = a->next; b; b = b->next)
2502 {
2503 /* Merge both jumps into one. */
2504 if (a->end == b->end)
2505 {
2506 /* Reallocate addresses. */
2507 size_t needed_size = a->start.count + b->start.count;
2508 size_t i;
2509
2510 if (needed_size > a->start.max_count)
2511 {
2512 a->start.max_count += b->start.max_count;
2513 a->start.addresses =
2514 xrealloc (a->start.addresses,
2515 a->start.max_count * sizeof (bfd_vma *));
2516 }
2517
2518 /* Append start addresses. */
2519 for (i = 0; i < b->start.count; ++i)
2520 a->start.addresses[a->start.count++] =
2521 b->start.addresses[i];
2522
2523 /* Remove and delete jump. */
2524 struct jump_info *tmp = b->prev;
2525 jump_info_unlink (b, base);
2526 jump_info_free (b);
2527 b = tmp;
2528 }
2529 }
2530 }
2531 }
2532
2533 /* Sort jumps by their size and starting point using a stable
2534 minsort. This could be improved if sorting performance is
2535 an issue, for example by using mergesort. */
2536
2537 static void
2538 jump_info_sort (struct jump_info **base)
2539 {
2540 struct jump_info *current_element = *base;
2541
2542 while (current_element)
2543 {
2544 struct jump_info *best_match = current_element;
2545 struct jump_info *runner = current_element->next;
2546 bfd_vma best_size = jump_info_size (best_match);
2547
2548 while (runner)
2549 {
2550 bfd_vma runner_size = jump_info_size (runner);
2551
2552 if ((runner_size < best_size)
2553 || ((runner_size == best_size)
2554 && (jump_info_min_address (runner)
2555 < jump_info_min_address (best_match))))
2556 {
2557 best_match = runner;
2558 best_size = runner_size;
2559 }
2560
2561 runner = runner->next;
2562 }
2563
2564 if (best_match == current_element)
2565 current_element = current_element->next;
2566 else
2567 jump_info_move_linked (best_match, current_element, base);
2568 }
2569 }
2570
2571 /* Visualize all jumps at a given address. */
2572
2573 static void
2574 jump_info_visualize_address (bfd_vma address,
2575 int max_level,
2576 char *line_buffer,
2577 uint8_t *color_buffer)
2578 {
2579 struct jump_info *ji = detected_jumps;
2580 size_t len = (max_level + 1) * 3;
2581
2582 /* Clear line buffer. */
2583 memset (line_buffer, ' ', len);
2584 memset (color_buffer, 0, len);
2585
2586 /* Iterate over jumps and add their ASCII art. */
2587 while (ji)
2588 {
2589 /* Discard jumps that are never needed again. */
2590 if (jump_info_max_address (ji) < address)
2591 {
2592 struct jump_info *tmp = ji;
2593
2594 ji = ji->next;
2595 jump_info_unlink (tmp, &detected_jumps);
2596 jump_info_free (tmp);
2597 continue;
2598 }
2599
2600 /* This jump intersects with the current address. */
2601 if (jump_info_min_address (ji) <= address)
2602 {
2603 /* Hash target address to get an even
2604 distribution between all values. */
2605 bfd_vma hash_address = jump_info_end_address (ji);
2606 uint8_t color = iterative_hash_object (hash_address, 0);
2607 /* Fetch line offset. */
2608 int offset = (max_level - ji->level) * 3;
2609
2610 /* Draw start line. */
2611 if (jump_info_is_start_address (ji, address))
2612 {
2613 size_t i = offset + 1;
2614
2615 for (; i < len - 1; ++i)
2616 if (line_buffer[i] == ' ')
2617 {
2618 line_buffer[i] = '-';
2619 color_buffer[i] = color;
2620 }
2621
2622 if (line_buffer[i] == ' ')
2623 {
2624 line_buffer[i] = '-';
2625 color_buffer[i] = color;
2626 }
2627 else if (line_buffer[i] == '>')
2628 {
2629 line_buffer[i] = 'X';
2630 color_buffer[i] = color;
2631 }
2632
2633 if (line_buffer[offset] == ' ')
2634 {
2635 if (address <= ji->end)
2636 line_buffer[offset] =
2637 (jump_info_min_address (ji) == address) ? '/': '+';
2638 else
2639 line_buffer[offset] =
2640 (jump_info_max_address (ji) == address) ? '\\': '+';
2641 color_buffer[offset] = color;
2642 }
2643 }
2644 /* Draw jump target. */
2645 else if (jump_info_is_end_address (ji, address))
2646 {
2647 size_t i = offset + 1;
2648
2649 for (; i < len - 1; ++i)
2650 if (line_buffer[i] == ' ')
2651 {
2652 line_buffer[i] = '-';
2653 color_buffer[i] = color;
2654 }
2655
2656 if (line_buffer[i] == ' ')
2657 {
2658 line_buffer[i] = '>';
2659 color_buffer[i] = color;
2660 }
2661 else if (line_buffer[i] == '-')
2662 {
2663 line_buffer[i] = 'X';
2664 color_buffer[i] = color;
2665 }
2666
2667 if (line_buffer[offset] == ' ')
2668 {
2669 if (jump_info_min_address (ji) < address)
2670 line_buffer[offset] =
2671 (jump_info_max_address (ji) > address) ? '>' : '\\';
2672 else
2673 line_buffer[offset] = '/';
2674 color_buffer[offset] = color;
2675 }
2676 }
2677 /* Draw intermediate line segment. */
2678 else if (line_buffer[offset] == ' ')
2679 {
2680 line_buffer[offset] = '|';
2681 color_buffer[offset] = color;
2682 }
2683 }
2684
2685 ji = ji->next;
2686 }
2687 }
2688
2689 /* Clone of disassemble_bytes to detect jumps inside a function. */
2690 /* FIXME: is this correct? Can we strip it down even further? */
2691
2692 static struct jump_info *
2693 disassemble_jumps (struct disassemble_info * inf,
2694 disassembler_ftype disassemble_fn,
2695 bfd_vma start_offset,
2696 bfd_vma stop_offset,
2697 bfd_vma rel_offset,
2698 arelent *** relppp,
2699 arelent ** relppend)
2700 {
2701 struct objdump_disasm_info *aux;
2702 struct jump_info *jumps = NULL;
2703 asection *section;
2704 bfd_vma addr_offset;
2705 unsigned int opb = inf->octets_per_byte;
2706 int octets = opb;
2707 SFILE sfile;
2708
2709 aux = (struct objdump_disasm_info *) inf->application_data;
2710 section = inf->section;
2711
2712 sfile.alloc = 120;
2713 sfile.buffer = (char *) xmalloc (sfile.alloc);
2714 sfile.pos = 0;
2715
2716 inf->insn_info_valid = 0;
2717 disassemble_set_printf (inf, &sfile, (fprintf_ftype) objdump_sprintf,
2718 (fprintf_styled_ftype) objdump_styled_sprintf);
2719
2720 addr_offset = start_offset;
2721 while (addr_offset < stop_offset)
2722 {
2723 int previous_octets;
2724
2725 /* Remember the length of the previous instruction. */
2726 previous_octets = octets;
2727 octets = 0;
2728
2729 sfile.pos = 0;
2730 inf->bytes_per_line = 0;
2731 inf->bytes_per_chunk = 0;
2732 inf->flags = ((disassemble_all ? DISASSEMBLE_DATA : 0)
2733 | (wide_output ? WIDE_OUTPUT : 0));
2734 if (machine)
2735 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
2736
2737 if (inf->disassembler_needs_relocs
2738 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
2739 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
2740 && *relppp < relppend)
2741 {
2742 bfd_signed_vma distance_to_rel;
2743
2744 distance_to_rel = (**relppp)->address - (rel_offset + addr_offset);
2745
2746 /* Check to see if the current reloc is associated with
2747 the instruction that we are about to disassemble. */
2748 if (distance_to_rel == 0
2749 /* FIXME: This is wrong. We are trying to catch
2750 relocs that are addressed part way through the
2751 current instruction, as might happen with a packed
2752 VLIW instruction. Unfortunately we do not know the
2753 length of the current instruction since we have not
2754 disassembled it yet. Instead we take a guess based
2755 upon the length of the previous instruction. The
2756 proper solution is to have a new target-specific
2757 disassembler function which just returns the length
2758 of an instruction at a given address without trying
2759 to display its disassembly. */
2760 || (distance_to_rel > 0
2761 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
2762 {
2763 inf->flags |= INSN_HAS_RELOC;
2764 }
2765 }
2766
2767 if (! disassemble_all
2768 && (section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
2769 == (SEC_CODE | SEC_HAS_CONTENTS))
2770 /* Set a stop_vma so that the disassembler will not read
2771 beyond the next symbol. We assume that symbols appear on
2772 the boundaries between instructions. We only do this when
2773 disassembling code of course, and when -D is in effect. */
2774 inf->stop_vma = section->vma + stop_offset;
2775
2776 inf->stop_offset = stop_offset;
2777
2778 /* Extract jump information. */
2779 inf->insn_info_valid = 0;
2780 disassembler_in_comment = false;
2781 octets = (*disassemble_fn) (section->vma + addr_offset, inf);
2782 /* Test if a jump was detected. */
2783 if (inf->insn_info_valid
2784 && ((inf->insn_type == dis_branch)
2785 || (inf->insn_type == dis_condbranch)
2786 || (inf->insn_type == dis_jsr)
2787 || (inf->insn_type == dis_condjsr))
2788 && (inf->target >= section->vma + start_offset)
2789 && (inf->target < section->vma + stop_offset))
2790 {
2791 struct jump_info *ji =
2792 jump_info_new (section->vma + addr_offset, inf->target, -1);
2793 jump_info_add_front (ji, &jumps);
2794 }
2795
2796 inf->stop_vma = 0;
2797
2798 addr_offset += octets / opb;
2799 }
2800
2801 disassemble_set_printf (inf, (void *) stdout, (fprintf_ftype) fprintf,
2802 (fprintf_styled_ftype) fprintf_styled);
2803 free (sfile.buffer);
2804
2805 /* Merge jumps. */
2806 jump_info_merge (&jumps);
2807 /* Process jumps. */
2808 jump_info_sort (&jumps);
2809
2810 /* Group jumps by level. */
2811 struct jump_info *last_jump = jumps;
2812 int max_level = -1;
2813
2814 while (last_jump)
2815 {
2816 /* The last jump is part of the next group. */
2817 struct jump_info *base = last_jump;
2818 /* Increment level. */
2819 base->level = ++max_level;
2820
2821 /* Find jumps that can be combined on the same
2822 level, with the largest jumps tested first.
2823 This has the advantage that large jumps are on
2824 lower levels and do not intersect with small
2825 jumps that get grouped on higher levels. */
2826 struct jump_info *exchange_item = last_jump->next;
2827 struct jump_info *it = exchange_item;
2828
2829 for (; it; it = it->next)
2830 {
2831 /* Test if the jump intersects with any
2832 jump from current group. */
2833 bool ok = true;
2834 struct jump_info *it_collision;
2835
2836 for (it_collision = base;
2837 it_collision != exchange_item;
2838 it_collision = it_collision->next)
2839 {
2840 /* This jump intersects so we leave it out. */
2841 if (jump_info_intersect (it_collision, it))
2842 {
2843 ok = false;
2844 break;
2845 }
2846 }
2847
2848 /* Add jump to group. */
2849 if (ok)
2850 {
2851 /* Move current element to the front. */
2852 if (it != exchange_item)
2853 {
2854 struct jump_info *save = it->prev;
2855 jump_info_move_linked (it, exchange_item, &jumps);
2856 last_jump = it;
2857 it = save;
2858 }
2859 else
2860 {
2861 last_jump = exchange_item;
2862 exchange_item = exchange_item->next;
2863 }
2864 last_jump->level = max_level;
2865 }
2866 }
2867
2868 /* Move to next group. */
2869 last_jump = exchange_item;
2870 }
2871
2872 return jumps;
2873 }
2874
2875 /* The number of zeroes we want to see before we start skipping them.
2876 The number is arbitrarily chosen. */
2877
2878 #define DEFAULT_SKIP_ZEROES 8
2879
2880 /* The number of zeroes to skip at the end of a section. If the
2881 number of zeroes at the end is between SKIP_ZEROES_AT_END and
2882 SKIP_ZEROES, they will be disassembled. If there are fewer than
2883 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
2884 attempt to avoid disassembling zeroes inserted by section
2885 alignment. */
2886
2887 #define DEFAULT_SKIP_ZEROES_AT_END 3
2888
2889 static int
2890 null_print (const void * stream ATTRIBUTE_UNUSED, const char * format ATTRIBUTE_UNUSED, ...)
2891 {
2892 return 1;
2893 }
2894
2895 /* Like null_print, but takes the extra STYLE argument. As this is not
2896 going to print anything, the extra argument is just ignored. */
2897
2898 static int
2899 null_styled_print (const void * stream ATTRIBUTE_UNUSED,
2900 enum disassembler_style style ATTRIBUTE_UNUSED,
2901 const char * format ATTRIBUTE_UNUSED, ...)
2902 {
2903 return 1;
2904 }
2905
2906 /* Print out jump visualization. */
2907
2908 static void
2909 print_jump_visualisation (bfd_vma addr, int max_level, char *line_buffer,
2910 uint8_t *color_buffer)
2911 {
2912 if (!line_buffer)
2913 return;
2914
2915 jump_info_visualize_address (addr, max_level, line_buffer, color_buffer);
2916
2917 size_t line_buffer_size = strlen (line_buffer);
2918 char last_color = 0;
2919 size_t i;
2920
2921 for (i = 0; i <= line_buffer_size; ++i)
2922 {
2923 if (color_output)
2924 {
2925 uint8_t color = (i < line_buffer_size) ? color_buffer[i]: 0;
2926
2927 if (color != last_color)
2928 {
2929 if (color)
2930 if (extended_color_output)
2931 /* Use extended 8bit color, but
2932 do not choose dark colors. */
2933 printf ("\033[38;5;%dm", 124 + (color % 108));
2934 else
2935 /* Use simple terminal colors. */
2936 printf ("\033[%dm", 31 + (color % 7));
2937 else
2938 /* Clear color. */
2939 printf ("\033[0m");
2940 last_color = color;
2941 }
2942 }
2943 putchar ((i < line_buffer_size) ? line_buffer[i]: ' ');
2944 }
2945 }
2946
2947 /* Disassemble some data in memory between given values. */
2948
2949 static void
2950 disassemble_bytes (struct disassemble_info *inf,
2951 disassembler_ftype disassemble_fn,
2952 bool insns,
2953 bfd_byte *data,
2954 bfd_vma start_offset,
2955 bfd_vma stop_offset,
2956 bfd_vma rel_offset,
2957 arelent ***relppp,
2958 arelent **relppend)
2959 {
2960 struct objdump_disasm_info *aux;
2961 asection *section;
2962 unsigned int octets_per_line;
2963 unsigned int skip_addr_chars;
2964 bfd_vma addr_offset;
2965 unsigned int opb = inf->octets_per_byte;
2966 unsigned int skip_zeroes = inf->skip_zeroes;
2967 unsigned int skip_zeroes_at_end = inf->skip_zeroes_at_end;
2968 size_t octets;
2969 SFILE sfile;
2970
2971 aux = (struct objdump_disasm_info *) inf->application_data;
2972 section = inf->section;
2973
2974 sfile.alloc = 120;
2975 sfile.buffer = (char *) xmalloc (sfile.alloc);
2976 sfile.pos = 0;
2977
2978 if (insn_width)
2979 octets_per_line = insn_width;
2980 else if (insns)
2981 octets_per_line = 4;
2982 else
2983 octets_per_line = 16;
2984
2985 /* Figure out how many characters to skip at the start of an
2986 address, to make the disassembly look nicer. We discard leading
2987 zeroes in chunks of 4, ensuring that there is always a leading
2988 zero remaining. */
2989 skip_addr_chars = 0;
2990 if (!no_addresses && !prefix_addresses)
2991 {
2992 char buf[30];
2993
2994 bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
2995
2996 while (buf[skip_addr_chars] == '0')
2997 ++skip_addr_chars;
2998
2999 /* Don't discard zeros on overflow. */
3000 if (buf[skip_addr_chars] == '\0' && section->vma != 0)
3001 skip_addr_chars = 0;
3002
3003 if (skip_addr_chars != 0)
3004 skip_addr_chars = (skip_addr_chars - 1) & -4;
3005 }
3006
3007 inf->insn_info_valid = 0;
3008
3009 /* Determine maximum level. */
3010 uint8_t *color_buffer = NULL;
3011 char *line_buffer = NULL;
3012 int max_level = -1;
3013
3014 /* Some jumps were detected. */
3015 if (detected_jumps)
3016 {
3017 struct jump_info *ji;
3018
3019 /* Find maximum jump level. */
3020 for (ji = detected_jumps; ji; ji = ji->next)
3021 {
3022 if (ji->level > max_level)
3023 max_level = ji->level;
3024 }
3025
3026 /* Allocate buffers. */
3027 size_t len = (max_level + 1) * 3 + 1;
3028 line_buffer = xmalloc (len);
3029 line_buffer[len - 1] = 0;
3030 color_buffer = xmalloc (len);
3031 color_buffer[len - 1] = 0;
3032 }
3033
3034 addr_offset = start_offset;
3035 while (addr_offset < stop_offset)
3036 {
3037 bool need_nl = false;
3038
3039 octets = 0;
3040
3041 /* Make sure we don't use relocs from previous instructions. */
3042 aux->reloc = NULL;
3043
3044 /* If we see more than SKIP_ZEROES octets of zeroes, we just
3045 print `...'. */
3046 if (! disassemble_zeroes)
3047 for (; addr_offset * opb + octets < stop_offset * opb; octets++)
3048 if (data[addr_offset * opb + octets] != 0)
3049 break;
3050 if (! disassemble_zeroes
3051 && (inf->insn_info_valid == 0
3052 || inf->branch_delay_insns == 0)
3053 && (octets >= skip_zeroes
3054 || (addr_offset * opb + octets == stop_offset * opb
3055 && octets < skip_zeroes_at_end)))
3056 {
3057 /* If there are more nonzero octets to follow, we only skip
3058 zeroes in multiples of 4, to try to avoid running over
3059 the start of an instruction which happens to start with
3060 zero. */
3061 if (addr_offset * opb + octets != stop_offset * opb)
3062 octets &= ~3;
3063
3064 /* If we are going to display more data, and we are displaying
3065 file offsets, then tell the user how many zeroes we skip
3066 and the file offset from where we resume dumping. */
3067 if (display_file_offsets
3068 && addr_offset + octets / opb < stop_offset)
3069 printf (_("\t... (skipping %lu zeroes, "
3070 "resuming at file offset: 0x%lx)\n"),
3071 (unsigned long) (octets / opb),
3072 (unsigned long) (section->filepos
3073 + addr_offset + octets / opb));
3074 else
3075 printf ("\t...\n");
3076 }
3077 else
3078 {
3079 char buf[50];
3080 unsigned int bpc = 0;
3081 unsigned int pb = 0;
3082
3083 if (with_line_numbers || with_source_code)
3084 show_line (aux->abfd, section, addr_offset);
3085
3086 if (no_addresses)
3087 printf ("\t");
3088 else if (!prefix_addresses)
3089 {
3090 char *s;
3091
3092 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
3093 for (s = buf + skip_addr_chars; *s == '0'; s++)
3094 *s = ' ';
3095 if (*s == '\0')
3096 *--s = '0';
3097 printf ("%s:\t", buf + skip_addr_chars);
3098 }
3099 else
3100 {
3101 aux->require_sec = true;
3102 objdump_print_address (section->vma + addr_offset, inf);
3103 aux->require_sec = false;
3104 putchar (' ');
3105 }
3106
3107 print_jump_visualisation (section->vma + addr_offset,
3108 max_level, line_buffer,
3109 color_buffer);
3110
3111 if (insns)
3112 {
3113 int insn_size;
3114
3115 sfile.pos = 0;
3116 disassemble_set_printf
3117 (inf, &sfile, (fprintf_ftype) objdump_sprintf,
3118 (fprintf_styled_ftype) objdump_styled_sprintf);
3119 inf->bytes_per_line = 0;
3120 inf->bytes_per_chunk = 0;
3121 inf->flags = ((disassemble_all ? DISASSEMBLE_DATA : 0)
3122 | (wide_output ? WIDE_OUTPUT : 0));
3123 if (machine)
3124 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
3125
3126 if (inf->disassembler_needs_relocs
3127 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
3128 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
3129 && *relppp < relppend)
3130 {
3131 bfd_signed_vma distance_to_rel;
3132 int max_reloc_offset
3133 = aux->abfd->arch_info->max_reloc_offset_into_insn;
3134
3135 distance_to_rel = ((**relppp)->address - rel_offset
3136 - addr_offset);
3137
3138 insn_size = 0;
3139 if (distance_to_rel > 0
3140 && (max_reloc_offset < 0
3141 || distance_to_rel <= max_reloc_offset))
3142 {
3143 /* This reloc *might* apply to the current insn,
3144 starting somewhere inside it. Discover the length
3145 of the current insn so that the check below will
3146 work. */
3147 if (insn_width)
3148 insn_size = insn_width;
3149 else
3150 {
3151 /* We find the length by calling the dissassembler
3152 function with a dummy print handler. This should
3153 work unless the disassembler is not expecting to
3154 be called multiple times for the same address.
3155
3156 This does mean disassembling the instruction
3157 twice, but we only do this when there is a high
3158 probability that there is a reloc that will
3159 affect the instruction. */
3160 disassemble_set_printf
3161 (inf, inf->stream, (fprintf_ftype) null_print,
3162 (fprintf_styled_ftype) null_styled_print);
3163 insn_size = disassemble_fn (section->vma
3164 + addr_offset, inf);
3165 disassemble_set_printf
3166 (inf, inf->stream,
3167 (fprintf_ftype) objdump_sprintf,
3168 (fprintf_styled_ftype) objdump_styled_sprintf);
3169 }
3170 }
3171
3172 /* Check to see if the current reloc is associated with
3173 the instruction that we are about to disassemble. */
3174 if (distance_to_rel == 0
3175 || (distance_to_rel > 0
3176 && distance_to_rel < insn_size / (int) opb))
3177 {
3178 inf->flags |= INSN_HAS_RELOC;
3179 aux->reloc = **relppp;
3180 }
3181 }
3182
3183 if (! disassemble_all
3184 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
3185 == (SEC_CODE | SEC_HAS_CONTENTS)))
3186 /* Set a stop_vma so that the disassembler will not read
3187 beyond the next symbol. We assume that symbols appear on
3188 the boundaries between instructions. We only do this when
3189 disassembling code of course, and when -D is in effect. */
3190 inf->stop_vma = section->vma + stop_offset;
3191
3192 inf->stop_offset = stop_offset;
3193 disassembler_in_comment = false;
3194 insn_size = (*disassemble_fn) (section->vma + addr_offset, inf);
3195 octets = insn_size;
3196
3197 inf->stop_vma = 0;
3198 disassemble_set_printf (inf, stdout, (fprintf_ftype) fprintf,
3199 (fprintf_styled_ftype) fprintf_styled);
3200 if (insn_width == 0 && inf->bytes_per_line != 0)
3201 octets_per_line = inf->bytes_per_line;
3202 if (insn_size < (int) opb)
3203 {
3204 if (sfile.pos)
3205 printf ("%s\n", sfile.buffer);
3206 if (insn_size >= 0)
3207 {
3208 non_fatal (_("disassemble_fn returned length %d"),
3209 insn_size);
3210 exit_status = 1;
3211 }
3212 break;
3213 }
3214 }
3215 else
3216 {
3217 bfd_vma j;
3218
3219 octets = octets_per_line;
3220 if (addr_offset + octets / opb > stop_offset)
3221 octets = (stop_offset - addr_offset) * opb;
3222
3223 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
3224 {
3225 if (ISPRINT (data[j]))
3226 buf[j - addr_offset * opb] = data[j];
3227 else
3228 buf[j - addr_offset * opb] = '.';
3229 }
3230 buf[j - addr_offset * opb] = '\0';
3231 }
3232
3233 if (prefix_addresses
3234 ? show_raw_insn > 0
3235 : show_raw_insn >= 0)
3236 {
3237 bfd_vma j;
3238
3239 /* If ! prefix_addresses and ! wide_output, we print
3240 octets_per_line octets per line. */
3241 pb = octets;
3242 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
3243 pb = octets_per_line;
3244
3245 if (inf->bytes_per_chunk)
3246 bpc = inf->bytes_per_chunk;
3247 else
3248 bpc = 1;
3249
3250 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
3251 {
3252 /* PR 21580: Check for a buffer ending early. */
3253 if (j + bpc <= stop_offset * opb)
3254 {
3255 unsigned int k;
3256
3257 if (inf->display_endian == BFD_ENDIAN_LITTLE)
3258 {
3259 for (k = bpc; k-- != 0; )
3260 printf ("%02x", (unsigned) data[j + k]);
3261 }
3262 else
3263 {
3264 for (k = 0; k < bpc; k++)
3265 printf ("%02x", (unsigned) data[j + k]);
3266 }
3267 }
3268 putchar (' ');
3269 }
3270
3271 for (; pb < octets_per_line; pb += bpc)
3272 {
3273 unsigned int k;
3274
3275 for (k = 0; k < bpc; k++)
3276 printf (" ");
3277 putchar (' ');
3278 }
3279
3280 /* Separate raw data from instruction by extra space. */
3281 if (insns)
3282 putchar ('\t');
3283 else
3284 printf (" ");
3285 }
3286
3287 if (! insns)
3288 printf ("%s", buf);
3289 else if (sfile.pos)
3290 printf ("%s", sfile.buffer);
3291
3292 if (prefix_addresses
3293 ? show_raw_insn > 0
3294 : show_raw_insn >= 0)
3295 {
3296 while (pb < octets)
3297 {
3298 bfd_vma j;
3299 char *s;
3300
3301 putchar ('\n');
3302 j = addr_offset * opb + pb;
3303
3304 if (no_addresses)
3305 printf ("\t");
3306 else
3307 {
3308 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
3309 for (s = buf + skip_addr_chars; *s == '0'; s++)
3310 *s = ' ';
3311 if (*s == '\0')
3312 *--s = '0';
3313 printf ("%s:\t", buf + skip_addr_chars);
3314 }
3315
3316 print_jump_visualisation (section->vma + j / opb,
3317 max_level, line_buffer,
3318 color_buffer);
3319
3320 pb += octets_per_line;
3321 if (pb > octets)
3322 pb = octets;
3323 for (; j < addr_offset * opb + pb; j += bpc)
3324 {
3325 /* PR 21619: Check for a buffer ending early. */
3326 if (j + bpc <= stop_offset * opb)
3327 {
3328 unsigned int k;
3329
3330 if (inf->display_endian == BFD_ENDIAN_LITTLE)
3331 {
3332 for (k = bpc; k-- != 0; )
3333 printf ("%02x", (unsigned) data[j + k]);
3334 }
3335 else
3336 {
3337 for (k = 0; k < bpc; k++)
3338 printf ("%02x", (unsigned) data[j + k]);
3339 }
3340 }
3341 putchar (' ');
3342 }
3343 }
3344 }
3345
3346 if (!wide_output)
3347 putchar ('\n');
3348 else
3349 need_nl = true;
3350 }
3351
3352 while ((*relppp) < relppend
3353 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
3354 {
3355 if (dump_reloc_info || dump_dynamic_reloc_info)
3356 {
3357 arelent *q;
3358
3359 q = **relppp;
3360
3361 if (wide_output)
3362 putchar ('\t');
3363 else
3364 printf ("\t\t\t");
3365
3366 if (!no_addresses)
3367 {
3368 objdump_print_value (section->vma - rel_offset + q->address,
3369 inf, true);
3370 printf (": ");
3371 }
3372
3373 if (q->howto == NULL)
3374 printf ("*unknown*\t");
3375 else if (q->howto->name)
3376 printf ("%s\t", q->howto->name);
3377 else
3378 printf ("%d\t", q->howto->type);
3379
3380 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
3381 printf ("*unknown*");
3382 else
3383 {
3384 const char *sym_name;
3385
3386 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
3387 if (sym_name != NULL && *sym_name != '\0')
3388 objdump_print_symname (aux->abfd, inf, *q->sym_ptr_ptr);
3389 else
3390 {
3391 asection *sym_sec;
3392
3393 sym_sec = bfd_asymbol_section (*q->sym_ptr_ptr);
3394 sym_name = bfd_section_name (sym_sec);
3395 if (sym_name == NULL || *sym_name == '\0')
3396 sym_name = "*unknown*";
3397 printf ("%s", sanitize_string (sym_name));
3398 }
3399 }
3400
3401 if (q->addend)
3402 {
3403 bfd_vma addend = q->addend;
3404 if ((bfd_signed_vma) addend < 0)
3405 {
3406 printf ("-0x");
3407 addend = -addend;
3408 }
3409 else
3410 printf ("+0x");
3411 objdump_print_value (addend, inf, true);
3412 }
3413
3414 printf ("\n");
3415 need_nl = false;
3416 }
3417 ++(*relppp);
3418 }
3419
3420 if (need_nl)
3421 printf ("\n");
3422
3423 addr_offset += octets / opb;
3424 }
3425
3426 free (sfile.buffer);
3427 free (line_buffer);
3428 free (color_buffer);
3429 }
3430
3431 static void
3432 disassemble_section (bfd *abfd, asection *section, void *inf)
3433 {
3434 const struct elf_backend_data *bed;
3435 bfd_vma sign_adjust = 0;
3436 struct disassemble_info *pinfo = (struct disassemble_info *) inf;
3437 struct objdump_disasm_info *paux;
3438 unsigned int opb = pinfo->octets_per_byte;
3439 bfd_byte *data = NULL;
3440 bfd_size_type datasize = 0;
3441 arelent **rel_pp = NULL;
3442 arelent **rel_ppstart = NULL;
3443 arelent **rel_ppend;
3444 bfd_vma stop_offset;
3445 asymbol *sym = NULL;
3446 long place = 0;
3447 long rel_count;
3448 bfd_vma rel_offset;
3449 unsigned long addr_offset;
3450 bool do_print;
3451 enum loop_control
3452 {
3453 stop_offset_reached,
3454 function_sym,
3455 next_sym
3456 } loop_until;
3457
3458 /* Sections that do not contain machine
3459 code are not normally disassembled. */
3460 if (! disassemble_all
3461 && only_list == NULL
3462 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
3463 != (SEC_CODE | SEC_HAS_CONTENTS)))
3464 return;
3465
3466 if (! process_section_p (section))
3467 return;
3468
3469 datasize = bfd_section_size (section);
3470 if (datasize == 0)
3471 return;
3472
3473 if (start_address == (bfd_vma) -1
3474 || start_address < section->vma)
3475 addr_offset = 0;
3476 else
3477 addr_offset = start_address - section->vma;
3478
3479 if (stop_address == (bfd_vma) -1)
3480 stop_offset = datasize / opb;
3481 else
3482 {
3483 if (stop_address < section->vma)
3484 stop_offset = 0;
3485 else
3486 stop_offset = stop_address - section->vma;
3487 if (stop_offset > datasize / opb)
3488 stop_offset = datasize / opb;
3489 }
3490
3491 if (addr_offset >= stop_offset)
3492 return;
3493
3494 /* Decide which set of relocs to use. Load them if necessary. */
3495 paux = (struct objdump_disasm_info *) pinfo->application_data;
3496 if (pinfo->dynrelbuf && dump_dynamic_reloc_info)
3497 {
3498 rel_pp = pinfo->dynrelbuf;
3499 rel_count = pinfo->dynrelcount;
3500 /* Dynamic reloc addresses are absolute, non-dynamic are section
3501 relative. REL_OFFSET specifies the reloc address corresponding
3502 to the start of this section. */
3503 rel_offset = section->vma;
3504 }
3505 else
3506 {
3507 rel_count = 0;
3508 rel_pp = NULL;
3509 rel_offset = 0;
3510
3511 if ((section->flags & SEC_RELOC) != 0
3512 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
3513 {
3514 long relsize;
3515
3516 relsize = bfd_get_reloc_upper_bound (abfd, section);
3517 if (relsize < 0)
3518 bfd_fatal (bfd_get_filename (abfd));
3519
3520 if (relsize > 0)
3521 {
3522 rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
3523 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
3524 if (rel_count < 0)
3525 bfd_fatal (bfd_get_filename (abfd));
3526
3527 /* Sort the relocs by address. */
3528 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
3529 }
3530 }
3531 }
3532 rel_ppend = PTR_ADD (rel_pp, rel_count);
3533
3534 if (!bfd_malloc_and_get_section (abfd, section, &data))
3535 {
3536 non_fatal (_("Reading section %s failed because: %s"),
3537 section->name, bfd_errmsg (bfd_get_error ()));
3538 return;
3539 }
3540
3541 pinfo->buffer = data;
3542 pinfo->buffer_vma = section->vma;
3543 pinfo->buffer_length = datasize;
3544 pinfo->section = section;
3545
3546 /* Sort the symbols into value and section order. */
3547 compare_section = section;
3548 if (sorted_symcount > 1)
3549 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
3550
3551 /* Skip over the relocs belonging to addresses below the
3552 start address. */
3553 while (rel_pp < rel_ppend
3554 && (*rel_pp)->address < rel_offset + addr_offset)
3555 ++rel_pp;
3556
3557 printf (_("\nDisassembly of section %s:\n"), sanitize_string (section->name));
3558
3559 /* Find the nearest symbol forwards from our current position. */
3560 paux->require_sec = true;
3561 sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
3562 (struct disassemble_info *) inf,
3563 &place);
3564 paux->require_sec = false;
3565
3566 /* PR 9774: If the target used signed addresses then we must make
3567 sure that we sign extend the value that we calculate for 'addr'
3568 in the loop below. */
3569 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
3570 && (bed = get_elf_backend_data (abfd)) != NULL
3571 && bed->sign_extend_vma)
3572 sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
3573
3574 /* Disassemble a block of instructions up to the address associated with
3575 the symbol we have just found. Then print the symbol and find the
3576 next symbol on. Repeat until we have disassembled the entire section
3577 or we have reached the end of the address range we are interested in. */
3578 do_print = paux->symbol == NULL;
3579 loop_until = stop_offset_reached;
3580
3581 while (addr_offset < stop_offset)
3582 {
3583 bfd_vma addr;
3584 asymbol *nextsym;
3585 bfd_vma nextstop_offset;
3586 bool insns;
3587
3588 addr = section->vma + addr_offset;
3589 addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
3590
3591 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
3592 {
3593 int x;
3594
3595 for (x = place;
3596 (x < sorted_symcount
3597 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
3598 ++x)
3599 continue;
3600
3601 pinfo->symbols = sorted_syms + place;
3602 pinfo->num_symbols = x - place;
3603 pinfo->symtab_pos = place;
3604 }
3605 else
3606 {
3607 pinfo->symbols = NULL;
3608 pinfo->num_symbols = 0;
3609 pinfo->symtab_pos = -1;
3610 }
3611
3612 /* If we are only disassembling from a specific symbol,
3613 check to see if we should start or stop displaying. */
3614 if (sym && paux->symbol)
3615 {
3616 if (do_print)
3617 {
3618 /* See if we should stop printing. */
3619 switch (loop_until)
3620 {
3621 case function_sym:
3622 if (sym->flags & BSF_FUNCTION)
3623 do_print = false;
3624 break;
3625
3626 case stop_offset_reached:
3627 /* Handled by the while loop. */
3628 break;
3629
3630 case next_sym:
3631 /* FIXME: There is an implicit assumption here
3632 that the name of sym is different from
3633 paux->symbol. */
3634 if (! bfd_is_local_label (abfd, sym))
3635 do_print = false;
3636 break;
3637 }
3638 }
3639 else
3640 {
3641 const char * name = bfd_asymbol_name (sym);
3642 char * alloc = NULL;
3643
3644 if (do_demangle && name[0] != '\0')
3645 {
3646 /* Demangle the name. */
3647 alloc = bfd_demangle (abfd, name, demangle_flags);
3648 if (alloc != NULL)
3649 name = alloc;
3650 }
3651
3652 /* We are not currently printing. Check to see
3653 if the current symbol matches the requested symbol. */
3654 if (streq (name, paux->symbol))
3655 {
3656 do_print = true;
3657
3658 if (sym->flags & BSF_FUNCTION)
3659 {
3660 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
3661 && ((elf_symbol_type *) sym)->internal_elf_sym.st_size > 0)
3662 {
3663 /* Sym is a function symbol with a size associated
3664 with it. Turn on automatic disassembly for the
3665 next VALUE bytes. */
3666 stop_offset = addr_offset
3667 + ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
3668 loop_until = stop_offset_reached;
3669 }
3670 else
3671 {
3672 /* Otherwise we need to tell the loop heuristic to
3673 loop until the next function symbol is encountered. */
3674 loop_until = function_sym;
3675 }
3676 }
3677 else
3678 {
3679 /* Otherwise loop until the next symbol is encountered. */
3680 loop_until = next_sym;
3681 }
3682 }
3683
3684 free (alloc);
3685 }
3686 }
3687
3688 if (! prefix_addresses && do_print)
3689 {
3690 pinfo->fprintf_func (pinfo->stream, "\n");
3691 objdump_print_addr_with_sym (abfd, section, sym, addr,
3692 pinfo, false);
3693 pinfo->fprintf_func (pinfo->stream, ":\n");
3694 }
3695
3696 if (sym != NULL && bfd_asymbol_value (sym) > addr)
3697 nextsym = sym;
3698 else if (sym == NULL)
3699 nextsym = NULL;
3700 else
3701 {
3702 #define is_valid_next_sym(SYM) \
3703 (strcmp (bfd_section_name ((SYM)->section), bfd_section_name (section)) == 0 \
3704 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
3705 && pinfo->symbol_is_valid (SYM, pinfo))
3706
3707 /* Search forward for the next appropriate symbol in
3708 SECTION. Note that all the symbols are sorted
3709 together into one big array, and that some sections
3710 may have overlapping addresses. */
3711 while (place < sorted_symcount
3712 && ! is_valid_next_sym (sorted_syms [place]))
3713 ++place;
3714
3715 if (place >= sorted_symcount)
3716 nextsym = NULL;
3717 else
3718 nextsym = sorted_syms[place];
3719 }
3720
3721 if (sym != NULL && bfd_asymbol_value (sym) > addr)
3722 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
3723 else if (nextsym == NULL)
3724 nextstop_offset = stop_offset;
3725 else
3726 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
3727
3728 if (nextstop_offset > stop_offset
3729 || nextstop_offset <= addr_offset)
3730 nextstop_offset = stop_offset;
3731
3732 /* If a symbol is explicitly marked as being an object
3733 rather than a function, just dump the bytes without
3734 disassembling them. */
3735 if (disassemble_all
3736 || sym == NULL
3737 || sym->section != section
3738 || bfd_asymbol_value (sym) > addr
3739 || ((sym->flags & BSF_OBJECT) == 0
3740 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
3741 == NULL)
3742 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
3743 == NULL))
3744 || (sym->flags & BSF_FUNCTION) != 0)
3745 insns = true;
3746 else
3747 insns = false;
3748
3749 if (do_print)
3750 {
3751 /* Resolve symbol name. */
3752 if (visualize_jumps && abfd && sym && sym->name)
3753 {
3754 struct disassemble_info di;
3755 SFILE sf;
3756
3757 sf.alloc = strlen (sym->name) + 40;
3758 sf.buffer = (char*) xmalloc (sf.alloc);
3759 sf.pos = 0;
3760 disassemble_set_printf
3761 (&di, &sf, (fprintf_ftype) objdump_sprintf,
3762 (fprintf_styled_ftype) objdump_styled_sprintf);
3763
3764 objdump_print_symname (abfd, &di, sym);
3765
3766 /* Fetch jump information. */
3767 detected_jumps = disassemble_jumps
3768 (pinfo, paux->disassemble_fn,
3769 addr_offset, nextstop_offset,
3770 rel_offset, &rel_pp, rel_ppend);
3771
3772 /* Free symbol name. */
3773 free (sf.buffer);
3774 }
3775
3776 /* Add jumps to output. */
3777 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
3778 addr_offset, nextstop_offset,
3779 rel_offset, &rel_pp, rel_ppend);
3780
3781 /* Free jumps. */
3782 while (detected_jumps)
3783 {
3784 detected_jumps = jump_info_free (detected_jumps);
3785 }
3786 }
3787
3788 addr_offset = nextstop_offset;
3789 sym = nextsym;
3790 }
3791
3792 free (data);
3793
3794 if (rel_ppstart != NULL)
3795 free (rel_ppstart);
3796 }
3797
3798 /* Disassemble the contents of an object file. */
3799
3800 static void
3801 disassemble_data (bfd *abfd)
3802 {
3803 struct disassemble_info disasm_info;
3804 struct objdump_disasm_info aux;
3805 long i;
3806
3807 print_files = NULL;
3808 prev_functionname = NULL;
3809 prev_line = -1;
3810 prev_discriminator = 0;
3811
3812 /* We make a copy of syms to sort. We don't want to sort syms
3813 because that will screw up the relocs. */
3814 sorted_symcount = symcount ? symcount : dynsymcount;
3815 sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
3816 * sizeof (asymbol *));
3817 if (sorted_symcount != 0)
3818 {
3819 memcpy (sorted_syms, symcount ? syms : dynsyms,
3820 sorted_symcount * sizeof (asymbol *));
3821
3822 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
3823 }
3824
3825 for (i = 0; i < synthcount; ++i)
3826 {
3827 sorted_syms[sorted_symcount] = synthsyms + i;
3828 ++sorted_symcount;
3829 }
3830
3831 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf,
3832 (fprintf_styled_ftype) fprintf_styled);
3833 disasm_info.application_data = (void *) &aux;
3834 aux.abfd = abfd;
3835 aux.require_sec = false;
3836 disasm_info.dynrelbuf = NULL;
3837 disasm_info.dynrelcount = 0;
3838 aux.reloc = NULL;
3839 aux.symbol = disasm_sym;
3840
3841 disasm_info.print_address_func = objdump_print_address;
3842 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
3843
3844 if (machine != NULL)
3845 {
3846 const bfd_arch_info_type *inf = bfd_scan_arch (machine);
3847
3848 if (inf == NULL)
3849 fatal (_("can't use supplied machine %s"), machine);
3850
3851 abfd->arch_info = inf;
3852 }
3853
3854 if (endian != BFD_ENDIAN_UNKNOWN)
3855 {
3856 struct bfd_target *xvec;
3857
3858 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
3859 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
3860 xvec->byteorder = endian;
3861 abfd->xvec = xvec;
3862 }
3863
3864 /* Use libopcodes to locate a suitable disassembler. */
3865 aux.disassemble_fn = disassembler (bfd_get_arch (abfd),
3866 bfd_big_endian (abfd),
3867 bfd_get_mach (abfd), abfd);
3868 if (!aux.disassemble_fn)
3869 {
3870 non_fatal (_("can't disassemble for architecture %s\n"),
3871 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
3872 exit_status = 1;
3873 return;
3874 }
3875
3876 disasm_info.flavour = bfd_get_flavour (abfd);
3877 disasm_info.arch = bfd_get_arch (abfd);
3878 disasm_info.mach = bfd_get_mach (abfd);
3879 disasm_info.disassembler_options = disassembler_options;
3880 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd, NULL);
3881 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
3882 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
3883 disasm_info.disassembler_needs_relocs = false;
3884
3885 if (bfd_big_endian (abfd))
3886 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
3887 else if (bfd_little_endian (abfd))
3888 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
3889 else
3890 /* ??? Aborting here seems too drastic. We could default to big or little
3891 instead. */
3892 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
3893
3894 disasm_info.endian_code = disasm_info.endian;
3895
3896 /* Allow the target to customize the info structure. */
3897 disassemble_init_for_target (& disasm_info);
3898
3899 /* Pre-load the dynamic relocs as we may need them during the disassembly. */
3900 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3901
3902 if (relsize < 0 && dump_dynamic_reloc_info)
3903 bfd_fatal (bfd_get_filename (abfd));
3904
3905 if (relsize > 0)
3906 {
3907 disasm_info.dynrelbuf = (arelent **) xmalloc (relsize);
3908 disasm_info.dynrelcount
3909 = bfd_canonicalize_dynamic_reloc (abfd, disasm_info.dynrelbuf, dynsyms);
3910 if (disasm_info.dynrelcount < 0)
3911 bfd_fatal (bfd_get_filename (abfd));
3912
3913 /* Sort the relocs by address. */
3914 qsort (disasm_info.dynrelbuf, disasm_info.dynrelcount, sizeof (arelent *),
3915 compare_relocs);
3916 }
3917
3918 disasm_info.symtab = sorted_syms;
3919 disasm_info.symtab_size = sorted_symcount;
3920
3921 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
3922
3923 free (disasm_info.dynrelbuf);
3924 disasm_info.dynrelbuf = NULL;
3925 free (sorted_syms);
3926 disassemble_free_target (&disasm_info);
3927 }
3928 \f
3929 static bool
3930 load_specific_debug_section (enum dwarf_section_display_enum debug,
3931 asection *sec, void *file)
3932 {
3933 struct dwarf_section *section = &debug_displays [debug].section;
3934 bfd *abfd = (bfd *) file;
3935 bfd_byte *contents;
3936 bfd_size_type amt;
3937 size_t alloced;
3938 bool ret;
3939
3940 if (section->start != NULL)
3941 {
3942 /* If it is already loaded, do nothing. */
3943 if (streq (section->filename, bfd_get_filename (abfd)))
3944 return true;
3945 free (section->start);
3946 }
3947
3948 section->filename = bfd_get_filename (abfd);
3949 section->reloc_info = NULL;
3950 section->num_relocs = 0;
3951 section->address = bfd_section_vma (sec);
3952 section->size = bfd_section_size (sec);
3953 /* PR 24360: On 32-bit hosts sizeof (size_t) < sizeof (bfd_size_type). */
3954 alloced = amt = section->size + 1;
3955 if (alloced != amt || alloced == 0)
3956 {
3957 section->start = NULL;
3958 free_debug_section (debug);
3959 printf (_("\nSection '%s' has an invalid size: %#llx.\n"),
3960 sanitize_string (section->name),
3961 (unsigned long long) section->size);
3962 return false;
3963 }
3964
3965 section->start = contents = xmalloc (alloced);
3966 /* Ensure any string section has a terminating NUL. */
3967 section->start[section->size] = 0;
3968
3969 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
3970 && debug_displays [debug].relocate)
3971 {
3972 ret = bfd_simple_get_relocated_section_contents (abfd,
3973 sec,
3974 section->start,
3975 syms) != NULL;
3976 if (ret)
3977 {
3978 long reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
3979
3980 if (reloc_size > 0)
3981 {
3982 unsigned long reloc_count;
3983 arelent **relocs;
3984
3985 relocs = (arelent **) xmalloc (reloc_size);
3986
3987 reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
3988 if (reloc_count == 0)
3989 free (relocs);
3990 else
3991 {
3992 section->reloc_info = relocs;
3993 section->num_relocs = reloc_count;
3994 }
3995 }
3996 }
3997 }
3998 else
3999 ret = bfd_get_full_section_contents (abfd, sec, &contents);
4000
4001 if (!ret)
4002 {
4003 free_debug_section (debug);
4004 printf (_("\nCan't get contents for section '%s'.\n"),
4005 sanitize_string (section->name));
4006 return false;
4007 }
4008
4009 return true;
4010 }
4011
4012 bool
4013 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
4014 {
4015 arelent ** relocs;
4016 arelent * rp;
4017
4018 if (dsec == NULL || dsec->reloc_info == NULL)
4019 return false;
4020
4021 relocs = (arelent **) dsec->reloc_info;
4022
4023 for (; (rp = * relocs) != NULL; ++ relocs)
4024 if (rp->address == offset)
4025 return true;
4026
4027 return false;
4028 }
4029
4030 bool
4031 load_debug_section (enum dwarf_section_display_enum debug, void *file)
4032 {
4033 struct dwarf_section *section = &debug_displays [debug].section;
4034 bfd *abfd = (bfd *) file;
4035 asection *sec;
4036 const char *name;
4037
4038 if (!dump_any_debugging)
4039 return false;
4040
4041 /* If it is already loaded, do nothing. */
4042 if (section->start != NULL)
4043 {
4044 if (streq (section->filename, bfd_get_filename (abfd)))
4045 return true;
4046 }
4047 /* Locate the debug section. */
4048 name = section->uncompressed_name;
4049 sec = bfd_get_section_by_name (abfd, name);
4050 if (sec == NULL)
4051 {
4052 name = section->compressed_name;
4053 if (*name)
4054 sec = bfd_get_section_by_name (abfd, name);
4055 }
4056 if (sec == NULL)
4057 {
4058 name = section->xcoff_name;
4059 if (*name)
4060 sec = bfd_get_section_by_name (abfd, name);
4061 }
4062 if (sec == NULL)
4063 return false;
4064
4065 section->name = name;
4066 return load_specific_debug_section (debug, sec, file);
4067 }
4068
4069 void
4070 free_debug_section (enum dwarf_section_display_enum debug)
4071 {
4072 struct dwarf_section *section = &debug_displays [debug].section;
4073
4074 free ((char *) section->start);
4075 section->start = NULL;
4076 section->address = 0;
4077 section->size = 0;
4078 }
4079
4080 void
4081 close_debug_file (void * file)
4082 {
4083 bfd * abfd = (bfd *) file;
4084
4085 bfd_close (abfd);
4086 }
4087
4088 void *
4089 open_debug_file (const char * pathname)
4090 {
4091 bfd * data;
4092
4093 data = bfd_openr (pathname, NULL);
4094 if (data == NULL)
4095 return NULL;
4096
4097 if (! bfd_check_format (data, bfd_object))
4098 return NULL;
4099
4100 return data;
4101 }
4102
4103 #if HAVE_LIBDEBUGINFOD
4104 /* Return a hex string represention of the build-id. */
4105
4106 unsigned char *
4107 get_build_id (void * data)
4108 {
4109 unsigned i;
4110 char * build_id_str;
4111 bfd * abfd = (bfd *) data;
4112 const struct bfd_build_id * build_id;
4113
4114 build_id = abfd->build_id;
4115 if (build_id == NULL)
4116 return NULL;
4117
4118 build_id_str = malloc (build_id->size * 2 + 1);
4119 if (build_id_str == NULL)
4120 return NULL;
4121
4122 for (i = 0; i < build_id->size; i++)
4123 sprintf (build_id_str + (i * 2), "%02x", build_id->data[i]);
4124 build_id_str[build_id->size * 2] = '\0';
4125
4126 return (unsigned char *)build_id_str;
4127 }
4128 #endif /* HAVE_LIBDEBUGINFOD */
4129
4130 static void
4131 dump_dwarf_section (bfd *abfd, asection *section,
4132 void *arg)
4133 {
4134 const char *name = bfd_section_name (section);
4135 const char *match;
4136 int i;
4137 bool is_mainfile = *(bool *) arg;
4138
4139 if (*name == 0)
4140 return;
4141
4142 if (!is_mainfile && !process_links
4143 && (section->flags & SEC_DEBUGGING) == 0)
4144 return;
4145
4146 if (startswith (name, ".gnu.linkonce.wi."))
4147 match = ".debug_info";
4148 else
4149 match = name;
4150
4151 for (i = 0; i < max; i++)
4152 if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
4153 || strcmp (debug_displays [i].section.compressed_name, match) == 0
4154 || strcmp (debug_displays [i].section.xcoff_name, match) == 0)
4155 && debug_displays [i].enabled != NULL
4156 && *debug_displays [i].enabled)
4157 {
4158 struct dwarf_section *sec = &debug_displays [i].section;
4159
4160 if (strcmp (sec->uncompressed_name, match) == 0)
4161 sec->name = sec->uncompressed_name;
4162 else if (strcmp (sec->compressed_name, match) == 0)
4163 sec->name = sec->compressed_name;
4164 else
4165 sec->name = sec->xcoff_name;
4166 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
4167 section, abfd))
4168 {
4169 debug_displays [i].display (sec, abfd);
4170
4171 if (i != info && i != abbrev)
4172 free_debug_section ((enum dwarf_section_display_enum) i);
4173 }
4174 break;
4175 }
4176 }
4177
4178 /* Dump the dwarf debugging information. */
4179
4180 static void
4181 dump_dwarf (bfd *abfd, bool is_mainfile)
4182 {
4183 /* The byte_get pointer should have been set at the start of dump_bfd(). */
4184 if (byte_get == NULL)
4185 {
4186 warn (_("File %s does not contain any dwarf debug information\n"),
4187 bfd_get_filename (abfd));
4188 return;
4189 }
4190
4191 switch (bfd_get_arch (abfd))
4192 {
4193 case bfd_arch_s12z:
4194 /* S12Z has a 24 bit address space. But the only known
4195 producer of dwarf_info encodes addresses into 32 bits. */
4196 eh_addr_size = 4;
4197 break;
4198
4199 default:
4200 eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
4201 break;
4202 }
4203
4204 init_dwarf_regnames_by_bfd_arch_and_mach (bfd_get_arch (abfd),
4205 bfd_get_mach (abfd));
4206
4207 bfd_map_over_sections (abfd, dump_dwarf_section, (void *) &is_mainfile);
4208 }
4209 \f
4210 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
4211 it. Return NULL on failure. */
4212
4213 static bfd_byte *
4214 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr,
4215 bfd_size_type *entsize_ptr)
4216 {
4217 asection *stabsect;
4218 bfd_byte *contents;
4219
4220 stabsect = bfd_get_section_by_name (abfd, sect_name);
4221 if (stabsect == NULL)
4222 {
4223 printf (_("No %s section present\n\n"),
4224 sanitize_string (sect_name));
4225 return false;
4226 }
4227
4228 if (!bfd_malloc_and_get_section (abfd, stabsect, &contents))
4229 {
4230 non_fatal (_("reading %s section of %s failed: %s"),
4231 sect_name, bfd_get_filename (abfd),
4232 bfd_errmsg (bfd_get_error ()));
4233 exit_status = 1;
4234 free (contents);
4235 return NULL;
4236 }
4237
4238 *size_ptr = bfd_section_size (stabsect);
4239 if (entsize_ptr)
4240 *entsize_ptr = stabsect->entsize;
4241
4242 return contents;
4243 }
4244
4245 /* Stabs entries use a 12 byte format:
4246 4 byte string table index
4247 1 byte stab type
4248 1 byte stab other field
4249 2 byte stab desc field
4250 4 byte stab value
4251 FIXME: This will have to change for a 64 bit object format. */
4252
4253 #define STRDXOFF (0)
4254 #define TYPEOFF (4)
4255 #define OTHEROFF (5)
4256 #define DESCOFF (6)
4257 #define VALOFF (8)
4258 #define STABSIZE (12)
4259
4260 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
4261 using string table section STRSECT_NAME (in `strtab'). */
4262
4263 static void
4264 print_section_stabs (bfd *abfd,
4265 const char *stabsect_name,
4266 unsigned *string_offset_ptr)
4267 {
4268 int i;
4269 unsigned file_string_table_offset = 0;
4270 unsigned next_file_string_table_offset = *string_offset_ptr;
4271 bfd_byte *stabp, *stabs_end;
4272
4273 stabp = stabs;
4274 stabs_end = stabp + stab_size;
4275
4276 printf (_("Contents of %s section:\n\n"), sanitize_string (stabsect_name));
4277 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
4278
4279 /* Loop through all symbols and print them.
4280
4281 We start the index at -1 because there is a dummy symbol on
4282 the front of stabs-in-{coff,elf} sections that supplies sizes. */
4283 for (i = -1; stabp <= stabs_end - STABSIZE; stabp += STABSIZE, i++)
4284 {
4285 const char *name;
4286 unsigned long strx;
4287 unsigned char type, other;
4288 unsigned short desc;
4289 bfd_vma value;
4290
4291 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
4292 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
4293 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
4294 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
4295 value = bfd_h_get_32 (abfd, stabp + VALOFF);
4296
4297 printf ("\n%-6d ", i);
4298 /* Either print the stab name, or, if unnamed, print its number
4299 again (makes consistent formatting for tools like awk). */
4300 name = bfd_get_stab_name (type);
4301 if (name != NULL)
4302 printf ("%-6s", sanitize_string (name));
4303 else if (type == N_UNDF)
4304 printf ("HdrSym");
4305 else
4306 printf ("%-6d", type);
4307 printf (" %-6d %-6d ", other, desc);
4308 bfd_printf_vma (abfd, value);
4309 printf (" %-6lu", strx);
4310
4311 /* Symbols with type == 0 (N_UNDF) specify the length of the
4312 string table associated with this file. We use that info
4313 to know how to relocate the *next* file's string table indices. */
4314 if (type == N_UNDF)
4315 {
4316 file_string_table_offset = next_file_string_table_offset;
4317 next_file_string_table_offset += value;
4318 }
4319 else
4320 {
4321 bfd_size_type amt = strx + file_string_table_offset;
4322
4323 /* Using the (possibly updated) string table offset, print the
4324 string (if any) associated with this symbol. */
4325 if (amt < stabstr_size)
4326 /* PR 17512: file: 079-79389-0.001:0.1.
4327 FIXME: May need to sanitize this string before displaying. */
4328 printf (" %.*s", (int)(stabstr_size - amt), strtab + amt);
4329 else
4330 printf (" *");
4331 }
4332 }
4333 printf ("\n\n");
4334 *string_offset_ptr = next_file_string_table_offset;
4335 }
4336
4337 typedef struct
4338 {
4339 const char * section_name;
4340 const char * string_section_name;
4341 unsigned string_offset;
4342 }
4343 stab_section_names;
4344
4345 static void
4346 find_stabs_section (bfd *abfd, asection *section, void *names)
4347 {
4348 int len;
4349 stab_section_names * sought = (stab_section_names *) names;
4350
4351 /* Check for section names for which stabsect_name is a prefix, to
4352 handle .stab.N, etc. */
4353 len = strlen (sought->section_name);
4354
4355 /* If the prefix matches, and the files section name ends with a
4356 nul or a digit, then we match. I.e., we want either an exact
4357 match or a section followed by a number. */
4358 if (strncmp (sought->section_name, section->name, len) == 0
4359 && (section->name[len] == 0
4360 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
4361 {
4362 if (strtab == NULL)
4363 strtab = read_section_stabs (abfd, sought->string_section_name,
4364 &stabstr_size, NULL);
4365
4366 if (strtab)
4367 {
4368 stabs = read_section_stabs (abfd, section->name, &stab_size, NULL);
4369 if (stabs)
4370 print_section_stabs (abfd, section->name, &sought->string_offset);
4371 }
4372 }
4373 }
4374
4375 static void
4376 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
4377 {
4378 stab_section_names s;
4379
4380 s.section_name = stabsect_name;
4381 s.string_section_name = strsect_name;
4382 s.string_offset = 0;
4383
4384 bfd_map_over_sections (abfd, find_stabs_section, & s);
4385
4386 free (strtab);
4387 strtab = NULL;
4388 }
4389
4390 /* Dump the any sections containing stabs debugging information. */
4391
4392 static void
4393 dump_stabs (bfd *abfd)
4394 {
4395 dump_stabs_section (abfd, ".stab", ".stabstr");
4396 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
4397 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
4398
4399 /* For Darwin. */
4400 dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
4401
4402 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
4403 }
4404 \f
4405 static void
4406 dump_bfd_header (bfd *abfd)
4407 {
4408 char *comma = "";
4409
4410 printf (_("architecture: %s, "),
4411 bfd_printable_arch_mach (bfd_get_arch (abfd),
4412 bfd_get_mach (abfd)));
4413 printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
4414
4415 #define PF(x, y) if (abfd->flags & x) {printf ("%s%s", comma, y); comma=", ";}
4416 PF (HAS_RELOC, "HAS_RELOC");
4417 PF (EXEC_P, "EXEC_P");
4418 PF (HAS_LINENO, "HAS_LINENO");
4419 PF (HAS_DEBUG, "HAS_DEBUG");
4420 PF (HAS_SYMS, "HAS_SYMS");
4421 PF (HAS_LOCALS, "HAS_LOCALS");
4422 PF (DYNAMIC, "DYNAMIC");
4423 PF (WP_TEXT, "WP_TEXT");
4424 PF (D_PAGED, "D_PAGED");
4425 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
4426 printf (_("\nstart address 0x"));
4427 bfd_printf_vma (abfd, abfd->start_address);
4428 printf ("\n");
4429 }
4430 \f
4431
4432 #ifdef ENABLE_LIBCTF
4433 /* Formatting callback function passed to ctf_dump. Returns either the pointer
4434 it is passed, or a pointer to newly-allocated storage, in which case
4435 dump_ctf() will free it when it no longer needs it. */
4436
4437 static char *
4438 dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
4439 char *s, void *arg)
4440 {
4441 const char *blanks = arg;
4442 char *new_s;
4443
4444 if (asprintf (&new_s, "%s%s", blanks, s) < 0)
4445 return s;
4446 return new_s;
4447 }
4448
4449 /* Make a ctfsect suitable for ctf_bfdopen_ctfsect(). */
4450 static ctf_sect_t
4451 make_ctfsect (const char *name, bfd_byte *data,
4452 bfd_size_type size)
4453 {
4454 ctf_sect_t ctfsect;
4455
4456 ctfsect.cts_name = name;
4457 ctfsect.cts_entsize = 1;
4458 ctfsect.cts_size = size;
4459 ctfsect.cts_data = data;
4460
4461 return ctfsect;
4462 }
4463
4464 /* Dump CTF errors/warnings. */
4465 static void
4466 dump_ctf_errs (ctf_dict_t *fp)
4467 {
4468 ctf_next_t *it = NULL;
4469 char *errtext;
4470 int is_warning;
4471 int err;
4472
4473 /* Dump accumulated errors and warnings. */
4474 while ((errtext = ctf_errwarning_next (fp, &it, &is_warning, &err)) != NULL)
4475 {
4476 non_fatal (_("%s: %s"), is_warning ? _("warning"): _("error"),
4477 errtext);
4478 free (errtext);
4479 }
4480 if (err != ECTF_NEXT_END)
4481 {
4482 non_fatal (_("CTF error: cannot get CTF errors: `%s'"),
4483 ctf_errmsg (err));
4484 }
4485 }
4486
4487 /* Dump one CTF archive member. */
4488
4489 static void
4490 dump_ctf_archive_member (ctf_dict_t *ctf, const char *name, ctf_dict_t *parent,
4491 size_t member)
4492 {
4493 const char *things[] = {"Header", "Labels", "Data objects",
4494 "Function objects", "Variables", "Types", "Strings",
4495 ""};
4496 const char **thing;
4497 size_t i;
4498
4499 /* Don't print out the name of the default-named archive member if it appears
4500 first in the list. The name .ctf appears everywhere, even for things that
4501 aren't really archives, so printing it out is liable to be confusing; also,
4502 the common case by far is for only one archive member to exist, and hiding
4503 it in that case seems worthwhile. */
4504
4505 if (strcmp (name, ".ctf") != 0 || member != 0)
4506 printf (_("\nCTF archive member: %s:\n"), sanitize_string (name));
4507
4508 if (ctf_parent_name (ctf) != NULL)
4509 ctf_import (ctf, parent);
4510
4511 for (i = 0, thing = things; *thing[0]; thing++, i++)
4512 {
4513 ctf_dump_state_t *s = NULL;
4514 char *item;
4515
4516 printf ("\n %s:\n", *thing);
4517 while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
4518 (void *) " ")) != NULL)
4519 {
4520 printf ("%s\n", item);
4521 free (item);
4522 }
4523
4524 if (ctf_errno (ctf))
4525 {
4526 non_fatal (_("Iteration failed: %s, %s"), *thing,
4527 ctf_errmsg (ctf_errno (ctf)));
4528 break;
4529 }
4530 }
4531
4532 dump_ctf_errs (ctf);
4533 }
4534
4535 /* Dump the CTF debugging information. */
4536
4537 static void
4538 dump_ctf (bfd *abfd, const char *sect_name, const char *parent_name)
4539 {
4540 ctf_archive_t *ctfa = NULL;
4541 bfd_byte *ctfdata = NULL;
4542 bfd_size_type ctfsize;
4543 ctf_sect_t ctfsect;
4544 ctf_dict_t *parent;
4545 ctf_dict_t *fp;
4546 ctf_next_t *i = NULL;
4547 const char *name;
4548 size_t member = 0;
4549 int err;
4550
4551 if (sect_name == NULL)
4552 sect_name = ".ctf";
4553
4554 if ((ctfdata = read_section_stabs (abfd, sect_name, &ctfsize, NULL)) == NULL)
4555 bfd_fatal (bfd_get_filename (abfd));
4556
4557 /* Load the CTF file and dump it. Preload the parent dict, since it will
4558 need to be imported into every child in turn. */
4559
4560 ctfsect = make_ctfsect (sect_name, ctfdata, ctfsize);
4561 if ((ctfa = ctf_bfdopen_ctfsect (abfd, &ctfsect, &err)) == NULL)
4562 {
4563 dump_ctf_errs (NULL);
4564 non_fatal (_("CTF open failure: %s"), ctf_errmsg (err));
4565 bfd_fatal (bfd_get_filename (abfd));
4566 }
4567
4568 if ((parent = ctf_dict_open (ctfa, parent_name, &err)) == NULL)
4569 {
4570 dump_ctf_errs (NULL);
4571 non_fatal (_("CTF open failure: %s"), ctf_errmsg (err));
4572 bfd_fatal (bfd_get_filename (abfd));
4573 }
4574
4575 printf (_("Contents of CTF section %s:\n"), sanitize_string (sect_name));
4576
4577 while ((fp = ctf_archive_next (ctfa, &i, &name, 0, &err)) != NULL)
4578 dump_ctf_archive_member (fp, name, parent, member++);
4579 if (err != ECTF_NEXT_END)
4580 {
4581 dump_ctf_errs (NULL);
4582 non_fatal (_("CTF archive member open failure: %s"), ctf_errmsg (err));
4583 bfd_fatal (bfd_get_filename (abfd));
4584 }
4585 ctf_dict_close (parent);
4586 ctf_close (ctfa);
4587 free (ctfdata);
4588 }
4589 #else
4590 static void
4591 dump_ctf (bfd *abfd ATTRIBUTE_UNUSED, const char *sect_name ATTRIBUTE_UNUSED,
4592 const char *parent_name ATTRIBUTE_UNUSED) {}
4593 #endif
4594
4595 \f
4596 static void
4597 dump_bfd_private_header (bfd *abfd)
4598 {
4599 if (!bfd_print_private_bfd_data (abfd, stdout))
4600 non_fatal (_("warning: private headers incomplete: %s"),
4601 bfd_errmsg (bfd_get_error ()));
4602 }
4603
4604 static void
4605 dump_target_specific (bfd *abfd)
4606 {
4607 const struct objdump_private_desc * const *desc;
4608 struct objdump_private_option *opt;
4609 char *e, *b;
4610
4611 /* Find the desc. */
4612 for (desc = objdump_private_vectors; *desc != NULL; desc++)
4613 if ((*desc)->filter (abfd))
4614 break;
4615
4616 if (*desc == NULL)
4617 {
4618 non_fatal (_("option -P/--private not supported by this file"));
4619 return;
4620 }
4621
4622 /* Clear all options. */
4623 for (opt = (*desc)->options; opt->name; opt++)
4624 opt->selected = false;
4625
4626 /* Decode options. */
4627 b = dump_private_options;
4628 do
4629 {
4630 e = strchr (b, ',');
4631
4632 if (e)
4633 *e = 0;
4634
4635 for (opt = (*desc)->options; opt->name; opt++)
4636 if (strcmp (opt->name, b) == 0)
4637 {
4638 opt->selected = true;
4639 break;
4640 }
4641 if (opt->name == NULL)
4642 non_fatal (_("target specific dump '%s' not supported"), b);
4643
4644 if (e)
4645 {
4646 *e = ',';
4647 b = e + 1;
4648 }
4649 }
4650 while (e != NULL);
4651
4652 /* Dump. */
4653 (*desc)->dump (abfd);
4654 }
4655 \f
4656 /* Display a section in hexadecimal format with associated characters.
4657 Each line prefixed by the zero padded address. */
4658
4659 static void
4660 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
4661 {
4662 bfd_byte *data = NULL;
4663 bfd_size_type datasize;
4664 bfd_vma addr_offset;
4665 bfd_vma start_offset;
4666 bfd_vma stop_offset;
4667 unsigned int opb = bfd_octets_per_byte (abfd, section);
4668 /* Bytes per line. */
4669 const int onaline = 16;
4670 char buf[64];
4671 int count;
4672 int width;
4673
4674 if (! process_section_p (section))
4675 return;
4676
4677 if ((section->flags & SEC_HAS_CONTENTS) == 0)
4678 return;
4679
4680 if ((datasize = bfd_section_size (section)) == 0)
4681 return;
4682
4683 /* Compute the address range to display. */
4684 if (start_address == (bfd_vma) -1
4685 || start_address < section->vma)
4686 start_offset = 0;
4687 else
4688 start_offset = start_address - section->vma;
4689
4690 if (stop_address == (bfd_vma) -1)
4691 stop_offset = datasize / opb;
4692 else
4693 {
4694 if (stop_address < section->vma)
4695 stop_offset = 0;
4696 else
4697 stop_offset = stop_address - section->vma;
4698
4699 if (stop_offset > datasize / opb)
4700 stop_offset = datasize / opb;
4701 }
4702
4703 if (start_offset >= stop_offset)
4704 return;
4705
4706 printf (_("Contents of section %s:"), sanitize_string (section->name));
4707 if (display_file_offsets)
4708 printf (_(" (Starting at file offset: 0x%lx)"),
4709 (unsigned long) (section->filepos + start_offset));
4710 printf ("\n");
4711
4712 if (!bfd_get_full_section_contents (abfd, section, &data))
4713 {
4714 non_fatal (_("Reading section %s failed because: %s"),
4715 section->name, bfd_errmsg (bfd_get_error ()));
4716 return;
4717 }
4718
4719 width = 4;
4720
4721 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
4722 if (strlen (buf) >= sizeof (buf))
4723 abort ();
4724
4725 count = 0;
4726 while (buf[count] == '0' && buf[count+1] != '\0')
4727 count++;
4728 count = strlen (buf) - count;
4729 if (count > width)
4730 width = count;
4731
4732 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
4733 if (strlen (buf) >= sizeof (buf))
4734 abort ();
4735
4736 count = 0;
4737 while (buf[count] == '0' && buf[count+1] != '\0')
4738 count++;
4739 count = strlen (buf) - count;
4740 if (count > width)
4741 width = count;
4742
4743 for (addr_offset = start_offset;
4744 addr_offset < stop_offset; addr_offset += onaline / opb)
4745 {
4746 bfd_size_type j;
4747
4748 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
4749 count = strlen (buf);
4750 if ((size_t) count >= sizeof (buf))
4751 abort ();
4752
4753 putchar (' ');
4754 while (count < width)
4755 {
4756 putchar ('0');
4757 count++;
4758 }
4759 fputs (buf + count - width, stdout);
4760 putchar (' ');
4761
4762 for (j = addr_offset * opb;
4763 j < addr_offset * opb + onaline; j++)
4764 {
4765 if (j < stop_offset * opb)
4766 printf ("%02x", (unsigned) (data[j]));
4767 else
4768 printf (" ");
4769 if ((j & 3) == 3)
4770 printf (" ");
4771 }
4772
4773 printf (" ");
4774 for (j = addr_offset * opb;
4775 j < addr_offset * opb + onaline; j++)
4776 {
4777 if (j >= stop_offset * opb)
4778 printf (" ");
4779 else
4780 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
4781 }
4782 putchar ('\n');
4783 }
4784 free (data);
4785 }
4786
4787 /* Actually display the various requested regions. */
4788
4789 static void
4790 dump_data (bfd *abfd)
4791 {
4792 bfd_map_over_sections (abfd, dump_section, NULL);
4793 }
4794
4795 /* Should perhaps share code and display with nm? */
4796
4797 static void
4798 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bool dynamic)
4799 {
4800 asymbol **current;
4801 long max_count;
4802 long count;
4803
4804 if (dynamic)
4805 {
4806 current = dynsyms;
4807 max_count = dynsymcount;
4808 printf ("DYNAMIC SYMBOL TABLE:\n");
4809 }
4810 else
4811 {
4812 current = syms;
4813 max_count = symcount;
4814 printf ("SYMBOL TABLE:\n");
4815 }
4816
4817 if (max_count == 0)
4818 printf (_("no symbols\n"));
4819
4820 for (count = 0; count < max_count; count++)
4821 {
4822 bfd *cur_bfd;
4823
4824 if (*current == NULL)
4825 printf (_("no information for symbol number %ld\n"), count);
4826
4827 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
4828 printf (_("could not determine the type of symbol number %ld\n"),
4829 count);
4830
4831 else if (process_section_p ((* current)->section)
4832 && (dump_special_syms
4833 || !bfd_is_target_special_symbol (cur_bfd, *current)))
4834 {
4835 const char *name = (*current)->name;
4836
4837 if (do_demangle && name != NULL && *name != '\0')
4838 {
4839 char *alloc;
4840
4841 /* If we want to demangle the name, we demangle it
4842 here, and temporarily clobber it while calling
4843 bfd_print_symbol. FIXME: This is a gross hack. */
4844 alloc = bfd_demangle (cur_bfd, name, demangle_flags);
4845 if (alloc != NULL)
4846 (*current)->name = alloc;
4847 bfd_print_symbol (cur_bfd, stdout, *current,
4848 bfd_print_symbol_all);
4849 if (alloc != NULL)
4850 {
4851 (*current)->name = name;
4852 free (alloc);
4853 }
4854 }
4855 else if (unicode_display != unicode_default
4856 && name != NULL && *name != '\0')
4857 {
4858 const char * sanitized_name;
4859
4860 /* If we want to sanitize the name, we do it here, and
4861 temporarily clobber it while calling bfd_print_symbol.
4862 FIXME: This is a gross hack. */
4863 sanitized_name = sanitize_string (name);
4864 if (sanitized_name != name)
4865 (*current)->name = sanitized_name;
4866 else
4867 sanitized_name = NULL;
4868 bfd_print_symbol (cur_bfd, stdout, *current,
4869 bfd_print_symbol_all);
4870 if (sanitized_name != NULL)
4871 (*current)->name = name;
4872 }
4873 else
4874 bfd_print_symbol (cur_bfd, stdout, *current,
4875 bfd_print_symbol_all);
4876 printf ("\n");
4877 }
4878
4879 current++;
4880 }
4881 printf ("\n\n");
4882 }
4883 \f
4884 static void
4885 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
4886 {
4887 arelent **p;
4888 char *last_filename, *last_functionname;
4889 unsigned int last_line;
4890 unsigned int last_discriminator;
4891
4892 /* Get column headers lined up reasonably. */
4893 {
4894 static int width;
4895
4896 if (width == 0)
4897 {
4898 char buf[30];
4899
4900 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
4901 width = strlen (buf) - 7;
4902 }
4903 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
4904 }
4905
4906 last_filename = NULL;
4907 last_functionname = NULL;
4908 last_line = 0;
4909 last_discriminator = 0;
4910
4911 for (p = relpp; relcount && *p != NULL; p++, relcount--)
4912 {
4913 arelent *q = *p;
4914 const char *filename, *functionname;
4915 unsigned int linenumber;
4916 unsigned int discriminator;
4917 const char *sym_name;
4918 const char *section_name;
4919 bfd_vma addend2 = 0;
4920
4921 if (start_address != (bfd_vma) -1
4922 && q->address < start_address)
4923 continue;
4924 if (stop_address != (bfd_vma) -1
4925 && q->address > stop_address)
4926 continue;
4927
4928 if (with_line_numbers
4929 && sec != NULL
4930 && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
4931 &filename, &functionname,
4932 &linenumber, &discriminator))
4933 {
4934 if (functionname != NULL
4935 && (last_functionname == NULL
4936 || strcmp (functionname, last_functionname) != 0))
4937 {
4938 printf ("%s():\n", sanitize_string (functionname));
4939 if (last_functionname != NULL)
4940 free (last_functionname);
4941 last_functionname = xstrdup (functionname);
4942 }
4943
4944 if (linenumber > 0
4945 && (linenumber != last_line
4946 || (filename != NULL
4947 && last_filename != NULL
4948 && filename_cmp (filename, last_filename) != 0)
4949 || (discriminator != last_discriminator)))
4950 {
4951 if (discriminator > 0)
4952 printf ("%s:%u\n", filename == NULL ? "???" :
4953 sanitize_string (filename), linenumber);
4954 else
4955 printf ("%s:%u (discriminator %u)\n",
4956 filename == NULL ? "???" : sanitize_string (filename),
4957 linenumber, discriminator);
4958 last_line = linenumber;
4959 last_discriminator = discriminator;
4960 if (last_filename != NULL)
4961 free (last_filename);
4962 if (filename == NULL)
4963 last_filename = NULL;
4964 else
4965 last_filename = xstrdup (filename);
4966 }
4967 }
4968
4969 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
4970 {
4971 sym_name = (*(q->sym_ptr_ptr))->name;
4972 section_name = (*(q->sym_ptr_ptr))->section->name;
4973 }
4974 else
4975 {
4976 sym_name = NULL;
4977 section_name = NULL;
4978 }
4979
4980 bfd_printf_vma (abfd, q->address);
4981 if (q->howto == NULL)
4982 printf (" *unknown* ");
4983 else if (q->howto->name)
4984 {
4985 const char *name = q->howto->name;
4986
4987 /* R_SPARC_OLO10 relocations contain two addends.
4988 But because 'arelent' lacks enough storage to
4989 store them both, the 64-bit ELF Sparc backend
4990 records this as two relocations. One R_SPARC_LO10
4991 and one R_SPARC_13, both pointing to the same
4992 address. This is merely so that we have some
4993 place to store both addend fields.
4994
4995 Undo this transformation, otherwise the output
4996 will be confusing. */
4997 if (abfd->xvec->flavour == bfd_target_elf_flavour
4998 && elf_tdata (abfd)->elf_header->e_machine == EM_SPARCV9
4999 && relcount > 1
5000 && !strcmp (q->howto->name, "R_SPARC_LO10"))
5001 {
5002 arelent *q2 = *(p + 1);
5003 if (q2 != NULL
5004 && q2->howto
5005 && q->address == q2->address
5006 && !strcmp (q2->howto->name, "R_SPARC_13"))
5007 {
5008 name = "R_SPARC_OLO10";
5009 addend2 = q2->addend;
5010 p++;
5011 }
5012 }
5013 printf (" %-16s ", name);
5014 }
5015 else
5016 printf (" %-16d ", q->howto->type);
5017
5018 if (sym_name)
5019 {
5020 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
5021 }
5022 else
5023 {
5024 if (section_name == NULL)
5025 section_name = "*unknown*";
5026 printf ("[%s]", sanitize_string (section_name));
5027 }
5028
5029 if (q->addend)
5030 {
5031 bfd_signed_vma addend = q->addend;
5032 if (addend < 0)
5033 {
5034 printf ("-0x");
5035 addend = -addend;
5036 }
5037 else
5038 printf ("+0x");
5039 bfd_printf_vma (abfd, addend);
5040 }
5041 if (addend2)
5042 {
5043 printf ("+0x");
5044 bfd_printf_vma (abfd, addend2);
5045 }
5046
5047 printf ("\n");
5048 }
5049
5050 if (last_filename != NULL)
5051 free (last_filename);
5052 if (last_functionname != NULL)
5053 free (last_functionname);
5054 }
5055
5056 static void
5057 dump_relocs_in_section (bfd *abfd,
5058 asection *section,
5059 void *dummy ATTRIBUTE_UNUSED)
5060 {
5061 arelent **relpp = NULL;
5062 long relcount;
5063 long relsize;
5064
5065 if ( bfd_is_abs_section (section)
5066 || bfd_is_und_section (section)
5067 || bfd_is_com_section (section)
5068 || (! process_section_p (section))
5069 || ((section->flags & SEC_RELOC) == 0))
5070 return;
5071
5072 printf ("RELOCATION RECORDS FOR [%s]:", sanitize_string (section->name));
5073
5074 relsize = bfd_get_reloc_upper_bound (abfd, section);
5075 if (relsize == 0)
5076 {
5077 printf (" (none)\n\n");
5078 return;
5079 }
5080
5081 if (relsize < 0)
5082 relcount = relsize;
5083 else
5084 {
5085 relpp = (arelent **) xmalloc (relsize);
5086 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
5087 }
5088
5089 if (relcount < 0)
5090 {
5091 printf ("\n");
5092 non_fatal (_("failed to read relocs in: %s"),
5093 sanitize_string (bfd_get_filename (abfd)));
5094 bfd_fatal (_("error message was"));
5095 }
5096 else if (relcount == 0)
5097 printf (" (none)\n\n");
5098 else
5099 {
5100 printf ("\n");
5101 dump_reloc_set (abfd, section, relpp, relcount);
5102 printf ("\n\n");
5103 }
5104 free (relpp);
5105 }
5106
5107 static void
5108 dump_relocs (bfd *abfd)
5109 {
5110 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
5111 }
5112
5113 static void
5114 dump_dynamic_relocs (bfd *abfd)
5115 {
5116 long relsize;
5117 arelent **relpp;
5118 long relcount;
5119
5120 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
5121 if (relsize < 0)
5122 bfd_fatal (bfd_get_filename (abfd));
5123
5124 printf ("DYNAMIC RELOCATION RECORDS");
5125
5126 if (relsize == 0)
5127 printf (" (none)\n\n");
5128 else
5129 {
5130 relpp = (arelent **) xmalloc (relsize);
5131 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
5132
5133 if (relcount < 0)
5134 bfd_fatal (bfd_get_filename (abfd));
5135 else if (relcount == 0)
5136 printf (" (none)\n\n");
5137 else
5138 {
5139 printf ("\n");
5140 dump_reloc_set (abfd, NULL, relpp, relcount);
5141 printf ("\n\n");
5142 }
5143 free (relpp);
5144 }
5145 }
5146
5147 /* Creates a table of paths, to search for source files. */
5148
5149 static void
5150 add_include_path (const char *path)
5151 {
5152 if (path[0] == 0)
5153 return;
5154 include_path_count++;
5155 include_paths = (const char **)
5156 xrealloc (include_paths, include_path_count * sizeof (*include_paths));
5157 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5158 if (path[1] == ':' && path[2] == 0)
5159 path = concat (path, ".", (const char *) 0);
5160 #endif
5161 include_paths[include_path_count - 1] = path;
5162 }
5163
5164 static void
5165 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
5166 asection *section,
5167 void *arg)
5168 {
5169 if ((section->flags & SEC_DEBUGGING) == 0)
5170 {
5171 bool *has_reloc_p = (bool *) arg;
5172 section->vma += adjust_section_vma;
5173 if (*has_reloc_p)
5174 section->lma += adjust_section_vma;
5175 }
5176 }
5177
5178 /* Return the sign-extended form of an ARCH_SIZE sized VMA. */
5179
5180 static bfd_vma
5181 sign_extend_address (bfd *abfd ATTRIBUTE_UNUSED,
5182 bfd_vma vma,
5183 unsigned arch_size)
5184 {
5185 bfd_vma mask;
5186 mask = (bfd_vma) 1 << (arch_size - 1);
5187 return (((vma & ((mask << 1) - 1)) ^ mask) - mask);
5188 }
5189
5190 /* Dump selected contents of ABFD. */
5191
5192 static void
5193 dump_bfd (bfd *abfd, bool is_mainfile)
5194 {
5195 const struct elf_backend_data * bed;
5196
5197 if (bfd_big_endian (abfd))
5198 byte_get = byte_get_big_endian;
5199 else if (bfd_little_endian (abfd))
5200 byte_get = byte_get_little_endian;
5201 else
5202 byte_get = NULL;
5203
5204 /* Load any separate debug information files.
5205 We do this now and without checking do_follow_links because separate
5206 debug info files may contain symbol tables that we will need when
5207 displaying information about the main file. Any memory allocated by
5208 load_separate_debug_files will be released when we call
5209 free_debug_memory below.
5210
5211 The test on is_mainfile is there because the chain of separate debug
5212 info files is a global variable shared by all invocations of dump_bfd. */
5213 if (byte_get != NULL && is_mainfile)
5214 {
5215 load_separate_debug_files (abfd, bfd_get_filename (abfd));
5216
5217 /* If asked to do so, recursively dump the separate files. */
5218 if (do_follow_links)
5219 {
5220 separate_info * i;
5221
5222 for (i = first_separate_info; i != NULL; i = i->next)
5223 dump_bfd (i->handle, false);
5224 }
5225 }
5226
5227 /* Adjust user-specified start and stop limits for targets that use
5228 signed addresses. */
5229 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
5230 && (bed = get_elf_backend_data (abfd)) != NULL
5231 && bed->sign_extend_vma)
5232 {
5233 start_address = sign_extend_address (abfd, start_address,
5234 bed->s->arch_size);
5235 stop_address = sign_extend_address (abfd, stop_address,
5236 bed->s->arch_size);
5237 }
5238
5239 /* If we are adjusting section VMA's, change them all now. Changing
5240 the BFD information is a hack. However, we must do it, or
5241 bfd_find_nearest_line will not do the right thing. */
5242 if (adjust_section_vma != 0)
5243 {
5244 bool has_reloc = (abfd->flags & HAS_RELOC);
5245 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
5246 }
5247
5248 if (is_mainfile || process_links)
5249 {
5250 if (! dump_debugging_tags && ! suppress_bfd_header)
5251 printf (_("\n%s: file format %s\n"),
5252 sanitize_string (bfd_get_filename (abfd)),
5253 abfd->xvec->name);
5254 if (dump_ar_hdrs)
5255 print_arelt_descr (stdout, abfd, true, false);
5256 if (dump_file_header)
5257 dump_bfd_header (abfd);
5258 if (dump_private_headers)
5259 dump_bfd_private_header (abfd);
5260 if (dump_private_options != NULL)
5261 dump_target_specific (abfd);
5262 if (! dump_debugging_tags && ! suppress_bfd_header)
5263 putchar ('\n');
5264 }
5265
5266 if (dump_symtab
5267 || dump_reloc_info
5268 || disassemble
5269 || dump_debugging
5270 || dump_dwarf_section_info)
5271 {
5272 syms = slurp_symtab (abfd);
5273
5274 /* If following links, load any symbol tables from the linked files as well. */
5275 if (do_follow_links && is_mainfile)
5276 {
5277 separate_info * i;
5278
5279 for (i = first_separate_info; i != NULL; i = i->next)
5280 {
5281 asymbol ** extra_syms;
5282 long old_symcount = symcount;
5283
5284 extra_syms = slurp_symtab (i->handle);
5285
5286 if (extra_syms)
5287 {
5288 if (old_symcount == 0)
5289 {
5290 syms = extra_syms;
5291 }
5292 else
5293 {
5294 syms = xrealloc (syms, ((symcount + old_symcount + 1)
5295 * sizeof (asymbol *)));
5296 memcpy (syms + old_symcount,
5297 extra_syms,
5298 (symcount + 1) * sizeof (asymbol *));
5299 }
5300 }
5301
5302 symcount += old_symcount;
5303 }
5304 }
5305 }
5306
5307 if (is_mainfile || process_links)
5308 {
5309 if (dump_section_headers)
5310 dump_headers (abfd);
5311
5312 if (dump_dynamic_symtab || dump_dynamic_reloc_info
5313 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
5314 dynsyms = slurp_dynamic_symtab (abfd);
5315
5316 if (disassemble)
5317 {
5318 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
5319 dynsymcount, dynsyms,
5320 &synthsyms);
5321 if (synthcount < 0)
5322 synthcount = 0;
5323 }
5324
5325 if (dump_symtab)
5326 dump_symbols (abfd, false);
5327 if (dump_dynamic_symtab)
5328 dump_symbols (abfd, true);
5329 }
5330 if (dump_dwarf_section_info)
5331 dump_dwarf (abfd, is_mainfile);
5332 if (is_mainfile || process_links)
5333 {
5334 if (dump_ctf_section_info)
5335 dump_ctf (abfd, dump_ctf_section_name, dump_ctf_parent_name);
5336 if (dump_stab_section_info)
5337 dump_stabs (abfd);
5338 if (dump_reloc_info && ! disassemble)
5339 dump_relocs (abfd);
5340 if (dump_dynamic_reloc_info && ! disassemble)
5341 dump_dynamic_relocs (abfd);
5342 if (dump_section_contents)
5343 dump_data (abfd);
5344 if (disassemble)
5345 disassemble_data (abfd);
5346 }
5347
5348 if (dump_debugging)
5349 {
5350 void *dhandle;
5351
5352 dhandle = read_debugging_info (abfd, syms, symcount, true);
5353 if (dhandle != NULL)
5354 {
5355 if (!print_debugging_info (stdout, dhandle, abfd, syms,
5356 bfd_demangle,
5357 dump_debugging_tags != 0))
5358 {
5359 non_fatal (_("%s: printing debugging information failed"),
5360 bfd_get_filename (abfd));
5361 exit_status = 1;
5362 }
5363
5364 free (dhandle);
5365 }
5366 /* PR 6483: If there was no STABS debug info in the file, try
5367 DWARF instead. */
5368 else if (! dump_dwarf_section_info)
5369 {
5370 dwarf_select_sections_all ();
5371 dump_dwarf (abfd, is_mainfile);
5372 }
5373 }
5374
5375 if (syms)
5376 {
5377 free (syms);
5378 syms = NULL;
5379 }
5380
5381 if (dynsyms)
5382 {
5383 free (dynsyms);
5384 dynsyms = NULL;
5385 }
5386
5387 if (synthsyms)
5388 {
5389 free (synthsyms);
5390 synthsyms = NULL;
5391 }
5392
5393 symcount = 0;
5394 dynsymcount = 0;
5395 synthcount = 0;
5396
5397 if (is_mainfile)
5398 free_debug_memory ();
5399 }
5400
5401 static void
5402 display_object_bfd (bfd *abfd)
5403 {
5404 char **matching;
5405
5406 if (bfd_check_format_matches (abfd, bfd_object, &matching))
5407 {
5408 dump_bfd (abfd, true);
5409 return;
5410 }
5411
5412 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
5413 {
5414 nonfatal (bfd_get_filename (abfd));
5415 list_matching_formats (matching);
5416 free (matching);
5417 return;
5418 }
5419
5420 if (bfd_get_error () != bfd_error_file_not_recognized)
5421 {
5422 nonfatal (bfd_get_filename (abfd));
5423 return;
5424 }
5425
5426 if (bfd_check_format_matches (abfd, bfd_core, &matching))
5427 {
5428 dump_bfd (abfd, true);
5429 return;
5430 }
5431
5432 nonfatal (bfd_get_filename (abfd));
5433
5434 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
5435 {
5436 list_matching_formats (matching);
5437 free (matching);
5438 }
5439 }
5440
5441 static void
5442 display_any_bfd (bfd *file, int level)
5443 {
5444 /* Decompress sections unless dumping the section contents. */
5445 if (!dump_section_contents)
5446 file->flags |= BFD_DECOMPRESS;
5447
5448 /* If the file is an archive, process all of its elements. */
5449 if (bfd_check_format (file, bfd_archive))
5450 {
5451 bfd *arfile = NULL;
5452 bfd *last_arfile = NULL;
5453
5454 if (level == 0)
5455 printf (_("In archive %s:\n"), sanitize_string (bfd_get_filename (file)));
5456 else if (level > 100)
5457 {
5458 /* Prevent corrupted files from spinning us into an
5459 infinite loop. 100 is an arbitrary heuristic. */
5460 fatal (_("Archive nesting is too deep"));
5461 return;
5462 }
5463 else
5464 printf (_("In nested archive %s:\n"),
5465 sanitize_string (bfd_get_filename (file)));
5466
5467 for (;;)
5468 {
5469 bfd_set_error (bfd_error_no_error);
5470
5471 arfile = bfd_openr_next_archived_file (file, arfile);
5472 if (arfile == NULL)
5473 {
5474 if (bfd_get_error () != bfd_error_no_more_archived_files)
5475 nonfatal (bfd_get_filename (file));
5476 break;
5477 }
5478
5479 display_any_bfd (arfile, level + 1);
5480
5481 if (last_arfile != NULL)
5482 {
5483 bfd_close (last_arfile);
5484 /* PR 17512: file: ac585d01. */
5485 if (arfile == last_arfile)
5486 {
5487 last_arfile = NULL;
5488 break;
5489 }
5490 }
5491 last_arfile = arfile;
5492 }
5493
5494 if (last_arfile != NULL)
5495 bfd_close (last_arfile);
5496 }
5497 else
5498 display_object_bfd (file);
5499 }
5500
5501 static void
5502 display_file (char *filename, char *target, bool last_file)
5503 {
5504 bfd *file;
5505
5506 if (get_file_size (filename) < 1)
5507 {
5508 exit_status = 1;
5509 return;
5510 }
5511
5512 file = bfd_openr (filename, target);
5513 if (file == NULL)
5514 {
5515 nonfatal (filename);
5516 return;
5517 }
5518
5519 display_any_bfd (file, 0);
5520
5521 /* This is an optimization to improve the speed of objdump, especially when
5522 dumping a file with lots of associated debug informatiom. Calling
5523 bfd_close on such a file can take a non-trivial amount of time as there
5524 are lots of lists to walk and buffers to free. This is only really
5525 necessary however if we are about to load another file and we need the
5526 memory back. Otherwise, if we are about to exit, then we can save (a lot
5527 of) time by only doing a quick close, and allowing the OS to reclaim the
5528 memory for us. */
5529 if (! last_file)
5530 bfd_close (file);
5531 else
5532 bfd_close_all_done (file);
5533 }
5534 \f
5535 int
5536 main (int argc, char **argv)
5537 {
5538 int c;
5539 char *target = default_target;
5540 bool seenflag = false;
5541
5542 #ifdef HAVE_LC_MESSAGES
5543 setlocale (LC_MESSAGES, "");
5544 #endif
5545 setlocale (LC_CTYPE, "");
5546
5547 bindtextdomain (PACKAGE, LOCALEDIR);
5548 textdomain (PACKAGE);
5549
5550 program_name = *argv;
5551 xmalloc_set_program_name (program_name);
5552 bfd_set_error_program_name (program_name);
5553
5554 START_PROGRESS (program_name, 0);
5555
5556 expandargv (&argc, &argv);
5557
5558 if (bfd_init () != BFD_INIT_MAGIC)
5559 fatal (_("fatal error: libbfd ABI mismatch"));
5560 set_default_bfd_target ();
5561
5562 while ((c = getopt_long (argc, argv,
5563 "CDE:FGHI:LM:P:RSTU:VW::ab:defghij:lm:prstvwxz",
5564 long_options, (int *) 0))
5565 != EOF)
5566 {
5567 switch (c)
5568 {
5569 case 0:
5570 break; /* We've been given a long option. */
5571 case 'm':
5572 machine = optarg;
5573 break;
5574 case 'M':
5575 {
5576 char *options;
5577 if (disassembler_options)
5578 /* Ignore potential memory leak for now. */
5579 options = concat (disassembler_options, ",",
5580 optarg, (const char *) NULL);
5581 else
5582 options = optarg;
5583 disassembler_options = remove_whitespace_and_extra_commas (options);
5584 }
5585 break;
5586 case 'j':
5587 add_only (optarg);
5588 break;
5589 case 'F':
5590 display_file_offsets = true;
5591 break;
5592 case 'l':
5593 with_line_numbers = true;
5594 break;
5595 case 'b':
5596 target = optarg;
5597 break;
5598 case 'C':
5599 do_demangle = true;
5600 if (optarg != NULL)
5601 {
5602 enum demangling_styles style;
5603
5604 style = cplus_demangle_name_to_style (optarg);
5605 if (style == unknown_demangling)
5606 fatal (_("unknown demangling style `%s'"),
5607 optarg);
5608
5609 cplus_demangle_set_style (style);
5610 }
5611 break;
5612 case OPTION_RECURSE_LIMIT:
5613 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
5614 break;
5615 case OPTION_NO_RECURSE_LIMIT:
5616 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
5617 break;
5618 case 'w':
5619 do_wide = wide_output = true;
5620 break;
5621 case OPTION_ADJUST_VMA:
5622 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
5623 break;
5624 case OPTION_START_ADDRESS:
5625 start_address = parse_vma (optarg, "--start-address");
5626 if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
5627 fatal (_("error: the start address should be before the end address"));
5628 break;
5629 case OPTION_STOP_ADDRESS:
5630 stop_address = parse_vma (optarg, "--stop-address");
5631 if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
5632 fatal (_("error: the stop address should be after the start address"));
5633 break;
5634 case OPTION_PREFIX:
5635 prefix = optarg;
5636 prefix_length = strlen (prefix);
5637 /* Remove an unnecessary trailing '/' */
5638 while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
5639 prefix_length--;
5640 break;
5641 case OPTION_PREFIX_STRIP:
5642 prefix_strip = atoi (optarg);
5643 if (prefix_strip < 0)
5644 fatal (_("error: prefix strip must be non-negative"));
5645 break;
5646 case OPTION_INSN_WIDTH:
5647 insn_width = strtoul (optarg, NULL, 0);
5648 if (insn_width <= 0)
5649 fatal (_("error: instruction width must be positive"));
5650 break;
5651 case OPTION_INLINES:
5652 unwind_inlines = true;
5653 break;
5654 case OPTION_VISUALIZE_JUMPS:
5655 visualize_jumps = true;
5656 color_output = false;
5657 extended_color_output = false;
5658 if (optarg != NULL)
5659 {
5660 if (streq (optarg, "color"))
5661 color_output = true;
5662 else if (streq (optarg, "extended-color"))
5663 {
5664 color_output = true;
5665 extended_color_output = true;
5666 }
5667 else if (streq (optarg, "off"))
5668 visualize_jumps = false;
5669 else
5670 nonfatal (_("unrecognized argument to --visualize-option"));
5671 }
5672 break;
5673 case OPTION_DISASSEMBLER_COLOR:
5674 if (streq (optarg, "off"))
5675 disassembler_color = false;
5676 else if (streq (optarg, "color"))
5677 disassembler_color = true;
5678 else if (streq (optarg, "extended-color"))
5679 disassembler_extended_color = true;
5680 else
5681 nonfatal (_("unrecognized argument to --disassembler-color"));
5682 break;
5683 case 'E':
5684 if (strcmp (optarg, "B") == 0)
5685 endian = BFD_ENDIAN_BIG;
5686 else if (strcmp (optarg, "L") == 0)
5687 endian = BFD_ENDIAN_LITTLE;
5688 else
5689 {
5690 nonfatal (_("unrecognized -E option"));
5691 usage (stderr, 1);
5692 }
5693 break;
5694 case OPTION_ENDIAN:
5695 if (strncmp (optarg, "big", strlen (optarg)) == 0)
5696 endian = BFD_ENDIAN_BIG;
5697 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
5698 endian = BFD_ENDIAN_LITTLE;
5699 else
5700 {
5701 non_fatal (_("unrecognized --endian type `%s'"), optarg);
5702 exit_status = 1;
5703 usage (stderr, 1);
5704 }
5705 break;
5706
5707 case 'f':
5708 dump_file_header = true;
5709 seenflag = true;
5710 break;
5711 case 'i':
5712 formats_info = true;
5713 seenflag = true;
5714 break;
5715 case 'I':
5716 add_include_path (optarg);
5717 break;
5718 case 'p':
5719 dump_private_headers = true;
5720 seenflag = true;
5721 break;
5722 case 'P':
5723 dump_private_options = optarg;
5724 seenflag = true;
5725 break;
5726 case 'x':
5727 dump_private_headers = true;
5728 dump_symtab = true;
5729 dump_reloc_info = true;
5730 dump_file_header = true;
5731 dump_ar_hdrs = true;
5732 dump_section_headers = true;
5733 seenflag = true;
5734 break;
5735 case 't':
5736 dump_symtab = true;
5737 seenflag = true;
5738 break;
5739 case 'T':
5740 dump_dynamic_symtab = true;
5741 seenflag = true;
5742 break;
5743 case 'd':
5744 disassemble = true;
5745 seenflag = true;
5746 disasm_sym = optarg;
5747 break;
5748 case 'z':
5749 disassemble_zeroes = true;
5750 break;
5751 case 'D':
5752 disassemble = true;
5753 disassemble_all = true;
5754 seenflag = true;
5755 break;
5756 case 'S':
5757 disassemble = true;
5758 with_source_code = true;
5759 seenflag = true;
5760 break;
5761 case OPTION_SOURCE_COMMENT:
5762 disassemble = true;
5763 with_source_code = true;
5764 seenflag = true;
5765 if (optarg)
5766 source_comment = xstrdup (sanitize_string (optarg));
5767 else
5768 source_comment = xstrdup ("# ");
5769 break;
5770 case 'g':
5771 dump_debugging = 1;
5772 seenflag = true;
5773 break;
5774 case 'e':
5775 dump_debugging = 1;
5776 dump_debugging_tags = 1;
5777 do_demangle = true;
5778 seenflag = true;
5779 break;
5780 case 'L':
5781 process_links = true;
5782 do_follow_links = true;
5783 break;
5784 case 'W':
5785 dump_dwarf_section_info = true;
5786 seenflag = true;
5787 if (optarg)
5788 dwarf_select_sections_by_letters (optarg);
5789 else
5790 dwarf_select_sections_all ();
5791 break;
5792 case OPTION_DWARF:
5793 dump_dwarf_section_info = true;
5794 seenflag = true;
5795 if (optarg)
5796 dwarf_select_sections_by_names (optarg);
5797 else
5798 dwarf_select_sections_all ();
5799 break;
5800 case OPTION_DWARF_DEPTH:
5801 {
5802 char *cp;
5803 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
5804 }
5805 break;
5806 case OPTION_DWARF_START:
5807 {
5808 char *cp;
5809 dwarf_start_die = strtoul (optarg, & cp, 0);
5810 suppress_bfd_header = 1;
5811 }
5812 break;
5813 case OPTION_DWARF_CHECK:
5814 dwarf_check = true;
5815 break;
5816 #ifdef ENABLE_LIBCTF
5817 case OPTION_CTF:
5818 dump_ctf_section_info = true;
5819 if (optarg)
5820 dump_ctf_section_name = xstrdup (optarg);
5821 seenflag = true;
5822 break;
5823 case OPTION_CTF_PARENT:
5824 dump_ctf_parent_name = xstrdup (optarg);
5825 break;
5826 #endif
5827 case 'G':
5828 dump_stab_section_info = true;
5829 seenflag = true;
5830 break;
5831 case 's':
5832 dump_section_contents = true;
5833 seenflag = true;
5834 break;
5835 case 'r':
5836 dump_reloc_info = true;
5837 seenflag = true;
5838 break;
5839 case 'R':
5840 dump_dynamic_reloc_info = true;
5841 seenflag = true;
5842 break;
5843 case 'a':
5844 dump_ar_hdrs = true;
5845 seenflag = true;
5846 break;
5847 case 'h':
5848 dump_section_headers = true;
5849 seenflag = true;
5850 break;
5851 case 'v':
5852 case 'V':
5853 show_version = true;
5854 seenflag = true;
5855 break;
5856
5857 case 'U':
5858 if (streq (optarg, "default") || streq (optarg, "d"))
5859 unicode_display = unicode_default;
5860 else if (streq (optarg, "locale") || streq (optarg, "l"))
5861 unicode_display = unicode_locale;
5862 else if (streq (optarg, "escape") || streq (optarg, "e"))
5863 unicode_display = unicode_escape;
5864 else if (streq (optarg, "invalid") || streq (optarg, "i"))
5865 unicode_display = unicode_invalid;
5866 else if (streq (optarg, "hex") || streq (optarg, "x"))
5867 unicode_display = unicode_hex;
5868 else if (streq (optarg, "highlight") || streq (optarg, "h"))
5869 unicode_display = unicode_highlight;
5870 else
5871 fatal (_("invalid argument to -U/--unicode: %s"), optarg);
5872 break;
5873
5874 case 'H':
5875 usage (stdout, 0);
5876 /* No need to set seenflag or to break - usage() does not return. */
5877 default:
5878 usage (stderr, 1);
5879 }
5880 }
5881
5882 if (show_version)
5883 print_version ("objdump");
5884
5885 if (!seenflag)
5886 usage (stderr, 2);
5887
5888 dump_any_debugging = (dump_debugging
5889 || dump_dwarf_section_info
5890 || process_links);
5891
5892 if (formats_info)
5893 exit_status = display_info ();
5894 else
5895 {
5896 if (optind == argc)
5897 display_file ("a.out", target, true);
5898 else
5899 for (; optind < argc;)
5900 {
5901 display_file (argv[optind], target, optind == argc - 1);
5902 optind++;
5903 }
5904 }
5905
5906 free_only_list ();
5907 free (dump_ctf_section_name);
5908 free (dump_ctf_parent_name);
5909 free ((void *) source_comment);
5910
5911 END_PROGRESS (program_name);
5912
5913 return exit_status;
5914 }