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