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