Add missing changelogs for previous commits.
[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 static inline bfd_boolean
991 sym_ok (bfd_boolean want_section,
992 bfd * abfd ATTRIBUTE_UNUSED,
993 long place,
994 asection * sec,
995 struct disassemble_info * inf)
996 {
997 if (want_section)
998 {
999 /* Note - we cannot just compare section pointers because they could
1000 be different, but the same... Ie the symbol that we are trying to
1001 find could have come from a separate debug info file. Under such
1002 circumstances the symbol will be associated with a section in the
1003 debug info file, whilst the section we want is in a normal file.
1004 So the section pointers will be different, but the section names
1005 will be the same. */
1006 if (strcmp (bfd_section_name (abfd, sorted_syms[place]->section),
1007 bfd_section_name (abfd, sec)) != 0)
1008 return FALSE;
1009 }
1010
1011 return inf->symbol_is_valid (sorted_syms[place], inf);
1012 }
1013
1014 /* Locate a symbol given a bfd and a section (from INFO->application_data),
1015 and a VMA. If INFO->application_data->require_sec is TRUE, then always
1016 require the symbol to be in the section. Returns NULL if there is no
1017 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
1018 of the symbol in sorted_syms. */
1019
1020 static asymbol *
1021 find_symbol_for_address (bfd_vma vma,
1022 struct disassemble_info *inf,
1023 long *place)
1024 {
1025 /* @@ Would it speed things up to cache the last two symbols returned,
1026 and maybe their address ranges? For many processors, only one memory
1027 operand can be present at a time, so the 2-entry cache wouldn't be
1028 constantly churned by code doing heavy memory accesses. */
1029
1030 /* Indices in `sorted_syms'. */
1031 long min = 0;
1032 long max_count = sorted_symcount;
1033 long thisplace;
1034 struct objdump_disasm_info *aux;
1035 bfd *abfd;
1036 asection *sec;
1037 unsigned int opb;
1038 bfd_boolean want_section;
1039 long rel_count;
1040
1041 if (sorted_symcount < 1)
1042 return NULL;
1043
1044 aux = (struct objdump_disasm_info *) inf->application_data;
1045 abfd = aux->abfd;
1046 sec = aux->sec;
1047 opb = inf->octets_per_byte;
1048
1049 /* Perform a binary search looking for the closest symbol to the
1050 required value. We are searching the range (min, max_count]. */
1051 while (min + 1 < max_count)
1052 {
1053 asymbol *sym;
1054
1055 thisplace = (max_count + min) / 2;
1056 sym = sorted_syms[thisplace];
1057
1058 if (bfd_asymbol_value (sym) > vma)
1059 max_count = thisplace;
1060 else if (bfd_asymbol_value (sym) < vma)
1061 min = thisplace;
1062 else
1063 {
1064 min = thisplace;
1065 break;
1066 }
1067 }
1068
1069 /* The symbol we want is now in min, the low end of the range we
1070 were searching. If there are several symbols with the same
1071 value, we want the first (non-section/non-debugging) one. */
1072 thisplace = min;
1073 while (thisplace > 0
1074 && (bfd_asymbol_value (sorted_syms[thisplace])
1075 == bfd_asymbol_value (sorted_syms[thisplace - 1]))
1076 && ((sorted_syms[thisplace - 1]->flags
1077 & (BSF_SECTION_SYM | BSF_DEBUGGING)) == 0)
1078 )
1079 --thisplace;
1080
1081 /* Prefer a symbol in the current section if we have multple symbols
1082 with the same value, as can occur with overlays or zero size
1083 sections. */
1084 min = thisplace;
1085 while (min < max_count
1086 && (bfd_asymbol_value (sorted_syms[min])
1087 == bfd_asymbol_value (sorted_syms[thisplace])))
1088 {
1089 if (sym_ok (TRUE, abfd, min, sec, inf))
1090 {
1091 thisplace = min;
1092
1093 if (place != NULL)
1094 *place = thisplace;
1095
1096 return sorted_syms[thisplace];
1097 }
1098 ++min;
1099 }
1100
1101 /* If the file is relocatable, and the symbol could be from this
1102 section, prefer a symbol from this section over symbols from
1103 others, even if the other symbol's value might be closer.
1104
1105 Note that this may be wrong for some symbol references if the
1106 sections have overlapping memory ranges, but in that case there's
1107 no way to tell what's desired without looking at the relocation
1108 table.
1109
1110 Also give the target a chance to reject symbols. */
1111 want_section = (aux->require_sec
1112 || ((abfd->flags & HAS_RELOC) != 0
1113 && vma >= bfd_get_section_vma (abfd, sec)
1114 && vma < (bfd_get_section_vma (abfd, sec)
1115 + bfd_section_size (abfd, sec) / opb)));
1116
1117 if (! sym_ok (want_section, abfd, thisplace, sec, inf))
1118 {
1119 long i;
1120 long newplace = sorted_symcount;
1121
1122 for (i = min - 1; i >= 0; i--)
1123 {
1124 if (sym_ok (want_section, abfd, i, sec, inf))
1125 {
1126 if (newplace == sorted_symcount)
1127 newplace = i;
1128
1129 if (bfd_asymbol_value (sorted_syms[i])
1130 != bfd_asymbol_value (sorted_syms[newplace]))
1131 break;
1132
1133 /* Remember this symbol and keep searching until we reach
1134 an earlier address. */
1135 newplace = i;
1136 }
1137 }
1138
1139 if (newplace != sorted_symcount)
1140 thisplace = newplace;
1141 else
1142 {
1143 /* We didn't find a good symbol with a smaller value.
1144 Look for one with a larger value. */
1145 for (i = thisplace + 1; i < sorted_symcount; i++)
1146 {
1147 if (sym_ok (want_section, abfd, i, sec, inf))
1148 {
1149 thisplace = i;
1150 break;
1151 }
1152 }
1153 }
1154
1155 if (! sym_ok (want_section, abfd, thisplace, sec, inf))
1156 /* There is no suitable symbol. */
1157 return NULL;
1158 }
1159
1160 /* If we have not found an exact match for the specified address
1161 and we have dynamic relocations available, then we can produce
1162 a better result by matching a relocation to the address and
1163 using the symbol associated with that relocation. */
1164 rel_count = aux->dynrelcount;
1165 if (!want_section
1166 && sorted_syms[thisplace]->value != vma
1167 && rel_count > 0
1168 && aux->dynrelbuf != NULL
1169 && aux->dynrelbuf[0]->address <= vma
1170 && aux->dynrelbuf[rel_count - 1]->address >= vma
1171 /* If we have matched a synthetic symbol, then stick with that. */
1172 && (sorted_syms[thisplace]->flags & BSF_SYNTHETIC) == 0)
1173 {
1174 arelent ** rel_low;
1175 arelent ** rel_high;
1176
1177 rel_low = aux->dynrelbuf;
1178 rel_high = rel_low + rel_count - 1;
1179 while (rel_low <= rel_high)
1180 {
1181 arelent **rel_mid = &rel_low[(rel_high - rel_low) / 2];
1182 arelent * rel = *rel_mid;
1183
1184 if (rel->address == vma)
1185 {
1186 /* Absolute relocations do not provide a more helpful
1187 symbolic address. Find a non-absolute relocation
1188 with the same address. */
1189 arelent **rel_vma = rel_mid;
1190 for (rel_mid--;
1191 rel_mid >= rel_low && rel_mid[0]->address == vma;
1192 rel_mid--)
1193 rel_vma = rel_mid;
1194
1195 for (; rel_vma <= rel_high && rel_vma[0]->address == vma;
1196 rel_vma++)
1197 {
1198 rel = *rel_vma;
1199 if (rel->sym_ptr_ptr != NULL
1200 && ! bfd_is_abs_section ((* rel->sym_ptr_ptr)->section))
1201 {
1202 if (place != NULL)
1203 * place = thisplace;
1204 return * rel->sym_ptr_ptr;
1205 }
1206 }
1207 break;
1208 }
1209
1210 if (vma < rel->address)
1211 rel_high = rel_mid;
1212 else if (vma >= rel_mid[1]->address)
1213 rel_low = rel_mid + 1;
1214 else
1215 break;
1216 }
1217 }
1218
1219 if (place != NULL)
1220 *place = thisplace;
1221
1222 return sorted_syms[thisplace];
1223 }
1224
1225 /* Print an address and the offset to the nearest symbol. */
1226
1227 static void
1228 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
1229 bfd_vma vma, struct disassemble_info *inf,
1230 bfd_boolean skip_zeroes)
1231 {
1232 objdump_print_value (vma, inf, skip_zeroes);
1233
1234 if (sym == NULL)
1235 {
1236 bfd_vma secaddr;
1237
1238 (*inf->fprintf_func) (inf->stream, " <%s",
1239 sanitize_string (bfd_get_section_name (abfd, sec)));
1240 secaddr = bfd_get_section_vma (abfd, sec);
1241 if (vma < secaddr)
1242 {
1243 (*inf->fprintf_func) (inf->stream, "-0x");
1244 objdump_print_value (secaddr - vma, inf, TRUE);
1245 }
1246 else if (vma > secaddr)
1247 {
1248 (*inf->fprintf_func) (inf->stream, "+0x");
1249 objdump_print_value (vma - secaddr, inf, TRUE);
1250 }
1251 (*inf->fprintf_func) (inf->stream, ">");
1252 }
1253 else
1254 {
1255 (*inf->fprintf_func) (inf->stream, " <");
1256
1257 objdump_print_symname (abfd, inf, sym);
1258
1259 if (bfd_asymbol_value (sym) == vma)
1260 ;
1261 /* Undefined symbols in an executables and dynamic objects do not have
1262 a value associated with them, so it does not make sense to display
1263 an offset relative to them. Normally we would not be provided with
1264 this kind of symbol, but the target backend might choose to do so,
1265 and the code in find_symbol_for_address might return an as yet
1266 unresolved symbol associated with a dynamic reloc. */
1267 else if ((bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
1268 && bfd_is_und_section (sym->section))
1269 ;
1270 else if (bfd_asymbol_value (sym) > vma)
1271 {
1272 (*inf->fprintf_func) (inf->stream, "-0x");
1273 objdump_print_value (bfd_asymbol_value (sym) - vma, inf, TRUE);
1274 }
1275 else if (vma > bfd_asymbol_value (sym))
1276 {
1277 (*inf->fprintf_func) (inf->stream, "+0x");
1278 objdump_print_value (vma - bfd_asymbol_value (sym), inf, TRUE);
1279 }
1280
1281 (*inf->fprintf_func) (inf->stream, ">");
1282 }
1283
1284 if (display_file_offsets)
1285 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1286 (long int)(sec->filepos + (vma - sec->vma)));
1287 }
1288
1289 /* Print an address (VMA), symbolically if possible.
1290 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
1291
1292 static void
1293 objdump_print_addr (bfd_vma vma,
1294 struct disassemble_info *inf,
1295 bfd_boolean skip_zeroes)
1296 {
1297 struct objdump_disasm_info *aux;
1298 asymbol *sym = NULL;
1299 bfd_boolean skip_find = FALSE;
1300
1301 aux = (struct objdump_disasm_info *) inf->application_data;
1302
1303 if (sorted_symcount < 1)
1304 {
1305 (*inf->fprintf_func) (inf->stream, "0x");
1306 objdump_print_value (vma, inf, skip_zeroes);
1307
1308 if (display_file_offsets)
1309 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1310 (long int)(aux->sec->filepos + (vma - aux->sec->vma)));
1311 return;
1312 }
1313
1314 if (aux->reloc != NULL
1315 && aux->reloc->sym_ptr_ptr != NULL
1316 && * aux->reloc->sym_ptr_ptr != NULL)
1317 {
1318 sym = * aux->reloc->sym_ptr_ptr;
1319
1320 /* Adjust the vma to the reloc. */
1321 vma += bfd_asymbol_value (sym);
1322
1323 if (bfd_is_und_section (bfd_get_section (sym)))
1324 skip_find = TRUE;
1325 }
1326
1327 if (!skip_find)
1328 sym = find_symbol_for_address (vma, inf, NULL);
1329
1330 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, inf,
1331 skip_zeroes);
1332 }
1333
1334 /* Print VMA to INFO. This function is passed to the disassembler
1335 routine. */
1336
1337 static void
1338 objdump_print_address (bfd_vma vma, struct disassemble_info *inf)
1339 {
1340 objdump_print_addr (vma, inf, ! prefix_addresses);
1341 }
1342
1343 /* Determine if the given address has a symbol associated with it. */
1344
1345 static int
1346 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
1347 {
1348 asymbol * sym;
1349
1350 sym = find_symbol_for_address (vma, inf, NULL);
1351
1352 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
1353 }
1354
1355 /* Hold the last function name and the last line number we displayed
1356 in a disassembly. */
1357
1358 static char *prev_functionname;
1359 static unsigned int prev_line;
1360 static unsigned int prev_discriminator;
1361
1362 /* We keep a list of all files that we have seen when doing a
1363 disassembly with source, so that we know how much of the file to
1364 display. This can be important for inlined functions. */
1365
1366 struct print_file_list
1367 {
1368 struct print_file_list *next;
1369 const char *filename;
1370 const char *modname;
1371 const char *map;
1372 size_t mapsize;
1373 const char **linemap;
1374 unsigned maxline;
1375 unsigned last_line;
1376 unsigned max_printed;
1377 int first;
1378 };
1379
1380 static struct print_file_list *print_files;
1381
1382 /* The number of preceding context lines to show when we start
1383 displaying a file for the first time. */
1384
1385 #define SHOW_PRECEDING_CONTEXT_LINES (5)
1386
1387 /* Read a complete file into memory. */
1388
1389 static const char *
1390 slurp_file (const char *fn, size_t *size, struct stat *fst)
1391 {
1392 #ifdef HAVE_MMAP
1393 int ps = getpagesize ();
1394 size_t msize;
1395 #endif
1396 const char *map;
1397 int fd = open (fn, O_RDONLY | O_BINARY);
1398
1399 if (fd < 0)
1400 return NULL;
1401 if (fstat (fd, fst) < 0)
1402 {
1403 close (fd);
1404 return NULL;
1405 }
1406 *size = fst->st_size;
1407 #ifdef HAVE_MMAP
1408 msize = (*size + ps - 1) & ~(ps - 1);
1409 map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
1410 if (map != (char *) -1L)
1411 {
1412 close (fd);
1413 return map;
1414 }
1415 #endif
1416 map = (const char *) malloc (*size);
1417 if (!map || (size_t) read (fd, (char *) map, *size) != *size)
1418 {
1419 free ((void *) map);
1420 map = NULL;
1421 }
1422 close (fd);
1423 return map;
1424 }
1425
1426 #define line_map_decrease 5
1427
1428 /* Precompute array of lines for a mapped file. */
1429
1430 static const char **
1431 index_file (const char *map, size_t size, unsigned int *maxline)
1432 {
1433 const char *p, *lstart, *end;
1434 int chars_per_line = 45; /* First iteration will use 40. */
1435 unsigned int lineno;
1436 const char **linemap = NULL;
1437 unsigned long line_map_size = 0;
1438
1439 lineno = 0;
1440 lstart = map;
1441 end = map + size;
1442
1443 for (p = map; p < end; p++)
1444 {
1445 if (*p == '\n')
1446 {
1447 if (p + 1 < end && p[1] == '\r')
1448 p++;
1449 }
1450 else if (*p == '\r')
1451 {
1452 if (p + 1 < end && p[1] == '\n')
1453 p++;
1454 }
1455 else
1456 continue;
1457
1458 /* End of line found. */
1459
1460 if (linemap == NULL || line_map_size < lineno + 1)
1461 {
1462 unsigned long newsize;
1463
1464 chars_per_line -= line_map_decrease;
1465 if (chars_per_line <= 1)
1466 chars_per_line = 1;
1467 line_map_size = size / chars_per_line + 1;
1468 if (line_map_size < lineno + 1)
1469 line_map_size = lineno + 1;
1470 newsize = line_map_size * sizeof (char *);
1471 linemap = (const char **) xrealloc (linemap, newsize);
1472 }
1473
1474 linemap[lineno++] = lstart;
1475 lstart = p + 1;
1476 }
1477
1478 *maxline = lineno;
1479 return linemap;
1480 }
1481
1482 /* Tries to open MODNAME, and if successful adds a node to print_files
1483 linked list and returns that node. Returns NULL on failure. */
1484
1485 static struct print_file_list *
1486 try_print_file_open (const char *origname, const char *modname, struct stat *fst)
1487 {
1488 struct print_file_list *p;
1489
1490 p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
1491
1492 p->map = slurp_file (modname, &p->mapsize, fst);
1493 if (p->map == NULL)
1494 {
1495 free (p);
1496 return NULL;
1497 }
1498
1499 p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1500 p->last_line = 0;
1501 p->max_printed = 0;
1502 p->filename = origname;
1503 p->modname = modname;
1504 p->next = print_files;
1505 p->first = 1;
1506 print_files = p;
1507 return p;
1508 }
1509
1510 /* If the source file, as described in the symtab, is not found
1511 try to locate it in one of the paths specified with -I
1512 If found, add location to print_files linked list. */
1513
1514 static struct print_file_list *
1515 update_source_path (const char *filename, bfd *abfd)
1516 {
1517 struct print_file_list *p;
1518 const char *fname;
1519 struct stat fst;
1520 int i;
1521
1522 p = try_print_file_open (filename, filename, &fst);
1523 if (p == NULL)
1524 {
1525 if (include_path_count == 0)
1526 return NULL;
1527
1528 /* Get the name of the file. */
1529 fname = lbasename (filename);
1530
1531 /* If file exists under a new path, we need to add it to the list
1532 so that show_line knows about it. */
1533 for (i = 0; i < include_path_count; i++)
1534 {
1535 char *modname = concat (include_paths[i], "/", fname,
1536 (const char *) 0);
1537
1538 p = try_print_file_open (filename, modname, &fst);
1539 if (p)
1540 break;
1541
1542 free (modname);
1543 }
1544 }
1545
1546 if (p != NULL)
1547 {
1548 long mtime = bfd_get_mtime (abfd);
1549
1550 if (fst.st_mtime > mtime)
1551 warn (_("source file %s is more recent than object file\n"),
1552 filename);
1553 }
1554
1555 return p;
1556 }
1557
1558 /* Print a source file line. */
1559
1560 static void
1561 print_line (struct print_file_list *p, unsigned int linenum)
1562 {
1563 const char *l;
1564 size_t len;
1565
1566 --linenum;
1567 if (linenum >= p->maxline)
1568 return;
1569 l = p->linemap [linenum];
1570 /* Test fwrite return value to quiet glibc warning. */
1571 len = strcspn (l, "\n\r");
1572 if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1573 putchar ('\n');
1574 }
1575
1576 /* Print a range of source code lines. */
1577
1578 static void
1579 dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1580 {
1581 if (p->map == NULL)
1582 return;
1583 while (start <= end)
1584 {
1585 print_line (p, start);
1586 start++;
1587 }
1588 }
1589
1590 /* Show the line number, or the source line, in a disassembly
1591 listing. */
1592
1593 static void
1594 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1595 {
1596 const char *filename;
1597 const char *functionname;
1598 unsigned int linenumber;
1599 unsigned int discriminator;
1600 bfd_boolean reloc;
1601 char *path = NULL;
1602
1603 if (! with_line_numbers && ! with_source_code)
1604 return;
1605
1606 if (! bfd_find_nearest_line_discriminator (abfd, section, syms, addr_offset,
1607 &filename, &functionname,
1608 &linenumber, &discriminator))
1609 return;
1610
1611 if (filename != NULL && *filename == '\0')
1612 filename = NULL;
1613 if (functionname != NULL && *functionname == '\0')
1614 functionname = NULL;
1615
1616 if (filename
1617 && IS_ABSOLUTE_PATH (filename)
1618 && prefix)
1619 {
1620 char *path_up;
1621 const char *fname = filename;
1622
1623 path = xmalloc (prefix_length + PATH_MAX + 1);
1624
1625 if (prefix_length)
1626 memcpy (path, prefix, prefix_length);
1627 path_up = path + prefix_length;
1628
1629 /* Build relocated filename, stripping off leading directories
1630 from the initial filename if requested. */
1631 if (prefix_strip > 0)
1632 {
1633 int level = 0;
1634 const char *s;
1635
1636 /* Skip selected directory levels. */
1637 for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
1638 if (IS_DIR_SEPARATOR(*s))
1639 {
1640 fname = s;
1641 level++;
1642 }
1643 }
1644
1645 /* Update complete filename. */
1646 strncpy (path_up, fname, PATH_MAX);
1647 path_up[PATH_MAX] = '\0';
1648
1649 filename = path;
1650 reloc = TRUE;
1651 }
1652 else
1653 reloc = FALSE;
1654
1655 if (with_line_numbers)
1656 {
1657 if (functionname != NULL
1658 && (prev_functionname == NULL
1659 || strcmp (functionname, prev_functionname) != 0))
1660 {
1661 printf ("%s():\n", sanitize_string (functionname));
1662 prev_line = -1;
1663 }
1664 if (linenumber > 0
1665 && (linenumber != prev_line
1666 || discriminator != prev_discriminator))
1667 {
1668 if (discriminator > 0)
1669 printf ("%s:%u (discriminator %u)\n",
1670 filename == NULL ? "???" : sanitize_string (filename),
1671 linenumber, discriminator);
1672 else
1673 printf ("%s:%u\n", filename == NULL
1674 ? "???" : sanitize_string (filename),
1675 linenumber);
1676 }
1677 if (unwind_inlines)
1678 {
1679 const char *filename2;
1680 const char *functionname2;
1681 unsigned line2;
1682
1683 while (bfd_find_inliner_info (abfd, &filename2, &functionname2,
1684 &line2))
1685 {
1686 printf ("inlined by %s:%u",
1687 sanitize_string (filename2), line2);
1688 printf (" (%s)\n", sanitize_string (functionname2));
1689 }
1690 }
1691 }
1692
1693 if (with_source_code
1694 && filename != NULL
1695 && linenumber > 0)
1696 {
1697 struct print_file_list **pp, *p;
1698 unsigned l;
1699
1700 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1701 if (filename_cmp ((*pp)->filename, filename) == 0)
1702 break;
1703 p = *pp;
1704
1705 if (p == NULL)
1706 {
1707 if (reloc)
1708 filename = xstrdup (filename);
1709 p = update_source_path (filename, abfd);
1710 }
1711
1712 if (p != NULL && linenumber != p->last_line)
1713 {
1714 if (file_start_context && p->first)
1715 l = 1;
1716 else
1717 {
1718 l = linenumber - SHOW_PRECEDING_CONTEXT_LINES;
1719 if (l >= linenumber)
1720 l = 1;
1721 if (p->max_printed >= l)
1722 {
1723 if (p->max_printed < linenumber)
1724 l = p->max_printed + 1;
1725 else
1726 l = linenumber;
1727 }
1728 }
1729 dump_lines (p, l, linenumber);
1730 if (p->max_printed < linenumber)
1731 p->max_printed = linenumber;
1732 p->last_line = linenumber;
1733 p->first = 0;
1734 }
1735 }
1736
1737 if (functionname != NULL
1738 && (prev_functionname == NULL
1739 || strcmp (functionname, prev_functionname) != 0))
1740 {
1741 if (prev_functionname != NULL)
1742 free (prev_functionname);
1743 prev_functionname = (char *) xmalloc (strlen (functionname) + 1);
1744 strcpy (prev_functionname, functionname);
1745 }
1746
1747 if (linenumber > 0 && linenumber != prev_line)
1748 prev_line = linenumber;
1749
1750 if (discriminator != prev_discriminator)
1751 prev_discriminator = discriminator;
1752
1753 if (path)
1754 free (path);
1755 }
1756
1757 /* Pseudo FILE object for strings. */
1758 typedef struct
1759 {
1760 char *buffer;
1761 size_t pos;
1762 size_t alloc;
1763 } SFILE;
1764
1765 /* sprintf to a "stream". */
1766
1767 static int ATTRIBUTE_PRINTF_2
1768 objdump_sprintf (SFILE *f, const char *format, ...)
1769 {
1770 size_t n;
1771 va_list args;
1772
1773 while (1)
1774 {
1775 size_t space = f->alloc - f->pos;
1776
1777 va_start (args, format);
1778 n = vsnprintf (f->buffer + f->pos, space, format, args);
1779 va_end (args);
1780
1781 if (space > n)
1782 break;
1783
1784 f->alloc = (f->alloc + n) * 2;
1785 f->buffer = (char *) xrealloc (f->buffer, f->alloc);
1786 }
1787 f->pos += n;
1788
1789 return n;
1790 }
1791
1792 /* The number of zeroes we want to see before we start skipping them.
1793 The number is arbitrarily chosen. */
1794
1795 #define DEFAULT_SKIP_ZEROES 8
1796
1797 /* The number of zeroes to skip at the end of a section. If the
1798 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1799 SKIP_ZEROES, they will be disassembled. If there are fewer than
1800 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1801 attempt to avoid disassembling zeroes inserted by section
1802 alignment. */
1803
1804 #define DEFAULT_SKIP_ZEROES_AT_END 3
1805
1806 /* Disassemble some data in memory between given values. */
1807
1808 static void
1809 disassemble_bytes (struct disassemble_info * inf,
1810 disassembler_ftype disassemble_fn,
1811 bfd_boolean insns,
1812 bfd_byte * data,
1813 bfd_vma start_offset,
1814 bfd_vma stop_offset,
1815 bfd_vma rel_offset,
1816 arelent *** relppp,
1817 arelent ** relppend)
1818 {
1819 struct objdump_disasm_info *aux;
1820 asection *section;
1821 int octets_per_line;
1822 int skip_addr_chars;
1823 bfd_vma addr_offset;
1824 unsigned int opb = inf->octets_per_byte;
1825 unsigned int skip_zeroes = inf->skip_zeroes;
1826 unsigned int skip_zeroes_at_end = inf->skip_zeroes_at_end;
1827 int octets = opb;
1828 SFILE sfile;
1829
1830 aux = (struct objdump_disasm_info *) inf->application_data;
1831 section = aux->sec;
1832
1833 sfile.alloc = 120;
1834 sfile.buffer = (char *) xmalloc (sfile.alloc);
1835 sfile.pos = 0;
1836
1837 if (insn_width)
1838 octets_per_line = insn_width;
1839 else if (insns)
1840 octets_per_line = 4;
1841 else
1842 octets_per_line = 16;
1843
1844 /* Figure out how many characters to skip at the start of an
1845 address, to make the disassembly look nicer. We discard leading
1846 zeroes in chunks of 4, ensuring that there is always a leading
1847 zero remaining. */
1848 skip_addr_chars = 0;
1849 if (! prefix_addresses)
1850 {
1851 char buf[30];
1852
1853 bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1854
1855 while (buf[skip_addr_chars] == '0')
1856 ++skip_addr_chars;
1857
1858 /* Don't discard zeros on overflow. */
1859 if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1860 skip_addr_chars = 0;
1861
1862 if (skip_addr_chars != 0)
1863 skip_addr_chars = (skip_addr_chars - 1) & -4;
1864 }
1865
1866 inf->insn_info_valid = 0;
1867
1868 addr_offset = start_offset;
1869 while (addr_offset < stop_offset)
1870 {
1871 bfd_vma z;
1872 bfd_boolean need_nl = FALSE;
1873 int previous_octets;
1874
1875 /* Remember the length of the previous instruction. */
1876 previous_octets = octets;
1877 octets = 0;
1878
1879 /* Make sure we don't use relocs from previous instructions. */
1880 aux->reloc = NULL;
1881
1882 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1883 print `...'. */
1884 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1885 if (data[z] != 0)
1886 break;
1887 if (! disassemble_zeroes
1888 && (inf->insn_info_valid == 0
1889 || inf->branch_delay_insns == 0)
1890 && (z - addr_offset * opb >= skip_zeroes
1891 || (z == stop_offset * opb &&
1892 z - addr_offset * opb < skip_zeroes_at_end)))
1893 {
1894 /* If there are more nonzero octets to follow, we only skip
1895 zeroes in multiples of 4, to try to avoid running over
1896 the start of an instruction which happens to start with
1897 zero. */
1898 if (z != stop_offset * opb)
1899 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1900
1901 octets = z - addr_offset * opb;
1902
1903 /* If we are going to display more data, and we are displaying
1904 file offsets, then tell the user how many zeroes we skip
1905 and the file offset from where we resume dumping. */
1906 if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1907 printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1908 octets / opb,
1909 (unsigned long) (section->filepos
1910 + (addr_offset + (octets / opb))));
1911 else
1912 printf ("\t...\n");
1913 }
1914 else
1915 {
1916 char buf[50];
1917 int bpc = 0;
1918 int pb = 0;
1919
1920 if (with_line_numbers || with_source_code)
1921 show_line (aux->abfd, section, addr_offset);
1922
1923 if (! prefix_addresses)
1924 {
1925 char *s;
1926
1927 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1928 for (s = buf + skip_addr_chars; *s == '0'; s++)
1929 *s = ' ';
1930 if (*s == '\0')
1931 *--s = '0';
1932 printf ("%s:\t", buf + skip_addr_chars);
1933 }
1934 else
1935 {
1936 aux->require_sec = TRUE;
1937 objdump_print_address (section->vma + addr_offset, inf);
1938 aux->require_sec = FALSE;
1939 putchar (' ');
1940 }
1941
1942 if (insns)
1943 {
1944 sfile.pos = 0;
1945 inf->fprintf_func = (fprintf_ftype) objdump_sprintf;
1946 inf->stream = &sfile;
1947 inf->bytes_per_line = 0;
1948 inf->bytes_per_chunk = 0;
1949 inf->flags = disassemble_all ? DISASSEMBLE_DATA : 0;
1950 if (machine)
1951 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
1952
1953 if (inf->disassembler_needs_relocs
1954 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1955 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1956 && *relppp < relppend)
1957 {
1958 bfd_signed_vma distance_to_rel;
1959
1960 distance_to_rel = (**relppp)->address
1961 - (rel_offset + addr_offset);
1962
1963 /* Check to see if the current reloc is associated with
1964 the instruction that we are about to disassemble. */
1965 if (distance_to_rel == 0
1966 /* FIXME: This is wrong. We are trying to catch
1967 relocs that are addressed part way through the
1968 current instruction, as might happen with a packed
1969 VLIW instruction. Unfortunately we do not know the
1970 length of the current instruction since we have not
1971 disassembled it yet. Instead we take a guess based
1972 upon the length of the previous instruction. The
1973 proper solution is to have a new target-specific
1974 disassembler function which just returns the length
1975 of an instruction at a given address without trying
1976 to display its disassembly. */
1977 || (distance_to_rel > 0
1978 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1979 {
1980 inf->flags |= INSN_HAS_RELOC;
1981 aux->reloc = **relppp;
1982 }
1983 }
1984
1985 if (! disassemble_all
1986 && (section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1987 == (SEC_CODE | SEC_HAS_CONTENTS))
1988 /* Set a stop_vma so that the disassembler will not read
1989 beyond the next symbol. We assume that symbols appear on
1990 the boundaries between instructions. We only do this when
1991 disassembling code of course, and when -D is in effect. */
1992 inf->stop_vma = section->vma + stop_offset;
1993
1994 octets = (*disassemble_fn) (section->vma + addr_offset, inf);
1995
1996 inf->stop_vma = 0;
1997 inf->fprintf_func = (fprintf_ftype) fprintf;
1998 inf->stream = stdout;
1999 if (insn_width == 0 && inf->bytes_per_line != 0)
2000 octets_per_line = inf->bytes_per_line;
2001 if (octets < (int) opb)
2002 {
2003 if (sfile.pos)
2004 printf ("%s\n", sfile.buffer);
2005 if (octets >= 0)
2006 {
2007 non_fatal (_("disassemble_fn returned length %d"),
2008 octets);
2009 exit_status = 1;
2010 }
2011 break;
2012 }
2013 }
2014 else
2015 {
2016 bfd_vma j;
2017
2018 octets = octets_per_line;
2019 if (addr_offset + octets / opb > stop_offset)
2020 octets = (stop_offset - addr_offset) * opb;
2021
2022 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
2023 {
2024 if (ISPRINT (data[j]))
2025 buf[j - addr_offset * opb] = data[j];
2026 else
2027 buf[j - addr_offset * opb] = '.';
2028 }
2029 buf[j - addr_offset * opb] = '\0';
2030 }
2031
2032 if (prefix_addresses
2033 ? show_raw_insn > 0
2034 : show_raw_insn >= 0)
2035 {
2036 bfd_vma j;
2037
2038 /* If ! prefix_addresses and ! wide_output, we print
2039 octets_per_line octets per line. */
2040 pb = octets;
2041 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
2042 pb = octets_per_line;
2043
2044 if (inf->bytes_per_chunk)
2045 bpc = inf->bytes_per_chunk;
2046 else
2047 bpc = 1;
2048
2049 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
2050 {
2051 /* PR 21580: Check for a buffer ending early. */
2052 if (j + bpc <= stop_offset * opb)
2053 {
2054 int k;
2055
2056 if (inf->display_endian == BFD_ENDIAN_LITTLE)
2057 {
2058 for (k = bpc - 1; k >= 0; k--)
2059 printf ("%02x", (unsigned) data[j + k]);
2060 }
2061 else
2062 {
2063 for (k = 0; k < bpc; k++)
2064 printf ("%02x", (unsigned) data[j + k]);
2065 }
2066 }
2067 putchar (' ');
2068 }
2069
2070 for (; pb < octets_per_line; pb += bpc)
2071 {
2072 int k;
2073
2074 for (k = 0; k < bpc; k++)
2075 printf (" ");
2076 putchar (' ');
2077 }
2078
2079 /* Separate raw data from instruction by extra space. */
2080 if (insns)
2081 putchar ('\t');
2082 else
2083 printf (" ");
2084 }
2085
2086 if (! insns)
2087 printf ("%s", buf);
2088 else if (sfile.pos)
2089 printf ("%s", sfile.buffer);
2090
2091 if (prefix_addresses
2092 ? show_raw_insn > 0
2093 : show_raw_insn >= 0)
2094 {
2095 while (pb < octets)
2096 {
2097 bfd_vma j;
2098 char *s;
2099
2100 putchar ('\n');
2101 j = addr_offset * opb + pb;
2102
2103 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
2104 for (s = buf + skip_addr_chars; *s == '0'; s++)
2105 *s = ' ';
2106 if (*s == '\0')
2107 *--s = '0';
2108 printf ("%s:\t", buf + skip_addr_chars);
2109
2110 pb += octets_per_line;
2111 if (pb > octets)
2112 pb = octets;
2113 for (; j < addr_offset * opb + pb; j += bpc)
2114 {
2115 /* PR 21619: Check for a buffer ending early. */
2116 if (j + bpc <= stop_offset * opb)
2117 {
2118 int k;
2119
2120 if (inf->display_endian == BFD_ENDIAN_LITTLE)
2121 {
2122 for (k = bpc - 1; k >= 0; k--)
2123 printf ("%02x", (unsigned) data[j + k]);
2124 }
2125 else
2126 {
2127 for (k = 0; k < bpc; k++)
2128 printf ("%02x", (unsigned) data[j + k]);
2129 }
2130 }
2131 putchar (' ');
2132 }
2133 }
2134 }
2135
2136 if (!wide_output)
2137 putchar ('\n');
2138 else
2139 need_nl = TRUE;
2140 }
2141
2142 while ((*relppp) < relppend
2143 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
2144 {
2145 if (dump_reloc_info || dump_dynamic_reloc_info)
2146 {
2147 arelent *q;
2148
2149 q = **relppp;
2150
2151 if (wide_output)
2152 putchar ('\t');
2153 else
2154 printf ("\t\t\t");
2155
2156 objdump_print_value (section->vma - rel_offset + q->address,
2157 inf, TRUE);
2158
2159 if (q->howto == NULL)
2160 printf (": *unknown*\t");
2161 else if (q->howto->name)
2162 printf (": %s\t", q->howto->name);
2163 else
2164 printf (": %d\t", q->howto->type);
2165
2166 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
2167 printf ("*unknown*");
2168 else
2169 {
2170 const char *sym_name;
2171
2172 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
2173 if (sym_name != NULL && *sym_name != '\0')
2174 objdump_print_symname (aux->abfd, inf, *q->sym_ptr_ptr);
2175 else
2176 {
2177 asection *sym_sec;
2178
2179 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
2180 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
2181 if (sym_name == NULL || *sym_name == '\0')
2182 sym_name = "*unknown*";
2183 printf ("%s", sanitize_string (sym_name));
2184 }
2185 }
2186
2187 if (q->addend)
2188 {
2189 bfd_signed_vma addend = q->addend;
2190 if (addend < 0)
2191 {
2192 printf ("-0x");
2193 addend = -addend;
2194 }
2195 else
2196 printf ("+0x");
2197 objdump_print_value (addend, inf, TRUE);
2198 }
2199
2200 printf ("\n");
2201 need_nl = FALSE;
2202 }
2203 ++(*relppp);
2204 }
2205
2206 if (need_nl)
2207 printf ("\n");
2208
2209 addr_offset += octets / opb;
2210 }
2211
2212 free (sfile.buffer);
2213 }
2214
2215 static void
2216 disassemble_section (bfd *abfd, asection *section, void *inf)
2217 {
2218 const struct elf_backend_data * bed;
2219 bfd_vma sign_adjust = 0;
2220 struct disassemble_info * pinfo = (struct disassemble_info *) inf;
2221 struct objdump_disasm_info * paux;
2222 unsigned int opb = pinfo->octets_per_byte;
2223 bfd_byte * data = NULL;
2224 bfd_size_type datasize = 0;
2225 arelent ** rel_pp = NULL;
2226 arelent ** rel_ppstart = NULL;
2227 arelent ** rel_ppend;
2228 bfd_vma stop_offset;
2229 asymbol * sym = NULL;
2230 long place = 0;
2231 long rel_count;
2232 bfd_vma rel_offset;
2233 unsigned long addr_offset;
2234 bfd_boolean do_print;
2235 enum loop_control
2236 {
2237 stop_offset_reached,
2238 function_sym,
2239 next_sym
2240 } loop_until;
2241
2242 /* Sections that do not contain machine
2243 code are not normally disassembled. */
2244 if (! disassemble_all
2245 && only_list == NULL
2246 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
2247 != (SEC_CODE | SEC_HAS_CONTENTS)))
2248 return;
2249
2250 if (! process_section_p (section))
2251 return;
2252
2253 datasize = bfd_get_section_size (section);
2254 if (datasize == 0)
2255 return;
2256
2257 if (start_address == (bfd_vma) -1
2258 || start_address < section->vma)
2259 addr_offset = 0;
2260 else
2261 addr_offset = start_address - section->vma;
2262
2263 if (stop_address == (bfd_vma) -1)
2264 stop_offset = datasize / opb;
2265 else
2266 {
2267 if (stop_address < section->vma)
2268 stop_offset = 0;
2269 else
2270 stop_offset = stop_address - section->vma;
2271 if (stop_offset > datasize / opb)
2272 stop_offset = datasize / opb;
2273 }
2274
2275 if (addr_offset >= stop_offset)
2276 return;
2277
2278 /* Decide which set of relocs to use. Load them if necessary. */
2279 paux = (struct objdump_disasm_info *) pinfo->application_data;
2280 if (paux->dynrelbuf && dump_dynamic_reloc_info)
2281 {
2282 rel_pp = paux->dynrelbuf;
2283 rel_count = paux->dynrelcount;
2284 /* Dynamic reloc addresses are absolute, non-dynamic are section
2285 relative. REL_OFFSET specifies the reloc address corresponding
2286 to the start of this section. */
2287 rel_offset = section->vma;
2288 }
2289 else
2290 {
2291 rel_count = 0;
2292 rel_pp = NULL;
2293 rel_offset = 0;
2294
2295 if ((section->flags & SEC_RELOC) != 0
2296 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
2297 {
2298 long relsize;
2299
2300 relsize = bfd_get_reloc_upper_bound (abfd, section);
2301 if (relsize < 0)
2302 bfd_fatal (bfd_get_filename (abfd));
2303
2304 if (relsize > 0)
2305 {
2306 rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
2307 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
2308 if (rel_count < 0)
2309 bfd_fatal (bfd_get_filename (abfd));
2310
2311 /* Sort the relocs by address. */
2312 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
2313 }
2314 }
2315 }
2316 rel_ppend = rel_pp + rel_count;
2317
2318 if (!bfd_malloc_and_get_section (abfd, section, &data))
2319 {
2320 non_fatal (_("Reading section %s failed because: %s"),
2321 section->name, bfd_errmsg (bfd_get_error ()));
2322 return;
2323 }
2324
2325 paux->sec = section;
2326 pinfo->buffer = data;
2327 pinfo->buffer_vma = section->vma;
2328 pinfo->buffer_length = datasize;
2329 pinfo->section = section;
2330
2331 /* Skip over the relocs belonging to addresses below the
2332 start address. */
2333 while (rel_pp < rel_ppend
2334 && (*rel_pp)->address < rel_offset + addr_offset)
2335 ++rel_pp;
2336
2337 printf (_("\nDisassembly of section %s:\n"), sanitize_string (section->name));
2338
2339 /* Find the nearest symbol forwards from our current position. */
2340 paux->require_sec = TRUE;
2341 sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
2342 (struct disassemble_info *) inf,
2343 &place);
2344 paux->require_sec = FALSE;
2345
2346 /* PR 9774: If the target used signed addresses then we must make
2347 sure that we sign extend the value that we calculate for 'addr'
2348 in the loop below. */
2349 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2350 && (bed = get_elf_backend_data (abfd)) != NULL
2351 && bed->sign_extend_vma)
2352 sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
2353
2354 /* Disassemble a block of instructions up to the address associated with
2355 the symbol we have just found. Then print the symbol and find the
2356 next symbol on. Repeat until we have disassembled the entire section
2357 or we have reached the end of the address range we are interested in. */
2358 do_print = paux->symbol == NULL;
2359 loop_until = stop_offset_reached;
2360
2361 while (addr_offset < stop_offset)
2362 {
2363 bfd_vma addr;
2364 asymbol *nextsym;
2365 bfd_vma nextstop_offset;
2366 bfd_boolean insns;
2367
2368 addr = section->vma + addr_offset;
2369 addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
2370
2371 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
2372 {
2373 int x;
2374
2375 for (x = place;
2376 (x < sorted_symcount
2377 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
2378 ++x)
2379 continue;
2380
2381 pinfo->symbols = sorted_syms + place;
2382 pinfo->num_symbols = x - place;
2383 pinfo->symtab_pos = place;
2384 }
2385 else
2386 {
2387 pinfo->symbols = NULL;
2388 pinfo->num_symbols = 0;
2389 pinfo->symtab_pos = -1;
2390 }
2391
2392 /* If we are only disassembling from a specific symbol,
2393 check to see if we should start or stop displaying. */
2394 if (sym && paux->symbol)
2395 {
2396 if (do_print)
2397 {
2398 /* See if we should stop printing. */
2399 switch (loop_until)
2400 {
2401 case function_sym:
2402 if (sym->flags & BSF_FUNCTION)
2403 do_print = FALSE;
2404 break;
2405
2406 case stop_offset_reached:
2407 /* Handled by the while loop. */
2408 break;
2409
2410 case next_sym:
2411 /* FIXME: There is an implicit assumption here
2412 that the name of sym is different from
2413 paux->symbol. */
2414 if (! bfd_is_local_label (abfd, sym))
2415 do_print = FALSE;
2416 break;
2417 }
2418 }
2419 else
2420 {
2421 const char * name = bfd_asymbol_name (sym);
2422 char * alloc = NULL;
2423
2424 if (do_demangle && name[0] != '\0')
2425 {
2426 /* Demangle the name. */
2427 alloc = bfd_demangle (abfd, name, demangle_flags);
2428 if (alloc != NULL)
2429 name = alloc;
2430 }
2431
2432 /* We are not currently printing. Check to see
2433 if the current symbol matches the requested symbol. */
2434 if (streq (name, paux->symbol))
2435 {
2436 do_print = TRUE;
2437
2438 if (sym->flags & BSF_FUNCTION)
2439 {
2440 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2441 && ((elf_symbol_type *) sym)->internal_elf_sym.st_size > 0)
2442 {
2443 /* Sym is a function symbol with a size associated
2444 with it. Turn on automatic disassembly for the
2445 next VALUE bytes. */
2446 stop_offset = addr_offset
2447 + ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
2448 loop_until = stop_offset_reached;
2449 }
2450 else
2451 {
2452 /* Otherwise we need to tell the loop heuristic to
2453 loop until the next function symbol is encountered. */
2454 loop_until = function_sym;
2455 }
2456 }
2457 else
2458 {
2459 /* Otherwise loop until the next symbol is encountered. */
2460 loop_until = next_sym;
2461 }
2462 }
2463
2464 free (alloc);
2465 }
2466 }
2467
2468 if (! prefix_addresses && do_print)
2469 {
2470 pinfo->fprintf_func (pinfo->stream, "\n");
2471 objdump_print_addr_with_sym (abfd, section, sym, addr,
2472 pinfo, FALSE);
2473 pinfo->fprintf_func (pinfo->stream, ":\n");
2474 }
2475
2476 if (sym != NULL && bfd_asymbol_value (sym) > addr)
2477 nextsym = sym;
2478 else if (sym == NULL)
2479 nextsym = NULL;
2480 else
2481 {
2482 #define is_valid_next_sym(SYM) \
2483 (strcmp (bfd_section_name (abfd, (SYM)->section), bfd_section_name (abfd, section)) == 0 \
2484 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
2485 && pinfo->symbol_is_valid (SYM, pinfo))
2486
2487 /* Search forward for the next appropriate symbol in
2488 SECTION. Note that all the symbols are sorted
2489 together into one big array, and that some sections
2490 may have overlapping addresses. */
2491 while (place < sorted_symcount
2492 && ! is_valid_next_sym (sorted_syms [place]))
2493 ++place;
2494
2495 if (place >= sorted_symcount)
2496 nextsym = NULL;
2497 else
2498 nextsym = sorted_syms[place];
2499 }
2500
2501 if (sym != NULL && bfd_asymbol_value (sym) > addr)
2502 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
2503 else if (nextsym == NULL)
2504 nextstop_offset = stop_offset;
2505 else
2506 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
2507
2508 if (nextstop_offset > stop_offset
2509 || nextstop_offset <= addr_offset)
2510 nextstop_offset = stop_offset;
2511
2512 /* If a symbol is explicitly marked as being an object
2513 rather than a function, just dump the bytes without
2514 disassembling them. */
2515 if (disassemble_all
2516 || sym == NULL
2517 || sym->section != section
2518 || bfd_asymbol_value (sym) > addr
2519 || ((sym->flags & BSF_OBJECT) == 0
2520 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
2521 == NULL)
2522 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
2523 == NULL))
2524 || (sym->flags & BSF_FUNCTION) != 0)
2525 insns = TRUE;
2526 else
2527 insns = FALSE;
2528
2529 if (do_print)
2530 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2531 addr_offset, nextstop_offset,
2532 rel_offset, &rel_pp, rel_ppend);
2533
2534 addr_offset = nextstop_offset;
2535 sym = nextsym;
2536 }
2537
2538 free (data);
2539
2540 if (rel_ppstart != NULL)
2541 free (rel_ppstart);
2542 }
2543
2544 /* Disassemble the contents of an object file. */
2545
2546 static void
2547 disassemble_data (bfd *abfd)
2548 {
2549 struct disassemble_info disasm_info;
2550 struct objdump_disasm_info aux;
2551 long i;
2552
2553 print_files = NULL;
2554 prev_functionname = NULL;
2555 prev_line = -1;
2556 prev_discriminator = 0;
2557
2558 /* We make a copy of syms to sort. We don't want to sort syms
2559 because that will screw up the relocs. */
2560 sorted_symcount = symcount ? symcount : dynsymcount;
2561 sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2562 * sizeof (asymbol *));
2563 memcpy (sorted_syms, symcount ? syms : dynsyms,
2564 sorted_symcount * sizeof (asymbol *));
2565
2566 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2567
2568 for (i = 0; i < synthcount; ++i)
2569 {
2570 sorted_syms[sorted_symcount] = synthsyms + i;
2571 ++sorted_symcount;
2572 }
2573
2574 /* Sort the symbols into section and symbol order. */
2575 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2576
2577 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
2578
2579 disasm_info.application_data = (void *) &aux;
2580 aux.abfd = abfd;
2581 aux.require_sec = FALSE;
2582 aux.dynrelbuf = NULL;
2583 aux.dynrelcount = 0;
2584 aux.reloc = NULL;
2585 aux.symbol = disasm_sym;
2586
2587 disasm_info.print_address_func = objdump_print_address;
2588 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2589
2590 if (machine != NULL)
2591 {
2592 const bfd_arch_info_type *inf = bfd_scan_arch (machine);
2593
2594 if (inf == NULL)
2595 fatal (_("can't use supplied machine %s"), machine);
2596
2597 abfd->arch_info = inf;
2598 }
2599
2600 if (endian != BFD_ENDIAN_UNKNOWN)
2601 {
2602 struct bfd_target *xvec;
2603
2604 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
2605 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2606 xvec->byteorder = endian;
2607 abfd->xvec = xvec;
2608 }
2609
2610 /* Use libopcodes to locate a suitable disassembler. */
2611 aux.disassemble_fn = disassembler (bfd_get_arch (abfd),
2612 bfd_big_endian (abfd),
2613 bfd_get_mach (abfd), abfd);
2614 if (!aux.disassemble_fn)
2615 {
2616 non_fatal (_("can't disassemble for architecture %s\n"),
2617 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2618 exit_status = 1;
2619 return;
2620 }
2621
2622 disasm_info.flavour = bfd_get_flavour (abfd);
2623 disasm_info.arch = bfd_get_arch (abfd);
2624 disasm_info.mach = bfd_get_mach (abfd);
2625 disasm_info.disassembler_options = disassembler_options;
2626 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2627 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2628 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2629 disasm_info.disassembler_needs_relocs = FALSE;
2630
2631 if (bfd_big_endian (abfd))
2632 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2633 else if (bfd_little_endian (abfd))
2634 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2635 else
2636 /* ??? Aborting here seems too drastic. We could default to big or little
2637 instead. */
2638 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2639
2640 /* Allow the target to customize the info structure. */
2641 disassemble_init_for_target (& disasm_info);
2642
2643 /* Pre-load the dynamic relocs as we may need them during the disassembly. */
2644 {
2645 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2646
2647 if (relsize < 0 && dump_dynamic_reloc_info)
2648 bfd_fatal (bfd_get_filename (abfd));
2649
2650 if (relsize > 0)
2651 {
2652 aux.dynrelbuf = (arelent **) xmalloc (relsize);
2653 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2654 aux.dynrelbuf,
2655 dynsyms);
2656 if (aux.dynrelcount < 0)
2657 bfd_fatal (bfd_get_filename (abfd));
2658
2659 /* Sort the relocs by address. */
2660 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2661 compare_relocs);
2662 }
2663 }
2664 disasm_info.symtab = sorted_syms;
2665 disasm_info.symtab_size = sorted_symcount;
2666
2667 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2668
2669 if (aux.dynrelbuf != NULL)
2670 free (aux.dynrelbuf);
2671 free (sorted_syms);
2672 }
2673 \f
2674 static bfd_boolean
2675 load_specific_debug_section (enum dwarf_section_display_enum debug,
2676 asection *sec, void *file)
2677 {
2678 struct dwarf_section *section = &debug_displays [debug].section;
2679 bfd *abfd = (bfd *) file;
2680 bfd_byte *contents;
2681 bfd_size_type amt;
2682
2683 if (section->start != NULL)
2684 {
2685 /* If it is already loaded, do nothing. */
2686 if (streq (section->filename, bfd_get_filename (abfd)))
2687 return TRUE;
2688 free (section->start);
2689 }
2690
2691 section->filename = bfd_get_filename (abfd);
2692 section->reloc_info = NULL;
2693 section->num_relocs = 0;
2694 section->address = bfd_get_section_vma (abfd, sec);
2695 section->user_data = sec;
2696 section->size = bfd_get_section_size (sec);
2697 amt = section->size + 1;
2698 if (amt == 0 || amt > bfd_get_file_size (abfd))
2699 {
2700 section->start = NULL;
2701 free_debug_section (debug);
2702 printf (_("\nSection '%s' has an invalid size: %#llx.\n"),
2703 sanitize_string (section->name),
2704 (unsigned long long) section->size);
2705 return FALSE;
2706 }
2707 section->start = contents = malloc (amt);
2708 if (section->start == NULL
2709 || !bfd_get_full_section_contents (abfd, sec, &contents))
2710 {
2711 free_debug_section (debug);
2712 printf (_("\nCan't get contents for section '%s'.\n"),
2713 sanitize_string (section->name));
2714 return FALSE;
2715 }
2716 /* Ensure any string section has a terminating NUL. */
2717 section->start[section->size] = 0;
2718
2719 if (is_relocatable && debug_displays [debug].relocate)
2720 {
2721 long reloc_size;
2722 bfd_boolean ret;
2723
2724 bfd_cache_section_contents (sec, section->start);
2725
2726 ret = bfd_simple_get_relocated_section_contents (abfd,
2727 sec,
2728 section->start,
2729 syms) != NULL;
2730
2731 if (! ret)
2732 {
2733 free_debug_section (debug);
2734 printf (_("\nCan't get contents for section '%s'.\n"),
2735 sanitize_string (section->name));
2736 return FALSE;
2737 }
2738
2739 reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
2740 if (reloc_size > 0)
2741 {
2742 unsigned long reloc_count;
2743 arelent **relocs;
2744
2745 relocs = (arelent **) xmalloc (reloc_size);
2746
2747 reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
2748 if (reloc_count == 0)
2749 free (relocs);
2750 else
2751 {
2752 section->reloc_info = relocs;
2753 section->num_relocs = reloc_count;
2754 }
2755 }
2756 }
2757
2758 return TRUE;
2759 }
2760
2761 bfd_boolean
2762 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
2763 {
2764 arelent ** relocs;
2765 arelent * rp;
2766
2767 if (dsec == NULL || dsec->reloc_info == NULL)
2768 return FALSE;
2769
2770 relocs = (arelent **) dsec->reloc_info;
2771
2772 for (; (rp = * relocs) != NULL; ++ relocs)
2773 if (rp->address == offset)
2774 return TRUE;
2775
2776 return FALSE;
2777 }
2778
2779 bfd_boolean
2780 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2781 {
2782 struct dwarf_section *section = &debug_displays [debug].section;
2783 bfd *abfd = (bfd *) file;
2784 asection *sec;
2785
2786 /* If it is already loaded, do nothing. */
2787 if (section->start != NULL)
2788 {
2789 if (streq (section->filename, bfd_get_filename (abfd)))
2790 return TRUE;
2791 }
2792
2793 /* Locate the debug section. */
2794 sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2795 if (sec != NULL)
2796 section->name = section->uncompressed_name;
2797 else
2798 {
2799 sec = bfd_get_section_by_name (abfd, section->compressed_name);
2800 if (sec != NULL)
2801 section->name = section->compressed_name;
2802 }
2803 if (sec == NULL)
2804 return FALSE;
2805
2806 return load_specific_debug_section (debug, sec, file);
2807 }
2808
2809 void
2810 free_debug_section (enum dwarf_section_display_enum debug)
2811 {
2812 struct dwarf_section *section = &debug_displays [debug].section;
2813
2814 if (section->start == NULL)
2815 return;
2816
2817 /* PR 17512: file: 0f67f69d. */
2818 if (section->user_data != NULL)
2819 {
2820 asection * sec = (asection *) section->user_data;
2821
2822 /* If we are freeing contents that are also pointed to by the BFD
2823 library's section structure then make sure to update those pointers
2824 too. Otherwise, the next time we try to load data for this section
2825 we can end up using a stale pointer. */
2826 if (section->start == sec->contents)
2827 {
2828 sec->contents = NULL;
2829 sec->flags &= ~ SEC_IN_MEMORY;
2830 sec->compress_status = COMPRESS_SECTION_NONE;
2831 }
2832 }
2833
2834 free ((char *) section->start);
2835 section->start = NULL;
2836 section->address = 0;
2837 section->size = 0;
2838 }
2839
2840 void
2841 close_debug_file (void * file)
2842 {
2843 bfd * abfd = (bfd *) file;
2844
2845 bfd_close (abfd);
2846 }
2847
2848 void *
2849 open_debug_file (const char * pathname)
2850 {
2851 bfd * data;
2852
2853 data = bfd_openr (pathname, NULL);
2854 if (data == NULL)
2855 return NULL;
2856
2857 if (! bfd_check_format (data, bfd_object))
2858 return NULL;
2859
2860 return data;
2861 }
2862
2863 static void
2864 dump_dwarf_section (bfd *abfd, asection *section,
2865 void *arg ATTRIBUTE_UNUSED)
2866 {
2867 const char *name = bfd_get_section_name (abfd, section);
2868 const char *match;
2869 int i;
2870
2871 if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2872 match = ".debug_info";
2873 else
2874 match = name;
2875
2876 for (i = 0; i < max; i++)
2877 if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2878 || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2879 && debug_displays [i].enabled != NULL
2880 && *debug_displays [i].enabled)
2881 {
2882 struct dwarf_section *sec = &debug_displays [i].section;
2883
2884 if (strcmp (sec->uncompressed_name, match) == 0)
2885 sec->name = sec->uncompressed_name;
2886 else
2887 sec->name = sec->compressed_name;
2888 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2889 section, abfd))
2890 {
2891 debug_displays [i].display (sec, abfd);
2892
2893 if (i != info && i != abbrev)
2894 free_debug_section ((enum dwarf_section_display_enum) i);
2895 }
2896 break;
2897 }
2898 }
2899
2900 /* Dump the dwarf debugging information. */
2901
2902 static void
2903 dump_dwarf (bfd *abfd)
2904 {
2905 /* The byte_get pointer should have been set at the start of dump_bfd(). */
2906 if (byte_get == NULL)
2907 {
2908 warn (_("File %s does not contain any dwarf debug information\n"),
2909 bfd_get_filename (abfd));
2910 return;
2911 }
2912
2913 is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2914
2915 eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
2916
2917 switch (bfd_get_arch (abfd))
2918 {
2919 case bfd_arch_i386:
2920 switch (bfd_get_mach (abfd))
2921 {
2922 case bfd_mach_x86_64:
2923 case bfd_mach_x86_64_intel_syntax:
2924 case bfd_mach_x86_64_nacl:
2925 case bfd_mach_x64_32:
2926 case bfd_mach_x64_32_intel_syntax:
2927 case bfd_mach_x64_32_nacl:
2928 init_dwarf_regnames_x86_64 ();
2929 break;
2930
2931 default:
2932 init_dwarf_regnames_i386 ();
2933 break;
2934 }
2935 break;
2936
2937 case bfd_arch_iamcu:
2938 init_dwarf_regnames_iamcu ();
2939 break;
2940
2941 case bfd_arch_aarch64:
2942 init_dwarf_regnames_aarch64();
2943 break;
2944
2945 case bfd_arch_s390:
2946 init_dwarf_regnames_s390 ();
2947 break;
2948
2949 case bfd_arch_riscv:
2950 init_dwarf_regnames_riscv ();
2951 break;
2952
2953 case bfd_arch_s12z:
2954 /* S12Z has a 24 bit address space. But the only known
2955 producer of dwarf_info encodes addresses into 32 bits. */
2956 eh_addr_size = 4;
2957 break;
2958
2959 default:
2960 break;
2961 }
2962
2963 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2964 }
2965 \f
2966 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2967 it. Return NULL on failure. */
2968
2969 static bfd_byte *
2970 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2971 {
2972 asection *stabsect;
2973 bfd_byte *contents;
2974
2975 stabsect = bfd_get_section_by_name (abfd, sect_name);
2976 if (stabsect == NULL)
2977 {
2978 printf (_("No %s section present\n\n"),
2979 sanitize_string (sect_name));
2980 return FALSE;
2981 }
2982
2983 if (!bfd_malloc_and_get_section (abfd, stabsect, &contents))
2984 {
2985 non_fatal (_("reading %s section of %s failed: %s"),
2986 sect_name, bfd_get_filename (abfd),
2987 bfd_errmsg (bfd_get_error ()));
2988 exit_status = 1;
2989 free (contents);
2990 return NULL;
2991 }
2992
2993 *size_ptr = bfd_section_size (abfd, stabsect);
2994
2995 return contents;
2996 }
2997
2998 /* Stabs entries use a 12 byte format:
2999 4 byte string table index
3000 1 byte stab type
3001 1 byte stab other field
3002 2 byte stab desc field
3003 4 byte stab value
3004 FIXME: This will have to change for a 64 bit object format. */
3005
3006 #define STRDXOFF (0)
3007 #define TYPEOFF (4)
3008 #define OTHEROFF (5)
3009 #define DESCOFF (6)
3010 #define VALOFF (8)
3011 #define STABSIZE (12)
3012
3013 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
3014 using string table section STRSECT_NAME (in `strtab'). */
3015
3016 static void
3017 print_section_stabs (bfd *abfd,
3018 const char *stabsect_name,
3019 unsigned *string_offset_ptr)
3020 {
3021 int i;
3022 unsigned file_string_table_offset = 0;
3023 unsigned next_file_string_table_offset = *string_offset_ptr;
3024 bfd_byte *stabp, *stabs_end;
3025
3026 stabp = stabs;
3027 stabs_end = stabp + stab_size;
3028
3029 printf (_("Contents of %s section:\n\n"), sanitize_string (stabsect_name));
3030 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
3031
3032 /* Loop through all symbols and print them.
3033
3034 We start the index at -1 because there is a dummy symbol on
3035 the front of stabs-in-{coff,elf} sections that supplies sizes. */
3036 for (i = -1; stabp <= stabs_end - STABSIZE; stabp += STABSIZE, i++)
3037 {
3038 const char *name;
3039 unsigned long strx;
3040 unsigned char type, other;
3041 unsigned short desc;
3042 bfd_vma value;
3043
3044 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
3045 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
3046 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
3047 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
3048 value = bfd_h_get_32 (abfd, stabp + VALOFF);
3049
3050 printf ("\n%-6d ", i);
3051 /* Either print the stab name, or, if unnamed, print its number
3052 again (makes consistent formatting for tools like awk). */
3053 name = bfd_get_stab_name (type);
3054 if (name != NULL)
3055 printf ("%-6s", sanitize_string (name));
3056 else if (type == N_UNDF)
3057 printf ("HdrSym");
3058 else
3059 printf ("%-6d", type);
3060 printf (" %-6d %-6d ", other, desc);
3061 bfd_printf_vma (abfd, value);
3062 printf (" %-6lu", strx);
3063
3064 /* Symbols with type == 0 (N_UNDF) specify the length of the
3065 string table associated with this file. We use that info
3066 to know how to relocate the *next* file's string table indices. */
3067 if (type == N_UNDF)
3068 {
3069 file_string_table_offset = next_file_string_table_offset;
3070 next_file_string_table_offset += value;
3071 }
3072 else
3073 {
3074 bfd_size_type amt = strx + file_string_table_offset;
3075
3076 /* Using the (possibly updated) string table offset, print the
3077 string (if any) associated with this symbol. */
3078 if (amt < stabstr_size)
3079 /* PR 17512: file: 079-79389-0.001:0.1.
3080 FIXME: May need to sanitize this string before displaying. */
3081 printf (" %.*s", (int)(stabstr_size - amt), strtab + amt);
3082 else
3083 printf (" *");
3084 }
3085 }
3086 printf ("\n\n");
3087 *string_offset_ptr = next_file_string_table_offset;
3088 }
3089
3090 typedef struct
3091 {
3092 const char * section_name;
3093 const char * string_section_name;
3094 unsigned string_offset;
3095 }
3096 stab_section_names;
3097
3098 static void
3099 find_stabs_section (bfd *abfd, asection *section, void *names)
3100 {
3101 int len;
3102 stab_section_names * sought = (stab_section_names *) names;
3103
3104 /* Check for section names for which stabsect_name is a prefix, to
3105 handle .stab.N, etc. */
3106 len = strlen (sought->section_name);
3107
3108 /* If the prefix matches, and the files section name ends with a
3109 nul or a digit, then we match. I.e., we want either an exact
3110 match or a section followed by a number. */
3111 if (strncmp (sought->section_name, section->name, len) == 0
3112 && (section->name[len] == 0
3113 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
3114 {
3115 if (strtab == NULL)
3116 strtab = read_section_stabs (abfd, sought->string_section_name,
3117 &stabstr_size);
3118
3119 if (strtab)
3120 {
3121 stabs = read_section_stabs (abfd, section->name, &stab_size);
3122 if (stabs)
3123 print_section_stabs (abfd, section->name, &sought->string_offset);
3124 }
3125 }
3126 }
3127
3128 static void
3129 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
3130 {
3131 stab_section_names s;
3132
3133 s.section_name = stabsect_name;
3134 s.string_section_name = strsect_name;
3135 s.string_offset = 0;
3136
3137 bfd_map_over_sections (abfd, find_stabs_section, & s);
3138
3139 free (strtab);
3140 strtab = NULL;
3141 }
3142
3143 /* Dump the any sections containing stabs debugging information. */
3144
3145 static void
3146 dump_stabs (bfd *abfd)
3147 {
3148 dump_stabs_section (abfd, ".stab", ".stabstr");
3149 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
3150 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
3151
3152 /* For Darwin. */
3153 dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
3154
3155 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
3156 }
3157 \f
3158 static void
3159 dump_bfd_header (bfd *abfd)
3160 {
3161 char *comma = "";
3162
3163 printf (_("architecture: %s, "),
3164 bfd_printable_arch_mach (bfd_get_arch (abfd),
3165 bfd_get_mach (abfd)));
3166 printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
3167
3168 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
3169 PF (HAS_RELOC, "HAS_RELOC");
3170 PF (EXEC_P, "EXEC_P");
3171 PF (HAS_LINENO, "HAS_LINENO");
3172 PF (HAS_DEBUG, "HAS_DEBUG");
3173 PF (HAS_SYMS, "HAS_SYMS");
3174 PF (HAS_LOCALS, "HAS_LOCALS");
3175 PF (DYNAMIC, "DYNAMIC");
3176 PF (WP_TEXT, "WP_TEXT");
3177 PF (D_PAGED, "D_PAGED");
3178 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
3179 printf (_("\nstart address 0x"));
3180 bfd_printf_vma (abfd, abfd->start_address);
3181 printf ("\n");
3182 }
3183
3184 \f
3185 static void
3186 dump_bfd_private_header (bfd *abfd)
3187 {
3188 if (!bfd_print_private_bfd_data (abfd, stdout))
3189 non_fatal (_("warning: private headers incomplete: %s"),
3190 bfd_errmsg (bfd_get_error ()));
3191 }
3192
3193 static void
3194 dump_target_specific (bfd *abfd)
3195 {
3196 const struct objdump_private_desc * const *desc;
3197 struct objdump_private_option *opt;
3198 char *e, *b;
3199
3200 /* Find the desc. */
3201 for (desc = objdump_private_vectors; *desc != NULL; desc++)
3202 if ((*desc)->filter (abfd))
3203 break;
3204
3205 if (*desc == NULL)
3206 {
3207 non_fatal (_("option -P/--private not supported by this file"));
3208 return;
3209 }
3210
3211 /* Clear all options. */
3212 for (opt = (*desc)->options; opt->name; opt++)
3213 opt->selected = FALSE;
3214
3215 /* Decode options. */
3216 b = dump_private_options;
3217 do
3218 {
3219 e = strchr (b, ',');
3220
3221 if (e)
3222 *e = 0;
3223
3224 for (opt = (*desc)->options; opt->name; opt++)
3225 if (strcmp (opt->name, b) == 0)
3226 {
3227 opt->selected = TRUE;
3228 break;
3229 }
3230 if (opt->name == NULL)
3231 non_fatal (_("target specific dump '%s' not supported"), b);
3232
3233 if (e)
3234 {
3235 *e = ',';
3236 b = e + 1;
3237 }
3238 }
3239 while (e != NULL);
3240
3241 /* Dump. */
3242 (*desc)->dump (abfd);
3243 }
3244 \f
3245 /* Display a section in hexadecimal format with associated characters.
3246 Each line prefixed by the zero padded address. */
3247
3248 static void
3249 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
3250 {
3251 bfd_byte *data = NULL;
3252 bfd_size_type datasize;
3253 bfd_vma addr_offset;
3254 bfd_vma start_offset;
3255 bfd_vma stop_offset;
3256 unsigned int opb = bfd_octets_per_byte (abfd);
3257 /* Bytes per line. */
3258 const int onaline = 16;
3259 char buf[64];
3260 int count;
3261 int width;
3262
3263 if ((section->flags & SEC_HAS_CONTENTS) == 0)
3264 return;
3265
3266 if (! process_section_p (section))
3267 return;
3268
3269 if ((datasize = bfd_section_size (abfd, section)) == 0)
3270 return;
3271
3272 /* Compute the address range to display. */
3273 if (start_address == (bfd_vma) -1
3274 || start_address < section->vma)
3275 start_offset = 0;
3276 else
3277 start_offset = start_address - section->vma;
3278
3279 if (stop_address == (bfd_vma) -1)
3280 stop_offset = datasize / opb;
3281 else
3282 {
3283 if (stop_address < section->vma)
3284 stop_offset = 0;
3285 else
3286 stop_offset = stop_address - section->vma;
3287
3288 if (stop_offset > datasize / opb)
3289 stop_offset = datasize / opb;
3290 }
3291
3292 if (start_offset >= stop_offset)
3293 return;
3294
3295 printf (_("Contents of section %s:"), sanitize_string (section->name));
3296 if (display_file_offsets)
3297 printf (_(" (Starting at file offset: 0x%lx)"),
3298 (unsigned long) (section->filepos + start_offset));
3299 printf ("\n");
3300
3301 if (!bfd_get_full_section_contents (abfd, section, &data))
3302 {
3303 non_fatal (_("Reading section %s failed because: %s"),
3304 section->name, bfd_errmsg (bfd_get_error ()));
3305 return;
3306 }
3307
3308 width = 4;
3309
3310 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
3311 if (strlen (buf) >= sizeof (buf))
3312 abort ();
3313
3314 count = 0;
3315 while (buf[count] == '0' && buf[count+1] != '\0')
3316 count++;
3317 count = strlen (buf) - count;
3318 if (count > width)
3319 width = count;
3320
3321 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
3322 if (strlen (buf) >= sizeof (buf))
3323 abort ();
3324
3325 count = 0;
3326 while (buf[count] == '0' && buf[count+1] != '\0')
3327 count++;
3328 count = strlen (buf) - count;
3329 if (count > width)
3330 width = count;
3331
3332 for (addr_offset = start_offset;
3333 addr_offset < stop_offset; addr_offset += onaline / opb)
3334 {
3335 bfd_size_type j;
3336
3337 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
3338 count = strlen (buf);
3339 if ((size_t) count >= sizeof (buf))
3340 abort ();
3341
3342 putchar (' ');
3343 while (count < width)
3344 {
3345 putchar ('0');
3346 count++;
3347 }
3348 fputs (buf + count - width, stdout);
3349 putchar (' ');
3350
3351 for (j = addr_offset * opb;
3352 j < addr_offset * opb + onaline; j++)
3353 {
3354 if (j < stop_offset * opb)
3355 printf ("%02x", (unsigned) (data[j]));
3356 else
3357 printf (" ");
3358 if ((j & 3) == 3)
3359 printf (" ");
3360 }
3361
3362 printf (" ");
3363 for (j = addr_offset * opb;
3364 j < addr_offset * opb + onaline; j++)
3365 {
3366 if (j >= stop_offset * opb)
3367 printf (" ");
3368 else
3369 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
3370 }
3371 putchar ('\n');
3372 }
3373 free (data);
3374 }
3375
3376 /* Actually display the various requested regions. */
3377
3378 static void
3379 dump_data (bfd *abfd)
3380 {
3381 bfd_map_over_sections (abfd, dump_section, NULL);
3382 }
3383
3384 /* Should perhaps share code and display with nm? */
3385
3386 static void
3387 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
3388 {
3389 asymbol **current;
3390 long max_count;
3391 long count;
3392
3393 if (dynamic)
3394 {
3395 current = dynsyms;
3396 max_count = dynsymcount;
3397 printf ("DYNAMIC SYMBOL TABLE:\n");
3398 }
3399 else
3400 {
3401 current = syms;
3402 max_count = symcount;
3403 printf ("SYMBOL TABLE:\n");
3404 }
3405
3406 if (max_count == 0)
3407 printf (_("no symbols\n"));
3408
3409 for (count = 0; count < max_count; count++)
3410 {
3411 bfd *cur_bfd;
3412
3413 if (*current == NULL)
3414 printf (_("no information for symbol number %ld\n"), count);
3415
3416 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
3417 printf (_("could not determine the type of symbol number %ld\n"),
3418 count);
3419
3420 else if (process_section_p ((* current)->section)
3421 && (dump_special_syms
3422 || !bfd_is_target_special_symbol (cur_bfd, *current)))
3423 {
3424 const char *name = (*current)->name;
3425
3426 if (do_demangle && name != NULL && *name != '\0')
3427 {
3428 char *alloc;
3429
3430 /* If we want to demangle the name, we demangle it
3431 here, and temporarily clobber it while calling
3432 bfd_print_symbol. FIXME: This is a gross hack. */
3433 alloc = bfd_demangle (cur_bfd, name, demangle_flags);
3434 if (alloc != NULL)
3435 (*current)->name = alloc;
3436 bfd_print_symbol (cur_bfd, stdout, *current,
3437 bfd_print_symbol_all);
3438 if (alloc != NULL)
3439 {
3440 (*current)->name = name;
3441 free (alloc);
3442 }
3443 }
3444 else
3445 bfd_print_symbol (cur_bfd, stdout, *current,
3446 bfd_print_symbol_all);
3447 printf ("\n");
3448 }
3449
3450 current++;
3451 }
3452 printf ("\n\n");
3453 }
3454 \f
3455 static void
3456 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
3457 {
3458 arelent **p;
3459 char *last_filename, *last_functionname;
3460 unsigned int last_line;
3461 unsigned int last_discriminator;
3462
3463 /* Get column headers lined up reasonably. */
3464 {
3465 static int width;
3466
3467 if (width == 0)
3468 {
3469 char buf[30];
3470
3471 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
3472 width = strlen (buf) - 7;
3473 }
3474 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
3475 }
3476
3477 last_filename = NULL;
3478 last_functionname = NULL;
3479 last_line = 0;
3480 last_discriminator = 0;
3481
3482 for (p = relpp; relcount && *p != NULL; p++, relcount--)
3483 {
3484 arelent *q = *p;
3485 const char *filename, *functionname;
3486 unsigned int linenumber;
3487 unsigned int discriminator;
3488 const char *sym_name;
3489 const char *section_name;
3490 bfd_vma addend2 = 0;
3491
3492 if (start_address != (bfd_vma) -1
3493 && q->address < start_address)
3494 continue;
3495 if (stop_address != (bfd_vma) -1
3496 && q->address > stop_address)
3497 continue;
3498
3499 if (with_line_numbers
3500 && sec != NULL
3501 && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
3502 &filename, &functionname,
3503 &linenumber, &discriminator))
3504 {
3505 if (functionname != NULL
3506 && (last_functionname == NULL
3507 || strcmp (functionname, last_functionname) != 0))
3508 {
3509 printf ("%s():\n", sanitize_string (functionname));
3510 if (last_functionname != NULL)
3511 free (last_functionname);
3512 last_functionname = xstrdup (functionname);
3513 }
3514
3515 if (linenumber > 0
3516 && (linenumber != last_line
3517 || (filename != NULL
3518 && last_filename != NULL
3519 && filename_cmp (filename, last_filename) != 0)
3520 || (discriminator != last_discriminator)))
3521 {
3522 if (discriminator > 0)
3523 printf ("%s:%u\n", filename == NULL ? "???" :
3524 sanitize_string (filename), linenumber);
3525 else
3526 printf ("%s:%u (discriminator %u)\n",
3527 filename == NULL ? "???" : sanitize_string (filename),
3528 linenumber, discriminator);
3529 last_line = linenumber;
3530 last_discriminator = discriminator;
3531 if (last_filename != NULL)
3532 free (last_filename);
3533 if (filename == NULL)
3534 last_filename = NULL;
3535 else
3536 last_filename = xstrdup (filename);
3537 }
3538 }
3539
3540 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
3541 {
3542 sym_name = (*(q->sym_ptr_ptr))->name;
3543 section_name = (*(q->sym_ptr_ptr))->section->name;
3544 }
3545 else
3546 {
3547 sym_name = NULL;
3548 section_name = NULL;
3549 }
3550
3551 bfd_printf_vma (abfd, q->address);
3552 if (q->howto == NULL)
3553 printf (" *unknown* ");
3554 else if (q->howto->name)
3555 {
3556 const char *name = q->howto->name;
3557
3558 /* R_SPARC_OLO10 relocations contain two addends.
3559 But because 'arelent' lacks enough storage to
3560 store them both, the 64-bit ELF Sparc backend
3561 records this as two relocations. One R_SPARC_LO10
3562 and one R_SPARC_13, both pointing to the same
3563 address. This is merely so that we have some
3564 place to store both addend fields.
3565
3566 Undo this transformation, otherwise the output
3567 will be confusing. */
3568 if (abfd->xvec->flavour == bfd_target_elf_flavour
3569 && elf_tdata(abfd)->elf_header->e_machine == EM_SPARCV9
3570 && relcount > 1
3571 && !strcmp (q->howto->name, "R_SPARC_LO10"))
3572 {
3573 arelent *q2 = *(p + 1);
3574 if (q2 != NULL
3575 && q2->howto
3576 && q->address == q2->address
3577 && !strcmp (q2->howto->name, "R_SPARC_13"))
3578 {
3579 name = "R_SPARC_OLO10";
3580 addend2 = q2->addend;
3581 p++;
3582 }
3583 }
3584 printf (" %-16s ", name);
3585 }
3586 else
3587 printf (" %-16d ", q->howto->type);
3588
3589 if (sym_name)
3590 {
3591 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
3592 }
3593 else
3594 {
3595 if (section_name == NULL)
3596 section_name = "*unknown*";
3597 printf ("[%s]", sanitize_string (section_name));
3598 }
3599
3600 if (q->addend)
3601 {
3602 bfd_signed_vma addend = q->addend;
3603 if (addend < 0)
3604 {
3605 printf ("-0x");
3606 addend = -addend;
3607 }
3608 else
3609 printf ("+0x");
3610 bfd_printf_vma (abfd, addend);
3611 }
3612 if (addend2)
3613 {
3614 printf ("+0x");
3615 bfd_printf_vma (abfd, addend2);
3616 }
3617
3618 printf ("\n");
3619 }
3620
3621 if (last_filename != NULL)
3622 free (last_filename);
3623 if (last_functionname != NULL)
3624 free (last_functionname);
3625 }
3626
3627 static void
3628 dump_relocs_in_section (bfd *abfd,
3629 asection *section,
3630 void *dummy ATTRIBUTE_UNUSED)
3631 {
3632 arelent **relpp;
3633 long relcount;
3634 long relsize;
3635
3636 if ( bfd_is_abs_section (section)
3637 || bfd_is_und_section (section)
3638 || bfd_is_com_section (section)
3639 || (! process_section_p (section))
3640 || ((section->flags & SEC_RELOC) == 0))
3641 return;
3642
3643 relsize = bfd_get_reloc_upper_bound (abfd, section);
3644 if (relsize < 0)
3645 bfd_fatal (bfd_get_filename (abfd));
3646
3647 printf ("RELOCATION RECORDS FOR [%s]:", sanitize_string (section->name));
3648
3649 if (relsize == 0)
3650 {
3651 printf (" (none)\n\n");
3652 return;
3653 }
3654
3655 if ((bfd_get_file_flags (abfd) & (BFD_IN_MEMORY | BFD_LINKER_CREATED)) == 0
3656 && (/* Check that the size of the relocs is reasonable. Note that some
3657 file formats, eg aout, can have relocs whose internal size is
3658 larger than their external size, thus we check the size divided
3659 by four against the file size. See PR 23931 for an example of
3660 this. */
3661 ((ufile_ptr) (relsize / 4) > bfd_get_file_size (abfd))
3662 /* Also check the section's reloc count since if this is negative
3663 (or very large) the computation in bfd_get_reloc_upper_bound
3664 may have resulted in returning a small, positive integer.
3665 See PR 22508 for a reproducer.
3666
3667 Note - we check against file size rather than section size as
3668 it is possible for there to be more relocs that apply to a
3669 section than there are bytes in that section. */
3670 || (section->reloc_count > bfd_get_file_size (abfd))))
3671 {
3672 printf (" (too many: %#x relocs)\n", section->reloc_count);
3673 bfd_set_error (bfd_error_file_truncated);
3674 bfd_fatal (bfd_get_filename (abfd));
3675 }
3676
3677 relpp = (arelent **) xmalloc (relsize);
3678 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
3679
3680 if (relcount < 0)
3681 {
3682 printf ("\n");
3683 non_fatal (_("failed to read relocs in: %s"), sanitize_string (bfd_get_filename (abfd)));
3684 bfd_fatal (_("error message was"));
3685 }
3686 else if (relcount == 0)
3687 printf (" (none)\n\n");
3688 else
3689 {
3690 printf ("\n");
3691 dump_reloc_set (abfd, section, relpp, relcount);
3692 printf ("\n\n");
3693 }
3694 free (relpp);
3695 }
3696
3697 static void
3698 dump_relocs (bfd *abfd)
3699 {
3700 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
3701 }
3702
3703 static void
3704 dump_dynamic_relocs (bfd *abfd)
3705 {
3706 long relsize;
3707 arelent **relpp;
3708 long relcount;
3709
3710 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3711 if (relsize < 0)
3712 bfd_fatal (bfd_get_filename (abfd));
3713
3714 printf ("DYNAMIC RELOCATION RECORDS");
3715
3716 if (relsize == 0)
3717 printf (" (none)\n\n");
3718 else
3719 {
3720 relpp = (arelent **) xmalloc (relsize);
3721 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
3722
3723 if (relcount < 0)
3724 bfd_fatal (bfd_get_filename (abfd));
3725 else if (relcount == 0)
3726 printf (" (none)\n\n");
3727 else
3728 {
3729 printf ("\n");
3730 dump_reloc_set (abfd, NULL, relpp, relcount);
3731 printf ("\n\n");
3732 }
3733 free (relpp);
3734 }
3735 }
3736
3737 /* Creates a table of paths, to search for source files. */
3738
3739 static void
3740 add_include_path (const char *path)
3741 {
3742 if (path[0] == 0)
3743 return;
3744 include_path_count++;
3745 include_paths = (const char **)
3746 xrealloc (include_paths, include_path_count * sizeof (*include_paths));
3747 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3748 if (path[1] == ':' && path[2] == 0)
3749 path = concat (path, ".", (const char *) 0);
3750 #endif
3751 include_paths[include_path_count - 1] = path;
3752 }
3753
3754 static void
3755 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
3756 asection *section,
3757 void *arg)
3758 {
3759 if ((section->flags & SEC_DEBUGGING) == 0)
3760 {
3761 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
3762 section->vma += adjust_section_vma;
3763 if (*has_reloc_p)
3764 section->lma += adjust_section_vma;
3765 }
3766 }
3767
3768 /* Dump selected contents of ABFD. */
3769
3770 static void
3771 dump_bfd (bfd *abfd, bfd_boolean is_mainfile)
3772 {
3773 if (bfd_big_endian (abfd))
3774 byte_get = byte_get_big_endian;
3775 else if (bfd_little_endian (abfd))
3776 byte_get = byte_get_little_endian;
3777 else
3778 byte_get = NULL;
3779
3780 /* Load any separate debug information files.
3781 We do this now and without checking do_follow_links because separate
3782 debug info files may contain symbol tables that we will need when
3783 displaying information about the main file. Any memory allocated by
3784 load_separate_debug_files will be released when we call
3785 free_debug_memory below.
3786
3787 The test on is_mainfile is there because the chain of separate debug
3788 info files is a global variable shared by all invocations of dump_bfd. */
3789 if (is_mainfile)
3790 {
3791 load_separate_debug_files (abfd, bfd_get_filename (abfd));
3792
3793 /* If asked to do so, recursively dump the separate files. */
3794 if (do_follow_links)
3795 {
3796 separate_info * i;
3797
3798 for (i = first_separate_info; i != NULL; i = i->next)
3799 dump_bfd (i->handle, FALSE);
3800 }
3801 }
3802
3803 /* If we are adjusting section VMA's, change them all now. Changing
3804 the BFD information is a hack. However, we must do it, or
3805 bfd_find_nearest_line will not do the right thing. */
3806 if (adjust_section_vma != 0)
3807 {
3808 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3809 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
3810 }
3811
3812 if (! dump_debugging_tags && ! suppress_bfd_header)
3813 printf (_("\n%s: file format %s\n"),
3814 sanitize_string (bfd_get_filename (abfd)),
3815 abfd->xvec->name);
3816 if (dump_ar_hdrs)
3817 print_arelt_descr (stdout, abfd, TRUE, FALSE);
3818 if (dump_file_header)
3819 dump_bfd_header (abfd);
3820 if (dump_private_headers)
3821 dump_bfd_private_header (abfd);
3822 if (dump_private_options != NULL)
3823 dump_target_specific (abfd);
3824 if (! dump_debugging_tags && ! suppress_bfd_header)
3825 putchar ('\n');
3826
3827 if (dump_symtab
3828 || dump_reloc_info
3829 || disassemble
3830 || dump_debugging
3831 || dump_dwarf_section_info)
3832 {
3833 syms = slurp_symtab (abfd);
3834
3835 /* If following links, load any symbol tables from the linked files as well. */
3836 if (do_follow_links && is_mainfile)
3837 {
3838 separate_info * i;
3839
3840 for (i = first_separate_info; i != NULL; i = i->next)
3841 {
3842 asymbol ** extra_syms;
3843 long old_symcount = symcount;
3844
3845 extra_syms = slurp_symtab (i->handle);
3846
3847 if (extra_syms)
3848 {
3849 if (old_symcount == 0)
3850 {
3851 syms = extra_syms;
3852 }
3853 else
3854 {
3855 syms = xrealloc (syms, (symcount + old_symcount) * sizeof (asymbol *));
3856 memcpy (syms + old_symcount,
3857 extra_syms,
3858 symcount * sizeof (asymbol *));
3859 }
3860 }
3861
3862 symcount += old_symcount;
3863 }
3864 }
3865 }
3866
3867 if (dump_section_headers)
3868 dump_headers (abfd);
3869
3870 if (dump_dynamic_symtab || dump_dynamic_reloc_info
3871 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
3872 dynsyms = slurp_dynamic_symtab (abfd);
3873
3874 if (disassemble)
3875 {
3876 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
3877 dynsymcount, dynsyms, &synthsyms);
3878 if (synthcount < 0)
3879 synthcount = 0;
3880 }
3881
3882 if (dump_symtab)
3883 dump_symbols (abfd, FALSE);
3884 if (dump_dynamic_symtab)
3885 dump_symbols (abfd, TRUE);
3886 if (dump_dwarf_section_info)
3887 dump_dwarf (abfd);
3888 if (dump_stab_section_info)
3889 dump_stabs (abfd);
3890 if (dump_reloc_info && ! disassemble)
3891 dump_relocs (abfd);
3892 if (dump_dynamic_reloc_info && ! disassemble)
3893 dump_dynamic_relocs (abfd);
3894 if (dump_section_contents)
3895 dump_data (abfd);
3896 if (disassemble)
3897 disassemble_data (abfd);
3898
3899 if (dump_debugging)
3900 {
3901 void *dhandle;
3902
3903 dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3904 if (dhandle != NULL)
3905 {
3906 if (!print_debugging_info (stdout, dhandle, abfd, syms,
3907 bfd_demangle,
3908 dump_debugging_tags ? TRUE : FALSE))
3909 {
3910 non_fatal (_("%s: printing debugging information failed"),
3911 bfd_get_filename (abfd));
3912 exit_status = 1;
3913 }
3914
3915 free (dhandle);
3916 }
3917 /* PR 6483: If there was no STABS debug info in the file, try
3918 DWARF instead. */
3919 else if (! dump_dwarf_section_info)
3920 {
3921 dwarf_select_sections_all ();
3922 dump_dwarf (abfd);
3923 }
3924 }
3925
3926 if (syms)
3927 {
3928 free (syms);
3929 syms = NULL;
3930 }
3931
3932 if (dynsyms)
3933 {
3934 free (dynsyms);
3935 dynsyms = NULL;
3936 }
3937
3938 if (synthsyms)
3939 {
3940 free (synthsyms);
3941 synthsyms = NULL;
3942 }
3943
3944 symcount = 0;
3945 dynsymcount = 0;
3946 synthcount = 0;
3947
3948 if (is_mainfile)
3949 free_debug_memory ();
3950 }
3951
3952 static void
3953 display_object_bfd (bfd *abfd)
3954 {
3955 char **matching;
3956
3957 if (bfd_check_format_matches (abfd, bfd_object, &matching))
3958 {
3959 dump_bfd (abfd, TRUE);
3960 return;
3961 }
3962
3963 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3964 {
3965 nonfatal (bfd_get_filename (abfd));
3966 list_matching_formats (matching);
3967 free (matching);
3968 return;
3969 }
3970
3971 if (bfd_get_error () != bfd_error_file_not_recognized)
3972 {
3973 nonfatal (bfd_get_filename (abfd));
3974 return;
3975 }
3976
3977 if (bfd_check_format_matches (abfd, bfd_core, &matching))
3978 {
3979 dump_bfd (abfd, TRUE);
3980 return;
3981 }
3982
3983 nonfatal (bfd_get_filename (abfd));
3984
3985 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3986 {
3987 list_matching_formats (matching);
3988 free (matching);
3989 }
3990 }
3991
3992 static void
3993 display_any_bfd (bfd *file, int level)
3994 {
3995 /* Decompress sections unless dumping the section contents. */
3996 if (!dump_section_contents)
3997 file->flags |= BFD_DECOMPRESS;
3998
3999 /* If the file is an archive, process all of its elements. */
4000 if (bfd_check_format (file, bfd_archive))
4001 {
4002 bfd *arfile = NULL;
4003 bfd *last_arfile = NULL;
4004
4005 if (level == 0)
4006 printf (_("In archive %s:\n"), sanitize_string (bfd_get_filename (file)));
4007 else if (level > 100)
4008 {
4009 /* Prevent corrupted files from spinning us into an
4010 infinite loop. 100 is an arbitrary heuristic. */
4011 fatal (_("Archive nesting is too deep"));
4012 return;
4013 }
4014 else
4015 printf (_("In nested archive %s:\n"),
4016 sanitize_string (bfd_get_filename (file)));
4017
4018 for (;;)
4019 {
4020 bfd_set_error (bfd_error_no_error);
4021
4022 arfile = bfd_openr_next_archived_file (file, arfile);
4023 if (arfile == NULL)
4024 {
4025 if (bfd_get_error () != bfd_error_no_more_archived_files)
4026 nonfatal (bfd_get_filename (file));
4027 break;
4028 }
4029
4030 display_any_bfd (arfile, level + 1);
4031
4032 if (last_arfile != NULL)
4033 {
4034 bfd_close (last_arfile);
4035 /* PR 17512: file: ac585d01. */
4036 if (arfile == last_arfile)
4037 {
4038 last_arfile = NULL;
4039 break;
4040 }
4041 }
4042 last_arfile = arfile;
4043 }
4044
4045 if (last_arfile != NULL)
4046 bfd_close (last_arfile);
4047 }
4048 else
4049 display_object_bfd (file);
4050 }
4051
4052 static void
4053 display_file (char *filename, char *target, bfd_boolean last_file)
4054 {
4055 bfd *file;
4056
4057 if (get_file_size (filename) < 1)
4058 {
4059 exit_status = 1;
4060 return;
4061 }
4062
4063 file = bfd_openr (filename, target);
4064 if (file == NULL)
4065 {
4066 nonfatal (filename);
4067 return;
4068 }
4069
4070 display_any_bfd (file, 0);
4071
4072 /* This is an optimization to improve the speed of objdump, especially when
4073 dumping a file with lots of associated debug informatiom. Calling
4074 bfd_close on such a file can take a non-trivial amount of time as there
4075 are lots of lists to walk and buffers to free. This is only really
4076 necessary however if we are about to load another file and we need the
4077 memory back. Otherwise, if we are about to exit, then we can save (a lot
4078 of) time by only doing a quick close, and allowing the OS to reclaim the
4079 memory for us. */
4080 if (! last_file)
4081 bfd_close (file);
4082 else
4083 bfd_close_all_done (file);
4084 }
4085 \f
4086 int
4087 main (int argc, char **argv)
4088 {
4089 int c;
4090 char *target = default_target;
4091 bfd_boolean seenflag = FALSE;
4092
4093 #if defined (HAVE_SETLOCALE)
4094 #if defined (HAVE_LC_MESSAGES)
4095 setlocale (LC_MESSAGES, "");
4096 #endif
4097 setlocale (LC_CTYPE, "");
4098 #endif
4099
4100 bindtextdomain (PACKAGE, LOCALEDIR);
4101 textdomain (PACKAGE);
4102
4103 program_name = *argv;
4104 xmalloc_set_program_name (program_name);
4105 bfd_set_error_program_name (program_name);
4106
4107 START_PROGRESS (program_name, 0);
4108
4109 expandargv (&argc, &argv);
4110
4111 if (bfd_init () != BFD_INIT_MAGIC)
4112 fatal (_("fatal error: libbfd ABI mismatch"));
4113 set_default_bfd_target ();
4114
4115 while ((c = getopt_long (argc, argv,
4116 "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
4117 long_options, (int *) 0))
4118 != EOF)
4119 {
4120 switch (c)
4121 {
4122 case 0:
4123 break; /* We've been given a long option. */
4124 case 'm':
4125 machine = optarg;
4126 break;
4127 case 'M':
4128 {
4129 char *options;
4130 if (disassembler_options)
4131 /* Ignore potential memory leak for now. */
4132 options = concat (disassembler_options, ",",
4133 optarg, (const char *) NULL);
4134 else
4135 options = optarg;
4136 disassembler_options = remove_whitespace_and_extra_commas (options);
4137 }
4138 break;
4139 case 'j':
4140 add_only (optarg);
4141 break;
4142 case 'F':
4143 display_file_offsets = TRUE;
4144 break;
4145 case 'l':
4146 with_line_numbers = TRUE;
4147 break;
4148 case 'b':
4149 target = optarg;
4150 break;
4151 case 'C':
4152 do_demangle = TRUE;
4153 if (optarg != NULL)
4154 {
4155 enum demangling_styles style;
4156
4157 style = cplus_demangle_name_to_style (optarg);
4158 if (style == unknown_demangling)
4159 fatal (_("unknown demangling style `%s'"),
4160 optarg);
4161
4162 cplus_demangle_set_style (style);
4163 }
4164 break;
4165 case OPTION_RECURSE_LIMIT:
4166 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
4167 break;
4168 case OPTION_NO_RECURSE_LIMIT:
4169 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
4170 break;
4171 case 'w':
4172 do_wide = wide_output = TRUE;
4173 break;
4174 case OPTION_ADJUST_VMA:
4175 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
4176 break;
4177 case OPTION_START_ADDRESS:
4178 start_address = parse_vma (optarg, "--start-address");
4179 if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
4180 fatal (_("error: the start address should be before the end address"));
4181 break;
4182 case OPTION_STOP_ADDRESS:
4183 stop_address = parse_vma (optarg, "--stop-address");
4184 if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
4185 fatal (_("error: the stop address should be after the start address"));
4186 break;
4187 case OPTION_PREFIX:
4188 prefix = optarg;
4189 prefix_length = strlen (prefix);
4190 /* Remove an unnecessary trailing '/' */
4191 while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
4192 prefix_length--;
4193 break;
4194 case OPTION_PREFIX_STRIP:
4195 prefix_strip = atoi (optarg);
4196 if (prefix_strip < 0)
4197 fatal (_("error: prefix strip must be non-negative"));
4198 break;
4199 case OPTION_INSN_WIDTH:
4200 insn_width = strtoul (optarg, NULL, 0);
4201 if (insn_width <= 0)
4202 fatal (_("error: instruction width must be positive"));
4203 break;
4204 case OPTION_INLINES:
4205 unwind_inlines = TRUE;
4206 break;
4207 case 'E':
4208 if (strcmp (optarg, "B") == 0)
4209 endian = BFD_ENDIAN_BIG;
4210 else if (strcmp (optarg, "L") == 0)
4211 endian = BFD_ENDIAN_LITTLE;
4212 else
4213 {
4214 nonfatal (_("unrecognized -E option"));
4215 usage (stderr, 1);
4216 }
4217 break;
4218 case OPTION_ENDIAN:
4219 if (strncmp (optarg, "big", strlen (optarg)) == 0)
4220 endian = BFD_ENDIAN_BIG;
4221 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
4222 endian = BFD_ENDIAN_LITTLE;
4223 else
4224 {
4225 non_fatal (_("unrecognized --endian type `%s'"), optarg);
4226 exit_status = 1;
4227 usage (stderr, 1);
4228 }
4229 break;
4230
4231 case 'f':
4232 dump_file_header = TRUE;
4233 seenflag = TRUE;
4234 break;
4235 case 'i':
4236 formats_info = TRUE;
4237 seenflag = TRUE;
4238 break;
4239 case 'I':
4240 add_include_path (optarg);
4241 break;
4242 case 'p':
4243 dump_private_headers = TRUE;
4244 seenflag = TRUE;
4245 break;
4246 case 'P':
4247 dump_private_options = optarg;
4248 seenflag = TRUE;
4249 break;
4250 case 'x':
4251 dump_private_headers = TRUE;
4252 dump_symtab = TRUE;
4253 dump_reloc_info = TRUE;
4254 dump_file_header = TRUE;
4255 dump_ar_hdrs = TRUE;
4256 dump_section_headers = TRUE;
4257 seenflag = TRUE;
4258 break;
4259 case 't':
4260 dump_symtab = TRUE;
4261 seenflag = TRUE;
4262 break;
4263 case 'T':
4264 dump_dynamic_symtab = TRUE;
4265 seenflag = TRUE;
4266 break;
4267 case 'd':
4268 disassemble = TRUE;
4269 seenflag = TRUE;
4270 disasm_sym = optarg;
4271 break;
4272 case 'z':
4273 disassemble_zeroes = TRUE;
4274 break;
4275 case 'D':
4276 disassemble = TRUE;
4277 disassemble_all = TRUE;
4278 seenflag = TRUE;
4279 break;
4280 case 'S':
4281 disassemble = TRUE;
4282 with_source_code = TRUE;
4283 seenflag = TRUE;
4284 break;
4285 case 'g':
4286 dump_debugging = 1;
4287 seenflag = TRUE;
4288 break;
4289 case 'e':
4290 dump_debugging = 1;
4291 dump_debugging_tags = 1;
4292 do_demangle = TRUE;
4293 seenflag = TRUE;
4294 break;
4295 case 'W':
4296 dump_dwarf_section_info = TRUE;
4297 seenflag = TRUE;
4298 if (optarg)
4299 dwarf_select_sections_by_letters (optarg);
4300 else
4301 dwarf_select_sections_all ();
4302 break;
4303 case OPTION_DWARF:
4304 dump_dwarf_section_info = TRUE;
4305 seenflag = TRUE;
4306 if (optarg)
4307 dwarf_select_sections_by_names (optarg);
4308 else
4309 dwarf_select_sections_all ();
4310 break;
4311 case OPTION_DWARF_DEPTH:
4312 {
4313 char *cp;
4314 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4315 }
4316 break;
4317 case OPTION_DWARF_START:
4318 {
4319 char *cp;
4320 dwarf_start_die = strtoul (optarg, & cp, 0);
4321 suppress_bfd_header = 1;
4322 }
4323 break;
4324 case OPTION_DWARF_CHECK:
4325 dwarf_check = TRUE;
4326 break;
4327 case 'G':
4328 dump_stab_section_info = TRUE;
4329 seenflag = TRUE;
4330 break;
4331 case 's':
4332 dump_section_contents = TRUE;
4333 seenflag = TRUE;
4334 break;
4335 case 'r':
4336 dump_reloc_info = TRUE;
4337 seenflag = TRUE;
4338 break;
4339 case 'R':
4340 dump_dynamic_reloc_info = TRUE;
4341 seenflag = TRUE;
4342 break;
4343 case 'a':
4344 dump_ar_hdrs = TRUE;
4345 seenflag = TRUE;
4346 break;
4347 case 'h':
4348 dump_section_headers = TRUE;
4349 seenflag = TRUE;
4350 break;
4351 case 'v':
4352 case 'V':
4353 show_version = TRUE;
4354 seenflag = TRUE;
4355 break;
4356
4357 case 'H':
4358 usage (stdout, 0);
4359 /* No need to set seenflag or to break - usage() does not return. */
4360 default:
4361 usage (stderr, 1);
4362 }
4363 }
4364
4365 if (show_version)
4366 print_version ("objdump");
4367
4368 if (!seenflag)
4369 usage (stderr, 2);
4370
4371 if (formats_info)
4372 exit_status = display_info ();
4373 else
4374 {
4375 if (optind == argc)
4376 display_file ("a.out", target, TRUE);
4377 else
4378 for (; optind < argc;)
4379 {
4380 display_file (argv[optind], target, optind == argc - 1);
4381 optind++;
4382 }
4383 }
4384
4385 free_only_list ();
4386
4387 END_PROGRESS (program_name);
4388
4389 return exit_status;
4390 }
This page took 0.165042 seconds and 5 git commands to generate.