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