Bug Summary

File:src/gnu/usr.bin/binutils-2.17/binutils/objdump.c
Warning:line 1305, column 3
Value stored to 'done_dot' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name objdump.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/gnu/usr.bin/binutils-2.17/obj/binutils -resource-dir /usr/local/lib/clang/13.0.0 -D HAVE_CONFIG_H -I . -I /usr/src/gnu/usr.bin/binutils-2.17/binutils -I . -D _GNU_SOURCE -I . -I /usr/src/gnu/usr.bin/binutils-2.17/binutils -I ../bfd -I /usr/src/gnu/usr.bin/binutils-2.17/binutils/../bfd -I /usr/src/gnu/usr.bin/binutils-2.17/binutils/../include -I /usr/src/gnu/usr.bin/binutils-2.17/binutils/../intl -I ../intl -D LOCALEDIR="/usr/share/locale" -D bin_dummy_emulation=bin_vanilla_emulation -D PIE_DEFAULT=1 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/gnu/usr.bin/binutils-2.17/obj/binutils -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c /usr/src/gnu/usr.bin/binutils-2.17/binutils/objdump.c
1/* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006
4 Free Software Foundation, Inc.
5
6 This file is part of GNU Binutils.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
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 "bfd.h"
52#include "bfdver.h"
53#include "progress.h"
54#include "bucomm.h"
55#include "dwarf.h"
56#include "budemang.h"
57#include "getopt.h"
58#include "safe-ctype.h"
59#include "dis-asm.h"
60#include "libiberty.h"
61#include "demangle.h"
62#include "debug.h"
63#include "budbg.h"
64
65/* Internal headers for the ELF .stab-dump code - sorry. */
66#define BYTES_IN_WORD32 32
67#include "aout/aout64.h"
68
69/* Exit status. */
70static int exit_status = 0;
71
72static char *default_target = NULL((void*)0); /* Default at runtime. */
73
74/* The following variables are set based on arguments passed on the
75 command line. */
76static int show_version = 0; /* Show the version number. */
77static int dump_section_contents; /* -s */
78static int dump_section_headers; /* -h */
79static bfd_boolean dump_file_header; /* -f */
80static int dump_symtab; /* -t */
81static int dump_dynamic_symtab; /* -T */
82static int dump_reloc_info; /* -r */
83static int dump_dynamic_reloc_info; /* -R */
84static int dump_ar_hdrs; /* -a */
85static int dump_private_headers; /* -p */
86static int prefix_addresses; /* --prefix-addresses */
87static int with_line_numbers; /* -l */
88static bfd_boolean with_source_code; /* -S */
89static int show_raw_insn; /* --show-raw-insn */
90static int dump_dwarf_section_info; /* --dwarf */
91static int dump_stab_section_info; /* --stabs */
92static int do_demangle; /* -C, --demangle */
93static bfd_boolean disassemble; /* -d */
94static bfd_boolean disassemble_all; /* -D */
95static int disassemble_zeroes; /* --disassemble-zeroes */
96static bfd_boolean formats_info; /* -i */
97static int wide_output; /* -w */
98static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
99static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
100static int dump_debugging; /* --debugging */
101static int dump_debugging_tags; /* --debugging-tags */
102static int dump_special_syms = 0; /* --special-syms */
103static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
104static int file_start_context = 0; /* --file-start-context */
105
106/* Pointer to an array of section names provided by
107 one or more "-j secname" command line options. */
108static char **only;
109/* The total number of slots in the only[] array. */
110static size_t only_size = 0;
111/* The number of occupied slots in the only[] array. */
112static size_t only_used = 0;
113
114/* Variables for handling include file path table. */
115static const char **include_paths;
116static int include_path_count;
117
118/* Extra info to pass to the section disassembler and address printing
119 function. */
120struct objdump_disasm_info
121{
122 bfd * abfd;
123 asection * sec;
124 bfd_boolean require_sec;
125 arelent ** dynrelbuf;
126 long dynrelcount;
127 disassembler_ftype disassemble_fn;
128 arelent * reloc;
129};
130
131/* Architecture to disassemble for, or default if NULL. */
132static char *machine = NULL((void*)0);
133
134/* Target specific options to the disassembler. */
135static char *disassembler_options = NULL((void*)0);
136
137/* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
138static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
139
140/* The symbol table. */
141static asymbol **syms;
142
143/* Number of symbols in `syms'. */
144static long symcount = 0;
145
146/* The sorted symbol table. */
147static asymbol **sorted_syms;
148
149/* Number of symbols in `sorted_syms'. */
150static long sorted_symcount = 0;
151
152/* The dynamic symbol table. */
153static asymbol **dynsyms;
154
155/* The synthetic symbol table. */
156static asymbol *synthsyms;
157static long synthcount = 0;
158
159/* Number of symbols in `dynsyms'. */
160static long dynsymcount = 0;
161
162static bfd_byte *stabs;
163static bfd_size_type stab_size;
164
165static char *strtab;
166static bfd_size_type stabstr_size;
167
168static void
169usage (FILE *stream, int status)
170{
171 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n")("Usage: %s <option(s)> <file(s)>\n"), program_name);
172 fprintf (stream, _(" Display information from object <file(s)>.\n")(" Display information from object <file(s)>.\n"));
173 fprintf (stream, _(" At least one of the following switches must be given:\n")(" At least one of the following switches must be given:\n"));
174 fprintf (stream, _("\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
175 -a, --archive-headers Display archive header information\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
176 -f, --file-headers Display the contents of the overall file header\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
177 -p, --private-headers Display object format specific file header contents\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
178 -h, --[section-]headers Display the contents of the section headers\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
179 -x, --all-headers Display the contents of all headers\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
180 -d, --disassemble Display assembler contents of executable sections\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
181 -D, --disassemble-all Display assembler contents of all sections\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
182 -S, --source Intermix source code with disassembly\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
183 -s, --full-contents Display the full contents of all sections requested\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
184 -g, --debugging Display debug information in object file\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
185 -e, --debugging-tags Display debug information using ctags style\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
186 -G, --stabs Display (in raw form) any STABS info in the file\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
187 -W, --dwarf Display DWARF info in the file\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
188 -t, --syms Display the contents of the symbol table(s)\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
189 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
190 -r, --reloc Display the relocation entries in the file\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
191 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
192 @<file> Read options from <file>\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
193 -v, --version Display this program's version number\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
194 -i, --info List object formats and architectures supported\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
195 -H, --help Display this information\n\(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
196")(" -a, --archive-headers Display archive header information\n -f, --file-headers Display the contents of the overall file header\n -p, --private-headers Display object format specific file header contents\n -h, --[section-]headers Display the contents of the section headers\n -x, --all-headers Display the contents of all headers\n -d, --disassemble Display assembler contents of executable sections\n -D, --disassemble-all Display assembler contents of all sections\n -S, --source Intermix source code with disassembly\n -s, --full-contents Display the full contents of all sections requested\n -g, --debugging Display debug information in object file\n -e, --debugging-tags Display debug information using ctags style\n -G, --stabs Display (in raw form) any STABS info in the file\n -W, --dwarf Display DWARF info in the file\n -t, --syms Display the contents of the symbol table(s)\n -T, --dynamic-syms Display the contents of the dynamic symbol table\n -r, --reloc Display the relocation entries in the file\n -R, --dynamic-reloc Display the dynamic relocation entries in the file\n @<file> Read options from <file>\n -v, --version Display this program's version number\n -i, --info List object formats and architectures supported\n -H, --help Display this information\n"
)
);
197 if (status != 2)
198 {
199 fprintf (stream, _("\n The following switches are optional:\n")("\n The following switches are optional:\n"));
200 fprintf (stream, _("\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
201 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
202 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
203 -j, --section=NAME Only display information for section NAME\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
204 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
205 -EB --endian=big Assume big endian format when disassembling\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
206 -EL --endian=little Assume little endian format when disassembling\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
207 --file-start-context Include context from start of file (with -S)\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
208 -I, --include=DIR Add DIR to search list for source files\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
209 -l, --line-numbers Include line numbers and filenames in output\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
210 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
211 The STYLE, if specified, can be `auto', `gnu',\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
212 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
213 or `gnat'\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
214 -w, --wide Format output for more than 80 columns\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
215 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
216 --start-address=ADDR Only process data whose address is >= ADDR\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
217 --stop-address=ADDR Only process data whose address is <= ADDR\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
218 --prefix-addresses Print complete address alongside disassembly\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
219 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
220 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
221 --special-syms Include special symbols in symbol dumps\n\(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
222\n")(" -b, --target=BFDNAME Specify the target object format as BFDNAME\n -m, --architecture=MACHINE Specify the target architecture as MACHINE\n -j, --section=NAME Only display information for section NAME\n -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n -EB --endian=big Assume big endian format when disassembling\n -EL --endian=little Assume little endian format when disassembling\n --file-start-context Include context from start of file (with -S)\n -I, --include=DIR Add DIR to search list for source files\n -l, --line-numbers Include line numbers and filenames in output\n -C, --demangle[=STYLE] Decode mangled/processed symbol names\n The STYLE, if specified, can be `auto', `gnu',\n `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n or `gnat'\n -w, --wide Format output for more than 80 columns\n -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n --start-address=ADDR Only process data whose address is >= ADDR\n --stop-address=ADDR Only process data whose address is <= ADDR\n --prefix-addresses Print complete address alongside disassembly\n --[no-]show-raw-insn Display hex alongside symbolic disassembly\n --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n --special-syms Include special symbols in symbol dumps\n\n"
)
);
223 list_supported_targets (program_name, stream);
224 list_supported_architectures (program_name, stream);
225
226 disassembler_usage (stream);
227 }
228 if (status == 0)
229 fprintf (stream, _("Report bugs to %s.\n")("Report bugs to %s.\n"), REPORT_BUGS_TO"<URL:http://www.sourceware.org/bugzilla/>");
230 exit (status);
231}
232
233/* 150 isn't special; it's just an arbitrary non-ASCII char value. */
234enum option_values
235 {
236 OPTION_ENDIAN=150,
237 OPTION_START_ADDRESS,
238 OPTION_STOP_ADDRESS,
239 OPTION_ADJUST_VMA
240 };
241
242static struct option long_options[]=
243{
244 {"adjust-vma", required_argument1, NULL((void*)0), OPTION_ADJUST_VMA},
245 {"all-headers", no_argument0, NULL((void*)0), 'x'},
246 {"private-headers", no_argument0, NULL((void*)0), 'p'},
247 {"architecture", required_argument1, NULL((void*)0), 'm'},
248 {"archive-headers", no_argument0, NULL((void*)0), 'a'},
249 {"debugging", no_argument0, NULL((void*)0), 'g'},
250 {"debugging-tags", no_argument0, NULL((void*)0), 'e'},
251 {"demangle", optional_argument2, NULL((void*)0), 'C'},
252 {"disassemble", no_argument0, NULL((void*)0), 'd'},
253 {"disassemble-all", no_argument0, NULL((void*)0), 'D'},
254 {"disassembler-options", required_argument1, NULL((void*)0), 'M'},
255 {"disassemble-zeroes", no_argument0, NULL((void*)0), 'z'},
256 {"dynamic-reloc", no_argument0, NULL((void*)0), 'R'},
257 {"dynamic-syms", no_argument0, NULL((void*)0), 'T'},
258 {"endian", required_argument1, NULL((void*)0), OPTION_ENDIAN},
259 {"file-headers", no_argument0, NULL((void*)0), 'f'},
260 {"file-start-context", no_argument0, &file_start_context, 1},
261 {"full-contents", no_argument0, NULL((void*)0), 's'},
262 {"headers", no_argument0, NULL((void*)0), 'h'},
263 {"help", no_argument0, NULL((void*)0), 'H'},
264 {"info", no_argument0, NULL((void*)0), 'i'},
265 {"line-numbers", no_argument0, NULL((void*)0), 'l'},
266 {"no-show-raw-insn", no_argument0, &show_raw_insn, -1},
267 {"prefix-addresses", no_argument0, &prefix_addresses, 1},
268 {"reloc", no_argument0, NULL((void*)0), 'r'},
269 {"section", required_argument1, NULL((void*)0), 'j'},
270 {"section-headers", no_argument0, NULL((void*)0), 'h'},
271 {"show-raw-insn", no_argument0, &show_raw_insn, 1},
272 {"source", no_argument0, NULL((void*)0), 'S'},
273 {"special-syms", no_argument0, &dump_special_syms, 1},
274 {"include", required_argument1, NULL((void*)0), 'I'},
275 {"dwarf", no_argument0, NULL((void*)0), 'W'},
276 {"stabs", no_argument0, NULL((void*)0), 'G'},
277 {"start-address", required_argument1, NULL((void*)0), OPTION_START_ADDRESS},
278 {"stop-address", required_argument1, NULL((void*)0), OPTION_STOP_ADDRESS},
279 {"syms", no_argument0, NULL((void*)0), 't'},
280 {"target", required_argument1, NULL((void*)0), 'b'},
281 {"version", no_argument0, NULL((void*)0), 'V'},
282 {"wide", no_argument0, NULL((void*)0), 'w'},
283 {0, no_argument0, 0, 0}
284};
285
286static void
287nonfatal (const char *msg)
288{
289 bfd_nonfatal (msg);
290 exit_status = 1;
291}
292
293static void
294dump_section_header (bfd *abfd, asection *section,
295 void *ignored ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
296{
297 char *comma = "";
298 unsigned int opb = bfd_octets_per_byte (abfd);
299
300 /* Ignore linker created section. See elfNN_ia64_object_p in
301 bfd/elfxx-ia64.c. */
302 if (section->flags & SEC_LINKER_CREATED0x200000)
303 return;
304
305 printf ("%3d %-13s %08lx ", section->index,
306 bfd_get_section_name (abfd, section)((section)->name + 0),
307 (unsigned long) bfd_section_size (abfd, section)((section)->size) / opb);
308 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section))bfd_fprintf_vma (abfd,(&__sF[1]),((section)->vma + 0));
309 printf (" ");
310 bfd_printf_vma (abfd, section->lma)bfd_fprintf_vma (abfd,(&__sF[1]),section->lma);
311 printf (" %08lx 2**%u", (unsigned long) section->filepos,
312 bfd_get_section_alignment (abfd, section)((section)->alignment_power + 0));
313 if (! wide_output)
314 printf ("\n ");
315 printf (" ");
316
317#define PF(x, y)if (abfd->flags & x) {printf("%s%s", comma, y); comma=
", ";}
\
318 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
319
320 PF (SEC_HAS_CONTENTS, "CONTENTS")if (abfd->flags & 0x100) {printf("%s%s", comma, "CONTENTS"
); comma=", ";}
;
321 PF (SEC_ALLOC, "ALLOC")if (abfd->flags & 0x001) {printf("%s%s", comma, "ALLOC"
); comma=", ";}
;
322 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR")if (abfd->flags & 0x080) {printf("%s%s", comma, "CONSTRUCTOR"
); comma=", ";}
;
323 PF (SEC_LOAD, "LOAD")if (abfd->flags & 0x002) {printf("%s%s", comma, "LOAD"
); comma=", ";}
;
324 PF (SEC_RELOC, "RELOC")if (abfd->flags & 0x004) {printf("%s%s", comma, "RELOC"
); comma=", ";}
;
325 PF (SEC_READONLY, "READONLY")if (abfd->flags & 0x008) {printf("%s%s", comma, "READONLY"
); comma=", ";}
;
326 PF (SEC_CODE, "CODE")if (abfd->flags & 0x010) {printf("%s%s", comma, "CODE"
); comma=", ";}
;
327 PF (SEC_DATA, "DATA")if (abfd->flags & 0x020) {printf("%s%s", comma, "DATA"
); comma=", ";}
;
328 PF (SEC_ROM, "ROM")if (abfd->flags & 0x040) {printf("%s%s", comma, "ROM")
; comma=", ";}
;
329 PF (SEC_DEBUGGING, "DEBUGGING")if (abfd->flags & 0x2000) {printf("%s%s", comma, "DEBUGGING"
); comma=", ";}
;
330 PF (SEC_NEVER_LOAD, "NEVER_LOAD")if (abfd->flags & 0x200) {printf("%s%s", comma, "NEVER_LOAD"
); comma=", ";}
;
331 PF (SEC_EXCLUDE, "EXCLUDE")if (abfd->flags & 0x8000) {printf("%s%s", comma, "EXCLUDE"
); comma=", ";}
;
332 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES")if (abfd->flags & 0x10000) {printf("%s%s", comma, "SORT_ENTRIES"
); comma=", ";}
;
333 if (bfd_get_arch (abfd) == bfd_arch_tic54x)
334 {
335 PF (SEC_TIC54X_BLOCK, "BLOCK")if (abfd->flags & 0x40000000) {printf("%s%s", comma, "BLOCK"
); comma=", ";}
;
336 PF (SEC_TIC54X_CLINK, "CLINK")if (abfd->flags & 0x80000000) {printf("%s%s", comma, "CLINK"
); comma=", ";}
;
337 }
338 PF (SEC_SMALL_DATA, "SMALL_DATA")if (abfd->flags & 0x800000) {printf("%s%s", comma, "SMALL_DATA"
); comma=", ";}
;
339 if (bfd_get_flavour (abfd)((abfd)->xvec->flavour) == bfd_target_coff_flavour)
340 PF (SEC_COFF_SHARED, "SHARED")if (abfd->flags & 0x20000000) {printf("%s%s", comma, "SHARED"
); comma=", ";}
;
341 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL")if (abfd->flags & 0x400) {printf("%s%s", comma, "THREAD_LOCAL"
); comma=", ";}
;
342 PF (SEC_GROUP, "GROUP")if (abfd->flags & 0x4000000) {printf("%s%s", comma, "GROUP"
); comma=", ";}
;
343
344 if ((section->flags & SEC_LINK_ONCE0x20000) != 0)
345 {
346 const char *ls;
347 struct coff_comdat_info *comdat;
348
349 switch (section->flags & SEC_LINK_DUPLICATES0x40000)
350 {
351 default:
352 abort ();
353 case SEC_LINK_DUPLICATES_DISCARD0x0:
354 ls = "LINK_ONCE_DISCARD";
355 break;
356 case SEC_LINK_DUPLICATES_ONE_ONLY0x80000:
357 ls = "LINK_ONCE_ONE_ONLY";
358 break;
359 case SEC_LINK_DUPLICATES_SAME_SIZE0x100000:
360 ls = "LINK_ONCE_SAME_SIZE";
361 break;
362 case SEC_LINK_DUPLICATES_SAME_CONTENTS(0x80000 | 0x100000):
363 ls = "LINK_ONCE_SAME_CONTENTS";
364 break;
365 }
366 printf ("%s%s", comma, ls);
367
368 comdat = bfd_coff_get_comdat_section (abfd, section);
369 if (comdat != NULL((void*)0))
370 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
371
372 comma = ", ";
373 }
374
375 printf ("\n");
376#undef PF
377}
378
379static void
380dump_headers (bfd *abfd)
381{
382 printf (_("Sections:\n")("Sections:\n"));
383
384#ifndef BFD64
385 printf (_("Idx Name Size VMA LMA File off Algn")("Idx Name Size VMA LMA File off Algn"
)
);
386#else
387 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
388 if (bfd_get_arch_size (abfd) == 32)
389 printf (_("Idx Name Size VMA LMA File off Algn")("Idx Name Size VMA LMA File off Algn"
)
);
390 else
391 printf (_("Idx Name Size VMA LMA File off Algn")("Idx Name Size VMA LMA File off Algn"
)
);
392#endif
393
394 if (wide_output)
395 printf (_(" Flags")(" Flags"));
396 if (abfd->flags & HAS_LOAD_PAGE0x1000)
397 printf (_(" Pg")(" Pg"));
398 printf ("\n");
399
400 bfd_map_over_sections (abfd, dump_section_header, NULL((void*)0));
401}
402
403static asymbol **
404slurp_symtab (bfd *abfd)
405{
406 asymbol **sy = NULL((void*)0);
407 long storage;
408
409 if (!(bfd_get_file_flags (abfd)((abfd)->flags) & HAS_SYMS0x10))
410 {
411 symcount = 0;
412 return NULL((void*)0);
413 }
414
415 storage = bfd_get_symtab_upper_bound (abfd)((*((abfd)->xvec->_bfd_get_symtab_upper_bound)) (abfd));
416 if (storage < 0)
417 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
418 if (storage)
419 sy = xmalloc (storage);
420
421 symcount = bfd_canonicalize_symtab (abfd, sy)((*((abfd)->xvec->_bfd_canonicalize_symtab)) (abfd, sy)
)
;
422 if (symcount < 0)
423 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
424 return sy;
425}
426
427/* Read in the dynamic symbols. */
428
429static asymbol **
430slurp_dynamic_symtab (bfd *abfd)
431{
432 asymbol **sy = NULL((void*)0);
433 long storage;
434
435 storage = bfd_get_dynamic_symtab_upper_bound (abfd)((*((abfd)->xvec->_bfd_get_dynamic_symtab_upper_bound))
(abfd))
;
436 if (storage < 0)
437 {
438 if (!(bfd_get_file_flags (abfd)((abfd)->flags) & DYNAMIC0x40))
439 {
440 non_fatal (_("%s: not a dynamic object")("%s: not a dynamic object"), bfd_get_filename (abfd)((char *) (abfd)->filename));
441 dynsymcount = 0;
442 return NULL((void*)0);
443 }
444
445 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
446 }
447 if (storage)
448 sy = xmalloc (storage);
449
450 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy)((*((abfd)->xvec->_bfd_canonicalize_dynamic_symtab)) (abfd
, sy))
;
451 if (dynsymcount < 0)
452 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
453 return sy;
454}
455
456/* Filter out (in place) symbols that are useless for disassembly.
457 COUNT is the number of elements in SYMBOLS.
458 Return the number of useful symbols. */
459
460static long
461remove_useless_symbols (asymbol **symbols, long count)
462{
463 asymbol **in_ptr = symbols, **out_ptr = symbols;
464
465 while (--count >= 0)
466 {
467 asymbol *sym = *in_ptr++;
468
469 if (sym->name == NULL((void*)0) || sym->name[0] == '\0')
470 continue;
471 if (sym->flags & (BSF_DEBUGGING0x08 | BSF_SECTION_SYM0x100))
472 continue;
473 if (bfd_is_und_section (sym->section)((sym->section) == ((asection *) &bfd_und_section))
474 || bfd_is_com_section (sym->section)(((sym->section)->flags & 0x1000) != 0))
475 continue;
476
477 *out_ptr++ = sym;
478 }
479 return out_ptr - symbols;
480}
481
482/* Sort symbols into value order. */
483
484static int
485compare_symbols (const void *ap, const void *bp)
486{
487 const asymbol *a = * (const asymbol **) ap;
488 const asymbol *b = * (const asymbol **) bp;
489 const char *an;
490 const char *bn;
491 size_t anl;
492 size_t bnl;
493 bfd_boolean af;
494 bfd_boolean bf;
495 flagword aflags;
496 flagword bflags;
497
498 if (bfd_asymbol_value (a)(((a)->section->vma) + (a)->value) > bfd_asymbol_value (b)(((b)->section->vma) + (b)->value))
499 return 1;
500 else if (bfd_asymbol_value (a)(((a)->section->vma) + (a)->value) < bfd_asymbol_value (b)(((b)->section->vma) + (b)->value))
501 return -1;
502
503 if (a->section > b->section)
504 return 1;
505 else if (a->section < b->section)
506 return -1;
507
508 an = bfd_asymbol_name (a)((a)->name);
509 bn = bfd_asymbol_name (b)((b)->name);
510 anl = strlen (an);
511 bnl = strlen (bn);
512
513 /* The symbols gnu_compiled and gcc2_compiled convey no real
514 information, so put them after other symbols with the same value. */
515 af = (strstr (an, "gnu_compiled") != NULL((void*)0)
516 || strstr (an, "gcc2_compiled") != NULL((void*)0));
517 bf = (strstr (bn, "gnu_compiled") != NULL((void*)0)
518 || strstr (bn, "gcc2_compiled") != NULL((void*)0));
519
520 if (af && ! bf)
521 return 1;
522 if (! af && bf)
523 return -1;
524
525 /* We use a heuristic for the file name, to try to sort it after
526 more useful symbols. It may not work on non Unix systems, but it
527 doesn't really matter; the only difference is precisely which
528 symbol names get printed. */
529
530#define file_symbol(s, sn, snl)(((s)->flags & 0x4000) != 0 || ((sn)[(snl) - 2] == '.'
&& ((sn)[(snl) - 1] == 'o' || (sn)[(snl) - 1] == 'a'
)))
\
531 (((s)->flags & BSF_FILE0x4000) != 0 \
532 || ((sn)[(snl) - 2] == '.' \
533 && ((sn)[(snl) - 1] == 'o' \
534 || (sn)[(snl) - 1] == 'a')))
535
536 af = file_symbol (a, an, anl)(((a)->flags & 0x4000) != 0 || ((an)[(anl) - 2] == '.'
&& ((an)[(anl) - 1] == 'o' || (an)[(anl) - 1] == 'a'
)))
;
537 bf = file_symbol (b, bn, bnl)(((b)->flags & 0x4000) != 0 || ((bn)[(bnl) - 2] == '.'
&& ((bn)[(bnl) - 1] == 'o' || (bn)[(bnl) - 1] == 'a'
)))
;
538
539 if (af && ! bf)
540 return 1;
541 if (! af && bf)
542 return -1;
543
544 /* Try to sort global symbols before local symbols before function
545 symbols before debugging symbols. */
546
547 aflags = a->flags;
548 bflags = b->flags;
549
550 if ((aflags & BSF_DEBUGGING0x08) != (bflags & BSF_DEBUGGING0x08))
551 {
552 if ((aflags & BSF_DEBUGGING0x08) != 0)
553 return 1;
554 else
555 return -1;
556 }
557 if ((aflags & BSF_FUNCTION0x10) != (bflags & BSF_FUNCTION0x10))
558 {
559 if ((aflags & BSF_FUNCTION0x10) != 0)
560 return -1;
561 else
562 return 1;
563 }
564 if ((aflags & BSF_LOCAL0x01) != (bflags & BSF_LOCAL0x01))
565 {
566 if ((aflags & BSF_LOCAL0x01) != 0)
567 return 1;
568 else
569 return -1;
570 }
571 if ((aflags & BSF_GLOBAL0x02) != (bflags & BSF_GLOBAL0x02))
572 {
573 if ((aflags & BSF_GLOBAL0x02) != 0)
574 return -1;
575 else
576 return 1;
577 }
578
579 /* Symbols that start with '.' might be section names, so sort them
580 after symbols that don't start with '.'. */
581 if (an[0] == '.' && bn[0] != '.')
582 return 1;
583 if (an[0] != '.' && bn[0] == '.')
584 return -1;
585
586 /* Finally, if we can't distinguish them in any other way, try to
587 get consistent results by sorting the symbols by name. */
588 return strcmp (an, bn);
589}
590
591/* Sort relocs into address order. */
592
593static int
594compare_relocs (const void *ap, const void *bp)
595{
596 const arelent *a = * (const arelent **) ap;
597 const arelent *b = * (const arelent **) bp;
598
599 if (a->address > b->address)
600 return 1;
601 else if (a->address < b->address)
602 return -1;
603
604 /* So that associated relocations tied to the same address show up
605 in the correct order, we don't do any further sorting. */
606 if (a > b)
607 return 1;
608 else if (a < b)
609 return -1;
610 else
611 return 0;
612}
613
614/* Print an address (VMA) to the output stream in INFO.
615 If SKIP_ZEROES is TRUE, omit leading zeroes. */
616
617static void
618objdump_print_value (bfd_vma vma, struct disassemble_info *info,
619 bfd_boolean skip_zeroes)
620{
621 char buf[30];
622 char *p;
623 struct objdump_disasm_info *aux;
624
625 aux = (struct objdump_disasm_info *) info->application_data;
626 bfd_sprintf_vma (aux->abfd, buf, vma);
627 if (! skip_zeroes)
628 p = buf;
629 else
630 {
631 for (p = buf; *p == '0'; ++p)
632 ;
633 if (*p == '\0')
634 --p;
635 }
636 (*info->fprintf_func) (info->stream, "%s", p);
637}
638
639/* Print the name of a symbol. */
640
641static void
642objdump_print_symname (bfd *abfd, struct disassemble_info *info,
643 asymbol *sym)
644{
645 char *alloc;
646 const char *name;
647
648 alloc = NULL((void*)0);
649 name = bfd_asymbol_name (sym)((sym)->name);
650 if (do_demangle && name[0] != '\0')
651 {
652 /* Demangle the name. */
653 alloc = demangle (abfd, name);
654 name = alloc;
655 }
656
657 if (info != NULL((void*)0))
658 (*info->fprintf_func) (info->stream, "%s", name);
659 else
660 printf ("%s", name);
661
662 if (alloc != NULL((void*)0))
663 free (alloc);
664}
665
666/* Locate a symbol given a bfd and a section (from INFO->application_data),
667 and a VMA. If INFO->application_data->require_sec is TRUE, then always
668 require the symbol to be in the section. Returns NULL if there is no
669 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
670 of the symbol in sorted_syms. */
671
672static asymbol *
673find_symbol_for_address (bfd_vma vma,
674 struct disassemble_info *info,
675 long *place)
676{
677 /* @@ Would it speed things up to cache the last two symbols returned,
678 and maybe their address ranges? For many processors, only one memory
679 operand can be present at a time, so the 2-entry cache wouldn't be
680 constantly churned by code doing heavy memory accesses. */
681
682 /* Indices in `sorted_syms'. */
683 long min = 0;
684 long max = sorted_symcount;
685 long thisplace;
686 struct objdump_disasm_info *aux;
687 bfd *abfd;
688 asection *sec;
689 unsigned int opb;
690
691 if (sorted_symcount < 1)
692 return NULL((void*)0);
693
694 aux = (struct objdump_disasm_info *) info->application_data;
695 abfd = aux->abfd;
696 sec = aux->sec;
697 opb = bfd_octets_per_byte (abfd);
698
699 /* Perform a binary search looking for the closest symbol to the
700 required value. We are searching the range (min, max]. */
701 while (min + 1 < max)
702 {
703 asymbol *sym;
704
705 thisplace = (max + min) / 2;
706 sym = sorted_syms[thisplace];
707
708 if (bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) > vma)
709 max = thisplace;
710 else if (bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) < vma)
711 min = thisplace;
712 else
713 {
714 min = thisplace;
715 break;
716 }
717 }
718
719 /* The symbol we want is now in min, the low end of the range we
720 were searching. If there are several symbols with the same
721 value, we want the first one. */
722 thisplace = min;
723 while (thisplace > 0
724 && (bfd_asymbol_value (sorted_syms[thisplace])(((sorted_syms[thisplace])->section->vma) + (sorted_syms
[thisplace])->value)
725 == bfd_asymbol_value (sorted_syms[thisplace - 1])(((sorted_syms[thisplace - 1])->section->vma) + (sorted_syms
[thisplace - 1])->value)
))
726 --thisplace;
727
728 /* If the file is relocatable, and the symbol could be from this
729 section, prefer a symbol from this section over symbols from
730 others, even if the other symbol's value might be closer.
731
732 Note that this may be wrong for some symbol references if the
733 sections have overlapping memory ranges, but in that case there's
734 no way to tell what's desired without looking at the relocation
735 table. */
736 if (sorted_syms[thisplace]->section != sec
737 && (aux->require_sec
738 || ((abfd->flags & HAS_RELOC0x01) != 0
739 && vma >= bfd_get_section_vma (abfd, sec)((sec)->vma + 0)
740 && vma < (bfd_get_section_vma (abfd, sec)((sec)->vma + 0)
741 + bfd_section_size (abfd, sec)((sec)->size) / opb))))
742 {
743 long i;
744
745 for (i = thisplace + 1; i < sorted_symcount; i++)
746 {
747 if (bfd_asymbol_value (sorted_syms[i])(((sorted_syms[i])->section->vma) + (sorted_syms[i])->
value)
748 != bfd_asymbol_value (sorted_syms[thisplace])(((sorted_syms[thisplace])->section->vma) + (sorted_syms
[thisplace])->value)
)
749 break;
750 }
751
752 --i;
753
754 for (; i >= 0; i--)
755 {
756 if (sorted_syms[i]->section == sec
757 && (i == 0
758 || sorted_syms[i - 1]->section != sec
759 || (bfd_asymbol_value (sorted_syms[i])(((sorted_syms[i])->section->vma) + (sorted_syms[i])->
value)
760 != bfd_asymbol_value (sorted_syms[i - 1])(((sorted_syms[i - 1])->section->vma) + (sorted_syms[i -
1])->value)
)))
761 {
762 thisplace = i;
763 break;
764 }
765 }
766
767 if (sorted_syms[thisplace]->section != sec)
768 {
769 /* We didn't find a good symbol with a smaller value.
770 Look for one with a larger value. */
771 for (i = thisplace + 1; i < sorted_symcount; i++)
772 {
773 if (sorted_syms[i]->section == sec)
774 {
775 thisplace = i;
776 break;
777 }
778 }
779 }
780
781 if (sorted_syms[thisplace]->section != sec
782 && (aux->require_sec
783 || ((abfd->flags & HAS_RELOC0x01) != 0
784 && vma >= bfd_get_section_vma (abfd, sec)((sec)->vma + 0)
785 && vma < (bfd_get_section_vma (abfd, sec)((sec)->vma + 0)
786 + bfd_section_size (abfd, sec)((sec)->size)))))
787 /* There is no suitable symbol. */
788 return NULL((void*)0);
789 }
790
791 /* Give the target a chance to reject the symbol. */
792 while (! info->symbol_is_valid (sorted_syms [thisplace], info))
793 {
794 ++ thisplace;
795 if (thisplace >= sorted_symcount
796 || bfd_asymbol_value (sorted_syms [thisplace])(((sorted_syms [thisplace])->section->vma) + (sorted_syms
[thisplace])->value)
> vma)
797 return NULL((void*)0);
798 }
799
800 if (place != NULL((void*)0))
801 *place = thisplace;
802
803 return sorted_syms[thisplace];
804}
805
806/* Print an address and the offset to the nearest symbol. */
807
808static void
809objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
810 bfd_vma vma, struct disassemble_info *info,
811 bfd_boolean skip_zeroes)
812{
813 objdump_print_value (vma, info, skip_zeroes);
814
815 if (sym == NULL((void*)0))
816 {
817 bfd_vma secaddr;
818
819 (*info->fprintf_func) (info->stream, " <%s",
820 bfd_get_section_name (abfd, sec)((sec)->name + 0));
821 secaddr = bfd_get_section_vma (abfd, sec)((sec)->vma + 0);
822 if (vma < secaddr)
823 {
824 (*info->fprintf_func) (info->stream, "-0x");
825 objdump_print_value (secaddr - vma, info, TRUE1);
826 }
827 else if (vma > secaddr)
828 {
829 (*info->fprintf_func) (info->stream, "+0x");
830 objdump_print_value (vma - secaddr, info, TRUE1);
831 }
832 (*info->fprintf_func) (info->stream, ">");
833 }
834 else
835 {
836 (*info->fprintf_func) (info->stream, " <");
837 objdump_print_symname (abfd, info, sym);
838 if (bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) > vma)
839 {
840 (*info->fprintf_func) (info->stream, "-0x");
841 objdump_print_value (bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) - vma, info, TRUE1);
842 }
843 else if (vma > bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value))
844 {
845 (*info->fprintf_func) (info->stream, "+0x");
846 objdump_print_value (vma - bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value), info, TRUE1);
847 }
848 (*info->fprintf_func) (info->stream, ">");
849 }
850}
851
852/* Print an address (VMA), symbolically if possible.
853 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
854
855static void
856objdump_print_addr (bfd_vma vma,
857 struct disassemble_info *info,
858 bfd_boolean skip_zeroes)
859{
860 struct objdump_disasm_info *aux;
861 asymbol *sym = NULL((void*)0); /* Initialize to avoid compiler warning. */
862 bfd_boolean skip_find = FALSE0;
863
864 if (sorted_symcount < 1)
865 {
866 (*info->fprintf_func) (info->stream, "0x");
867 objdump_print_value (vma, info, skip_zeroes);
868 return;
869 }
870
871 aux = (struct objdump_disasm_info *) info->application_data;
872
873 if (aux->reloc != NULL((void*)0)
874 && aux->reloc->sym_ptr_ptr != NULL((void*)0)
875 && * aux->reloc->sym_ptr_ptr != NULL((void*)0))
876 {
877 sym = * aux->reloc->sym_ptr_ptr;
878
879 /* Adjust the vma to the reloc. */
880 vma += bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value);
881
882 if (bfd_is_und_section (bfd_get_section (sym))((((sym)->section)) == ((asection *) &bfd_und_section)
)
)
883 skip_find = TRUE1;
884 }
885
886 if (!skip_find)
887 sym = find_symbol_for_address (vma, info, NULL((void*)0));
888
889 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
890 skip_zeroes);
891}
892
893/* Print VMA to INFO. This function is passed to the disassembler
894 routine. */
895
896static void
897objdump_print_address (bfd_vma vma, struct disassemble_info *info)
898{
899 objdump_print_addr (vma, info, ! prefix_addresses);
900}
901
902/* Determine if the given address has a symbol associated with it. */
903
904static int
905objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * info)
906{
907 asymbol * sym;
908
909 sym = find_symbol_for_address (vma, info, NULL((void*)0));
910
911 return (sym != NULL((void*)0) && (bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) == vma));
912}
913
914/* Hold the last function name and the last line number we displayed
915 in a disassembly. */
916
917static char *prev_functionname;
918static unsigned int prev_line;
919
920/* We keep a list of all files that we have seen when doing a
921 disassembly with source, so that we know how much of the file to
922 display. This can be important for inlined functions. */
923
924struct print_file_list
925{
926 struct print_file_list *next;
927 const char *filename;
928 const char *modname;
929 unsigned int line;
930 FILE *f;
931};
932
933static struct print_file_list *print_files;
934
935/* The number of preceding context lines to show when we start
936 displaying a file for the first time. */
937
938#define SHOW_PRECEDING_CONTEXT_LINES(5) (5)
939
940/* Tries to open MODNAME, and if successful adds a node to print_files
941 linked list and returns that node. Returns NULL on failure. */
942
943static struct print_file_list *
944try_print_file_open (const char *origname, const char *modname)
945{
946 struct print_file_list *p;
947 FILE *f;
948
949 f = fopen (modname, "r");
950 if (f == NULL((void*)0))
951 return NULL((void*)0);
952
953 if (print_files != NULL((void*)0) && print_files->f != NULL((void*)0))
954 {
955 fclose (print_files->f);
956 print_files->f = NULL((void*)0);
957 }
958
959 p = xmalloc (sizeof (struct print_file_list));
960 p->filename = origname;
961 p->modname = modname;
962 p->line = 0;
963 p->f = f;
964 p->next = print_files;
965 print_files = p;
966 return p;
967}
968
969/* If the the source file, as described in the symtab, is not found
970 try to locate it in one of the paths specified with -I
971 If found, add location to print_files linked list. */
972
973static struct print_file_list *
974update_source_path (const char *filename)
975{
976 struct print_file_list *p;
977 const char *fname;
978 int i;
979
980 if (filename == NULL((void*)0))
981 return NULL((void*)0);
982
983 p = try_print_file_open (filename, filename);
984 if (p != NULL((void*)0))
985 return p;
986
987 if (include_path_count == 0)
988 return NULL((void*)0);
989
990 /* Get the name of the file. */
991 fname = strrchr (filename, '/');
992#ifdef HAVE_DOS_BASED_FILE_SYSTEM
993 {
994 /* We could have a mixed forward/back slash case. */
995 char *backslash = strrchr (filename, '\\');
996 if (fname == NULL((void*)0) || (backslash != NULL((void*)0) && backslash > fname))
997 fname = backslash;
998 if (fname == NULL((void*)0) && filename[0] != '\0' && filename[1] == ':')
999 fname = filename + 1;
1000 }
1001#endif
1002 if (fname == NULL((void*)0))
1003 fname = filename;
1004 else
1005 ++fname;
1006
1007 /* If file exists under a new path, we need to add it to the list
1008 so that show_line knows about it. */
1009 for (i = 0; i < include_path_count; i++)
1010 {
1011 char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1012
1013 p = try_print_file_open (filename, modname);
1014 if (p)
1015 return p;
1016
1017 free (modname);
1018 }
1019
1020 return NULL((void*)0);
1021}
1022
1023/* Skip ahead to a given line in a file, optionally printing each
1024 line. */
1025
1026static void
1027skip_to_line (struct print_file_list *p, unsigned int line,
1028 bfd_boolean show)
1029{
1030 while (p->line < line)
1031 {
1032 char buf[100];
1033
1034 if (fgets (buf, sizeof buf, p->f) == NULL((void*)0))
1035 {
1036 fclose (p->f);
1037 p->f = NULL((void*)0);
1038 break;
1039 }
1040
1041 if (show)
1042 printf ("%s", buf);
1043
1044 if (strchr (buf, '\n') != NULL((void*)0))
1045 ++p->line;
1046 }
1047}
1048
1049/* Show the line number, or the source line, in a disassembly
1050 listing. */
1051
1052static void
1053show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1054{
1055 const char *filename;
1056 const char *functionname;
1057 unsigned int line;
1058
1059 if (! with_line_numbers && ! with_source_code)
1060 return;
1061
1062 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,((*((abfd)->xvec->_bfd_find_nearest_line)) (abfd, section
, syms, addr_offset, &filename, &functionname, &line
))
1063 &functionname, &line)((*((abfd)->xvec->_bfd_find_nearest_line)) (abfd, section
, syms, addr_offset, &filename, &functionname, &line
))
)
1064 return;
1065
1066 if (filename != NULL((void*)0) && *filename == '\0')
1067 filename = NULL((void*)0);
1068 if (functionname != NULL((void*)0) && *functionname == '\0')
1069 functionname = NULL((void*)0);
1070
1071 if (with_line_numbers)
1072 {
1073 if (functionname != NULL((void*)0)
1074 && (prev_functionname == NULL((void*)0)
1075 || strcmp (functionname, prev_functionname) != 0))
1076 printf ("%s():\n", functionname);
1077 if (line > 0 && line != prev_line)
1078 printf ("%s:%u\n", filename == NULL((void*)0) ? "???" : filename, line);
1079 }
1080
1081 if (with_source_code
1082 && filename != NULL((void*)0)
1083 && line > 0)
1084 {
1085 struct print_file_list **pp, *p;
1086
1087 for (pp = &print_files; *pp != NULL((void*)0); pp = &(*pp)->next)
1088 if (strcmp ((*pp)->filename, filename) == 0)
1089 break;
1090 p = *pp;
1091
1092 if (p != NULL((void*)0))
1093 {
1094 if (p != print_files)
1095 {
1096 int l;
1097
1098 /* We have reencountered a file name which we saw
1099 earlier. This implies that either we are dumping out
1100 code from an included file, or the same file was
1101 linked in more than once. There are two common cases
1102 of an included file: inline functions in a header
1103 file, and a bison or flex skeleton file. In the
1104 former case we want to just start printing (but we
1105 back up a few lines to give context); in the latter
1106 case we want to continue from where we left off. I
1107 can't think of a good way to distinguish the cases,
1108 so I used a heuristic based on the file name. */
1109 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1110 l = p->line;
1111 else
1112 {
1113 l = line - SHOW_PRECEDING_CONTEXT_LINES(5);
1114 if (l < 0)
1115 l = 0;
1116 }
1117
1118 if (p->f == NULL((void*)0))
1119 {
1120 p->f = fopen (p->modname, "r");
1121 p->line = 0;
1122 }
1123 if (p->f != NULL((void*)0))
1124 skip_to_line (p, l, FALSE0);
1125
1126 if (print_files->f != NULL((void*)0))
1127 {
1128 fclose (print_files->f);
1129 print_files->f = NULL((void*)0);
1130 }
1131 }
1132
1133 if (p->f != NULL((void*)0))
1134 {
1135 skip_to_line (p, line, TRUE1);
1136 *pp = p->next;
1137 p->next = print_files;
1138 print_files = p;
1139 }
1140 }
1141 else
1142 {
1143 p = update_source_path (filename);
1144
1145 if (p != NULL((void*)0))
1146 {
1147 int l;
1148
1149 if (file_start_context)
1150 l = 0;
1151 else
1152 l = line - SHOW_PRECEDING_CONTEXT_LINES(5);
1153 if (l < 0)
1154 l = 0;
1155 skip_to_line (p, l, FALSE0);
1156 if (p->f != NULL((void*)0))
1157 skip_to_line (p, line, TRUE1);
1158 }
1159 }
1160 }
1161
1162 if (functionname != NULL((void*)0)
1163 && (prev_functionname == NULL((void*)0)
1164 || strcmp (functionname, prev_functionname) != 0))
1165 {
1166 if (prev_functionname != NULL((void*)0))
1167 free (prev_functionname);
1168 prev_functionname = xmalloc (strlen (functionname) + 1);
1169 strcpy (prev_functionname, functionname);
1170 }
1171
1172 if (line > 0 && line != prev_line)
1173 prev_line = line;
1174}
1175
1176/* Pseudo FILE object for strings. */
1177typedef struct
1178{
1179 char *buffer;
1180 size_t pos;
1181 size_t alloc;
1182} SFILE;
1183
1184/* sprintf to a "stream". */
1185
1186static int ATTRIBUTE_PRINTF_2__attribute__ ((__format__ (__printf__, 2, 3))) __attribute__
((__nonnull__ (2)))
1187objdump_sprintf (SFILE *f, const char *format, ...)
1188{
1189 size_t n;
1190 va_list args;
1191
1192 while (1)
1193 {
1194 size_t space = f->alloc - f->pos;
1195
1196 va_start (args, format)__builtin_va_start(args, format);
1197 n = vsnprintf (f->buffer + f->pos, space, format, args);
1198 va_end (args)__builtin_va_end(args);
1199
1200 if (space > n)
1201 break;
1202
1203 f->alloc = (f->alloc + n) * 2;
1204 f->buffer = xrealloc (f->buffer, f->alloc);
1205 }
1206 f->pos += n;
1207
1208 return n;
1209}
1210
1211/* Returns TRUE if the specified section should be dumped. */
1212
1213static bfd_boolean
1214process_section_p (asection * section)
1215{
1216 size_t i;
1217
1218 if (only == NULL((void*)0))
1219 return TRUE1;
1220
1221 for (i = 0; i < only_used; i++)
1222 if (strcmp (only [i], section->name) == 0)
1223 return TRUE1;
1224
1225 return FALSE0;
1226}
1227
1228
1229/* The number of zeroes we want to see before we start skipping them.
1230 The number is arbitrarily chosen. */
1231
1232#define DEFAULT_SKIP_ZEROES8 8
1233
1234/* The number of zeroes to skip at the end of a section. If the
1235 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1236 SKIP_ZEROES, they will be disassembled. If there are fewer than
1237 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1238 attempt to avoid disassembling zeroes inserted by section
1239 alignment. */
1240
1241#define DEFAULT_SKIP_ZEROES_AT_END3 3
1242
1243/* Disassemble some data in memory between given values. */
1244
1245static void
1246disassemble_bytes (struct disassemble_info * info,
1247 disassembler_ftype disassemble_fn,
1248 bfd_boolean insns,
1249 bfd_byte * data,
1250 bfd_vma start_offset,
1251 bfd_vma stop_offset,
1252 bfd_vma rel_offset,
1253 arelent *** relppp,
1254 arelent ** relppend)
1255{
1256 struct objdump_disasm_info *aux;
1257 asection *section;
1258 int octets_per_line;
1259 bfd_boolean done_dot;
1260 int skip_addr_chars;
1261 bfd_vma addr_offset;
1262 unsigned int opb = info->octets_per_byte;
1263 unsigned int skip_zeroes = info->skip_zeroes;
1264 unsigned int skip_zeroes_at_end = info->skip_zeroes_at_end;
1265 int octets = opb;
1266 SFILE sfile;
1267
1268 aux = (struct objdump_disasm_info *) info->application_data;
1269 section = aux->sec;
1270
1271 sfile.alloc = 120;
1272 sfile.buffer = xmalloc (sfile.alloc);
1273 sfile.pos = 0;
1274
1275 if (insns)
1276 octets_per_line = 4;
1277 else
1278 octets_per_line = 16;
1279
1280 /* Figure out how many characters to skip at the start of an
1281 address, to make the disassembly look nicer. We discard leading
1282 zeroes in chunks of 4, ensuring that there is always a leading
1283 zero remaining. */
1284 skip_addr_chars = 0;
1285 if (! prefix_addresses)
1286 {
1287 char buf[30];
1288 char *s;
1289
1290 bfd_sprintf_vma
1291 (aux->abfd, buf,
1292 (section->vma
1293 + bfd_section_size (section->owner, section)((section)->size) / opb));
1294 s = buf;
1295 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1296 && s[4] == '0')
1297 {
1298 skip_addr_chars += 4;
1299 s += 4;
1300 }
1301 }
1302
1303 info->insn_info_valid = 0;
1304
1305 done_dot = FALSE0;
Value stored to 'done_dot' is never read
1306 addr_offset = start_offset;
1307 while (addr_offset < stop_offset)
1308 {
1309 bfd_vma z;
1310 bfd_boolean need_nl = FALSE0;
1311 int previous_octets;
1312
1313 /* Remember the length of the previous instruction. */
1314 previous_octets = octets;
1315 octets = 0;
1316
1317 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1318 print `...'. */
1319 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1320 if (data[z] != 0)
1321 break;
1322 if (! disassemble_zeroes
1323 && (info->insn_info_valid == 0
1324 || info->branch_delay_insns == 0)
1325 && (z - addr_offset * opb >= skip_zeroes
1326 || (z == stop_offset * opb &&
1327 z - addr_offset * opb < skip_zeroes_at_end)))
1328 {
1329 printf ("\t...\n");
1330
1331 /* If there are more nonzero octets to follow, we only skip
1332 zeroes in multiples of 4, to try to avoid running over
1333 the start of an instruction which happens to start with
1334 zero. */
1335 if (z != stop_offset * opb)
1336 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1337
1338 octets = z - addr_offset * opb;
1339 }
1340 else
1341 {
1342 char buf[50];
1343 int bpc = 0;
1344 int pb = 0;
1345
1346 done_dot = FALSE0;
1347
1348 if (with_line_numbers || with_source_code)
1349 show_line (aux->abfd, section, addr_offset);
1350
1351 if (! prefix_addresses)
1352 {
1353 char *s;
1354
1355 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1356 for (s = buf + skip_addr_chars; *s == '0'; s++)
1357 *s = ' ';
1358 if (*s == '\0')
1359 *--s = '0';
1360 printf ("%s:\t", buf + skip_addr_chars);
1361 }
1362 else
1363 {
1364 aux->require_sec = TRUE1;
1365 objdump_print_address (section->vma + addr_offset, info);
1366 aux->require_sec = FALSE0;
1367 putchar (' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', (
&__sF[1])))
;
1368 }
1369
1370 if (insns)
1371 {
1372 sfile.pos = 0;
1373 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1374 info->stream = &sfile;
1375 info->bytes_per_line = 0;
1376 info->bytes_per_chunk = 0;
1377 info->flags = 0;
1378
1379 if (info->disassembler_needs_relocs
1380 && *relppp < relppend)
1381 {
1382 bfd_signed_vma distance_to_rel;
1383
1384 distance_to_rel = (**relppp)->address
1385 - (rel_offset + addr_offset);
1386
1387 /* Check to see if the current reloc is associated with
1388 the instruction that we are about to disassemble. */
1389 if (distance_to_rel == 0
1390 /* FIXME: This is wrong. We are trying to catch
1391 relocs that are addressed part way through the
1392 current instruction, as might happen with a packed
1393 VLIW instruction. Unfortunately we do not know the
1394 length of the current instruction since we have not
1395 disassembled it yet. Instead we take a guess based
1396 upon the length of the previous instruction. The
1397 proper solution is to have a new target-specific
1398 disassembler function which just returns the length
1399 of an instruction at a given address without trying
1400 to display its disassembly. */
1401 || (distance_to_rel > 0
1402 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1403 {
1404 info->flags = INSN_HAS_RELOC0x80000000;
1405 aux->reloc = **relppp;
1406 }
1407 else
1408 aux->reloc = NULL((void*)0);
1409 }
1410
1411 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1412 info->fprintf_func = (fprintf_ftype) fprintf;
1413 info->stream = stdout(&__sF[1]);
1414 if (info->bytes_per_line != 0)
1415 octets_per_line = info->bytes_per_line;
1416 if (octets < 0)
1417 {
1418 if (sfile.pos)
1419 printf ("%s\n", sfile.buffer);
1420 break;
1421 }
1422 }
1423 else
1424 {
1425 bfd_vma j;
1426
1427 octets = octets_per_line;
1428 if (addr_offset + octets / opb > stop_offset)
1429 octets = (stop_offset - addr_offset) * opb;
1430
1431 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1432 {
1433 if (ISPRINT (data[j])(_sch_istable[(data[j]) & 0xff] & (unsigned short)(_sch_isprint
))
)
1434 buf[j - addr_offset * opb] = data[j];
1435 else
1436 buf[j - addr_offset * opb] = '.';
1437 }
1438 buf[j - addr_offset * opb] = '\0';
1439 }
1440
1441 if (prefix_addresses
1442 ? show_raw_insn > 0
1443 : show_raw_insn >= 0)
1444 {
1445 bfd_vma j;
1446
1447 /* If ! prefix_addresses and ! wide_output, we print
1448 octets_per_line octets per line. */
1449 pb = octets;
1450 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1451 pb = octets_per_line;
1452
1453 if (info->bytes_per_chunk)
1454 bpc = info->bytes_per_chunk;
1455 else
1456 bpc = 1;
1457
1458 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1459 {
1460 int k;
1461
1462 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1463 {
1464 for (k = bpc - 1; k >= 0; k--)
1465 printf ("%02x", (unsigned) data[j + k]);
1466 putchar (' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', (
&__sF[1])))
;
1467 }
1468 else
1469 {
1470 for (k = 0; k < bpc; k++)
1471 printf ("%02x", (unsigned) data[j + k]);
1472 putchar (' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', (
&__sF[1])))
;
1473 }
1474 }
1475
1476 for (; pb < octets_per_line; pb += bpc)
1477 {
1478 int k;
1479
1480 for (k = 0; k < bpc; k++)
1481 printf (" ");
1482 putchar (' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', (
&__sF[1])))
;
1483 }
1484
1485 /* Separate raw data from instruction by extra space. */
1486 if (insns)
1487 putchar ('\t')(!__isthreaded ? __sputc('\t', (&__sF[1])) : (putc)('\t',
(&__sF[1])))
;
1488 else
1489 printf (" ");
1490 }
1491
1492 if (! insns)
1493 printf ("%s", buf);
1494 else if (sfile.pos)
1495 printf ("%s", sfile.buffer);
1496
1497 if (prefix_addresses
1498 ? show_raw_insn > 0
1499 : show_raw_insn >= 0)
1500 {
1501 while (pb < octets)
1502 {
1503 bfd_vma j;
1504 char *s;
1505
1506 putchar ('\n')(!__isthreaded ? __sputc('\n', (&__sF[1])) : (putc)('\n',
(&__sF[1])))
;
1507 j = addr_offset * opb + pb;
1508
1509 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1510 for (s = buf + skip_addr_chars; *s == '0'; s++)
1511 *s = ' ';
1512 if (*s == '\0')
1513 *--s = '0';
1514 printf ("%s:\t", buf + skip_addr_chars);
1515
1516 pb += octets_per_line;
1517 if (pb > octets)
1518 pb = octets;
1519 for (; j < addr_offset * opb + pb; j += bpc)
1520 {
1521 int k;
1522
1523 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1524 {
1525 for (k = bpc - 1; k >= 0; k--)
1526 printf ("%02x", (unsigned) data[j + k]);
1527 putchar (' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', (
&__sF[1])))
;
1528 }
1529 else
1530 {
1531 for (k = 0; k < bpc; k++)
1532 printf ("%02x", (unsigned) data[j + k]);
1533 putchar (' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', (
&__sF[1])))
;
1534 }
1535 }
1536 }
1537 }
1538
1539 if (!wide_output)
1540 putchar ('\n')(!__isthreaded ? __sputc('\n', (&__sF[1])) : (putc)('\n',
(&__sF[1])))
;
1541 else
1542 need_nl = TRUE1;
1543 }
1544
1545 while ((*relppp) < relppend
1546 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1547 {
1548 if (dump_reloc_info || dump_dynamic_reloc_info)
1549 {
1550 arelent *q;
1551
1552 q = **relppp;
1553
1554 if (wide_output)
1555 putchar ('\t')(!__isthreaded ? __sputc('\t', (&__sF[1])) : (putc)('\t',
(&__sF[1])))
;
1556 else
1557 printf ("\t\t\t");
1558
1559 objdump_print_value (section->vma - rel_offset + q->address,
1560 info, TRUE1);
1561
1562 if (q->howto == NULL((void*)0))
1563 printf (": *unknown*\t");
1564 else if (q->howto->name)
1565 printf (": %s\t", q->howto->name);
1566 else
1567 printf (": %d\t", q->howto->type);
1568
1569 if (q->sym_ptr_ptr == NULL((void*)0) || *q->sym_ptr_ptr == NULL((void*)0))
1570 printf ("*unknown*");
1571 else
1572 {
1573 const char *sym_name;
1574
1575 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr)((*q->sym_ptr_ptr)->name);
1576 if (sym_name != NULL((void*)0) && *sym_name != '\0')
1577 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1578 else
1579 {
1580 asection *sym_sec;
1581
1582 sym_sec = bfd_get_section (*q->sym_ptr_ptr)((*q->sym_ptr_ptr)->section);
1583 sym_name = bfd_get_section_name (aux->abfd, sym_sec)((sym_sec)->name + 0);
1584 if (sym_name == NULL((void*)0) || *sym_name == '\0')
1585 sym_name = "*unknown*";
1586 printf ("%s", sym_name);
1587 }
1588 }
1589
1590 if (q->addend)
1591 {
1592 printf ("+0x");
1593 objdump_print_value (q->addend, info, TRUE1);
1594 }
1595
1596 printf ("\n");
1597 need_nl = FALSE0;
1598 }
1599 ++(*relppp);
1600 }
1601
1602 if (need_nl)
1603 printf ("\n");
1604
1605 addr_offset += octets / opb;
1606 }
1607
1608 free (sfile.buffer);
1609}
1610
1611static void
1612disassemble_section (bfd *abfd, asection *section, void *info)
1613{
1614 struct disassemble_info * pinfo = (struct disassemble_info *) info;
1615 struct objdump_disasm_info * paux;
1616 unsigned int opb = pinfo->octets_per_byte;
1617 bfd_byte * data = NULL((void*)0);
1618 bfd_size_type datasize = 0;
1619 arelent ** rel_pp = NULL((void*)0);
1620 arelent ** rel_ppstart = NULL((void*)0);
1621 arelent ** rel_ppend;
1622 unsigned long stop_offset;
1623 asymbol * sym = NULL((void*)0);
1624 long place = 0;
1625 long rel_count;
1626 bfd_vma rel_offset;
1627 unsigned long addr_offset;
1628
1629 /* Sections that do not contain machine
1630 code are not normally disassembled. */
1631 if (! disassemble_all
1632 && only == NULL((void*)0)
1633 && ((section->flags & (SEC_CODE0x010 | SEC_HAS_CONTENTS0x100))
1634 != (SEC_CODE0x010 | SEC_HAS_CONTENTS0x100)))
1635 return;
1636
1637 if (! process_section_p (section))
1638 return;
1639
1640 datasize = bfd_get_section_size (section)((section)->size);
1641 if (datasize == 0)
1642 return;
1643
1644 /* Decide which set of relocs to use. Load them if necessary. */
1645 paux = (struct objdump_disasm_info *) pinfo->application_data;
1646 if (paux->dynrelbuf)
1647 {
1648 rel_pp = paux->dynrelbuf;
1649 rel_count = paux->dynrelcount;
1650 /* Dynamic reloc addresses are absolute, non-dynamic are section
1651 relative. REL_OFFSET specifies the reloc address corresponding
1652 to the start of this section. */
1653 rel_offset = section->vma;
1654 }
1655 else
1656 {
1657 rel_count = 0;
1658 rel_pp = NULL((void*)0);
1659 rel_offset = 0;
1660
1661 if ((section->flags & SEC_RELOC0x004) != 0
1662 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1663 {
1664 long relsize;
1665
1666 relsize = bfd_get_reloc_upper_bound (abfd, section);
1667 if (relsize < 0)
1668 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
1669
1670 if (relsize > 0)
1671 {
1672 rel_ppstart = rel_pp = xmalloc (relsize);
1673 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1674 if (rel_count < 0)
1675 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
1676
1677 /* Sort the relocs by address. */
1678 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1679 }
1680 }
1681
1682 }
1683 rel_ppend = rel_pp + rel_count;
1684
1685 data = xmalloc (datasize);
1686
1687 bfd_get_section_contents (abfd, section, data, 0, datasize);
1688
1689 paux->sec = section;
1690 pinfo->buffer = data;
1691 pinfo->buffer_vma = section->vma;
1692 pinfo->buffer_length = datasize;
1693 pinfo->section = section;
1694
1695 if (start_address == (bfd_vma) -1
1696 || start_address < pinfo->buffer_vma)
1697 addr_offset = 0;
1698 else
1699 addr_offset = start_address - pinfo->buffer_vma;
1700
1701 if (stop_address == (bfd_vma) -1)
1702 stop_offset = datasize / opb;
1703 else
1704 {
1705 if (stop_address < pinfo->buffer_vma)
1706 stop_offset = 0;
1707 else
1708 stop_offset = stop_address - pinfo->buffer_vma;
1709 if (stop_offset > pinfo->buffer_length / opb)
1710 stop_offset = pinfo->buffer_length / opb;
1711 }
1712
1713 /* Skip over the relocs belonging to addresses below the
1714 start address. */
1715 while (rel_pp < rel_ppend
1716 && (*rel_pp)->address < rel_offset + addr_offset)
1717 ++rel_pp;
1718
1719 printf (_("Disassembly of section %s:\n")("Disassembly of section %s:\n"), section->name);
1720
1721 /* Find the nearest symbol forwards from our current position. */
1722 paux->require_sec = TRUE1;
1723 sym = find_symbol_for_address (section->vma + addr_offset, info, &place);
1724 paux->require_sec = FALSE0;
1725
1726 /* Disassemble a block of instructions up to the address associated with
1727 the symbol we have just found. Then print the symbol and find the
1728 next symbol on. Repeat until we have disassembled the entire section
1729 or we have reached the end of the address range we are interested in. */
1730 while (addr_offset < stop_offset)
1731 {
1732 bfd_vma addr;
1733 asymbol *nextsym;
1734 unsigned long nextstop_offset;
1735 bfd_boolean insns;
1736
1737 addr = section->vma + addr_offset;
1738
1739 if (sym != NULL((void*)0) && bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) <= addr)
1740 {
1741 int x;
1742
1743 for (x = place;
1744 (x < sorted_symcount
1745 && (bfd_asymbol_value (sorted_syms[x])(((sorted_syms[x])->section->vma) + (sorted_syms[x])->
value)
<= addr));
1746 ++x)
1747 continue;
1748
1749 pinfo->symbols = sorted_syms + place;
1750 pinfo->num_symbols = x - place;
1751 }
1752 else
1753 {
1754 pinfo->symbols = NULL((void*)0);
1755 pinfo->num_symbols = 0;
1756 }
1757
1758 if (! prefix_addresses)
1759 {
1760 pinfo->fprintf_func (pinfo->stream, "\n");
1761 objdump_print_addr_with_sym (abfd, section, sym, addr,
1762 pinfo, FALSE0);
1763 pinfo->fprintf_func (pinfo->stream, ":\n");
1764 }
1765
1766 if (sym != NULL((void*)0) && bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) > addr)
1767 nextsym = sym;
1768 else if (sym == NULL((void*)0))
1769 nextsym = NULL((void*)0);
1770 else
1771 {
1772#define is_valid_next_sym(SYM)((SYM)->section == section && ((((SYM)->section
->vma) + (SYM)->value) > (((sym)->section->vma
) + (sym)->value)) && pinfo->symbol_is_valid (SYM
, pinfo))
\
1773 ((SYM)->section == section \
1774 && (bfd_asymbol_value (SYM)(((SYM)->section->vma) + (SYM)->value) > bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value)) \
1775 && pinfo->symbol_is_valid (SYM, pinfo))
1776
1777 /* Search forward for the next appropriate symbol in
1778 SECTION. Note that all the symbols are sorted
1779 together into one big array, and that some sections
1780 may have overlapping addresses. */
1781 while (place < sorted_symcount
1782 && ! is_valid_next_sym (sorted_syms [place])((sorted_syms [place])->section == section && ((((
sorted_syms [place])->section->vma) + (sorted_syms [place
])->value) > (((sym)->section->vma) + (sym)->value
)) && pinfo->symbol_is_valid (sorted_syms [place],
pinfo))
)
1783 ++place;
1784
1785 if (place >= sorted_symcount)
1786 nextsym = NULL((void*)0);
1787 else
1788 nextsym = sorted_syms[place];
1789 }
1790
1791 if (sym != NULL((void*)0) && bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) > addr)
1792 nextstop_offset = bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) - section->vma;
1793 else if (nextsym == NULL((void*)0))
1794 nextstop_offset = stop_offset;
1795 else
1796 nextstop_offset = bfd_asymbol_value (nextsym)(((nextsym)->section->vma) + (nextsym)->value) - section->vma;
1797
1798 if (nextstop_offset > stop_offset)
1799 nextstop_offset = stop_offset;
1800
1801 /* If a symbol is explicitly marked as being an object
1802 rather than a function, just dump the bytes without
1803 disassembling them. */
1804 if (disassemble_all
1805 || sym == NULL((void*)0)
1806 || bfd_asymbol_value (sym)(((sym)->section->vma) + (sym)->value) > addr
1807 || ((sym->flags & BSF_OBJECT0x10000) == 0
1808 && (strstr (bfd_asymbol_name (sym)((sym)->name), "gnu_compiled")
1809 == NULL((void*)0))
1810 && (strstr (bfd_asymbol_name (sym)((sym)->name), "gcc2_compiled")
1811 == NULL((void*)0)))
1812 || (sym->flags & BSF_FUNCTION0x10) != 0)
1813 insns = TRUE1;
1814 else
1815 insns = FALSE0;
1816
1817 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
1818 addr_offset, nextstop_offset,
1819 rel_offset, &rel_pp, rel_ppend);
1820
1821 addr_offset = nextstop_offset;
1822 sym = nextsym;
1823 }
1824
1825 free (data);
1826
1827 if (rel_ppstart != NULL((void*)0))
1828 free (rel_ppstart);
1829}
1830
1831/* Disassemble the contents of an object file. */
1832
1833static void
1834disassemble_data (bfd *abfd)
1835{
1836 struct disassemble_info disasm_info;
1837 struct objdump_disasm_info aux;
1838 long i;
1839
1840 print_files = NULL((void*)0);
1841 prev_functionname = NULL((void*)0);
1842 prev_line = -1;
1843
1844 /* We make a copy of syms to sort. We don't want to sort syms
1845 because that will screw up the relocs. */
1846 sorted_symcount = symcount ? symcount : dynsymcount;
1847 sorted_syms = xmalloc ((sorted_symcount + synthcount) * sizeof (asymbol *));
1848 memcpy (sorted_syms, symcount ? syms : dynsyms,
1849 sorted_symcount * sizeof (asymbol *));
1850
1851 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
1852
1853 for (i = 0; i < synthcount; ++i)
1854 {
1855 sorted_syms[sorted_symcount] = synthsyms + i;
1856 ++sorted_symcount;
1857 }
1858
1859 /* Sort the symbols into section and symbol order. */
1860 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1861
1862 init_disassemble_info (&disasm_info, stdout(&__sF[1]), (fprintf_ftype) fprintf);
1863
1864 disasm_info.application_data = (void *) &aux;
1865 aux.abfd = abfd;
1866 aux.require_sec = FALSE0;
1867 aux.dynrelbuf = NULL((void*)0);
1868 aux.dynrelcount = 0;
1869 aux.reloc = NULL((void*)0);
1870
1871 disasm_info.print_address_func = objdump_print_address;
1872 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1873
1874 if (machine != NULL((void*)0))
1875 {
1876 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1877
1878 if (info == NULL((void*)0))
1879 fatal (_("Can't use supplied machine %s")("Can't use supplied machine %s"), machine);
1880
1881 abfd->arch_info = info;
1882 }
1883
1884 if (endian != BFD_ENDIAN_UNKNOWN)
1885 {
1886 struct bfd_target *xvec;
1887
1888 xvec = xmalloc (sizeof (struct bfd_target));
1889 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1890 xvec->byteorder = endian;
1891 abfd->xvec = xvec;
1892 }
1893
1894 /* Use libopcodes to locate a suitable disassembler. */
1895 aux.disassemble_fn = disassembler (abfd);
1896 if (!aux.disassemble_fn)
1897 {
1898 non_fatal (_("Can't disassemble for architecture %s\n")("Can't disassemble for architecture %s\n"),
1899 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1900 exit_status = 1;
1901 return;
1902 }
1903
1904 disasm_info.flavour = bfd_get_flavour (abfd)((abfd)->xvec->flavour);
1905 disasm_info.arch = bfd_get_arch (abfd);
1906 disasm_info.mach = bfd_get_mach (abfd);
1907 disasm_info.disassembler_options = disassembler_options;
1908 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
1909 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES8;
1910 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END3;
1911 disasm_info.disassembler_needs_relocs = FALSE0;
1912
1913 if (bfd_big_endian (abfd)((abfd)->xvec->byteorder == BFD_ENDIAN_BIG))
1914 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1915 else if (bfd_little_endian (abfd)((abfd)->xvec->byteorder == BFD_ENDIAN_LITTLE))
1916 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1917 else
1918 /* ??? Aborting here seems too drastic. We could default to big or little
1919 instead. */
1920 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1921
1922 /* Allow the target to customize the info structure. */
1923 disassemble_init_for_target (& disasm_info);
1924
1925 /* Pre-load the dynamic relocs if we are going
1926 to be dumping them along with the disassembly. */
1927 if (dump_dynamic_reloc_info)
1928 {
1929 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd)((*((abfd)->xvec->_bfd_get_dynamic_reloc_upper_bound)) (
abfd))
;
1930
1931 if (relsize < 0)
1932 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
1933
1934 if (relsize > 0)
1935 {
1936 aux.dynrelbuf = xmalloc (relsize);
1937 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,((*((abfd)->xvec->_bfd_canonicalize_dynamic_reloc)) (abfd
, aux.dynrelbuf, dynsyms))
1938 aux.dynrelbuf,((*((abfd)->xvec->_bfd_canonicalize_dynamic_reloc)) (abfd
, aux.dynrelbuf, dynsyms))
1939 dynsyms)((*((abfd)->xvec->_bfd_canonicalize_dynamic_reloc)) (abfd
, aux.dynrelbuf, dynsyms))
;
1940 if (aux.dynrelcount < 0)
1941 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
1942
1943 /* Sort the relocs by address. */
1944 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
1945 compare_relocs);
1946 }
1947 }
1948
1949 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
1950
1951 if (aux.dynrelbuf != NULL((void*)0))
1952 free (aux.dynrelbuf);
1953 free (sorted_syms);
1954}
1955
1956int
1957load_debug_section (enum dwarf_section_display_enum debug, void *file)
1958{
1959 struct dwarf_section *section = &debug_displays [debug].section;
1960 bfd *abfd = file;
1961 asection *sec;
1962 bfd_boolean ret;
1963
1964 /* If it is already loaded, do nothing. */
1965 if (section->start != NULL((void*)0))
1966 return 1;
1967
1968 /* Locate the debug section. */
1969 sec = bfd_get_section_by_name (abfd, section->name);
1970 if (sec == NULL((void*)0))
1971 return 0;
1972
1973 section->address = bfd_get_section_vma (abfd, sec)((sec)->vma + 0);
1974 section->size = bfd_get_section_size (sec)((sec)->size);
1975 section->start = xmalloc (section->size);
1976
1977 if (is_relocatable && debug_displays [debug].relocate)
1978 ret = bfd_simple_get_relocated_section_contents (abfd,
1979 sec,
1980 section->start,
1981 syms) != NULL((void*)0);
1982 else
1983 ret = bfd_get_section_contents (abfd, sec, section->start, 0,
1984 section->size);
1985
1986 if (!ret)
1987 {
1988 free_debug_section (debug);
1989 printf (_("\nCan't get contents for section '%s'.\n")("\nCan't get contents for section '%s'.\n"),
1990 section->name);
1991 }
1992
1993 return ret;
1994}
1995
1996void
1997free_debug_section (enum dwarf_section_display_enum debug)
1998{
1999 struct dwarf_section *section = &debug_displays [debug].section;
2000
2001 if (section->start == NULL((void*)0))
2002 return;
2003
2004 free ((char *) section->start);
2005 section->start = NULL((void*)0);
2006 section->address = 0;
2007 section->size = 0;
2008}
2009
2010static void
2011dump_dwarf_section (bfd *abfd, asection *section,
2012 void *arg ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
2013{
2014 const char *name = bfd_get_section_name (abfd, section)((section)->name + 0);
2015 const char *match;
2016 enum dwarf_section_display_enum i;
2017
2018 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
2019 match = ".debug_info";
2020 else
2021 match = name;
2022
2023 for (i = 0; i < max; i++)
2024 if (strcmp (debug_displays[i].section.name, match) == 0)
2025 {
2026 if (!debug_displays[i].eh_frame)
2027 {
2028 struct dwarf_section *sec = &debug_displays [i].section;
2029
2030 if (load_debug_section (i, abfd))
2031 {
2032 debug_displays[i].display (sec, abfd);
2033
2034 if (i != info && i != abbrev)
2035 free_debug_section (i);
2036 }
2037 }
2038 break;
2039 }
2040}
2041
2042static const char *mach_o_dwarf_sections [] = {
2043 "LC_SEGMENT.__DWARFA.__debug_abbrev", /* .debug_abbrev */
2044 "LC_SEGMENT.__DWARFA.__debug_aranges", /* .debug_aranges */
2045 "LC_SEGMENT.__DWARFA.__debug_frame", /* .debug_frame */
2046 "LC_SEGMENT.__DWARFA.__debug_info", /* .debug_info */
2047 "LC_SEGMENT.__DWARFA.__debug_line", /* .debug_line */
2048 "LC_SEGMENT.__DWARFA.__debug_pubnames", /* .debug_pubnames */
2049 ".eh_frame", /* .eh_frame */
2050 "LC_SEGMENT.__DWARFA.__debug_macinfo", /* .debug_macinfo */
2051 "LC_SEGMENT.__DWARFA.__debug_str", /* .debug_str */
2052 "LC_SEGMENT.__DWARFA.__debug_loc", /* .debug_loc */
2053 "LC_SEGMENT.__DWARFA.__debug_pubtypes", /* .debug_pubtypes */
2054 "LC_SEGMENT.__DWARFA.__debug_ranges", /* .debug_ranges */
2055 "LC_SEGMENT.__DWARFA.__debug_static_func", /* .debug_static_func */
2056 "LC_SEGMENT.__DWARFA.__debug_static_vars", /* .debug_static_vars */
2057 "LC_SEGMENT.__DWARFA.__debug_types", /* .debug_types */
2058 "LC_SEGMENT.__DWARFA.__debug_weaknames" /* .debug_weaknames */
2059};
2060
2061static const char *generic_dwarf_sections [max];
2062
2063static void
2064check_mach_o_dwarf (bfd *abfd)
2065{
2066 static enum bfd_flavour old_flavour = bfd_target_unknown_flavour;
2067 enum bfd_flavour current_flavour = bfd_get_flavour (abfd)((abfd)->xvec->flavour);
2068 enum dwarf_section_display_enum i;
2069
2070 if (generic_dwarf_sections [0] == NULL((void*)0))
2071 for (i = 0; i < max; i++)
2072 generic_dwarf_sections [i] = debug_displays[i].section.name;
2073
2074 if (old_flavour != current_flavour)
2075 {
2076 if (current_flavour == bfd_target_mach_o_flavour)
2077 for (i = 0; i < max; i++)
2078 debug_displays[i].section.name = mach_o_dwarf_sections [i];
2079 else if (old_flavour == bfd_target_mach_o_flavour)
2080 for (i = 0; i < max; i++)
2081 debug_displays[i].section.name = generic_dwarf_sections [i];
2082
2083 old_flavour = current_flavour;
2084 }
2085}
2086
2087/* Dump the dwarf debugging information. */
2088
2089static void
2090dump_dwarf (bfd *abfd)
2091{
2092 is_relocatable = ((abfd->flags & (HAS_RELOC0x01 | EXEC_P0x02 | DYNAMIC0x40))
2093 == HAS_RELOC0x01);
2094
2095 /* FIXME: bfd_get_arch_size may return -1. We assume that 64bit
2096 targets will return 64. */
2097 eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
2098
2099 if (bfd_big_endian (abfd)((abfd)->xvec->byteorder == BFD_ENDIAN_BIG))
2100 byte_get = byte_get_big_endian;
2101 else if (bfd_little_endian (abfd)((abfd)->xvec->byteorder == BFD_ENDIAN_LITTLE))
2102 byte_get = byte_get_little_endian;
2103 else
2104 abort ();
2105
2106 check_mach_o_dwarf (abfd);
2107
2108 bfd_map_over_sections (abfd, dump_dwarf_section, NULL((void*)0));
2109
2110 free_debug_memory ();
2111}
2112
2113/* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2114 it. Return NULL on failure. */
2115
2116static char *
2117read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2118{
2119 asection *stabsect;
2120 bfd_size_type size;
2121 char *contents;
2122
2123 stabsect = bfd_get_section_by_name (abfd, sect_name);
2124 if (stabsect == NULL((void*)0))
2125 {
2126 printf (_("No %s section present\n\n")("No %s section present\n\n"), sect_name);
2127 return FALSE0;
2128 }
2129
2130 size = bfd_section_size (abfd, stabsect)((stabsect)->size);
2131 contents = xmalloc (size);
2132
2133 if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2134 {
2135 non_fatal (_("Reading %s section of %s failed: %s")("Reading %s section of %s failed: %s"),
2136 sect_name, bfd_get_filename (abfd)((char *) (abfd)->filename),
2137 bfd_errmsg (bfd_get_error ()));
2138 free (contents);
2139 exit_status = 1;
2140 return NULL((void*)0);
2141 }
2142
2143 *size_ptr = size;
2144
2145 return contents;
2146}
2147
2148/* Stabs entries use a 12 byte format:
2149 4 byte string table index
2150 1 byte stab type
2151 1 byte stab other field
2152 2 byte stab desc field
2153 4 byte stab value
2154 FIXME: This will have to change for a 64 bit object format. */
2155
2156#define STRDXOFF(0) (0)
2157#define TYPEOFF(4) (4)
2158#define OTHEROFF(5) (5)
2159#define DESCOFF(6) (6)
2160#define VALOFF(8) (8)
2161#define STABSIZE(12) (12)
2162
2163/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2164 using string table section STRSECT_NAME (in `strtab'). */
2165
2166static void
2167print_section_stabs (bfd *abfd,
2168 const char *stabsect_name,
2169 unsigned *string_offset_ptr)
2170{
2171 int i;
2172 unsigned file_string_table_offset = 0;
2173 unsigned next_file_string_table_offset = *string_offset_ptr;
2174 bfd_byte *stabp, *stabs_end;
2175
2176 stabp = stabs;
2177 stabs_end = stabp + stab_size;
2178
2179 printf (_("Contents of %s section:\n\n")("Contents of %s section:\n\n"), stabsect_name);
2180 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
2181
2182 /* Loop through all symbols and print them.
2183
2184 We start the index at -1 because there is a dummy symbol on
2185 the front of stabs-in-{coff,elf} sections that supplies sizes. */
2186 for (i = -1; stabp < stabs_end; stabp += STABSIZE(12), i++)
2187 {
2188 const char *name;
2189 unsigned long strx;
2190 unsigned char type, other;
2191 unsigned short desc;
2192 bfd_vma value;
2193
2194 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF)((*((abfd)->xvec->bfd_h_getx32)) (stabp + (0)));
2195 type = bfd_h_get_8 (abfd, stabp + TYPEOFF)(*(unsigned char *) (stabp + (4)) & 0xff);
2196 other = bfd_h_get_8 (abfd, stabp + OTHEROFF)(*(unsigned char *) (stabp + (5)) & 0xff);
2197 desc = bfd_h_get_16 (abfd, stabp + DESCOFF)((*((abfd)->xvec->bfd_h_getx16)) (stabp + (6)));
2198 value = bfd_h_get_32 (abfd, stabp + VALOFF)((*((abfd)->xvec->bfd_h_getx32)) (stabp + (8)));
2199
2200 printf ("\n%-6d ", i);
2201 /* Either print the stab name, or, if unnamed, print its number
2202 again (makes consistent formatting for tools like awk). */
2203 name = bfd_get_stab_name (type);
2204 if (name != NULL((void*)0))
2205 printf ("%-6s", name);
2206 else if (type == N_UNDF0)
2207 printf ("HdrSym");
2208 else
2209 printf ("%-6d", type);
2210 printf (" %-6d %-6d ", other, desc);
2211 bfd_printf_vma (abfd, value)bfd_fprintf_vma (abfd,(&__sF[1]),value);
2212 printf (" %-6lu", strx);
2213
2214 /* Symbols with type == 0 (N_UNDF) specify the length of the
2215 string table associated with this file. We use that info
2216 to know how to relocate the *next* file's string table indices. */
2217 if (type == N_UNDF0)
2218 {
2219 file_string_table_offset = next_file_string_table_offset;
2220 next_file_string_table_offset += value;
2221 }
2222 else
2223 {
2224 /* Using the (possibly updated) string table offset, print the
2225 string (if any) associated with this symbol. */
2226 if ((strx + file_string_table_offset) < stabstr_size)
2227 printf (" %s", &strtab[strx + file_string_table_offset]);
2228 else
2229 printf (" *");
2230 }
2231 }
2232 printf ("\n\n");
2233 *string_offset_ptr = next_file_string_table_offset;
2234}
2235
2236typedef struct
2237{
2238 const char * section_name;
2239 const char * string_section_name;
2240 unsigned string_offset;
2241}
2242stab_section_names;
2243
2244static void
2245find_stabs_section (bfd *abfd, asection *section, void *names)
2246{
2247 int len;
2248 stab_section_names * sought = (stab_section_names *) names;
2249
2250 /* Check for section names for which stabsect_name is a prefix, to
2251 handle .stab.N, etc. */
2252 len = strlen (sought->section_name);
2253
2254 /* If the prefix matches, and the files section name ends with a
2255 nul or a digit, then we match. I.e., we want either an exact
2256 match or a section followed by a number. */
2257 if (strncmp (sought->section_name, section->name, len) == 0
2258 && (section->name[len] == 0
2259 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1])(_sch_istable[(section->name[len + 1]) & 0xff] & (
unsigned short)(_sch_isdigit))
)))
2260 {
2261 if (strtab == NULL((void*)0))
2262 strtab = read_section_stabs (abfd, sought->string_section_name,
2263 &stabstr_size);
2264
2265 if (strtab)
2266 {
2267 stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2268 &stab_size);
2269 if (stabs)
2270 print_section_stabs (abfd, section->name, &sought->string_offset);
2271 }
2272 }
2273}
2274
2275static void
2276dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2277{
2278 stab_section_names s;
2279
2280 s.section_name = stabsect_name;
2281 s.string_section_name = strsect_name;
2282 s.string_offset = 0;
2283
2284 bfd_map_over_sections (abfd, find_stabs_section, & s);
2285
2286 free (strtab);
2287 strtab = NULL((void*)0);
2288}
2289
2290/* Dump the any sections containing stabs debugging information. */
2291
2292static void
2293dump_stabs (bfd *abfd)
2294{
2295 dump_stabs_section (abfd, ".stab", ".stabstr");
2296 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2297 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2298 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2299}
2300
2301static void
2302dump_bfd_header (bfd *abfd)
2303{
2304 char *comma = "";
2305
2306 printf (_("architecture: %s, ")("architecture: %s, "),
2307 bfd_printable_arch_mach (bfd_get_arch (abfd),
2308 bfd_get_mach (abfd)));
2309 printf (_("flags 0x%08x:\n")("flags 0x%08x:\n"), abfd->flags);
2310
2311#define PF(x, y)if (abfd->flags & x) {printf("%s%s", comma, y); comma=
", ";}
if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2312 PF (HAS_RELOC, "HAS_RELOC")if (abfd->flags & 0x01) {printf("%s%s", comma, "HAS_RELOC"
); comma=", ";}
;
2313 PF (EXEC_P, "EXEC_P")if (abfd->flags & 0x02) {printf("%s%s", comma, "EXEC_P"
); comma=", ";}
;
2314 PF (HAS_LINENO, "HAS_LINENO")if (abfd->flags & 0x04) {printf("%s%s", comma, "HAS_LINENO"
); comma=", ";}
;
2315 PF (HAS_DEBUG, "HAS_DEBUG")if (abfd->flags & 0x08) {printf("%s%s", comma, "HAS_DEBUG"
); comma=", ";}
;
2316 PF (HAS_SYMS, "HAS_SYMS")if (abfd->flags & 0x10) {printf("%s%s", comma, "HAS_SYMS"
); comma=", ";}
;
2317 PF (HAS_LOCALS, "HAS_LOCALS")if (abfd->flags & 0x20) {printf("%s%s", comma, "HAS_LOCALS"
); comma=", ";}
;
2318 PF (DYNAMIC, "DYNAMIC")if (abfd->flags & 0x40) {printf("%s%s", comma, "DYNAMIC"
); comma=", ";}
;
2319 PF (WP_TEXT, "WP_TEXT")if (abfd->flags & 0x80) {printf("%s%s", comma, "WP_TEXT"
); comma=", ";}
;
2320 PF (D_PAGED, "D_PAGED")if (abfd->flags & 0x100) {printf("%s%s", comma, "D_PAGED"
); comma=", ";}
;
2321 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE")if (abfd->flags & 0x200) {printf("%s%s", comma, "BFD_IS_RELAXABLE"
); comma=", ";}
;
2322 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE")if (abfd->flags & 0x1000) {printf("%s%s", comma, "HAS_LOAD_PAGE"
); comma=", ";}
;
2323 printf (_("\nstart address 0x")("\nstart address 0x"));
2324 bfd_printf_vma (abfd, abfd->start_address)bfd_fprintf_vma (abfd,(&__sF[1]),abfd->start_address);
2325 printf ("\n");
2326}
2327
2328
2329static void
2330dump_bfd_private_header (bfd *abfd)
2331{
2332 bfd_print_private_bfd_data (abfd, stdout)((*((abfd)->xvec->_bfd_print_private_bfd_data)) (abfd, (
&__sF[1])))
;
2333}
2334
2335
2336/* Display a section in hexadecimal format with associated characters.
2337 Each line prefixed by the zero padded address. */
2338
2339static void
2340dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
2341{
2342 bfd_byte *data = 0;
2343 bfd_size_type datasize;
2344 bfd_size_type addr_offset;
2345 bfd_size_type start_offset;
2346 bfd_size_type stop_offset;
2347 unsigned int opb = bfd_octets_per_byte (abfd);
2348 /* Bytes per line. */
2349 const int onaline = 16;
2350 char buf[64];
2351 int count;
2352 int width;
2353
2354 if ((section->flags & SEC_HAS_CONTENTS0x100) == 0)
2355 return;
2356
2357 if (! process_section_p (section))
2358 return;
2359
2360 if ((datasize = bfd_section_size (abfd, section)((section)->size)) == 0)
2361 return;
2362
2363 printf (_("Contents of section %s:\n")("Contents of section %s:\n"), section->name);
2364
2365 data = xmalloc (datasize);
2366
2367 bfd_get_section_contents (abfd, section, data, 0, datasize);
2368
2369 /* Compute the address range to display. */
2370 if (start_address == (bfd_vma) -1
2371 || start_address < section->vma)
2372 start_offset = 0;
2373 else
2374 start_offset = start_address - section->vma;
2375
2376 if (stop_address == (bfd_vma) -1)
2377 stop_offset = datasize / opb;
2378 else
2379 {
2380 if (stop_address < section->vma)
2381 stop_offset = 0;
2382 else
2383 stop_offset = stop_address - section->vma;
2384
2385 if (stop_offset > datasize / opb)
2386 stop_offset = datasize / opb;
2387 }
2388
2389 width = 4;
2390
2391 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2392 if (strlen (buf) >= sizeof (buf))
2393 abort ();
2394
2395 count = 0;
2396 while (buf[count] == '0' && buf[count+1] != '\0')
2397 count++;
2398 count = strlen (buf) - count;
2399 if (count > width)
2400 width = count;
2401
2402 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2403 if (strlen (buf) >= sizeof (buf))
2404 abort ();
2405
2406 count = 0;
2407 while (buf[count] == '0' && buf[count+1] != '\0')
2408 count++;
2409 count = strlen (buf) - count;
2410 if (count > width)
2411 width = count;
2412
2413 for (addr_offset = start_offset;
2414 addr_offset < stop_offset; addr_offset += onaline / opb)
2415 {
2416 bfd_size_type j;
2417
2418 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2419 count = strlen (buf);
2420 if ((size_t) count >= sizeof (buf))
2421 abort ();
2422
2423 putchar (' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', (
&__sF[1])))
;
2424 while (count < width)
2425 {
2426 putchar ('0')(!__isthreaded ? __sputc('0', (&__sF[1])) : (putc)('0', (
&__sF[1])))
;
2427 count++;
2428 }
2429 fputs (buf + count - width, stdout(&__sF[1]));
2430 putchar (' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', (
&__sF[1])))
;
2431
2432 for (j = addr_offset * opb;
2433 j < addr_offset * opb + onaline; j++)
2434 {
2435 if (j < stop_offset * opb)
2436 printf ("%02x", (unsigned) (data[j]));
2437 else
2438 printf (" ");
2439 if ((j & 3) == 3)
2440 printf (" ");
2441 }
2442
2443 printf (" ");
2444 for (j = addr_offset * opb;
2445 j < addr_offset * opb + onaline; j++)
2446 {
2447 if (j >= stop_offset * opb)
2448 printf (" ");
2449 else
2450 printf ("%c", ISPRINT (data[j])(_sch_istable[(data[j]) & 0xff] & (unsigned short)(_sch_isprint
))
? data[j] : '.');
2451 }
2452 putchar ('\n')(!__isthreaded ? __sputc('\n', (&__sF[1])) : (putc)('\n',
(&__sF[1])))
;
2453 }
2454 free (data);
2455}
2456
2457/* Actually display the various requested regions. */
2458
2459static void
2460dump_data (bfd *abfd)
2461{
2462 bfd_map_over_sections (abfd, dump_section, NULL((void*)0));
2463}
2464
2465/* Should perhaps share code and display with nm? */
2466
2467static void
2468dump_symbols (bfd *abfd ATTRIBUTE_UNUSED__attribute__ ((__unused__)), bfd_boolean dynamic)
2469{
2470 asymbol **current;
2471 long max;
2472 long count;
2473
2474 if (dynamic)
2475 {
2476 current = dynsyms;
2477 max = dynsymcount;
2478 printf ("DYNAMIC SYMBOL TABLE:\n");
2479 }
2480 else
2481 {
2482 current = syms;
2483 max = symcount;
2484 printf ("SYMBOL TABLE:\n");
2485 }
2486
2487 if (max == 0)
2488 printf (_("no symbols\n")("no symbols\n"));
2489
2490 for (count = 0; count < max; count++)
2491 {
2492 bfd *cur_bfd;
2493
2494 if (*current == NULL((void*)0))
2495 printf (_("no information for symbol number %ld\n")("no information for symbol number %ld\n"), count);
2496
2497 else if ((cur_bfd = bfd_asymbol_bfd (*current)((*current)->the_bfd)) == NULL((void*)0))
2498 printf (_("could not determine the type of symbol number %ld\n")("could not determine the type of symbol number %ld\n"),
2499 count);
2500
2501 else if (process_section_p ((* current)->section)
2502 && (dump_special_syms
2503 || !bfd_is_target_special_symbol (cur_bfd, *current)((*((cur_bfd)->xvec->_bfd_is_target_special_symbol)) (cur_bfd
, *current))
))
2504 {
2505 const char *name = (*current)->name;
2506
2507 if (do_demangle && name != NULL((void*)0) && *name != '\0')
2508 {
2509 char *alloc;
2510
2511 /* If we want to demangle the name, we demangle it
2512 here, and temporarily clobber it while calling
2513 bfd_print_symbol. FIXME: This is a gross hack. */
2514 alloc = demangle (cur_bfd, name);
2515 (*current)->name = alloc;
2516 bfd_print_symbol (cur_bfd, stdout, *current,((*((cur_bfd)->xvec->_bfd_print_symbol)) (cur_bfd,(&
__sF[1]),*current,bfd_print_symbol_all))
2517 bfd_print_symbol_all)((*((cur_bfd)->xvec->_bfd_print_symbol)) (cur_bfd,(&
__sF[1]),*current,bfd_print_symbol_all))
;
2518 (*current)->name = name;
2519 free (alloc);
2520 }
2521 else
2522 bfd_print_symbol (cur_bfd, stdout, *current,((*((cur_bfd)->xvec->_bfd_print_symbol)) (cur_bfd,(&
__sF[1]),*current,bfd_print_symbol_all))
2523 bfd_print_symbol_all)((*((cur_bfd)->xvec->_bfd_print_symbol)) (cur_bfd,(&
__sF[1]),*current,bfd_print_symbol_all))
;
2524 printf ("\n");
2525 }
2526
2527 current++;
2528 }
2529 printf ("\n\n");
2530}
2531
2532static void
2533dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2534{
2535 arelent **p;
2536 char *last_filename, *last_functionname;
2537 unsigned int last_line;
2538
2539 /* Get column headers lined up reasonably. */
2540 {
2541 static int width;
2542
2543 if (width == 0)
2544 {
2545 char buf[30];
2546
2547 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2548 width = strlen (buf) - 7;
2549 }
2550 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2551 }
2552
2553 last_filename = NULL((void*)0);
2554 last_functionname = NULL((void*)0);
2555 last_line = 0;
2556
2557 for (p = relpp; relcount && *p != NULL((void*)0); p++, relcount--)
2558 {
2559 arelent *q = *p;
2560 const char *filename, *functionname;
2561 unsigned int line;
2562 const char *sym_name;
2563 const char *section_name;
2564
2565 if (start_address != (bfd_vma) -1
2566 && q->address < start_address)
2567 continue;
2568 if (stop_address != (bfd_vma) -1
2569 && q->address > stop_address)
2570 continue;
2571
2572 if (with_line_numbers
2573 && sec != NULL((void*)0)
2574 && bfd_find_nearest_line (abfd, sec, syms, q->address,((*((abfd)->xvec->_bfd_find_nearest_line)) (abfd, sec, syms
, q->address, &filename, &functionname, &line)
)
2575 &filename, &functionname, &line)((*((abfd)->xvec->_bfd_find_nearest_line)) (abfd, sec, syms
, q->address, &filename, &functionname, &line)
)
)
2576 {
2577 if (functionname != NULL((void*)0)
2578 && (last_functionname == NULL((void*)0)
2579 || strcmp (functionname, last_functionname) != 0))
2580 {
2581 printf ("%s():\n", functionname);
2582 if (last_functionname != NULL((void*)0))
2583 free (last_functionname);
2584 last_functionname = xstrdup (functionname);
2585 }
2586
2587 if (line > 0
2588 && (line != last_line
2589 || (filename != NULL((void*)0)
2590 && last_filename != NULL((void*)0)
2591 && strcmp (filename, last_filename) != 0)))
2592 {
2593 printf ("%s:%u\n", filename == NULL((void*)0) ? "???" : filename, line);
2594 last_line = line;
2595 if (last_filename != NULL((void*)0))
2596 free (last_filename);
2597 if (filename == NULL((void*)0))
2598 last_filename = NULL((void*)0);
2599 else
2600 last_filename = xstrdup (filename);
2601 }
2602 }
2603
2604 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2605 {
2606 sym_name = (*(q->sym_ptr_ptr))->name;
2607 section_name = (*(q->sym_ptr_ptr))->section->name;
2608 }
2609 else
2610 {
2611 sym_name = NULL((void*)0);
2612 section_name = NULL((void*)0);
2613 }
2614
2615 bfd_printf_vma (abfd, q->address)bfd_fprintf_vma (abfd,(&__sF[1]),q->address);
2616 if (q->howto == NULL((void*)0))
2617 printf (" *unknown* ");
2618 else if (q->howto->name)
2619 printf (" %-16s ", q->howto->name);
2620 else
2621 printf (" %-16d ", q->howto->type);
2622 if (sym_name)
2623 objdump_print_symname (abfd, NULL((void*)0), *q->sym_ptr_ptr);
2624 else
2625 {
2626 if (section_name == NULL((void*)0))
2627 section_name = "*unknown*";
2628 printf ("[%s]", section_name);
2629 }
2630
2631 if (q->addend)
2632 {
2633 printf ("+0x");
2634 bfd_printf_vma (abfd, q->addend)bfd_fprintf_vma (abfd,(&__sF[1]),q->addend);
2635 }
2636
2637 printf ("\n");
2638 }
2639}
2640
2641static void
2642dump_relocs_in_section (bfd *abfd,
2643 asection *section,
2644 void *dummy ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
2645{
2646 arelent **relpp;
2647 long relcount;
2648 long relsize;
2649
2650 if ( bfd_is_abs_section (section)((section) == ((asection *) &bfd_abs_section))
2651 || bfd_is_und_section (section)((section) == ((asection *) &bfd_und_section))
2652 || bfd_is_com_section (section)(((section)->flags & 0x1000) != 0)
2653 || (! process_section_p (section))
2654 || ((section->flags & SEC_RELOC0x004) == 0))
2655 return;
2656
2657 relsize = bfd_get_reloc_upper_bound (abfd, section);
2658 if (relsize < 0)
2659 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
2660
2661 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2662
2663 if (relsize == 0)
2664 {
2665 printf (" (none)\n\n");
2666 return;
2667 }
2668
2669 relpp = xmalloc (relsize);
2670 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2671
2672 if (relcount < 0)
2673 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
2674 else if (relcount == 0)
2675 printf (" (none)\n\n");
2676 else
2677 {
2678 printf ("\n");
2679 dump_reloc_set (abfd, section, relpp, relcount);
2680 printf ("\n\n");
2681 }
2682 free (relpp);
2683}
2684
2685static void
2686dump_relocs (bfd *abfd)
2687{
2688 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL((void*)0));
2689}
2690
2691static void
2692dump_dynamic_relocs (bfd *abfd)
2693{
2694 long relsize;
2695 arelent **relpp;
2696 long relcount;
2697
2698 relsize = bfd_get_dynamic_reloc_upper_bound (abfd)((*((abfd)->xvec->_bfd_get_dynamic_reloc_upper_bound)) (
abfd))
;
2699 if (relsize < 0)
2700 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
2701
2702 printf ("DYNAMIC RELOCATION RECORDS");
2703
2704 if (relsize == 0)
2705 printf (" (none)\n\n");
2706 else
2707 {
2708 relpp = xmalloc (relsize);
2709 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms)((*((abfd)->xvec->_bfd_canonicalize_dynamic_reloc)) (abfd
, relpp, dynsyms))
;
2710
2711 if (relcount < 0)
2712 bfd_fatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
2713 else if (relcount == 0)
2714 printf (" (none)\n\n");
2715 else
2716 {
2717 printf ("\n");
2718 dump_reloc_set (abfd, NULL((void*)0), relpp, relcount);
2719 printf ("\n\n");
2720 }
2721 free (relpp);
2722 }
2723}
2724
2725/* Creates a table of paths, to search for source files. */
2726
2727static void
2728add_include_path (const char *path)
2729{
2730 if (path[0] == 0)
2731 return;
2732 include_path_count++;
2733 include_paths = xrealloc (include_paths,
2734 include_path_count * sizeof (*include_paths));
2735#ifdef HAVE_DOS_BASED_FILE_SYSTEM
2736 if (path[1] == ':' && path[2] == 0)
2737 path = concat (path, ".", (const char *) 0);
2738#endif
2739 include_paths[include_path_count - 1] = path;
2740}
2741
2742static void
2743adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED__attribute__ ((__unused__)),
2744 asection *section,
2745 void *arg)
2746{
2747 if ((section->flags & SEC_DEBUGGING0x2000) == 0)
2748 {
2749 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
2750 section->vma += adjust_section_vma;
2751 if (*has_reloc_p)
2752 section->lma += adjust_section_vma;
2753 }
2754}
2755
2756/* Dump selected contents of ABFD. */
2757
2758static void
2759dump_bfd (bfd *abfd)
2760{
2761 /* If we are adjusting section VMA's, change them all now. Changing
2762 the BFD information is a hack. However, we must do it, or
2763 bfd_find_nearest_line will not do the right thing. */
2764 if (adjust_section_vma != 0)
2765 {
2766 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC0x01);
2767 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
2768 }
2769
2770 if (! dump_debugging_tags)
2771 printf (_("\n%s: file format %s\n")("\n%s: file format %s\n"), bfd_get_filename (abfd)((char *) (abfd)->filename),
2772 abfd->xvec->name);
2773 if (dump_ar_hdrs)
2774 print_arelt_descr (stdout(&__sF[1]), abfd, TRUE1);
2775 if (dump_file_header)
2776 dump_bfd_header (abfd);
2777 if (dump_private_headers)
2778 dump_bfd_private_header (abfd);
2779 if (! dump_debugging_tags)
2780 putchar ('\n')(!__isthreaded ? __sputc('\n', (&__sF[1])) : (putc)('\n',
(&__sF[1])))
;
2781 if (dump_section_headers)
2782 dump_headers (abfd);
2783
2784 if (dump_symtab
2785 || dump_reloc_info
2786 || disassemble
2787 || dump_debugging
2788 || dump_dwarf_section_info)
2789 syms = slurp_symtab (abfd);
2790 if (dump_dynamic_symtab || dump_dynamic_reloc_info
2791 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd)((*((abfd)->xvec->_bfd_get_dynamic_symtab_upper_bound))
(abfd))
> 0))
2792 dynsyms = slurp_dynamic_symtab (abfd);
2793 if (disassemble)
2794 {
2795 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,((*((abfd)->xvec->_bfd_get_synthetic_symtab)) (abfd, symcount
, syms, dynsymcount, dynsyms, &synthsyms))
2796 dynsymcount, dynsyms, &synthsyms)((*((abfd)->xvec->_bfd_get_synthetic_symtab)) (abfd, symcount
, syms, dynsymcount, dynsyms, &synthsyms))
;
2797 if (synthcount < 0)
2798 synthcount = 0;
2799 }
2800
2801 if (dump_symtab)
2802 dump_symbols (abfd, FALSE0);
2803 if (dump_dynamic_symtab)
2804 dump_symbols (abfd, TRUE1);
2805 if (dump_dwarf_section_info)
2806 dump_dwarf (abfd);
2807 if (dump_stab_section_info)
2808 dump_stabs (abfd);
2809 if (dump_reloc_info && ! disassemble)
2810 dump_relocs (abfd);
2811 if (dump_dynamic_reloc_info && ! disassemble)
2812 dump_dynamic_relocs (abfd);
2813 if (dump_section_contents)
2814 dump_data (abfd);
2815 if (disassemble)
2816 disassemble_data (abfd);
2817
2818 if (dump_debugging)
2819 {
2820 void *dhandle;
2821
2822 dhandle = read_debugging_info (abfd, syms, symcount);
2823 if (dhandle != NULL((void*)0))
2824 {
2825 if (! print_debugging_info (stdout(&__sF[1]), dhandle, abfd, syms, demangle,
2826 dump_debugging_tags ? TRUE1 : FALSE0))
2827 {
2828 non_fatal (_("%s: printing debugging information failed")("%s: printing debugging information failed"),
2829 bfd_get_filename (abfd)((char *) (abfd)->filename));
2830 exit_status = 1;
2831 }
2832 }
2833 }
2834
2835 if (syms)
2836 {
2837 free (syms);
2838 syms = NULL((void*)0);
2839 }
2840
2841 if (dynsyms)
2842 {
2843 free (dynsyms);
2844 dynsyms = NULL((void*)0);
2845 }
2846
2847 if (synthsyms)
2848 {
2849 free (synthsyms);
2850 synthsyms = NULL((void*)0);
2851 }
2852
2853 symcount = 0;
2854 dynsymcount = 0;
2855 synthcount = 0;
2856}
2857
2858static void
2859display_bfd (bfd *abfd)
2860{
2861 char **matching;
2862
2863 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2864 {
2865 dump_bfd (abfd);
2866 return;
2867 }
2868
2869 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2870 {
2871 nonfatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
2872 list_matching_formats (matching);
2873 free (matching);
2874 return;
2875 }
2876
2877 if (bfd_get_error () != bfd_error_file_not_recognized)
2878 {
2879 nonfatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
2880 return;
2881 }
2882
2883 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2884 {
2885 dump_bfd (abfd);
2886 return;
2887 }
2888
2889 nonfatal (bfd_get_filename (abfd)((char *) (abfd)->filename));
2890
2891 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2892 {
2893 list_matching_formats (matching);
2894 free (matching);
2895 }
2896}
2897
2898static void
2899display_file (char *filename, char *target)
2900{
2901 bfd *file;
2902 bfd *arfile = NULL((void*)0);
2903
2904 if (get_file_size (filename) < 1)
2905 return;
2906
2907 file = bfd_openr (filename, target);
2908 if (file == NULL((void*)0))
2909 {
2910 nonfatal (filename);
2911 return;
2912 }
2913
2914 /* If the file is an archive, process all of its elements. */
2915 if (bfd_check_format (file, bfd_archive))
2916 {
2917 bfd *last_arfile = NULL((void*)0);
2918
2919 printf (_("In archive %s:\n")("In archive %s:\n"), bfd_get_filename (file)((char *) (file)->filename));
2920 for (;;)
2921 {
2922 bfd_set_error (bfd_error_no_error);
2923
2924 arfile = bfd_openr_next_archived_file (file, arfile);
2925 if (arfile == NULL((void*)0))
2926 {
2927 if (bfd_get_error () != bfd_error_no_more_archived_files)
2928 nonfatal (bfd_get_filename (file)((char *) (file)->filename));
2929 break;
2930 }
2931
2932 display_bfd (arfile);
2933
2934 if (last_arfile != NULL((void*)0))
2935 bfd_close (last_arfile);
2936 last_arfile = arfile;
2937 }
2938
2939 if (last_arfile != NULL((void*)0))
2940 bfd_close (last_arfile);
2941 }
2942 else
2943 display_bfd (file);
2944
2945 bfd_close (file);
2946}
2947
2948int
2949main (int argc, char **argv)
2950{
2951 int c;
2952 char *target = default_target;
2953 bfd_boolean seenflag = FALSE0;
2954
2955#if defined (HAVE_SETLOCALE1)
2956#if defined (HAVE_LC_MESSAGES1)
2957 setlocale (LC_MESSAGES6, "");
2958#endif
2959 setlocale (LC_CTYPE2, "");
2960#endif
2961
2962 bindtextdomain (PACKAGE, LOCALEDIR)while (0);
2963 textdomain (PACKAGE)while (0);
2964
2965 if (pledge ("stdio rpath tmppath", NULL((void*)0)) == -1)
2966 fatal (_("Failed to pledge")("Failed to pledge"));
2967
2968 program_name = *argv;
2969 xmalloc_set_program_name (program_name);
2970
2971 START_PROGRESS (program_name, 0);
2972
2973 expandargv (&argc, &argv);
2974
2975 bfd_init ();
2976 set_default_bfd_target ();
2977
2978 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSI:j:wE:zgeGW",
2979 long_options, (int *) 0))
2980 != EOF(-1))
2981 {
2982 switch (c)
2983 {
2984 case 0:
2985 break; /* We've been given a long option. */
2986 case 'm':
2987 machine = optarg;
2988 break;
2989 case 'M':
2990 if (disassembler_options)
2991 /* Ignore potential memory leak for now. */
2992 disassembler_options = concat (disassembler_options, ",",
2993 optarg, NULL((void*)0));
2994 else
2995 disassembler_options = optarg;
2996 break;
2997 case 'j':
2998 if (only_used == only_size)
2999 {
3000 only_size += 8;
3001 only = xrealloc (only, only_size * sizeof (char *));
3002 }
3003 only [only_used++] = optarg;
3004 break;
3005 case 'l':
3006 with_line_numbers = TRUE1;
3007 break;
3008 case 'b':
3009 target = optarg;
3010 break;
3011 case 'C':
3012 do_demangle = TRUE1;
3013 if (optarg != NULL((void*)0))
3014 {
3015 enum demangling_styles style;
3016
3017 style = cplus_demangle_name_to_style (optarg);
3018 if (style == unknown_demangling)
3019 fatal (_("unknown demangling style `%s'")("unknown demangling style `%s'"),
3020 optarg);
3021
3022 cplus_demangle_set_style (style);
3023 }
3024 break;
3025 case 'w':
3026 wide_output = TRUE1;
3027 break;
3028 case OPTION_ADJUST_VMA:
3029 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3030 break;
3031 case OPTION_START_ADDRESS:
3032 start_address = parse_vma (optarg, "--start-address");
3033 break;
3034 case OPTION_STOP_ADDRESS:
3035 stop_address = parse_vma (optarg, "--stop-address");
3036 break;
3037 case 'E':
3038 if (strcmp (optarg, "B") == 0)
3039 endian = BFD_ENDIAN_BIG;
3040 else if (strcmp (optarg, "L") == 0)
3041 endian = BFD_ENDIAN_LITTLE;
3042 else
3043 {
3044 non_fatal (_("unrecognized -E option")("unrecognized -E option"));
3045 usage (stderr(&__sF[2]), 1);
3046 }
3047 break;
3048 case OPTION_ENDIAN:
3049 if (strncmp (optarg, "big", strlen (optarg)) == 0)
3050 endian = BFD_ENDIAN_BIG;
3051 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3052 endian = BFD_ENDIAN_LITTLE;
3053 else
3054 {
3055 non_fatal (_("unrecognized --endian type `%s'")("unrecognized --endian type `%s'"), optarg);
3056 usage (stderr(&__sF[2]), 1);
3057 }
3058 break;
3059
3060 case 'f':
3061 dump_file_header = TRUE1;
3062 seenflag = TRUE1;
3063 break;
3064 case 'i':
3065 formats_info = TRUE1;
3066 seenflag = TRUE1;
3067 break;
3068 case 'I':
3069 add_include_path (optarg);
3070 break;
3071 case 'p':
3072 dump_private_headers = TRUE1;
3073 seenflag = TRUE1;
3074 break;
3075 case 'x':
3076 dump_private_headers = TRUE1;
3077 dump_symtab = TRUE1;
3078 dump_reloc_info = TRUE1;
3079 dump_file_header = TRUE1;
3080 dump_ar_hdrs = TRUE1;
3081 dump_section_headers = TRUE1;
3082 seenflag = TRUE1;
3083 break;
3084 case 't':
3085 dump_symtab = TRUE1;
3086 seenflag = TRUE1;
3087 break;
3088 case 'T':
3089 dump_dynamic_symtab = TRUE1;
3090 seenflag = TRUE1;
3091 break;
3092 case 'd':
3093 disassemble = TRUE1;
3094 seenflag = TRUE1;
3095 break;
3096 case 'z':
3097 disassemble_zeroes = TRUE1;
3098 break;
3099 case 'D':
3100 disassemble = TRUE1;
3101 disassemble_all = TRUE1;
3102 seenflag = TRUE1;
3103 break;
3104 case 'S':
3105 disassemble = TRUE1;
3106 with_source_code = TRUE1;
3107 seenflag = TRUE1;
3108 break;
3109 case 'g':
3110 dump_debugging = 1;
3111 seenflag = TRUE1;
3112 break;
3113 case 'e':
3114 dump_debugging = 1;
3115 dump_debugging_tags = 1;
3116 do_demangle = TRUE1;
3117 seenflag = TRUE1;
3118 break;
3119 case 'W':
3120 dump_dwarf_section_info = TRUE1;
3121 seenflag = TRUE1;
3122 do_debug_info = 1;
3123 do_debug_abbrevs = 1;
3124 do_debug_lines = 1;
3125 do_debug_pubnames = 1;
3126 do_debug_aranges = 1;
3127 do_debug_ranges = 1;
3128 do_debug_frames = 1;
3129 do_debug_macinfo = 1;
3130 do_debug_str = 1;
3131 do_debug_loc = 1;
3132 break;
3133 case 'G':
3134 dump_stab_section_info = TRUE1;
3135 seenflag = TRUE1;
3136 break;
3137 case 's':
3138 dump_section_contents = TRUE1;
3139 seenflag = TRUE1;
3140 break;
3141 case 'r':
3142 dump_reloc_info = TRUE1;
3143 seenflag = TRUE1;
3144 break;
3145 case 'R':
3146 dump_dynamic_reloc_info = TRUE1;
3147 seenflag = TRUE1;
3148 break;
3149 case 'a':
3150 dump_ar_hdrs = TRUE1;
3151 seenflag = TRUE1;
3152 break;
3153 case 'h':
3154 dump_section_headers = TRUE1;
3155 seenflag = TRUE1;
3156 break;
3157 case 'H':
3158 usage (stdout(&__sF[1]), 0);
3159 seenflag = TRUE1;
3160 case 'v':
3161 case 'V':
3162 show_version = TRUE1;
3163 seenflag = TRUE1;
3164 break;
3165
3166 default:
3167 usage (stderr(&__sF[2]), 1);
3168 }
3169 }
3170
3171 if (show_version)
3172 print_version ("objdump");
3173
3174 if (!seenflag)
3175 usage (stderr(&__sF[2]), 2);
3176
3177 if (formats_info)
3178 exit_status = display_info ();
3179 else
3180 {
3181 if (optind == argc)
3182 display_file ("a.out", target);
3183 else
3184 for (; optind < argc;)
3185 display_file (argv[optind++], target);
3186 }
3187
3188 END_PROGRESS (program_name);
3189
3190 return exit_status;
3191}