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