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