Automatic date update in version.in
[deliverable/binutils-gdb.git] / binutils / objdump.c
... / ...
CommitLineData
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. */
78static int exit_status = 0;
79
80static char *default_target = NULL; /* Default at runtime. */
81
82/* The following variables are set based on arguments passed on the
83 command line. */
84static int show_version = 0; /* Show the version number. */
85static int dump_section_contents; /* -s */
86static int dump_section_headers; /* -h */
87static bfd_boolean dump_file_header; /* -f */
88static int dump_symtab; /* -t */
89static int dump_dynamic_symtab; /* -T */
90static int dump_reloc_info; /* -r */
91static int dump_dynamic_reloc_info; /* -R */
92static int dump_ar_hdrs; /* -a */
93static int dump_private_headers; /* -p */
94static char *dump_private_options; /* -P */
95static int prefix_addresses; /* --prefix-addresses */
96static int with_line_numbers; /* -l */
97static bfd_boolean with_source_code; /* -S */
98static int show_raw_insn; /* --show-raw-insn */
99static int dump_dwarf_section_info; /* --dwarf */
100static int dump_stab_section_info; /* --stabs */
101static int do_demangle; /* -C, --demangle */
102static bfd_boolean disassemble; /* -d */
103static bfd_boolean disassemble_all; /* -D */
104static int disassemble_zeroes; /* --disassemble-zeroes */
105static bfd_boolean formats_info; /* -i */
106static int wide_output; /* -w */
107static int insn_width; /* --insn-width */
108static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
109static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
110static int dump_debugging; /* --debugging */
111static int dump_debugging_tags; /* --debugging-tags */
112static int suppress_bfd_header;
113static int dump_special_syms = 0; /* --special-syms */
114static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
115static int file_start_context = 0; /* --file-start-context */
116static bfd_boolean display_file_offsets;/* -F */
117static const char *prefix; /* --prefix */
118static int prefix_strip; /* --prefix-strip */
119static size_t prefix_length;
120static bfd_boolean unwind_inlines; /* --inlines. */
121static const char * disasm_sym; /* Disassembly start symbol. */
122
123static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
124
125/* A structure to record the sections mentioned in -j switches. */
126struct 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. */
134static struct only * only_list = NULL;
135
136/* Variables for handling include file path table. */
137static const char **include_paths;
138static int include_path_count;
139
140/* Extra info to pass to the section disassembler and address printing
141 function. */
142struct 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. */
155static char *machine = NULL;
156
157/* Target specific options to the disassembler. */
158static char *disassembler_options = NULL;
159
160/* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
161static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
162
163/* The symbol table. */
164static asymbol **syms;
165
166/* Number of symbols in `syms'. */
167static long symcount = 0;
168
169/* The sorted symbol table. */
170static asymbol **sorted_syms;
171
172/* Number of symbols in `sorted_syms'. */
173static long sorted_symcount = 0;
174
175/* The dynamic symbol table. */
176static asymbol **dynsyms;
177
178/* The synthetic symbol table. */
179static asymbol *synthsyms;
180static long synthcount = 0;
181
182/* Number of symbols in `dynsyms'. */
183static long dynsymcount = 0;
184
185static bfd_byte *stabs;
186static bfd_size_type stab_size;
187
188static bfd_byte *strtab;
189static bfd_size_type stabstr_size;
190
191static bfd_boolean is_relocatable = FALSE;
192
193/* Handlers for -P/--private. */
194static const struct objdump_private_desc * const objdump_private_vectors[] =
195 {
196 OBJDUMP_PRIVATE_VECTORS
197 NULL
198 };
199\f
200static void usage (FILE *, int) ATTRIBUTE_NORETURN;
201static void
202usage (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. */
296enum 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
314static 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
371static void
372nonfatal (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
382static const char *
383sanitize_string (const char * in)
384{
385 static char * buffer = NULL;
386 static size_t 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
442static bfd_boolean
443process_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
462static void
463add_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
487static void
488free_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
519static void
520dump_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
621static void
622find_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
642static void
643dump_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
678static asymbol **
679slurp_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
707static asymbol **
708slurp_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
739static bfd_boolean
740is_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
749static long
750remove_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
774static int
775compare_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
898static int
899compare_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
922static void
923objdump_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
946static void
947objdump_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
990static inline bfd_boolean
991sym_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
1020static asymbol *
1021find_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
1227static void
1228objdump_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
1292static void
1293objdump_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
1337static void
1338objdump_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
1345static int
1346objdump_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
1358static char *prev_functionname;
1359static unsigned int prev_line;
1360static 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
1366struct 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
1380static 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
1389static const char *
1390slurp_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
1430static const char **
1431index_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
1485static struct print_file_list *
1486try_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
1514static struct print_file_list *
1515update_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
1560static void
1561print_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
1578static void
1579dump_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
1593static void
1594show_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. */
1758typedef struct
1759{
1760 char *buffer;
1761 size_t pos;
1762 size_t alloc;
1763} SFILE;
1764
1765/* sprintf to a "stream". */
1766
1767static int ATTRIBUTE_PRINTF_2
1768objdump_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
1808static void
1809disassemble_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 inf->stop_offset = stop_offset;
1995 octets = (*disassemble_fn) (section->vma + addr_offset, inf);
1996
1997 inf->stop_vma = 0;
1998 inf->fprintf_func = (fprintf_ftype) fprintf;
1999 inf->stream = stdout;
2000 if (insn_width == 0 && inf->bytes_per_line != 0)
2001 octets_per_line = inf->bytes_per_line;
2002 if (octets < (int) opb)
2003 {
2004 if (sfile.pos)
2005 printf ("%s\n", sfile.buffer);
2006 if (octets >= 0)
2007 {
2008 non_fatal (_("disassemble_fn returned length %d"),
2009 octets);
2010 exit_status = 1;
2011 }
2012 break;
2013 }
2014 }
2015 else
2016 {
2017 bfd_vma j;
2018
2019 octets = octets_per_line;
2020 if (addr_offset + octets / opb > stop_offset)
2021 octets = (stop_offset - addr_offset) * opb;
2022
2023 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
2024 {
2025 if (ISPRINT (data[j]))
2026 buf[j - addr_offset * opb] = data[j];
2027 else
2028 buf[j - addr_offset * opb] = '.';
2029 }
2030 buf[j - addr_offset * opb] = '\0';
2031 }
2032
2033 if (prefix_addresses
2034 ? show_raw_insn > 0
2035 : show_raw_insn >= 0)
2036 {
2037 bfd_vma j;
2038
2039 /* If ! prefix_addresses and ! wide_output, we print
2040 octets_per_line octets per line. */
2041 pb = octets;
2042 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
2043 pb = octets_per_line;
2044
2045 if (inf->bytes_per_chunk)
2046 bpc = inf->bytes_per_chunk;
2047 else
2048 bpc = 1;
2049
2050 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
2051 {
2052 /* PR 21580: Check for a buffer ending early. */
2053 if (j + bpc <= stop_offset * opb)
2054 {
2055 int k;
2056
2057 if (inf->display_endian == BFD_ENDIAN_LITTLE)
2058 {
2059 for (k = bpc - 1; k >= 0; k--)
2060 printf ("%02x", (unsigned) data[j + k]);
2061 }
2062 else
2063 {
2064 for (k = 0; k < bpc; k++)
2065 printf ("%02x", (unsigned) data[j + k]);
2066 }
2067 }
2068 putchar (' ');
2069 }
2070
2071 for (; pb < octets_per_line; pb += bpc)
2072 {
2073 int k;
2074
2075 for (k = 0; k < bpc; k++)
2076 printf (" ");
2077 putchar (' ');
2078 }
2079
2080 /* Separate raw data from instruction by extra space. */
2081 if (insns)
2082 putchar ('\t');
2083 else
2084 printf (" ");
2085 }
2086
2087 if (! insns)
2088 printf ("%s", buf);
2089 else if (sfile.pos)
2090 printf ("%s", sfile.buffer);
2091
2092 if (prefix_addresses
2093 ? show_raw_insn > 0
2094 : show_raw_insn >= 0)
2095 {
2096 while (pb < octets)
2097 {
2098 bfd_vma j;
2099 char *s;
2100
2101 putchar ('\n');
2102 j = addr_offset * opb + pb;
2103
2104 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
2105 for (s = buf + skip_addr_chars; *s == '0'; s++)
2106 *s = ' ';
2107 if (*s == '\0')
2108 *--s = '0';
2109 printf ("%s:\t", buf + skip_addr_chars);
2110
2111 pb += octets_per_line;
2112 if (pb > octets)
2113 pb = octets;
2114 for (; j < addr_offset * opb + pb; j += bpc)
2115 {
2116 /* PR 21619: Check for a buffer ending early. */
2117 if (j + bpc <= stop_offset * opb)
2118 {
2119 int k;
2120
2121 if (inf->display_endian == BFD_ENDIAN_LITTLE)
2122 {
2123 for (k = bpc - 1; k >= 0; k--)
2124 printf ("%02x", (unsigned) data[j + k]);
2125 }
2126 else
2127 {
2128 for (k = 0; k < bpc; k++)
2129 printf ("%02x", (unsigned) data[j + k]);
2130 }
2131 }
2132 putchar (' ');
2133 }
2134 }
2135 }
2136
2137 if (!wide_output)
2138 putchar ('\n');
2139 else
2140 need_nl = TRUE;
2141 }
2142
2143 while ((*relppp) < relppend
2144 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
2145 {
2146 if (dump_reloc_info || dump_dynamic_reloc_info)
2147 {
2148 arelent *q;
2149
2150 q = **relppp;
2151
2152 if (wide_output)
2153 putchar ('\t');
2154 else
2155 printf ("\t\t\t");
2156
2157 objdump_print_value (section->vma - rel_offset + q->address,
2158 inf, TRUE);
2159
2160 if (q->howto == NULL)
2161 printf (": *unknown*\t");
2162 else if (q->howto->name)
2163 printf (": %s\t", q->howto->name);
2164 else
2165 printf (": %d\t", q->howto->type);
2166
2167 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
2168 printf ("*unknown*");
2169 else
2170 {
2171 const char *sym_name;
2172
2173 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
2174 if (sym_name != NULL && *sym_name != '\0')
2175 objdump_print_symname (aux->abfd, inf, *q->sym_ptr_ptr);
2176 else
2177 {
2178 asection *sym_sec;
2179
2180 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
2181 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
2182 if (sym_name == NULL || *sym_name == '\0')
2183 sym_name = "*unknown*";
2184 printf ("%s", sanitize_string (sym_name));
2185 }
2186 }
2187
2188 if (q->addend)
2189 {
2190 bfd_signed_vma addend = q->addend;
2191 if (addend < 0)
2192 {
2193 printf ("-0x");
2194 addend = -addend;
2195 }
2196 else
2197 printf ("+0x");
2198 objdump_print_value (addend, inf, TRUE);
2199 }
2200
2201 printf ("\n");
2202 need_nl = FALSE;
2203 }
2204 ++(*relppp);
2205 }
2206
2207 if (need_nl)
2208 printf ("\n");
2209
2210 addr_offset += octets / opb;
2211 }
2212
2213 free (sfile.buffer);
2214}
2215
2216static void
2217disassemble_section (bfd *abfd, asection *section, void *inf)
2218{
2219 const struct elf_backend_data * bed;
2220 bfd_vma sign_adjust = 0;
2221 struct disassemble_info * pinfo = (struct disassemble_info *) inf;
2222 struct objdump_disasm_info * paux;
2223 unsigned int opb = pinfo->octets_per_byte;
2224 bfd_byte * data = NULL;
2225 bfd_size_type datasize = 0;
2226 arelent ** rel_pp = NULL;
2227 arelent ** rel_ppstart = NULL;
2228 arelent ** rel_ppend;
2229 bfd_vma stop_offset;
2230 asymbol * sym = NULL;
2231 long place = 0;
2232 long rel_count;
2233 bfd_vma rel_offset;
2234 unsigned long addr_offset;
2235 bfd_boolean do_print;
2236 enum loop_control
2237 {
2238 stop_offset_reached,
2239 function_sym,
2240 next_sym
2241 } loop_until;
2242
2243 /* Sections that do not contain machine
2244 code are not normally disassembled. */
2245 if (! disassemble_all
2246 && only_list == NULL
2247 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
2248 != (SEC_CODE | SEC_HAS_CONTENTS)))
2249 return;
2250
2251 if (! process_section_p (section))
2252 return;
2253
2254 datasize = bfd_get_section_size (section);
2255 if (datasize == 0)
2256 return;
2257
2258 if (start_address == (bfd_vma) -1
2259 || start_address < section->vma)
2260 addr_offset = 0;
2261 else
2262 addr_offset = start_address - section->vma;
2263
2264 if (stop_address == (bfd_vma) -1)
2265 stop_offset = datasize / opb;
2266 else
2267 {
2268 if (stop_address < section->vma)
2269 stop_offset = 0;
2270 else
2271 stop_offset = stop_address - section->vma;
2272 if (stop_offset > datasize / opb)
2273 stop_offset = datasize / opb;
2274 }
2275
2276 if (addr_offset >= stop_offset)
2277 return;
2278
2279 /* Decide which set of relocs to use. Load them if necessary. */
2280 paux = (struct objdump_disasm_info *) pinfo->application_data;
2281 if (paux->dynrelbuf && dump_dynamic_reloc_info)
2282 {
2283 rel_pp = paux->dynrelbuf;
2284 rel_count = paux->dynrelcount;
2285 /* Dynamic reloc addresses are absolute, non-dynamic are section
2286 relative. REL_OFFSET specifies the reloc address corresponding
2287 to the start of this section. */
2288 rel_offset = section->vma;
2289 }
2290 else
2291 {
2292 rel_count = 0;
2293 rel_pp = NULL;
2294 rel_offset = 0;
2295
2296 if ((section->flags & SEC_RELOC) != 0
2297 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
2298 {
2299 long relsize;
2300
2301 relsize = bfd_get_reloc_upper_bound (abfd, section);
2302 if (relsize < 0)
2303 bfd_fatal (bfd_get_filename (abfd));
2304
2305 if (relsize > 0)
2306 {
2307 rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
2308 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
2309 if (rel_count < 0)
2310 bfd_fatal (bfd_get_filename (abfd));
2311
2312 /* Sort the relocs by address. */
2313 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
2314 }
2315 }
2316 }
2317 rel_ppend = rel_pp + rel_count;
2318
2319 if (!bfd_malloc_and_get_section (abfd, section, &data))
2320 {
2321 non_fatal (_("Reading section %s failed because: %s"),
2322 section->name, bfd_errmsg (bfd_get_error ()));
2323 return;
2324 }
2325
2326 paux->sec = section;
2327 pinfo->buffer = data;
2328 pinfo->buffer_vma = section->vma;
2329 pinfo->buffer_length = datasize;
2330 pinfo->section = section;
2331
2332 /* Skip over the relocs belonging to addresses below the
2333 start address. */
2334 while (rel_pp < rel_ppend
2335 && (*rel_pp)->address < rel_offset + addr_offset)
2336 ++rel_pp;
2337
2338 printf (_("\nDisassembly of section %s:\n"), sanitize_string (section->name));
2339
2340 /* Find the nearest symbol forwards from our current position. */
2341 paux->require_sec = TRUE;
2342 sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
2343 (struct disassemble_info *) inf,
2344 &place);
2345 paux->require_sec = FALSE;
2346
2347 /* PR 9774: If the target used signed addresses then we must make
2348 sure that we sign extend the value that we calculate for 'addr'
2349 in the loop below. */
2350 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2351 && (bed = get_elf_backend_data (abfd)) != NULL
2352 && bed->sign_extend_vma)
2353 sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
2354
2355 /* Disassemble a block of instructions up to the address associated with
2356 the symbol we have just found. Then print the symbol and find the
2357 next symbol on. Repeat until we have disassembled the entire section
2358 or we have reached the end of the address range we are interested in. */
2359 do_print = paux->symbol == NULL;
2360 loop_until = stop_offset_reached;
2361
2362 while (addr_offset < stop_offset)
2363 {
2364 bfd_vma addr;
2365 asymbol *nextsym;
2366 bfd_vma nextstop_offset;
2367 bfd_boolean insns;
2368
2369 addr = section->vma + addr_offset;
2370 addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
2371
2372 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
2373 {
2374 int x;
2375
2376 for (x = place;
2377 (x < sorted_symcount
2378 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
2379 ++x)
2380 continue;
2381
2382 pinfo->symbols = sorted_syms + place;
2383 pinfo->num_symbols = x - place;
2384 pinfo->symtab_pos = place;
2385 }
2386 else
2387 {
2388 pinfo->symbols = NULL;
2389 pinfo->num_symbols = 0;
2390 pinfo->symtab_pos = -1;
2391 }
2392
2393 /* If we are only disassembling from a specific symbol,
2394 check to see if we should start or stop displaying. */
2395 if (sym && paux->symbol)
2396 {
2397 if (do_print)
2398 {
2399 /* See if we should stop printing. */
2400 switch (loop_until)
2401 {
2402 case function_sym:
2403 if (sym->flags & BSF_FUNCTION)
2404 do_print = FALSE;
2405 break;
2406
2407 case stop_offset_reached:
2408 /* Handled by the while loop. */
2409 break;
2410
2411 case next_sym:
2412 /* FIXME: There is an implicit assumption here
2413 that the name of sym is different from
2414 paux->symbol. */
2415 if (! bfd_is_local_label (abfd, sym))
2416 do_print = FALSE;
2417 break;
2418 }
2419 }
2420 else
2421 {
2422 const char * name = bfd_asymbol_name (sym);
2423 char * alloc = NULL;
2424
2425 if (do_demangle && name[0] != '\0')
2426 {
2427 /* Demangle the name. */
2428 alloc = bfd_demangle (abfd, name, demangle_flags);
2429 if (alloc != NULL)
2430 name = alloc;
2431 }
2432
2433 /* We are not currently printing. Check to see
2434 if the current symbol matches the requested symbol. */
2435 if (streq (name, paux->symbol))
2436 {
2437 do_print = TRUE;
2438
2439 if (sym->flags & BSF_FUNCTION)
2440 {
2441 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2442 && ((elf_symbol_type *) sym)->internal_elf_sym.st_size > 0)
2443 {
2444 /* Sym is a function symbol with a size associated
2445 with it. Turn on automatic disassembly for the
2446 next VALUE bytes. */
2447 stop_offset = addr_offset
2448 + ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
2449 loop_until = stop_offset_reached;
2450 }
2451 else
2452 {
2453 /* Otherwise we need to tell the loop heuristic to
2454 loop until the next function symbol is encountered. */
2455 loop_until = function_sym;
2456 }
2457 }
2458 else
2459 {
2460 /* Otherwise loop until the next symbol is encountered. */
2461 loop_until = next_sym;
2462 }
2463 }
2464
2465 free (alloc);
2466 }
2467 }
2468
2469 if (! prefix_addresses && do_print)
2470 {
2471 pinfo->fprintf_func (pinfo->stream, "\n");
2472 objdump_print_addr_with_sym (abfd, section, sym, addr,
2473 pinfo, FALSE);
2474 pinfo->fprintf_func (pinfo->stream, ":\n");
2475 }
2476
2477 if (sym != NULL && bfd_asymbol_value (sym) > addr)
2478 nextsym = sym;
2479 else if (sym == NULL)
2480 nextsym = NULL;
2481 else
2482 {
2483#define is_valid_next_sym(SYM) \
2484 (strcmp (bfd_section_name (abfd, (SYM)->section), bfd_section_name (abfd, section)) == 0 \
2485 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
2486 && pinfo->symbol_is_valid (SYM, pinfo))
2487
2488 /* Search forward for the next appropriate symbol in
2489 SECTION. Note that all the symbols are sorted
2490 together into one big array, and that some sections
2491 may have overlapping addresses. */
2492 while (place < sorted_symcount
2493 && ! is_valid_next_sym (sorted_syms [place]))
2494 ++place;
2495
2496 if (place >= sorted_symcount)
2497 nextsym = NULL;
2498 else
2499 nextsym = sorted_syms[place];
2500 }
2501
2502 if (sym != NULL && bfd_asymbol_value (sym) > addr)
2503 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
2504 else if (nextsym == NULL)
2505 nextstop_offset = stop_offset;
2506 else
2507 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
2508
2509 if (nextstop_offset > stop_offset
2510 || nextstop_offset <= addr_offset)
2511 nextstop_offset = stop_offset;
2512
2513 /* If a symbol is explicitly marked as being an object
2514 rather than a function, just dump the bytes without
2515 disassembling them. */
2516 if (disassemble_all
2517 || sym == NULL
2518 || sym->section != section
2519 || bfd_asymbol_value (sym) > addr
2520 || ((sym->flags & BSF_OBJECT) == 0
2521 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
2522 == NULL)
2523 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
2524 == NULL))
2525 || (sym->flags & BSF_FUNCTION) != 0)
2526 insns = TRUE;
2527 else
2528 insns = FALSE;
2529
2530 if (do_print)
2531 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2532 addr_offset, nextstop_offset,
2533 rel_offset, &rel_pp, rel_ppend);
2534
2535 addr_offset = nextstop_offset;
2536 sym = nextsym;
2537 }
2538
2539 free (data);
2540
2541 if (rel_ppstart != NULL)
2542 free (rel_ppstart);
2543}
2544
2545/* Disassemble the contents of an object file. */
2546
2547static void
2548disassemble_data (bfd *abfd)
2549{
2550 struct disassemble_info disasm_info;
2551 struct objdump_disasm_info aux;
2552 long i;
2553
2554 print_files = NULL;
2555 prev_functionname = NULL;
2556 prev_line = -1;
2557 prev_discriminator = 0;
2558
2559 /* We make a copy of syms to sort. We don't want to sort syms
2560 because that will screw up the relocs. */
2561 sorted_symcount = symcount ? symcount : dynsymcount;
2562 sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2563 * sizeof (asymbol *));
2564 memcpy (sorted_syms, symcount ? syms : dynsyms,
2565 sorted_symcount * sizeof (asymbol *));
2566
2567 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2568
2569 for (i = 0; i < synthcount; ++i)
2570 {
2571 sorted_syms[sorted_symcount] = synthsyms + i;
2572 ++sorted_symcount;
2573 }
2574
2575 /* Sort the symbols into section and symbol order. */
2576 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2577
2578 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
2579
2580 disasm_info.application_data = (void *) &aux;
2581 aux.abfd = abfd;
2582 aux.require_sec = FALSE;
2583 aux.dynrelbuf = NULL;
2584 aux.dynrelcount = 0;
2585 aux.reloc = NULL;
2586 aux.symbol = disasm_sym;
2587
2588 disasm_info.print_address_func = objdump_print_address;
2589 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2590
2591 if (machine != NULL)
2592 {
2593 const bfd_arch_info_type *inf = bfd_scan_arch (machine);
2594
2595 if (inf == NULL)
2596 fatal (_("can't use supplied machine %s"), machine);
2597
2598 abfd->arch_info = inf;
2599 }
2600
2601 if (endian != BFD_ENDIAN_UNKNOWN)
2602 {
2603 struct bfd_target *xvec;
2604
2605 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
2606 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2607 xvec->byteorder = endian;
2608 abfd->xvec = xvec;
2609 }
2610
2611 /* Use libopcodes to locate a suitable disassembler. */
2612 aux.disassemble_fn = disassembler (bfd_get_arch (abfd),
2613 bfd_big_endian (abfd),
2614 bfd_get_mach (abfd), abfd);
2615 if (!aux.disassemble_fn)
2616 {
2617 non_fatal (_("can't disassemble for architecture %s\n"),
2618 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2619 exit_status = 1;
2620 return;
2621 }
2622
2623 disasm_info.flavour = bfd_get_flavour (abfd);
2624 disasm_info.arch = bfd_get_arch (abfd);
2625 disasm_info.mach = bfd_get_mach (abfd);
2626 disasm_info.disassembler_options = disassembler_options;
2627 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2628 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2629 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2630 disasm_info.disassembler_needs_relocs = FALSE;
2631
2632 if (bfd_big_endian (abfd))
2633 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2634 else if (bfd_little_endian (abfd))
2635 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2636 else
2637 /* ??? Aborting here seems too drastic. We could default to big or little
2638 instead. */
2639 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2640
2641 /* Allow the target to customize the info structure. */
2642 disassemble_init_for_target (& disasm_info);
2643
2644 /* Pre-load the dynamic relocs as we may need them during the disassembly. */
2645 {
2646 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2647
2648 if (relsize < 0 && dump_dynamic_reloc_info)
2649 bfd_fatal (bfd_get_filename (abfd));
2650
2651 if (relsize > 0)
2652 {
2653 aux.dynrelbuf = (arelent **) xmalloc (relsize);
2654 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2655 aux.dynrelbuf,
2656 dynsyms);
2657 if (aux.dynrelcount < 0)
2658 bfd_fatal (bfd_get_filename (abfd));
2659
2660 /* Sort the relocs by address. */
2661 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2662 compare_relocs);
2663 }
2664 }
2665 disasm_info.symtab = sorted_syms;
2666 disasm_info.symtab_size = sorted_symcount;
2667
2668 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2669
2670 if (aux.dynrelbuf != NULL)
2671 free (aux.dynrelbuf);
2672 free (sorted_syms);
2673}
2674\f
2675static bfd_boolean
2676load_specific_debug_section (enum dwarf_section_display_enum debug,
2677 asection *sec, void *file)
2678{
2679 struct dwarf_section *section = &debug_displays [debug].section;
2680 bfd *abfd = (bfd *) file;
2681 bfd_byte *contents;
2682 bfd_size_type amt;
2683 size_t alloced;
2684
2685 if (section->start != NULL)
2686 {
2687 /* If it is already loaded, do nothing. */
2688 if (streq (section->filename, bfd_get_filename (abfd)))
2689 return TRUE;
2690 free (section->start);
2691 }
2692
2693 section->filename = bfd_get_filename (abfd);
2694 section->reloc_info = NULL;
2695 section->num_relocs = 0;
2696 section->address = bfd_get_section_vma (abfd, sec);
2697 section->user_data = sec;
2698 section->size = bfd_get_section_size (sec);
2699 /* PR 24360: On 32-bit hosts sizeof (size_t) < sizeof (bfd_size_type). */
2700 alloced = amt = section->size + 1;
2701 if (alloced != amt || alloced == 0)
2702 {
2703 section->start = NULL;
2704 free_debug_section (debug);
2705 printf (_("\nSection '%s' has an invalid size: %#llx.\n"),
2706 sanitize_string (section->name),
2707 (unsigned long long) section->size);
2708 return FALSE;
2709 }
2710 section->start = contents = malloc (alloced);
2711 if (section->start == NULL
2712 || !bfd_get_full_section_contents (abfd, sec, &contents))
2713 {
2714 free_debug_section (debug);
2715 printf (_("\nCan't get contents for section '%s'.\n"),
2716 sanitize_string (section->name));
2717 return FALSE;
2718 }
2719 /* Ensure any string section has a terminating NUL. */
2720 section->start[section->size] = 0;
2721
2722 if (is_relocatable && debug_displays [debug].relocate)
2723 {
2724 long reloc_size;
2725 bfd_boolean ret;
2726
2727 bfd_cache_section_contents (sec, section->start);
2728
2729 ret = bfd_simple_get_relocated_section_contents (abfd,
2730 sec,
2731 section->start,
2732 syms) != NULL;
2733
2734 if (! ret)
2735 {
2736 free_debug_section (debug);
2737 printf (_("\nCan't get contents for section '%s'.\n"),
2738 sanitize_string (section->name));
2739 return FALSE;
2740 }
2741
2742 reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
2743 if (reloc_size > 0)
2744 {
2745 unsigned long reloc_count;
2746 arelent **relocs;
2747
2748 relocs = (arelent **) xmalloc (reloc_size);
2749
2750 reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
2751 if (reloc_count == 0)
2752 free (relocs);
2753 else
2754 {
2755 section->reloc_info = relocs;
2756 section->num_relocs = reloc_count;
2757 }
2758 }
2759 }
2760
2761 return TRUE;
2762}
2763
2764bfd_boolean
2765reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
2766{
2767 arelent ** relocs;
2768 arelent * rp;
2769
2770 if (dsec == NULL || dsec->reloc_info == NULL)
2771 return FALSE;
2772
2773 relocs = (arelent **) dsec->reloc_info;
2774
2775 for (; (rp = * relocs) != NULL; ++ relocs)
2776 if (rp->address == offset)
2777 return TRUE;
2778
2779 return FALSE;
2780}
2781
2782bfd_boolean
2783load_debug_section (enum dwarf_section_display_enum debug, void *file)
2784{
2785 struct dwarf_section *section = &debug_displays [debug].section;
2786 bfd *abfd = (bfd *) file;
2787 asection *sec;
2788
2789 /* If it is already loaded, do nothing. */
2790 if (section->start != NULL)
2791 {
2792 if (streq (section->filename, bfd_get_filename (abfd)))
2793 return TRUE;
2794 }
2795
2796 /* Locate the debug section. */
2797 sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2798 if (sec != NULL)
2799 section->name = section->uncompressed_name;
2800 else
2801 {
2802 sec = bfd_get_section_by_name (abfd, section->compressed_name);
2803 if (sec != NULL)
2804 section->name = section->compressed_name;
2805 }
2806 if (sec == NULL)
2807 return FALSE;
2808
2809 return load_specific_debug_section (debug, sec, file);
2810}
2811
2812void
2813free_debug_section (enum dwarf_section_display_enum debug)
2814{
2815 struct dwarf_section *section = &debug_displays [debug].section;
2816
2817 if (section->start == NULL)
2818 return;
2819
2820 /* PR 17512: file: 0f67f69d. */
2821 if (section->user_data != NULL)
2822 {
2823 asection * sec = (asection *) section->user_data;
2824
2825 /* If we are freeing contents that are also pointed to by the BFD
2826 library's section structure then make sure to update those pointers
2827 too. Otherwise, the next time we try to load data for this section
2828 we can end up using a stale pointer. */
2829 if (section->start == sec->contents)
2830 {
2831 sec->contents = NULL;
2832 sec->flags &= ~ SEC_IN_MEMORY;
2833 sec->compress_status = COMPRESS_SECTION_NONE;
2834 }
2835 }
2836
2837 free ((char *) section->start);
2838 section->start = NULL;
2839 section->address = 0;
2840 section->size = 0;
2841}
2842
2843void
2844close_debug_file (void * file)
2845{
2846 bfd * abfd = (bfd *) file;
2847
2848 bfd_close (abfd);
2849}
2850
2851void *
2852open_debug_file (const char * pathname)
2853{
2854 bfd * data;
2855
2856 data = bfd_openr (pathname, NULL);
2857 if (data == NULL)
2858 return NULL;
2859
2860 if (! bfd_check_format (data, bfd_object))
2861 return NULL;
2862
2863 return data;
2864}
2865
2866static void
2867dump_dwarf_section (bfd *abfd, asection *section,
2868 void *arg ATTRIBUTE_UNUSED)
2869{
2870 const char *name = bfd_get_section_name (abfd, section);
2871 const char *match;
2872 int i;
2873
2874 if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2875 match = ".debug_info";
2876 else
2877 match = name;
2878
2879 for (i = 0; i < max; i++)
2880 if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2881 || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2882 && debug_displays [i].enabled != NULL
2883 && *debug_displays [i].enabled)
2884 {
2885 struct dwarf_section *sec = &debug_displays [i].section;
2886
2887 if (strcmp (sec->uncompressed_name, match) == 0)
2888 sec->name = sec->uncompressed_name;
2889 else
2890 sec->name = sec->compressed_name;
2891 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2892 section, abfd))
2893 {
2894 debug_displays [i].display (sec, abfd);
2895
2896 if (i != info && i != abbrev)
2897 free_debug_section ((enum dwarf_section_display_enum) i);
2898 }
2899 break;
2900 }
2901}
2902
2903/* Dump the dwarf debugging information. */
2904
2905static void
2906dump_dwarf (bfd *abfd)
2907{
2908 /* The byte_get pointer should have been set at the start of dump_bfd(). */
2909 if (byte_get == NULL)
2910 {
2911 warn (_("File %s does not contain any dwarf debug information\n"),
2912 bfd_get_filename (abfd));
2913 return;
2914 }
2915
2916 is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2917
2918 eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
2919
2920 switch (bfd_get_arch (abfd))
2921 {
2922 case bfd_arch_i386:
2923 switch (bfd_get_mach (abfd))
2924 {
2925 case bfd_mach_x86_64:
2926 case bfd_mach_x86_64_intel_syntax:
2927 case bfd_mach_x86_64_nacl:
2928 case bfd_mach_x64_32:
2929 case bfd_mach_x64_32_intel_syntax:
2930 case bfd_mach_x64_32_nacl:
2931 init_dwarf_regnames_x86_64 ();
2932 break;
2933
2934 default:
2935 init_dwarf_regnames_i386 ();
2936 break;
2937 }
2938 break;
2939
2940 case bfd_arch_iamcu:
2941 init_dwarf_regnames_iamcu ();
2942 break;
2943
2944 case bfd_arch_aarch64:
2945 init_dwarf_regnames_aarch64();
2946 break;
2947
2948 case bfd_arch_s390:
2949 init_dwarf_regnames_s390 ();
2950 break;
2951
2952 case bfd_arch_riscv:
2953 init_dwarf_regnames_riscv ();
2954 break;
2955
2956 case bfd_arch_s12z:
2957 /* S12Z has a 24 bit address space. But the only known
2958 producer of dwarf_info encodes addresses into 32 bits. */
2959 eh_addr_size = 4;
2960 break;
2961
2962 default:
2963 break;
2964 }
2965
2966 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2967}
2968\f
2969/* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2970 it. Return NULL on failure. */
2971
2972static bfd_byte *
2973read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2974{
2975 asection *stabsect;
2976 bfd_byte *contents;
2977
2978 stabsect = bfd_get_section_by_name (abfd, sect_name);
2979 if (stabsect == NULL)
2980 {
2981 printf (_("No %s section present\n\n"),
2982 sanitize_string (sect_name));
2983 return FALSE;
2984 }
2985
2986 if (!bfd_malloc_and_get_section (abfd, stabsect, &contents))
2987 {
2988 non_fatal (_("reading %s section of %s failed: %s"),
2989 sect_name, bfd_get_filename (abfd),
2990 bfd_errmsg (bfd_get_error ()));
2991 exit_status = 1;
2992 free (contents);
2993 return NULL;
2994 }
2995
2996 *size_ptr = bfd_section_size (abfd, stabsect);
2997
2998 return contents;
2999}
3000
3001/* Stabs entries use a 12 byte format:
3002 4 byte string table index
3003 1 byte stab type
3004 1 byte stab other field
3005 2 byte stab desc field
3006 4 byte stab value
3007 FIXME: This will have to change for a 64 bit object format. */
3008
3009#define STRDXOFF (0)
3010#define TYPEOFF (4)
3011#define OTHEROFF (5)
3012#define DESCOFF (6)
3013#define VALOFF (8)
3014#define STABSIZE (12)
3015
3016/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
3017 using string table section STRSECT_NAME (in `strtab'). */
3018
3019static void
3020print_section_stabs (bfd *abfd,
3021 const char *stabsect_name,
3022 unsigned *string_offset_ptr)
3023{
3024 int i;
3025 unsigned file_string_table_offset = 0;
3026 unsigned next_file_string_table_offset = *string_offset_ptr;
3027 bfd_byte *stabp, *stabs_end;
3028
3029 stabp = stabs;
3030 stabs_end = stabp + stab_size;
3031
3032 printf (_("Contents of %s section:\n\n"), sanitize_string (stabsect_name));
3033 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
3034
3035 /* Loop through all symbols and print them.
3036
3037 We start the index at -1 because there is a dummy symbol on
3038 the front of stabs-in-{coff,elf} sections that supplies sizes. */
3039 for (i = -1; stabp <= stabs_end - STABSIZE; stabp += STABSIZE, i++)
3040 {
3041 const char *name;
3042 unsigned long strx;
3043 unsigned char type, other;
3044 unsigned short desc;
3045 bfd_vma value;
3046
3047 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
3048 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
3049 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
3050 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
3051 value = bfd_h_get_32 (abfd, stabp + VALOFF);
3052
3053 printf ("\n%-6d ", i);
3054 /* Either print the stab name, or, if unnamed, print its number
3055 again (makes consistent formatting for tools like awk). */
3056 name = bfd_get_stab_name (type);
3057 if (name != NULL)
3058 printf ("%-6s", sanitize_string (name));
3059 else if (type == N_UNDF)
3060 printf ("HdrSym");
3061 else
3062 printf ("%-6d", type);
3063 printf (" %-6d %-6d ", other, desc);
3064 bfd_printf_vma (abfd, value);
3065 printf (" %-6lu", strx);
3066
3067 /* Symbols with type == 0 (N_UNDF) specify the length of the
3068 string table associated with this file. We use that info
3069 to know how to relocate the *next* file's string table indices. */
3070 if (type == N_UNDF)
3071 {
3072 file_string_table_offset = next_file_string_table_offset;
3073 next_file_string_table_offset += value;
3074 }
3075 else
3076 {
3077 bfd_size_type amt = strx + file_string_table_offset;
3078
3079 /* Using the (possibly updated) string table offset, print the
3080 string (if any) associated with this symbol. */
3081 if (amt < stabstr_size)
3082 /* PR 17512: file: 079-79389-0.001:0.1.
3083 FIXME: May need to sanitize this string before displaying. */
3084 printf (" %.*s", (int)(stabstr_size - amt), strtab + amt);
3085 else
3086 printf (" *");
3087 }
3088 }
3089 printf ("\n\n");
3090 *string_offset_ptr = next_file_string_table_offset;
3091}
3092
3093typedef struct
3094{
3095 const char * section_name;
3096 const char * string_section_name;
3097 unsigned string_offset;
3098}
3099stab_section_names;
3100
3101static void
3102find_stabs_section (bfd *abfd, asection *section, void *names)
3103{
3104 int len;
3105 stab_section_names * sought = (stab_section_names *) names;
3106
3107 /* Check for section names for which stabsect_name is a prefix, to
3108 handle .stab.N, etc. */
3109 len = strlen (sought->section_name);
3110
3111 /* If the prefix matches, and the files section name ends with a
3112 nul or a digit, then we match. I.e., we want either an exact
3113 match or a section followed by a number. */
3114 if (strncmp (sought->section_name, section->name, len) == 0
3115 && (section->name[len] == 0
3116 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
3117 {
3118 if (strtab == NULL)
3119 strtab = read_section_stabs (abfd, sought->string_section_name,
3120 &stabstr_size);
3121
3122 if (strtab)
3123 {
3124 stabs = read_section_stabs (abfd, section->name, &stab_size);
3125 if (stabs)
3126 print_section_stabs (abfd, section->name, &sought->string_offset);
3127 }
3128 }
3129}
3130
3131static void
3132dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
3133{
3134 stab_section_names s;
3135
3136 s.section_name = stabsect_name;
3137 s.string_section_name = strsect_name;
3138 s.string_offset = 0;
3139
3140 bfd_map_over_sections (abfd, find_stabs_section, & s);
3141
3142 free (strtab);
3143 strtab = NULL;
3144}
3145
3146/* Dump the any sections containing stabs debugging information. */
3147
3148static void
3149dump_stabs (bfd *abfd)
3150{
3151 dump_stabs_section (abfd, ".stab", ".stabstr");
3152 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
3153 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
3154
3155 /* For Darwin. */
3156 dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
3157
3158 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
3159}
3160\f
3161static void
3162dump_bfd_header (bfd *abfd)
3163{
3164 char *comma = "";
3165
3166 printf (_("architecture: %s, "),
3167 bfd_printable_arch_mach (bfd_get_arch (abfd),
3168 bfd_get_mach (abfd)));
3169 printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
3170
3171#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
3172 PF (HAS_RELOC, "HAS_RELOC");
3173 PF (EXEC_P, "EXEC_P");
3174 PF (HAS_LINENO, "HAS_LINENO");
3175 PF (HAS_DEBUG, "HAS_DEBUG");
3176 PF (HAS_SYMS, "HAS_SYMS");
3177 PF (HAS_LOCALS, "HAS_LOCALS");
3178 PF (DYNAMIC, "DYNAMIC");
3179 PF (WP_TEXT, "WP_TEXT");
3180 PF (D_PAGED, "D_PAGED");
3181 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
3182 printf (_("\nstart address 0x"));
3183 bfd_printf_vma (abfd, abfd->start_address);
3184 printf ("\n");
3185}
3186
3187\f
3188static void
3189dump_bfd_private_header (bfd *abfd)
3190{
3191 if (!bfd_print_private_bfd_data (abfd, stdout))
3192 non_fatal (_("warning: private headers incomplete: %s"),
3193 bfd_errmsg (bfd_get_error ()));
3194}
3195
3196static void
3197dump_target_specific (bfd *abfd)
3198{
3199 const struct objdump_private_desc * const *desc;
3200 struct objdump_private_option *opt;
3201 char *e, *b;
3202
3203 /* Find the desc. */
3204 for (desc = objdump_private_vectors; *desc != NULL; desc++)
3205 if ((*desc)->filter (abfd))
3206 break;
3207
3208 if (*desc == NULL)
3209 {
3210 non_fatal (_("option -P/--private not supported by this file"));
3211 return;
3212 }
3213
3214 /* Clear all options. */
3215 for (opt = (*desc)->options; opt->name; opt++)
3216 opt->selected = FALSE;
3217
3218 /* Decode options. */
3219 b = dump_private_options;
3220 do
3221 {
3222 e = strchr (b, ',');
3223
3224 if (e)
3225 *e = 0;
3226
3227 for (opt = (*desc)->options; opt->name; opt++)
3228 if (strcmp (opt->name, b) == 0)
3229 {
3230 opt->selected = TRUE;
3231 break;
3232 }
3233 if (opt->name == NULL)
3234 non_fatal (_("target specific dump '%s' not supported"), b);
3235
3236 if (e)
3237 {
3238 *e = ',';
3239 b = e + 1;
3240 }
3241 }
3242 while (e != NULL);
3243
3244 /* Dump. */
3245 (*desc)->dump (abfd);
3246}
3247\f
3248/* Display a section in hexadecimal format with associated characters.
3249 Each line prefixed by the zero padded address. */
3250
3251static void
3252dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
3253{
3254 bfd_byte *data = NULL;
3255 bfd_size_type datasize;
3256 bfd_vma addr_offset;
3257 bfd_vma start_offset;
3258 bfd_vma stop_offset;
3259 unsigned int opb = bfd_octets_per_byte (abfd);
3260 /* Bytes per line. */
3261 const int onaline = 16;
3262 char buf[64];
3263 int count;
3264 int width;
3265
3266 if ((section->flags & SEC_HAS_CONTENTS) == 0)
3267 return;
3268
3269 if (! process_section_p (section))
3270 return;
3271
3272 if ((datasize = bfd_section_size (abfd, section)) == 0)
3273 return;
3274
3275 /* Compute the address range to display. */
3276 if (start_address == (bfd_vma) -1
3277 || start_address < section->vma)
3278 start_offset = 0;
3279 else
3280 start_offset = start_address - section->vma;
3281
3282 if (stop_address == (bfd_vma) -1)
3283 stop_offset = datasize / opb;
3284 else
3285 {
3286 if (stop_address < section->vma)
3287 stop_offset = 0;
3288 else
3289 stop_offset = stop_address - section->vma;
3290
3291 if (stop_offset > datasize / opb)
3292 stop_offset = datasize / opb;
3293 }
3294
3295 if (start_offset >= stop_offset)
3296 return;
3297
3298 printf (_("Contents of section %s:"), sanitize_string (section->name));
3299 if (display_file_offsets)
3300 printf (_(" (Starting at file offset: 0x%lx)"),
3301 (unsigned long) (section->filepos + start_offset));
3302 printf ("\n");
3303
3304 if (!bfd_get_full_section_contents (abfd, section, &data))
3305 {
3306 non_fatal (_("Reading section %s failed because: %s"),
3307 section->name, bfd_errmsg (bfd_get_error ()));
3308 return;
3309 }
3310
3311 width = 4;
3312
3313 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
3314 if (strlen (buf) >= sizeof (buf))
3315 abort ();
3316
3317 count = 0;
3318 while (buf[count] == '0' && buf[count+1] != '\0')
3319 count++;
3320 count = strlen (buf) - count;
3321 if (count > width)
3322 width = count;
3323
3324 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
3325 if (strlen (buf) >= sizeof (buf))
3326 abort ();
3327
3328 count = 0;
3329 while (buf[count] == '0' && buf[count+1] != '\0')
3330 count++;
3331 count = strlen (buf) - count;
3332 if (count > width)
3333 width = count;
3334
3335 for (addr_offset = start_offset;
3336 addr_offset < stop_offset; addr_offset += onaline / opb)
3337 {
3338 bfd_size_type j;
3339
3340 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
3341 count = strlen (buf);
3342 if ((size_t) count >= sizeof (buf))
3343 abort ();
3344
3345 putchar (' ');
3346 while (count < width)
3347 {
3348 putchar ('0');
3349 count++;
3350 }
3351 fputs (buf + count - width, stdout);
3352 putchar (' ');
3353
3354 for (j = addr_offset * opb;
3355 j < addr_offset * opb + onaline; j++)
3356 {
3357 if (j < stop_offset * opb)
3358 printf ("%02x", (unsigned) (data[j]));
3359 else
3360 printf (" ");
3361 if ((j & 3) == 3)
3362 printf (" ");
3363 }
3364
3365 printf (" ");
3366 for (j = addr_offset * opb;
3367 j < addr_offset * opb + onaline; j++)
3368 {
3369 if (j >= stop_offset * opb)
3370 printf (" ");
3371 else
3372 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
3373 }
3374 putchar ('\n');
3375 }
3376 free (data);
3377}
3378
3379/* Actually display the various requested regions. */
3380
3381static void
3382dump_data (bfd *abfd)
3383{
3384 bfd_map_over_sections (abfd, dump_section, NULL);
3385}
3386
3387/* Should perhaps share code and display with nm? */
3388
3389static void
3390dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
3391{
3392 asymbol **current;
3393 long max_count;
3394 long count;
3395
3396 if (dynamic)
3397 {
3398 current = dynsyms;
3399 max_count = dynsymcount;
3400 printf ("DYNAMIC SYMBOL TABLE:\n");
3401 }
3402 else
3403 {
3404 current = syms;
3405 max_count = symcount;
3406 printf ("SYMBOL TABLE:\n");
3407 }
3408
3409 if (max_count == 0)
3410 printf (_("no symbols\n"));
3411
3412 for (count = 0; count < max_count; count++)
3413 {
3414 bfd *cur_bfd;
3415
3416 if (*current == NULL)
3417 printf (_("no information for symbol number %ld\n"), count);
3418
3419 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
3420 printf (_("could not determine the type of symbol number %ld\n"),
3421 count);
3422
3423 else if (process_section_p ((* current)->section)
3424 && (dump_special_syms
3425 || !bfd_is_target_special_symbol (cur_bfd, *current)))
3426 {
3427 const char *name = (*current)->name;
3428
3429 if (do_demangle && name != NULL && *name != '\0')
3430 {
3431 char *alloc;
3432
3433 /* If we want to demangle the name, we demangle it
3434 here, and temporarily clobber it while calling
3435 bfd_print_symbol. FIXME: This is a gross hack. */
3436 alloc = bfd_demangle (cur_bfd, name, demangle_flags);
3437 if (alloc != NULL)
3438 (*current)->name = alloc;
3439 bfd_print_symbol (cur_bfd, stdout, *current,
3440 bfd_print_symbol_all);
3441 if (alloc != NULL)
3442 {
3443 (*current)->name = name;
3444 free (alloc);
3445 }
3446 }
3447 else
3448 bfd_print_symbol (cur_bfd, stdout, *current,
3449 bfd_print_symbol_all);
3450 printf ("\n");
3451 }
3452
3453 current++;
3454 }
3455 printf ("\n\n");
3456}
3457\f
3458static void
3459dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
3460{
3461 arelent **p;
3462 char *last_filename, *last_functionname;
3463 unsigned int last_line;
3464 unsigned int last_discriminator;
3465
3466 /* Get column headers lined up reasonably. */
3467 {
3468 static int width;
3469
3470 if (width == 0)
3471 {
3472 char buf[30];
3473
3474 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
3475 width = strlen (buf) - 7;
3476 }
3477 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
3478 }
3479
3480 last_filename = NULL;
3481 last_functionname = NULL;
3482 last_line = 0;
3483 last_discriminator = 0;
3484
3485 for (p = relpp; relcount && *p != NULL; p++, relcount--)
3486 {
3487 arelent *q = *p;
3488 const char *filename, *functionname;
3489 unsigned int linenumber;
3490 unsigned int discriminator;
3491 const char *sym_name;
3492 const char *section_name;
3493 bfd_vma addend2 = 0;
3494
3495 if (start_address != (bfd_vma) -1
3496 && q->address < start_address)
3497 continue;
3498 if (stop_address != (bfd_vma) -1
3499 && q->address > stop_address)
3500 continue;
3501
3502 if (with_line_numbers
3503 && sec != NULL
3504 && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
3505 &filename, &functionname,
3506 &linenumber, &discriminator))
3507 {
3508 if (functionname != NULL
3509 && (last_functionname == NULL
3510 || strcmp (functionname, last_functionname) != 0))
3511 {
3512 printf ("%s():\n", sanitize_string (functionname));
3513 if (last_functionname != NULL)
3514 free (last_functionname);
3515 last_functionname = xstrdup (functionname);
3516 }
3517
3518 if (linenumber > 0
3519 && (linenumber != last_line
3520 || (filename != NULL
3521 && last_filename != NULL
3522 && filename_cmp (filename, last_filename) != 0)
3523 || (discriminator != last_discriminator)))
3524 {
3525 if (discriminator > 0)
3526 printf ("%s:%u\n", filename == NULL ? "???" :
3527 sanitize_string (filename), linenumber);
3528 else
3529 printf ("%s:%u (discriminator %u)\n",
3530 filename == NULL ? "???" : sanitize_string (filename),
3531 linenumber, discriminator);
3532 last_line = linenumber;
3533 last_discriminator = discriminator;
3534 if (last_filename != NULL)
3535 free (last_filename);
3536 if (filename == NULL)
3537 last_filename = NULL;
3538 else
3539 last_filename = xstrdup (filename);
3540 }
3541 }
3542
3543 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
3544 {
3545 sym_name = (*(q->sym_ptr_ptr))->name;
3546 section_name = (*(q->sym_ptr_ptr))->section->name;
3547 }
3548 else
3549 {
3550 sym_name = NULL;
3551 section_name = NULL;
3552 }
3553
3554 bfd_printf_vma (abfd, q->address);
3555 if (q->howto == NULL)
3556 printf (" *unknown* ");
3557 else if (q->howto->name)
3558 {
3559 const char *name = q->howto->name;
3560
3561 /* R_SPARC_OLO10 relocations contain two addends.
3562 But because 'arelent' lacks enough storage to
3563 store them both, the 64-bit ELF Sparc backend
3564 records this as two relocations. One R_SPARC_LO10
3565 and one R_SPARC_13, both pointing to the same
3566 address. This is merely so that we have some
3567 place to store both addend fields.
3568
3569 Undo this transformation, otherwise the output
3570 will be confusing. */
3571 if (abfd->xvec->flavour == bfd_target_elf_flavour
3572 && elf_tdata(abfd)->elf_header->e_machine == EM_SPARCV9
3573 && relcount > 1
3574 && !strcmp (q->howto->name, "R_SPARC_LO10"))
3575 {
3576 arelent *q2 = *(p + 1);
3577 if (q2 != NULL
3578 && q2->howto
3579 && q->address == q2->address
3580 && !strcmp (q2->howto->name, "R_SPARC_13"))
3581 {
3582 name = "R_SPARC_OLO10";
3583 addend2 = q2->addend;
3584 p++;
3585 }
3586 }
3587 printf (" %-16s ", name);
3588 }
3589 else
3590 printf (" %-16d ", q->howto->type);
3591
3592 if (sym_name)
3593 {
3594 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
3595 }
3596 else
3597 {
3598 if (section_name == NULL)
3599 section_name = "*unknown*";
3600 printf ("[%s]", sanitize_string (section_name));
3601 }
3602
3603 if (q->addend)
3604 {
3605 bfd_signed_vma addend = q->addend;
3606 if (addend < 0)
3607 {
3608 printf ("-0x");
3609 addend = -addend;
3610 }
3611 else
3612 printf ("+0x");
3613 bfd_printf_vma (abfd, addend);
3614 }
3615 if (addend2)
3616 {
3617 printf ("+0x");
3618 bfd_printf_vma (abfd, addend2);
3619 }
3620
3621 printf ("\n");
3622 }
3623
3624 if (last_filename != NULL)
3625 free (last_filename);
3626 if (last_functionname != NULL)
3627 free (last_functionname);
3628}
3629
3630static void
3631dump_relocs_in_section (bfd *abfd,
3632 asection *section,
3633 void *dummy ATTRIBUTE_UNUSED)
3634{
3635 arelent **relpp = NULL;
3636 long relcount;
3637 long relsize;
3638
3639 if ( bfd_is_abs_section (section)
3640 || bfd_is_und_section (section)
3641 || bfd_is_com_section (section)
3642 || (! process_section_p (section))
3643 || ((section->flags & SEC_RELOC) == 0))
3644 return;
3645
3646 printf ("RELOCATION RECORDS FOR [%s]:", sanitize_string (section->name));
3647
3648 relsize = bfd_get_reloc_upper_bound (abfd, section);
3649 if (relsize == 0)
3650 {
3651 printf (" (none)\n\n");
3652 return;
3653 }
3654
3655 if (relsize < 0)
3656 relcount = relsize;
3657 else
3658 {
3659 relpp = (arelent **) xmalloc (relsize);
3660 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
3661 }
3662
3663 if (relcount < 0)
3664 {
3665 printf ("\n");
3666 non_fatal (_("failed to read relocs in: %s"),
3667 sanitize_string (bfd_get_filename (abfd)));
3668 bfd_fatal (_("error message was"));
3669 }
3670 else if (relcount == 0)
3671 printf (" (none)\n\n");
3672 else
3673 {
3674 printf ("\n");
3675 dump_reloc_set (abfd, section, relpp, relcount);
3676 printf ("\n\n");
3677 }
3678 free (relpp);
3679}
3680
3681static void
3682dump_relocs (bfd *abfd)
3683{
3684 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
3685}
3686
3687static void
3688dump_dynamic_relocs (bfd *abfd)
3689{
3690 long relsize;
3691 arelent **relpp;
3692 long relcount;
3693
3694 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3695 if (relsize < 0)
3696 bfd_fatal (bfd_get_filename (abfd));
3697
3698 printf ("DYNAMIC RELOCATION RECORDS");
3699
3700 if (relsize == 0)
3701 printf (" (none)\n\n");
3702 else
3703 {
3704 relpp = (arelent **) xmalloc (relsize);
3705 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
3706
3707 if (relcount < 0)
3708 bfd_fatal (bfd_get_filename (abfd));
3709 else if (relcount == 0)
3710 printf (" (none)\n\n");
3711 else
3712 {
3713 printf ("\n");
3714 dump_reloc_set (abfd, NULL, relpp, relcount);
3715 printf ("\n\n");
3716 }
3717 free (relpp);
3718 }
3719}
3720
3721/* Creates a table of paths, to search for source files. */
3722
3723static void
3724add_include_path (const char *path)
3725{
3726 if (path[0] == 0)
3727 return;
3728 include_path_count++;
3729 include_paths = (const char **)
3730 xrealloc (include_paths, include_path_count * sizeof (*include_paths));
3731#ifdef HAVE_DOS_BASED_FILE_SYSTEM
3732 if (path[1] == ':' && path[2] == 0)
3733 path = concat (path, ".", (const char *) 0);
3734#endif
3735 include_paths[include_path_count - 1] = path;
3736}
3737
3738static void
3739adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
3740 asection *section,
3741 void *arg)
3742{
3743 if ((section->flags & SEC_DEBUGGING) == 0)
3744 {
3745 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
3746 section->vma += adjust_section_vma;
3747 if (*has_reloc_p)
3748 section->lma += adjust_section_vma;
3749 }
3750}
3751
3752/* Return the sign-extended form of an ARCH_SIZE sized VMA. */
3753
3754static bfd_vma
3755sign_extend_address (bfd *abfd ATTRIBUTE_UNUSED,
3756 bfd_vma vma,
3757 unsigned arch_size)
3758{
3759 bfd_vma mask;
3760 mask = (bfd_vma) 1 << (arch_size - 1);
3761 return (((vma & ((mask << 1) - 1)) ^ mask) - mask);
3762}
3763
3764/* Dump selected contents of ABFD. */
3765
3766static void
3767dump_bfd (bfd *abfd, bfd_boolean is_mainfile)
3768{
3769 const struct elf_backend_data * bed;
3770
3771 if (bfd_big_endian (abfd))
3772 byte_get = byte_get_big_endian;
3773 else if (bfd_little_endian (abfd))
3774 byte_get = byte_get_little_endian;
3775 else
3776 byte_get = NULL;
3777
3778 /* Load any separate debug information files.
3779 We do this now and without checking do_follow_links because separate
3780 debug info files may contain symbol tables that we will need when
3781 displaying information about the main file. Any memory allocated by
3782 load_separate_debug_files will be released when we call
3783 free_debug_memory below.
3784
3785 The test on is_mainfile is there because the chain of separate debug
3786 info files is a global variable shared by all invocations of dump_bfd. */
3787 if (is_mainfile)
3788 {
3789 load_separate_debug_files (abfd, bfd_get_filename (abfd));
3790
3791 /* If asked to do so, recursively dump the separate files. */
3792 if (do_follow_links)
3793 {
3794 separate_info * i;
3795
3796 for (i = first_separate_info; i != NULL; i = i->next)
3797 dump_bfd (i->handle, FALSE);
3798 }
3799 }
3800
3801 /* Adjust user-specified start and stop limits for targets that use
3802 signed addresses. */
3803 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
3804 && (bed = get_elf_backend_data (abfd)) != NULL
3805 && bed->sign_extend_vma)
3806 {
3807 start_address = sign_extend_address (abfd, start_address,
3808 bed->s->arch_size);
3809 stop_address = sign_extend_address (abfd, stop_address,
3810 bed->s->arch_size);
3811 }
3812
3813 /* If we are adjusting section VMA's, change them all now. Changing
3814 the BFD information is a hack. However, we must do it, or
3815 bfd_find_nearest_line will not do the right thing. */
3816 if (adjust_section_vma != 0)
3817 {
3818 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3819 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
3820 }
3821
3822 if (! dump_debugging_tags && ! suppress_bfd_header)
3823 printf (_("\n%s: file format %s\n"),
3824 sanitize_string (bfd_get_filename (abfd)),
3825 abfd->xvec->name);
3826 if (dump_ar_hdrs)
3827 print_arelt_descr (stdout, abfd, TRUE, FALSE);
3828 if (dump_file_header)
3829 dump_bfd_header (abfd);
3830 if (dump_private_headers)
3831 dump_bfd_private_header (abfd);
3832 if (dump_private_options != NULL)
3833 dump_target_specific (abfd);
3834 if (! dump_debugging_tags && ! suppress_bfd_header)
3835 putchar ('\n');
3836
3837 if (dump_symtab
3838 || dump_reloc_info
3839 || disassemble
3840 || dump_debugging
3841 || dump_dwarf_section_info)
3842 {
3843 syms = slurp_symtab (abfd);
3844
3845 /* If following links, load any symbol tables from the linked files as well. */
3846 if (do_follow_links && is_mainfile)
3847 {
3848 separate_info * i;
3849
3850 for (i = first_separate_info; i != NULL; i = i->next)
3851 {
3852 asymbol ** extra_syms;
3853 long old_symcount = symcount;
3854
3855 extra_syms = slurp_symtab (i->handle);
3856
3857 if (extra_syms)
3858 {
3859 if (old_symcount == 0)
3860 {
3861 syms = extra_syms;
3862 }
3863 else
3864 {
3865 syms = xrealloc (syms, (symcount + old_symcount) * sizeof (asymbol *));
3866 memcpy (syms + old_symcount,
3867 extra_syms,
3868 symcount * sizeof (asymbol *));
3869 }
3870 }
3871
3872 symcount += old_symcount;
3873 }
3874 }
3875 }
3876
3877 if (dump_section_headers)
3878 dump_headers (abfd);
3879
3880 if (dump_dynamic_symtab || dump_dynamic_reloc_info
3881 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
3882 dynsyms = slurp_dynamic_symtab (abfd);
3883
3884 if (disassemble)
3885 {
3886 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
3887 dynsymcount, dynsyms, &synthsyms);
3888 if (synthcount < 0)
3889 synthcount = 0;
3890 }
3891
3892 if (dump_symtab)
3893 dump_symbols (abfd, FALSE);
3894 if (dump_dynamic_symtab)
3895 dump_symbols (abfd, TRUE);
3896 if (dump_dwarf_section_info)
3897 dump_dwarf (abfd);
3898 if (dump_stab_section_info)
3899 dump_stabs (abfd);
3900 if (dump_reloc_info && ! disassemble)
3901 dump_relocs (abfd);
3902 if (dump_dynamic_reloc_info && ! disassemble)
3903 dump_dynamic_relocs (abfd);
3904 if (dump_section_contents)
3905 dump_data (abfd);
3906 if (disassemble)
3907 disassemble_data (abfd);
3908
3909 if (dump_debugging)
3910 {
3911 void *dhandle;
3912
3913 dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3914 if (dhandle != NULL)
3915 {
3916 if (!print_debugging_info (stdout, dhandle, abfd, syms,
3917 bfd_demangle,
3918 dump_debugging_tags ? TRUE : FALSE))
3919 {
3920 non_fatal (_("%s: printing debugging information failed"),
3921 bfd_get_filename (abfd));
3922 exit_status = 1;
3923 }
3924
3925 free (dhandle);
3926 }
3927 /* PR 6483: If there was no STABS debug info in the file, try
3928 DWARF instead. */
3929 else if (! dump_dwarf_section_info)
3930 {
3931 dwarf_select_sections_all ();
3932 dump_dwarf (abfd);
3933 }
3934 }
3935
3936 if (syms)
3937 {
3938 free (syms);
3939 syms = NULL;
3940 }
3941
3942 if (dynsyms)
3943 {
3944 free (dynsyms);
3945 dynsyms = NULL;
3946 }
3947
3948 if (synthsyms)
3949 {
3950 free (synthsyms);
3951 synthsyms = NULL;
3952 }
3953
3954 symcount = 0;
3955 dynsymcount = 0;
3956 synthcount = 0;
3957
3958 if (is_mainfile)
3959 free_debug_memory ();
3960}
3961
3962static void
3963display_object_bfd (bfd *abfd)
3964{
3965 char **matching;
3966
3967 if (bfd_check_format_matches (abfd, bfd_object, &matching))
3968 {
3969 dump_bfd (abfd, TRUE);
3970 return;
3971 }
3972
3973 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3974 {
3975 nonfatal (bfd_get_filename (abfd));
3976 list_matching_formats (matching);
3977 free (matching);
3978 return;
3979 }
3980
3981 if (bfd_get_error () != bfd_error_file_not_recognized)
3982 {
3983 nonfatal (bfd_get_filename (abfd));
3984 return;
3985 }
3986
3987 if (bfd_check_format_matches (abfd, bfd_core, &matching))
3988 {
3989 dump_bfd (abfd, TRUE);
3990 return;
3991 }
3992
3993 nonfatal (bfd_get_filename (abfd));
3994
3995 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3996 {
3997 list_matching_formats (matching);
3998 free (matching);
3999 }
4000}
4001
4002static void
4003display_any_bfd (bfd *file, int level)
4004{
4005 /* Decompress sections unless dumping the section contents. */
4006 if (!dump_section_contents)
4007 file->flags |= BFD_DECOMPRESS;
4008
4009 /* If the file is an archive, process all of its elements. */
4010 if (bfd_check_format (file, bfd_archive))
4011 {
4012 bfd *arfile = NULL;
4013 bfd *last_arfile = NULL;
4014
4015 if (level == 0)
4016 printf (_("In archive %s:\n"), sanitize_string (bfd_get_filename (file)));
4017 else if (level > 100)
4018 {
4019 /* Prevent corrupted files from spinning us into an
4020 infinite loop. 100 is an arbitrary heuristic. */
4021 fatal (_("Archive nesting is too deep"));
4022 return;
4023 }
4024 else
4025 printf (_("In nested archive %s:\n"),
4026 sanitize_string (bfd_get_filename (file)));
4027
4028 for (;;)
4029 {
4030 bfd_set_error (bfd_error_no_error);
4031
4032 arfile = bfd_openr_next_archived_file (file, arfile);
4033 if (arfile == NULL)
4034 {
4035 if (bfd_get_error () != bfd_error_no_more_archived_files)
4036 nonfatal (bfd_get_filename (file));
4037 break;
4038 }
4039
4040 display_any_bfd (arfile, level + 1);
4041
4042 if (last_arfile != NULL)
4043 {
4044 bfd_close (last_arfile);
4045 /* PR 17512: file: ac585d01. */
4046 if (arfile == last_arfile)
4047 {
4048 last_arfile = NULL;
4049 break;
4050 }
4051 }
4052 last_arfile = arfile;
4053 }
4054
4055 if (last_arfile != NULL)
4056 bfd_close (last_arfile);
4057 }
4058 else
4059 display_object_bfd (file);
4060}
4061
4062static void
4063display_file (char *filename, char *target, bfd_boolean last_file)
4064{
4065 bfd *file;
4066
4067 if (get_file_size (filename) < 1)
4068 {
4069 exit_status = 1;
4070 return;
4071 }
4072
4073 file = bfd_openr (filename, target);
4074 if (file == NULL)
4075 {
4076 nonfatal (filename);
4077 return;
4078 }
4079
4080 display_any_bfd (file, 0);
4081
4082 /* This is an optimization to improve the speed of objdump, especially when
4083 dumping a file with lots of associated debug informatiom. Calling
4084 bfd_close on such a file can take a non-trivial amount of time as there
4085 are lots of lists to walk and buffers to free. This is only really
4086 necessary however if we are about to load another file and we need the
4087 memory back. Otherwise, if we are about to exit, then we can save (a lot
4088 of) time by only doing a quick close, and allowing the OS to reclaim the
4089 memory for us. */
4090 if (! last_file)
4091 bfd_close (file);
4092 else
4093 bfd_close_all_done (file);
4094}
4095\f
4096int
4097main (int argc, char **argv)
4098{
4099 int c;
4100 char *target = default_target;
4101 bfd_boolean seenflag = FALSE;
4102
4103#if defined (HAVE_SETLOCALE)
4104#if defined (HAVE_LC_MESSAGES)
4105 setlocale (LC_MESSAGES, "");
4106#endif
4107 setlocale (LC_CTYPE, "");
4108#endif
4109
4110 bindtextdomain (PACKAGE, LOCALEDIR);
4111 textdomain (PACKAGE);
4112
4113 program_name = *argv;
4114 xmalloc_set_program_name (program_name);
4115 bfd_set_error_program_name (program_name);
4116
4117 START_PROGRESS (program_name, 0);
4118
4119 expandargv (&argc, &argv);
4120
4121 if (bfd_init () != BFD_INIT_MAGIC)
4122 fatal (_("fatal error: libbfd ABI mismatch"));
4123 set_default_bfd_target ();
4124
4125 while ((c = getopt_long (argc, argv,
4126 "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
4127 long_options, (int *) 0))
4128 != EOF)
4129 {
4130 switch (c)
4131 {
4132 case 0:
4133 break; /* We've been given a long option. */
4134 case 'm':
4135 machine = optarg;
4136 break;
4137 case 'M':
4138 {
4139 char *options;
4140 if (disassembler_options)
4141 /* Ignore potential memory leak for now. */
4142 options = concat (disassembler_options, ",",
4143 optarg, (const char *) NULL);
4144 else
4145 options = optarg;
4146 disassembler_options = remove_whitespace_and_extra_commas (options);
4147 }
4148 break;
4149 case 'j':
4150 add_only (optarg);
4151 break;
4152 case 'F':
4153 display_file_offsets = TRUE;
4154 break;
4155 case 'l':
4156 with_line_numbers = TRUE;
4157 break;
4158 case 'b':
4159 target = optarg;
4160 break;
4161 case 'C':
4162 do_demangle = TRUE;
4163 if (optarg != NULL)
4164 {
4165 enum demangling_styles style;
4166
4167 style = cplus_demangle_name_to_style (optarg);
4168 if (style == unknown_demangling)
4169 fatal (_("unknown demangling style `%s'"),
4170 optarg);
4171
4172 cplus_demangle_set_style (style);
4173 }
4174 break;
4175 case OPTION_RECURSE_LIMIT:
4176 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
4177 break;
4178 case OPTION_NO_RECURSE_LIMIT:
4179 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
4180 break;
4181 case 'w':
4182 do_wide = wide_output = TRUE;
4183 break;
4184 case OPTION_ADJUST_VMA:
4185 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
4186 break;
4187 case OPTION_START_ADDRESS:
4188 start_address = parse_vma (optarg, "--start-address");
4189 if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
4190 fatal (_("error: the start address should be before the end address"));
4191 break;
4192 case OPTION_STOP_ADDRESS:
4193 stop_address = parse_vma (optarg, "--stop-address");
4194 if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
4195 fatal (_("error: the stop address should be after the start address"));
4196 break;
4197 case OPTION_PREFIX:
4198 prefix = optarg;
4199 prefix_length = strlen (prefix);
4200 /* Remove an unnecessary trailing '/' */
4201 while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
4202 prefix_length--;
4203 break;
4204 case OPTION_PREFIX_STRIP:
4205 prefix_strip = atoi (optarg);
4206 if (prefix_strip < 0)
4207 fatal (_("error: prefix strip must be non-negative"));
4208 break;
4209 case OPTION_INSN_WIDTH:
4210 insn_width = strtoul (optarg, NULL, 0);
4211 if (insn_width <= 0)
4212 fatal (_("error: instruction width must be positive"));
4213 break;
4214 case OPTION_INLINES:
4215 unwind_inlines = TRUE;
4216 break;
4217 case 'E':
4218 if (strcmp (optarg, "B") == 0)
4219 endian = BFD_ENDIAN_BIG;
4220 else if (strcmp (optarg, "L") == 0)
4221 endian = BFD_ENDIAN_LITTLE;
4222 else
4223 {
4224 nonfatal (_("unrecognized -E option"));
4225 usage (stderr, 1);
4226 }
4227 break;
4228 case OPTION_ENDIAN:
4229 if (strncmp (optarg, "big", strlen (optarg)) == 0)
4230 endian = BFD_ENDIAN_BIG;
4231 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
4232 endian = BFD_ENDIAN_LITTLE;
4233 else
4234 {
4235 non_fatal (_("unrecognized --endian type `%s'"), optarg);
4236 exit_status = 1;
4237 usage (stderr, 1);
4238 }
4239 break;
4240
4241 case 'f':
4242 dump_file_header = TRUE;
4243 seenflag = TRUE;
4244 break;
4245 case 'i':
4246 formats_info = TRUE;
4247 seenflag = TRUE;
4248 break;
4249 case 'I':
4250 add_include_path (optarg);
4251 break;
4252 case 'p':
4253 dump_private_headers = TRUE;
4254 seenflag = TRUE;
4255 break;
4256 case 'P':
4257 dump_private_options = optarg;
4258 seenflag = TRUE;
4259 break;
4260 case 'x':
4261 dump_private_headers = TRUE;
4262 dump_symtab = TRUE;
4263 dump_reloc_info = TRUE;
4264 dump_file_header = TRUE;
4265 dump_ar_hdrs = TRUE;
4266 dump_section_headers = TRUE;
4267 seenflag = TRUE;
4268 break;
4269 case 't':
4270 dump_symtab = TRUE;
4271 seenflag = TRUE;
4272 break;
4273 case 'T':
4274 dump_dynamic_symtab = TRUE;
4275 seenflag = TRUE;
4276 break;
4277 case 'd':
4278 disassemble = TRUE;
4279 seenflag = TRUE;
4280 disasm_sym = optarg;
4281 break;
4282 case 'z':
4283 disassemble_zeroes = TRUE;
4284 break;
4285 case 'D':
4286 disassemble = TRUE;
4287 disassemble_all = TRUE;
4288 seenflag = TRUE;
4289 break;
4290 case 'S':
4291 disassemble = TRUE;
4292 with_source_code = TRUE;
4293 seenflag = TRUE;
4294 break;
4295 case 'g':
4296 dump_debugging = 1;
4297 seenflag = TRUE;
4298 break;
4299 case 'e':
4300 dump_debugging = 1;
4301 dump_debugging_tags = 1;
4302 do_demangle = TRUE;
4303 seenflag = TRUE;
4304 break;
4305 case 'W':
4306 dump_dwarf_section_info = TRUE;
4307 seenflag = TRUE;
4308 if (optarg)
4309 dwarf_select_sections_by_letters (optarg);
4310 else
4311 dwarf_select_sections_all ();
4312 break;
4313 case OPTION_DWARF:
4314 dump_dwarf_section_info = TRUE;
4315 seenflag = TRUE;
4316 if (optarg)
4317 dwarf_select_sections_by_names (optarg);
4318 else
4319 dwarf_select_sections_all ();
4320 break;
4321 case OPTION_DWARF_DEPTH:
4322 {
4323 char *cp;
4324 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4325 }
4326 break;
4327 case OPTION_DWARF_START:
4328 {
4329 char *cp;
4330 dwarf_start_die = strtoul (optarg, & cp, 0);
4331 suppress_bfd_header = 1;
4332 }
4333 break;
4334 case OPTION_DWARF_CHECK:
4335 dwarf_check = TRUE;
4336 break;
4337 case 'G':
4338 dump_stab_section_info = TRUE;
4339 seenflag = TRUE;
4340 break;
4341 case 's':
4342 dump_section_contents = TRUE;
4343 seenflag = TRUE;
4344 break;
4345 case 'r':
4346 dump_reloc_info = TRUE;
4347 seenflag = TRUE;
4348 break;
4349 case 'R':
4350 dump_dynamic_reloc_info = TRUE;
4351 seenflag = TRUE;
4352 break;
4353 case 'a':
4354 dump_ar_hdrs = TRUE;
4355 seenflag = TRUE;
4356 break;
4357 case 'h':
4358 dump_section_headers = TRUE;
4359 seenflag = TRUE;
4360 break;
4361 case 'v':
4362 case 'V':
4363 show_version = TRUE;
4364 seenflag = TRUE;
4365 break;
4366
4367 case 'H':
4368 usage (stdout, 0);
4369 /* No need to set seenflag or to break - usage() does not return. */
4370 default:
4371 usage (stderr, 1);
4372 }
4373 }
4374
4375 if (show_version)
4376 print_version ("objdump");
4377
4378 if (!seenflag)
4379 usage (stderr, 2);
4380
4381 if (formats_info)
4382 exit_status = display_info ();
4383 else
4384 {
4385 if (optind == argc)
4386 display_file ("a.out", target, TRUE);
4387 else
4388 for (; optind < argc;)
4389 {
4390 display_file (argv[optind], target, optind == argc - 1);
4391 optind++;
4392 }
4393 }
4394
4395 free_only_list ();
4396
4397 END_PROGRESS (program_name);
4398
4399 return exit_status;
4400}
This page took 0.036718 seconds and 4 git commands to generate.