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