]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/objdump.c
sim: bfin: fix the otp fix fix
[thirdparty/binutils-gdb.git] / binutils / objdump.c
CommitLineData
252b5132 1/* objdump.c -- dump information about an object file.
250d07de 2 Copyright (C) 1990-2021 Free Software Foundation, Inc.
252b5132 3
b5e2a4f3 4 This file is part of GNU Binutils.
252b5132 5
b5e2a4f3
NC
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
32866df7 8 the Free Software Foundation; either version 3, or (at your option)
b5e2a4f3 9 any later version.
252b5132 10
b5e2a4f3
NC
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
252b5132 15
b5e2a4f3
NC
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
32866df7
NC
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
252b5132 21
155e0d23
NC
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:
3aade688 30
155e0d23
NC
31 1. Command line arguments are checked for control switches and the
32 information to be displayed is selected.
3aade688 33
155e0d23
NC
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.
3aade688 37
50c2245b 38 3. The file's target architecture and binary file format are determined
155e0d23
NC
39 by bfd_check_format(). If they are recognised, then dump_bfd() is
40 called.
41
50c2245b
KH
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
aaad4cf3 44 a disassembly has been requested.
155e0d23
NC
45
46 When disassembling the code loops through blocks of instructions bounded
50c2245b 47 by symbols, calling disassemble_bytes() on each block. The actual
155e0d23
NC
48 disassembling is done by the libopcodes library, via a function pointer
49 supplied by the disassembler() function. */
50
3db64b00 51#include "sysdep.h"
252b5132 52#include "bfd.h"
2dc4cec1 53#include "elf-bfd.h"
f4943d82 54#include "coff-bfd.h"
252b5132
RH
55#include "progress.h"
56#include "bucomm.h"
3284fe0c 57#include "elfcomm.h"
365544c3 58#include "dwarf.h"
7d9813f1 59#include "ctf-api.h"
d7a283d4 60#include "getopt.h"
3882b010 61#include "safe-ctype.h"
252b5132
RH
62#include "dis-asm.h"
63#include "libiberty.h"
64#include "demangle.h"
0dafdf3f 65#include "filenames.h"
252b5132
RH
66#include "debug.h"
67#include "budbg.h"
6abcee90 68#include "objdump.h"
252b5132 69
e8f5eee4
NC
70#ifdef HAVE_MMAP
71#include <sys/mman.h>
72#endif
73
252b5132
RH
74/* Internal headers for the ELF .stab-dump code - sorry. */
75#define BYTES_IN_WORD 32
76#include "aout/aout64.h"
77
75cd796a
ILT
78/* Exit status. */
79static int exit_status = 0;
80
98a91d6a 81static char *default_target = NULL; /* Default at runtime. */
252b5132 82
3b9ad1cc
AM
83/* The following variables are set based on arguments passed on the
84 command line. */
98a91d6a 85static int show_version = 0; /* Show the version number. */
252b5132
RH
86static int dump_section_contents; /* -s */
87static int dump_section_headers; /* -h */
015dc7e1 88static bool dump_file_header; /* -f */
252b5132
RH
89static int dump_symtab; /* -t */
90static int dump_dynamic_symtab; /* -T */
91static int dump_reloc_info; /* -r */
92static int dump_dynamic_reloc_info; /* -R */
93static int dump_ar_hdrs; /* -a */
94static int dump_private_headers; /* -p */
6abcee90 95static char *dump_private_options; /* -P */
b1bc1394 96static int no_addresses; /* --no-addresses */
252b5132
RH
97static int prefix_addresses; /* --prefix-addresses */
98static int with_line_numbers; /* -l */
015dc7e1 99static bool with_source_code; /* -S */
252b5132 100static int show_raw_insn; /* --show-raw-insn */
365544c3 101static int dump_dwarf_section_info; /* --dwarf */
252b5132 102static int dump_stab_section_info; /* --stabs */
7d9813f1
NA
103static int dump_ctf_section_info; /* --ctf */
104static char *dump_ctf_section_name;
105static char *dump_ctf_parent_name; /* --ctf-parent */
252b5132 106static int do_demangle; /* -C, --demangle */
015dc7e1
AM
107static bool disassemble; /* -d */
108static bool disassemble_all; /* -D */
252b5132 109static int disassemble_zeroes; /* --disassemble-zeroes */
015dc7e1 110static bool formats_info; /* -i */
252b5132 111static int wide_output; /* -w */
3dcb3fcb 112static int insn_width; /* --insn-width */
252b5132
RH
113static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
114static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
115static int dump_debugging; /* --debugging */
51cdc6e0 116static int dump_debugging_tags; /* --debugging-tags */
fd2f0033 117static int suppress_bfd_header;
3c9458e9 118static int dump_special_syms = 0; /* --special-syms */
252b5132 119static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
f1563258 120static int file_start_context = 0; /* --file-start-context */
015dc7e1 121static bool display_file_offsets; /* -F */
0dafdf3f
L
122static const char *prefix; /* --prefix */
123static int prefix_strip; /* --prefix-strip */
124static size_t prefix_length;
015dc7e1 125static bool unwind_inlines; /* --inlines. */
d3def5d7 126static const char * disasm_sym; /* Disassembly start symbol. */
a1c110a3 127static const char * source_comment; /* --source_comment. */
015dc7e1
AM
128static bool visualize_jumps = false; /* --visualize-jumps. */
129static bool color_output = false; /* --visualize-jumps=color. */
130static bool extended_color_output = false; /* --visualize-jumps=extended-color. */
131static int process_links = false; /* --process-links. */
252b5132 132
af03af8f
NC
133static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
134
70ecb384
NC
135/* A structure to record the sections mentioned in -j switches. */
136struct only
137{
015dc7e1
AM
138 const char *name; /* The name of the section. */
139 bool seen; /* A flag to indicate that the section has been found in one or more input files. */
140 struct only *next; /* Pointer to the next structure in the list. */
70ecb384
NC
141};
142/* Pointer to an array of 'only' structures.
143 This pointer is NULL if the -j switch has not been used. */
144static struct only * only_list = NULL;
155e0d23 145
43ac9881
AM
146/* Variables for handling include file path table. */
147static const char **include_paths;
148static int include_path_count;
149
3b9ad1cc
AM
150/* Extra info to pass to the section disassembler and address printing
151 function. */
026df7c5
NC
152struct objdump_disasm_info
153{
015dc7e1
AM
154 bfd *abfd;
155 bool require_sec;
155e0d23 156 disassembler_ftype disassemble_fn;
015dc7e1
AM
157 arelent *reloc;
158 const char *symbol;
252b5132
RH
159};
160
161/* Architecture to disassemble for, or default if NULL. */
d3ba0551 162static char *machine = NULL;
252b5132 163
dd92f639 164/* Target specific options to the disassembler. */
d3ba0551 165static char *disassembler_options = NULL;
dd92f639 166
252b5132
RH
167/* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
168static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
169
170/* The symbol table. */
171static asymbol **syms;
172
173/* Number of symbols in `syms'. */
174static long symcount = 0;
175
176/* The sorted symbol table. */
177static asymbol **sorted_syms;
178
179/* Number of symbols in `sorted_syms'. */
180static long sorted_symcount = 0;
181
182/* The dynamic symbol table. */
183static asymbol **dynsyms;
184
4c45e5c9
JJ
185/* The synthetic symbol table. */
186static asymbol *synthsyms;
187static long synthcount = 0;
188
252b5132
RH
189/* Number of symbols in `dynsyms'. */
190static long dynsymcount = 0;
191
98a91d6a
NC
192static bfd_byte *stabs;
193static bfd_size_type stab_size;
194
bae7501e 195static bfd_byte *strtab;
98a91d6a 196static bfd_size_type stabstr_size;
41e92641 197
6abcee90
TG
198/* Handlers for -P/--private. */
199static const struct objdump_private_desc * const objdump_private_vectors[] =
200 {
201 OBJDUMP_PRIVATE_VECTORS
202 NULL
203 };
1d67fe3b
TT
204
205/* The list of detected jumps inside a function. */
206static struct jump_info *detected_jumps = NULL;
252b5132 207\f
aebcf7b7 208static void usage (FILE *, int) ATTRIBUTE_NORETURN;
252b5132 209static void
46dca2e0 210usage (FILE *stream, int status)
252b5132 211{
8b53311e
NC
212 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
213 fprintf (stream, _(" Display information from object <file(s)>.\n"));
214 fprintf (stream, _(" At least one of the following switches must be given:\n"));
252b5132 215 fprintf (stream, _("\
86d65c94
MK
216 -a, --archive-headers Display archive header information\n\
217 -f, --file-headers Display the contents of the overall file header\n\
218 -p, --private-headers Display object format specific file header contents\n\
6abcee90 219 -P, --private=OPT,OPT... Display object format specific contents\n\
86d65c94
MK
220 -h, --[section-]headers Display the contents of the section headers\n\
221 -x, --all-headers Display the contents of all headers\n\
222 -d, --disassemble Display assembler contents of executable sections\n\
223 -D, --disassemble-all Display assembler contents of all sections\n\
d3def5d7 224 --disassemble=<sym> Display assembler contents from <sym>\n\
86d65c94 225 -S, --source Intermix source code with disassembly\n\
a1c110a3 226 --source-comment[=<txt>] Prefix lines of source code with <txt>\n\
86d65c94
MK
227 -s, --full-contents Display the full contents of all sections requested\n\
228 -g, --debugging Display debug information in object file\n\
51cdc6e0 229 -e, --debugging-tags Display debug information using ctags style\n\
86d65c94 230 -G, --stabs Display (in raw form) any STABS info in the file\n\
c46b7066 231 -W[lLiaprmfFsoORtUuTgAck] or\n\
1ed06042 232 --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
e4b7104b 233 =frames-interp,=str,=str-offsets,=loc,=Ranges,=pubtypes,\n\
657d0d47 234 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
c46b7066 235 =addr,=cu_index,=links]\n\
79b377b3 236 Display DWARF info in the file\n\
094e34f2 237"));
c46b7066
NC
238#if DEFAULT_FOR_FOLLOW_LINKS
239 fprintf (stream, _("\
240 -WK,--dwarf=follow-links Follow links to separate debug info files (default)\n\
241 -WN,--dwarf=no-follow-links Do not follow links to separate debug info files\n\
242"));
243#else
244 fprintf (stream, _("\
245 -WK,--dwarf=follow-links Follow links to separate debug info files\n\
246 -WN,--dwarf=no-follow-links Do not follow links to separate debug info files (default)\n\
247"));
248#endif
ca0e11aa
NC
249 fprintf (stream, _("\
250 -L, --process-links Display the contents of non-debug sections in separate debuginfo files.\n\
251"));
094e34f2
NA
252#ifdef ENABLE_LIBCTF
253 fprintf (stream, _("\
79b377b3 254 --ctf=SECTION Display CTF info from SECTION\n\
094e34f2
NA
255"));
256#endif
257 fprintf (stream, _("\
86d65c94
MK
258 -t, --syms Display the contents of the symbol table(s)\n\
259 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
260 -r, --reloc Display the relocation entries in the file\n\
261 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
07012eee 262 @<file> Read options from <file>\n\
8b53311e 263 -v, --version Display this program's version number\n\
86d65c94
MK
264 -i, --info List object formats and architectures supported\n\
265 -H, --help Display this information\n\
1dada9c5
NC
266"));
267 if (status != 2)
268 {
6abcee90
TG
269 const struct objdump_private_desc * const *desc;
270
1dada9c5
NC
271 fprintf (stream, _("\n The following switches are optional:\n"));
272 fprintf (stream, _("\
86d65c94
MK
273 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
274 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
275 -j, --section=NAME Only display information for section NAME\n\
276 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
1dada9c5
NC
277 -EB --endian=big Assume big endian format when disassembling\n\
278 -EL --endian=little Assume little endian format when disassembling\n\
f1563258 279 --file-start-context Include context from start of file (with -S)\n\
43ac9881 280 -I, --include=DIR Add DIR to search list for source files\n\
86d65c94 281 -l, --line-numbers Include line numbers and filenames in output\n\
98ec6e72 282 -F, --file-offsets Include file offsets when displaying information\n\
28c309a2 283 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
f0c8c24a
NC
284 The STYLE, if specified, can be `auto', `gnu',\n\
285 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
286 or `gnat'\n\
af03af8f
NC
287 --recurse-limit Enable a limit on recursion whilst demangling. [Default]\n\
288 --no-recurse-limit Disable a limit on recursion whilst demangling\n\
86d65c94
MK
289 -w, --wide Format output for more than 80 columns\n\
290 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
f0c8c24a 291 --start-address=ADDR Only process data whose address is >= ADDR\n\
831bd6aa 292 --stop-address=ADDR Only process data whose address is < ADDR\n\
b1bc1394 293 --no-addresses Do not print address alongside disassembly\n\
1dada9c5
NC
294 --prefix-addresses Print complete address alongside disassembly\n\
295 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
505f1412 296 --insn-width=WIDTH Display WIDTH bytes on a single line for -d\n\
86d65c94 297 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
3c9458e9 298 --special-syms Include special symbols in symbol dumps\n\
4a14e306 299 --inlines Print all inlines for source line (with -l)\n\
0dafdf3f 300 --prefix=PREFIX Add PREFIX to absolute paths for -S\n\
fd2f0033
TT
301 --prefix-strip=LEVEL Strip initial directory names for -S\n"));
302 fprintf (stream, _("\
303 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
304 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4723351a 305 or deeper\n\
094e34f2
NA
306 --dwarf-check Make additional dwarf internal consistency checks.\n"));
307#ifdef ENABLE_LIBCTF
308 fprintf (stream, _("\
309 --ctf-parent=SECTION Use SECTION as the CTF parent\n"));
310#endif
311 fprintf (stream, _("\
1d67fe3b
TT
312 --visualize-jumps Visualize jumps by drawing ASCII art lines\n\
313 --visualize-jumps=color Use colors in the ASCII art\n\
314 --visualize-jumps=extended-color Use extended 8-bit color codes\n\
315 --visualize-jumps=off Disable jump visualization\n\n"));
316
1dada9c5 317 list_supported_targets (program_name, stream);
2f83960e 318 list_supported_architectures (program_name, stream);
86d65c94 319
94470b23 320 disassembler_usage (stream);
6abcee90
TG
321
322 if (objdump_private_vectors[0] != NULL)
323 {
324 fprintf (stream,
325 _("\nOptions supported for -P/--private switch:\n"));
326 for (desc = objdump_private_vectors; *desc != NULL; desc++)
327 (*desc)->help (stream);
328 }
1dada9c5 329 }
92f01d61 330 if (REPORT_BUGS_TO[0] && status == 0)
86d65c94 331 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
252b5132
RH
332 exit (status);
333}
334
335/* 150 isn't special; it's just an arbitrary non-ASCII char value. */
46dca2e0
NC
336enum option_values
337 {
338 OPTION_ENDIAN=150,
339 OPTION_START_ADDRESS,
340 OPTION_STOP_ADDRESS,
4cb93e3b 341 OPTION_DWARF,
0dafdf3f
L
342 OPTION_PREFIX,
343 OPTION_PREFIX_STRIP,
3dcb3fcb 344 OPTION_INSN_WIDTH,
fd2f0033
TT
345 OPTION_ADJUST_VMA,
346 OPTION_DWARF_DEPTH,
4723351a 347 OPTION_DWARF_CHECK,
4a14e306 348 OPTION_DWARF_START,
af03af8f
NC
349 OPTION_RECURSE_LIMIT,
350 OPTION_NO_RECURSE_LIMIT,
79b377b3 351 OPTION_INLINES,
a1c110a3 352 OPTION_SOURCE_COMMENT,
094e34f2 353#ifdef ENABLE_LIBCTF
7d9813f1 354 OPTION_CTF,
1d67fe3b 355 OPTION_CTF_PARENT,
094e34f2 356#endif
1d67fe3b 357 OPTION_VISUALIZE_JUMPS
46dca2e0 358 };
252b5132
RH
359
360static struct option long_options[]=
361{
362 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
363 {"all-headers", no_argument, NULL, 'x'},
364 {"private-headers", no_argument, NULL, 'p'},
6abcee90 365 {"private", required_argument, NULL, 'P'},
252b5132
RH
366 {"architecture", required_argument, NULL, 'm'},
367 {"archive-headers", no_argument, NULL, 'a'},
1dada9c5 368 {"debugging", no_argument, NULL, 'g'},
51cdc6e0 369 {"debugging-tags", no_argument, NULL, 'e'},
28c309a2 370 {"demangle", optional_argument, NULL, 'C'},
d3def5d7 371 {"disassemble", optional_argument, NULL, 'd'},
252b5132 372 {"disassemble-all", no_argument, NULL, 'D'},
dd92f639 373 {"disassembler-options", required_argument, NULL, 'M'},
1dada9c5 374 {"disassemble-zeroes", no_argument, NULL, 'z'},
252b5132
RH
375 {"dynamic-reloc", no_argument, NULL, 'R'},
376 {"dynamic-syms", no_argument, NULL, 'T'},
377 {"endian", required_argument, NULL, OPTION_ENDIAN},
378 {"file-headers", no_argument, NULL, 'f'},
98ec6e72 379 {"file-offsets", no_argument, NULL, 'F'},
f1563258 380 {"file-start-context", no_argument, &file_start_context, 1},
252b5132
RH
381 {"full-contents", no_argument, NULL, 's'},
382 {"headers", no_argument, NULL, 'h'},
383 {"help", no_argument, NULL, 'H'},
384 {"info", no_argument, NULL, 'i'},
385 {"line-numbers", no_argument, NULL, 'l'},
386 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
b1bc1394 387 {"no-addresses", no_argument, &no_addresses, 1},
015dc7e1 388 {"process-links", no_argument, &process_links, true},
252b5132 389 {"prefix-addresses", no_argument, &prefix_addresses, 1},
af03af8f
NC
390 {"recurse-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
391 {"recursion-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
392 {"no-recurse-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
393 {"no-recursion-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
252b5132
RH
394 {"reloc", no_argument, NULL, 'r'},
395 {"section", required_argument, NULL, 'j'},
396 {"section-headers", no_argument, NULL, 'h'},
397 {"show-raw-insn", no_argument, &show_raw_insn, 1},
398 {"source", no_argument, NULL, 'S'},
a1c110a3 399 {"source-comment", optional_argument, NULL, OPTION_SOURCE_COMMENT},
3c9458e9 400 {"special-syms", no_argument, &dump_special_syms, 1},
43ac9881 401 {"include", required_argument, NULL, 'I'},
4cb93e3b 402 {"dwarf", optional_argument, NULL, OPTION_DWARF},
094e34f2 403#ifdef ENABLE_LIBCTF
7d9813f1
NA
404 {"ctf", required_argument, NULL, OPTION_CTF},
405 {"ctf-parent", required_argument, NULL, OPTION_CTF_PARENT},
094e34f2 406#endif
1dada9c5 407 {"stabs", no_argument, NULL, 'G'},
252b5132
RH
408 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
409 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
410 {"syms", no_argument, NULL, 't'},
411 {"target", required_argument, NULL, 'b'},
1dada9c5
NC
412 {"version", no_argument, NULL, 'V'},
413 {"wide", no_argument, NULL, 'w'},
0dafdf3f
L
414 {"prefix", required_argument, NULL, OPTION_PREFIX},
415 {"prefix-strip", required_argument, NULL, OPTION_PREFIX_STRIP},
3dcb3fcb 416 {"insn-width", required_argument, NULL, OPTION_INSN_WIDTH},
dda8d76d
NC
417 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
418 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
419 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
420 {"inlines", no_argument, 0, OPTION_INLINES},
1d67fe3b 421 {"visualize-jumps", optional_argument, 0, OPTION_VISUALIZE_JUMPS},
252b5132
RH
422 {0, no_argument, 0, 0}
423};
424\f
425static void
46dca2e0 426nonfatal (const char *msg)
75cd796a
ILT
427{
428 bfd_nonfatal (msg);
429 exit_status = 1;
430}
12add40e
NC
431
432/* Returns a version of IN with any control characters
433 replaced by escape sequences. Uses a static buffer
434 if necessary. */
435
436static const char *
437sanitize_string (const char * in)
438{
63455780
NC
439 static char * buffer = NULL;
440 static size_t buffer_len = 0;
441 const char * original = in;
442 char * out;
12add40e
NC
443
444 /* Paranoia. */
445 if (in == NULL)
446 return "";
447
448 /* See if any conversion is necessary. In the majority
449 of cases it will not be needed. */
450 do
451 {
452 char c = *in++;
453
454 if (c == 0)
455 return original;
456
457 if (ISCNTRL (c))
458 break;
459 }
460 while (1);
461
462 /* Copy the input, translating as needed. */
463 in = original;
464 if (buffer_len < (strlen (in) * 2))
465 {
466 free ((void *) buffer);
467 buffer_len = strlen (in) * 2;
468 buffer = xmalloc (buffer_len + 1);
469 }
470
471 out = buffer;
472 do
473 {
474 char c = *in++;
475
476 if (c == 0)
477 break;
478
479 if (!ISCNTRL (c))
480 *out++ = c;
481 else
482 {
483 *out++ = '^';
484 *out++ = c + 0x40;
485 }
486 }
487 while (1);
488
489 *out = 0;
490 return buffer;
491}
492
75cd796a 493\f
d2fcac5c
NC
494/* Returns TRUE if the specified section should be dumped. */
495
015dc7e1 496static bool
d2fcac5c
NC
497process_section_p (asection * section)
498{
70ecb384 499 struct only * only;
d2fcac5c 500
70ecb384 501 if (only_list == NULL)
015dc7e1 502 return true;
d2fcac5c 503
70ecb384
NC
504 for (only = only_list; only; only = only->next)
505 if (strcmp (only->name, section->name) == 0)
506 {
015dc7e1
AM
507 only->seen = true;
508 return true;
70ecb384 509 }
d2fcac5c 510
015dc7e1 511 return false;
d2fcac5c 512}
70ecb384
NC
513
514/* Add an entry to the 'only' list. */
515
516static void
517add_only (char * name)
518{
519 struct only * only;
520
521 /* First check to make sure that we do not
522 already have an entry for this name. */
523 for (only = only_list; only; only = only->next)
524 if (strcmp (only->name, name) == 0)
525 return;
526
527 only = xmalloc (sizeof * only);
528 only->name = name;
015dc7e1 529 only->seen = false;
70ecb384
NC
530 only->next = only_list;
531 only_list = only;
532}
533
534/* Release the memory used by the 'only' list.
535 PR 11225: Issue a warning message for unseen sections.
536 Only do this if none of the sections were seen. This is mainly to support
537 tools like the GAS testsuite where an object file is dumped with a list of
538 generic section names known to be present in a range of different file
539 formats. */
540
541static void
542free_only_list (void)
543{
015dc7e1 544 bool at_least_one_seen = false;
70ecb384
NC
545 struct only * only;
546 struct only * next;
547
548 if (only_list == NULL)
549 return;
550
551 for (only = only_list; only; only = only->next)
552 if (only->seen)
553 {
015dc7e1 554 at_least_one_seen = true;
70ecb384
NC
555 break;
556 }
557
558 for (only = only_list; only; only = next)
559 {
560 if (! at_least_one_seen)
561 {
a8c62f1c
AM
562 non_fatal (_("section '%s' mentioned in a -j option, "
563 "but not found in any input file"),
70ecb384
NC
564 only->name);
565 exit_status = 1;
566 }
567 next = only->next;
568 free (only);
569 }
570}
571
d2fcac5c 572\f
75cd796a 573static void
1737c640 574dump_section_header (bfd *abfd, asection *section, void *data)
252b5132
RH
575{
576 char *comma = "";
61826503 577 unsigned int opb = bfd_octets_per_byte (abfd, section);
1737c640 578 int longest_section_name = *((int *) data);
252b5132 579
3bee8bcd
L
580 /* Ignore linker created section. See elfNN_ia64_object_p in
581 bfd/elfxx-ia64.c. */
582 if (section->flags & SEC_LINKER_CREATED)
583 return;
584
d2fcac5c
NC
585 /* PR 10413: Skip sections that we are ignoring. */
586 if (! process_section_p (section))
587 return;
588
1737c640 589 printf ("%3d %-*s %08lx ", section->index, longest_section_name,
fd361982
AM
590 sanitize_string (bfd_section_name (section)),
591 (unsigned long) bfd_section_size (section) / opb);
592 bfd_printf_vma (abfd, bfd_section_vma (section));
252b5132 593 printf (" ");
d8180c76 594 bfd_printf_vma (abfd, section->lma);
e59b4dfb 595 printf (" %08lx 2**%u", (unsigned long) section->filepos,
fd361982 596 bfd_section_alignment (section));
252b5132
RH
597 if (! wide_output)
598 printf ("\n ");
599 printf (" ");
600
601#define PF(x, y) \
602 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
603
604 PF (SEC_HAS_CONTENTS, "CONTENTS");
605 PF (SEC_ALLOC, "ALLOC");
606 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
252b5132
RH
607 PF (SEC_LOAD, "LOAD");
608 PF (SEC_RELOC, "RELOC");
252b5132
RH
609 PF (SEC_READONLY, "READONLY");
610 PF (SEC_CODE, "CODE");
611 PF (SEC_DATA, "DATA");
612 PF (SEC_ROM, "ROM");
613 PF (SEC_DEBUGGING, "DEBUGGING");
614 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
615 PF (SEC_EXCLUDE, "EXCLUDE");
616 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
ebe372c1
L
617 if (bfd_get_arch (abfd) == bfd_arch_tic54x)
618 {
619 PF (SEC_TIC54X_BLOCK, "BLOCK");
620 PF (SEC_TIC54X_CLINK, "CLINK");
621 }
24c411ed 622 PF (SEC_SMALL_DATA, "SMALL_DATA");
ebe372c1 623 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
91f68a68
MG
624 {
625 PF (SEC_COFF_SHARED, "SHARED");
626 PF (SEC_COFF_NOREAD, "NOREAD");
627 }
628 else if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
61826503
CE
629 {
630 PF (SEC_ELF_OCTETS, "OCTETS");
631 PF (SEC_ELF_PURECODE, "PURECODE");
632 }
13ae64f3 633 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
64c1196b 634 PF (SEC_GROUP, "GROUP");
91f68a68
MG
635 if (bfd_get_arch (abfd) == bfd_arch_mep)
636 {
637 PF (SEC_MEP_VLIW, "VLIW");
638 }
252b5132
RH
639
640 if ((section->flags & SEC_LINK_ONCE) != 0)
641 {
642 const char *ls;
082b7297 643 struct coff_comdat_info *comdat;
252b5132
RH
644
645 switch (section->flags & SEC_LINK_DUPLICATES)
646 {
647 default:
648 abort ();
649 case SEC_LINK_DUPLICATES_DISCARD:
650 ls = "LINK_ONCE_DISCARD";
651 break;
652 case SEC_LINK_DUPLICATES_ONE_ONLY:
653 ls = "LINK_ONCE_ONE_ONLY";
654 break;
655 case SEC_LINK_DUPLICATES_SAME_SIZE:
656 ls = "LINK_ONCE_SAME_SIZE";
657 break;
658 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
659 ls = "LINK_ONCE_SAME_CONTENTS";
660 break;
661 }
662 printf ("%s%s", comma, ls);
deecf979 663
082b7297
L
664 comdat = bfd_coff_get_comdat_section (abfd, section);
665 if (comdat != NULL)
666 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
deecf979 667
252b5132
RH
668 comma = ", ";
669 }
670
671 printf ("\n");
672#undef PF
673}
674
1737c640
AB
675/* Called on each SECTION in ABFD, update the int variable pointed to by
676 DATA which contains the string length of the longest section name. */
677
678static void
fd361982
AM
679find_longest_section_name (bfd *abfd ATTRIBUTE_UNUSED,
680 asection *section, void *data)
1737c640
AB
681{
682 int *longest_so_far = (int *) data;
683 const char *name;
684 int len;
685
686 /* Ignore linker created section. */
687 if (section->flags & SEC_LINKER_CREATED)
688 return;
689
690 /* Skip sections that we are ignoring. */
691 if (! process_section_p (section))
692 return;
693
fd361982 694 name = bfd_section_name (section);
1737c640
AB
695 len = (int) strlen (name);
696 if (len > *longest_so_far)
697 *longest_so_far = len;
698}
699
252b5132 700static void
46dca2e0 701dump_headers (bfd *abfd)
252b5132 702{
1737c640
AB
703 /* The default width of 13 is just an arbitrary choice. */
704 int max_section_name_length = 13;
705 int bfd_vma_width;
8bea4d5c 706
252b5132 707#ifndef BFD64
1737c640 708 bfd_vma_width = 10;
252b5132 709#else
21611032
TS
710 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
711 if (bfd_get_arch_size (abfd) == 32)
1737c640 712 bfd_vma_width = 10;
21611032 713 else
1737c640 714 bfd_vma_width = 18;
252b5132 715#endif
8bea4d5c 716
1737c640
AB
717 printf (_("Sections:\n"));
718
719 if (wide_output)
720 bfd_map_over_sections (abfd, find_longest_section_name,
721 &max_section_name_length);
722
723 printf (_("Idx %-*s Size %-*s%-*sFile off Algn"),
724 max_section_name_length, "Name",
725 bfd_vma_width, "VMA",
726 bfd_vma_width, "LMA");
727
8bea4d5c
ILT
728 if (wide_output)
729 printf (_(" Flags"));
730 printf ("\n");
731
1737c640
AB
732 bfd_map_over_sections (abfd, dump_section_header,
733 &max_section_name_length);
252b5132
RH
734}
735\f
736static asymbol **
46dca2e0 737slurp_symtab (bfd *abfd)
252b5132 738{
d3ba0551 739 asymbol **sy = NULL;
252b5132
RH
740 long storage;
741
742 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
743 {
252b5132
RH
744 symcount = 0;
745 return NULL;
746 }
747
748 storage = bfd_get_symtab_upper_bound (abfd);
749 if (storage < 0)
5a3f568b
NC
750 {
751 non_fatal (_("failed to read symbol table from: %s"), bfd_get_filename (abfd));
752 bfd_fatal (_("error message was"));
753 }
781152ec 754
1944212b 755 if (storage)
c46b7066 756 {
1944212b
AM
757 off_t filesize = bfd_get_file_size (abfd);
758
759 /* qv PR 24707. */
760 if (filesize > 0
761 && filesize < storage
762 /* The MMO file format supports its own special compression
763 technique, so its sections can be larger than the file size. */
764 && bfd_get_flavour (abfd) != bfd_target_mmo_flavour)
765 {
766 bfd_nonfatal_message (bfd_get_filename (abfd), abfd, NULL,
767 _("error: symbol table size (%#lx) "
768 "is larger than filesize (%#lx)"),
769 storage, (long) filesize);
770 exit_status = 1;
771 symcount = 0;
772 return NULL;
773 }
774
775 sy = (asymbol **) xmalloc (storage);
781152ec 776 }
28b18af1 777
252b5132
RH
778 symcount = bfd_canonicalize_symtab (abfd, sy);
779 if (symcount < 0)
780 bfd_fatal (bfd_get_filename (abfd));
252b5132
RH
781 return sy;
782}
783
784/* Read in the dynamic symbols. */
785
786static asymbol **
46dca2e0 787slurp_dynamic_symtab (bfd *abfd)
252b5132 788{
d3ba0551 789 asymbol **sy = NULL;
252b5132
RH
790 long storage;
791
792 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
793 if (storage < 0)
794 {
795 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
796 {
37cc8ec1 797 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
a8c62f1c 798 exit_status = 1;
252b5132
RH
799 dynsymcount = 0;
800 return NULL;
801 }
802
803 bfd_fatal (bfd_get_filename (abfd));
804 }
c46b7066 805
1944212b
AM
806 if (storage)
807 sy = (asymbol **) xmalloc (storage);
28b18af1 808
252b5132
RH
809 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
810 if (dynsymcount < 0)
811 bfd_fatal (bfd_get_filename (abfd));
252b5132
RH
812 return sy;
813}
814
a24bb4f0
NC
815/* Some symbol names are significant and should be kept in the
816 table of sorted symbol names, even if they are marked as
817 debugging/section symbols. */
818
015dc7e1 819static bool
a24bb4f0
NC
820is_significant_symbol_name (const char * name)
821{
3f3328b8 822 return startswith (name, ".plt") || startswith (name, ".got");
a24bb4f0
NC
823}
824
252b5132
RH
825/* Filter out (in place) symbols that are useless for disassembly.
826 COUNT is the number of elements in SYMBOLS.
0af11b59 827 Return the number of useful symbols. */
252b5132
RH
828
829static long
46dca2e0 830remove_useless_symbols (asymbol **symbols, long count)
252b5132 831{
46dca2e0 832 asymbol **in_ptr = symbols, **out_ptr = symbols;
252b5132
RH
833
834 while (--count >= 0)
835 {
836 asymbol *sym = *in_ptr++;
837
838 if (sym->name == NULL || sym->name[0] == '\0')
839 continue;
a24bb4f0
NC
840 if ((sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
841 && ! is_significant_symbol_name (sym->name))
252b5132
RH
842 continue;
843 if (bfd_is_und_section (sym->section)
844 || bfd_is_com_section (sym->section))
845 continue;
846
847 *out_ptr++ = sym;
848 }
849 return out_ptr - symbols;
850}
851
660df28a
AM
852static const asection *compare_section;
853
252b5132
RH
854/* Sort symbols into value order. */
855
0af11b59 856static int
46dca2e0 857compare_symbols (const void *ap, const void *bp)
252b5132 858{
46dca2e0
NC
859 const asymbol *a = * (const asymbol **) ap;
860 const asymbol *b = * (const asymbol **) bp;
861 const char *an;
862 const char *bn;
863 size_t anl;
864 size_t bnl;
015dc7e1 865 bool as, af, bs, bf;
46dca2e0
NC
866 flagword aflags;
867 flagword bflags;
252b5132
RH
868
869 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
870 return 1;
871 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
872 return -1;
873
660df28a
AM
874 /* Prefer symbols from the section currently being disassembled.
875 Don't sort symbols from other sections by section, since there
876 isn't much reason to prefer one section over another otherwise.
877 See sym_ok comment for why we compare by section name. */
878 as = strcmp (compare_section->name, a->section->name) == 0;
879 bs = strcmp (compare_section->name, b->section->name) == 0;
880 if (as && !bs)
252b5132 881 return -1;
660df28a
AM
882 if (!as && bs)
883 return 1;
252b5132
RH
884
885 an = bfd_asymbol_name (a);
886 bn = bfd_asymbol_name (b);
887 anl = strlen (an);
888 bnl = strlen (bn);
889
890 /* The symbols gnu_compiled and gcc2_compiled convey no real
891 information, so put them after other symbols with the same value. */
252b5132
RH
892 af = (strstr (an, "gnu_compiled") != NULL
893 || strstr (an, "gcc2_compiled") != NULL);
894 bf = (strstr (bn, "gnu_compiled") != NULL
895 || strstr (bn, "gcc2_compiled") != NULL);
896
897 if (af && ! bf)
898 return 1;
899 if (! af && bf)
900 return -1;
901
902 /* We use a heuristic for the file name, to try to sort it after
903 more useful symbols. It may not work on non Unix systems, but it
904 doesn't really matter; the only difference is precisely which
905 symbol names get printed. */
906
907#define file_symbol(s, sn, snl) \
908 (((s)->flags & BSF_FILE) != 0 \
660df28a
AM
909 || ((snl) > 2 \
910 && (sn)[(snl) - 2] == '.' \
252b5132
RH
911 && ((sn)[(snl) - 1] == 'o' \
912 || (sn)[(snl) - 1] == 'a')))
913
914 af = file_symbol (a, an, anl);
915 bf = file_symbol (b, bn, bnl);
916
917 if (af && ! bf)
918 return 1;
919 if (! af && bf)
920 return -1;
921
660df28a
AM
922 /* Sort function and object symbols before global symbols before
923 local symbols before section symbols before debugging symbols. */
252b5132
RH
924
925 aflags = a->flags;
926 bflags = b->flags;
927
928 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
929 {
930 if ((aflags & BSF_DEBUGGING) != 0)
931 return 1;
932 else
933 return -1;
934 }
660df28a
AM
935 if ((aflags & BSF_SECTION_SYM) != (bflags & BSF_SECTION_SYM))
936 {
937 if ((aflags & BSF_SECTION_SYM) != 0)
938 return 1;
939 else
940 return -1;
941 }
252b5132
RH
942 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
943 {
944 if ((aflags & BSF_FUNCTION) != 0)
945 return -1;
946 else
947 return 1;
948 }
660df28a
AM
949 if ((aflags & BSF_OBJECT) != (bflags & BSF_OBJECT))
950 {
951 if ((aflags & BSF_OBJECT) != 0)
952 return -1;
953 else
954 return 1;
955 }
252b5132
RH
956 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
957 {
958 if ((aflags & BSF_LOCAL) != 0)
959 return 1;
960 else
961 return -1;
962 }
963 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
964 {
965 if ((aflags & BSF_GLOBAL) != 0)
966 return -1;
967 else
968 return 1;
969 }
970
32a0481f
AM
971 if (bfd_get_flavour (bfd_asymbol_bfd (a)) == bfd_target_elf_flavour
972 && bfd_get_flavour (bfd_asymbol_bfd (b)) == bfd_target_elf_flavour)
973 {
974 bfd_vma asz, bsz;
975
976 asz = 0;
160b1a61 977 if ((a->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
32a0481f
AM
978 asz = ((elf_symbol_type *) a)->internal_elf_sym.st_size;
979 bsz = 0;
160b1a61 980 if ((b->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
32a0481f
AM
981 bsz = ((elf_symbol_type *) b)->internal_elf_sym.st_size;
982 if (asz != bsz)
983 return asz > bsz ? -1 : 1;
984 }
985
252b5132
RH
986 /* Symbols that start with '.' might be section names, so sort them
987 after symbols that don't start with '.'. */
988 if (an[0] == '.' && bn[0] != '.')
989 return 1;
990 if (an[0] != '.' && bn[0] == '.')
991 return -1;
992
993 /* Finally, if we can't distinguish them in any other way, try to
994 get consistent results by sorting the symbols by name. */
995 return strcmp (an, bn);
996}
997
998/* Sort relocs into address order. */
999
1000static int
46dca2e0 1001compare_relocs (const void *ap, const void *bp)
252b5132 1002{
46dca2e0
NC
1003 const arelent *a = * (const arelent **) ap;
1004 const arelent *b = * (const arelent **) bp;
252b5132
RH
1005
1006 if (a->address > b->address)
1007 return 1;
1008 else if (a->address < b->address)
1009 return -1;
1010
1011 /* So that associated relocations tied to the same address show up
1012 in the correct order, we don't do any further sorting. */
1013 if (a > b)
1014 return 1;
1015 else if (a < b)
1016 return -1;
1017 else
1018 return 0;
1019}
1020
155e0d23
NC
1021/* Print an address (VMA) to the output stream in INFO.
1022 If SKIP_ZEROES is TRUE, omit leading zeroes. */
252b5132
RH
1023
1024static void
91d6fa6a 1025objdump_print_value (bfd_vma vma, struct disassemble_info *inf,
015dc7e1 1026 bool skip_zeroes)
252b5132
RH
1027{
1028 char buf[30];
1029 char *p;
3b9ad1cc 1030 struct objdump_disasm_info *aux;
252b5132 1031
91d6fa6a 1032 aux = (struct objdump_disasm_info *) inf->application_data;
d8180c76 1033 bfd_sprintf_vma (aux->abfd, buf, vma);
252b5132
RH
1034 if (! skip_zeroes)
1035 p = buf;
1036 else
1037 {
1038 for (p = buf; *p == '0'; ++p)
1039 ;
1040 if (*p == '\0')
1041 --p;
1042 }
91d6fa6a 1043 (*inf->fprintf_func) (inf->stream, "%s", p);
252b5132
RH
1044}
1045
1046/* Print the name of a symbol. */
1047
1048static void
91d6fa6a 1049objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
46dca2e0 1050 asymbol *sym)
252b5132
RH
1051{
1052 char *alloc;
bb4d2ac2 1053 const char *name, *version_string = NULL;
015dc7e1 1054 bool hidden = false;
252b5132
RH
1055
1056 alloc = NULL;
1057 name = bfd_asymbol_name (sym);
a6637ec0 1058 if (do_demangle && name[0] != '\0')
252b5132
RH
1059 {
1060 /* Demangle the name. */
af03af8f 1061 alloc = bfd_demangle (abfd, name, demangle_flags);
ed180cc5
AM
1062 if (alloc != NULL)
1063 name = alloc;
252b5132
RH
1064 }
1065
160b1a61 1066 if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
015dc7e1 1067 version_string = bfd_get_symbol_version_string (abfd, sym, true,
1081065c 1068 &hidden);
bb4d2ac2 1069
e6f7f6d1 1070 if (bfd_is_und_section (bfd_asymbol_section (sym)))
015dc7e1 1071 hidden = true;
bb4d2ac2 1072
12add40e
NC
1073 name = sanitize_string (name);
1074
91d6fa6a 1075 if (inf != NULL)
bb4d2ac2
L
1076 {
1077 (*inf->fprintf_func) (inf->stream, "%s", name);
1078 if (version_string && *version_string != '\0')
1079 (*inf->fprintf_func) (inf->stream, hidden ? "@%s" : "@@%s",
1080 version_string);
1081 }
252b5132 1082 else
bb4d2ac2
L
1083 {
1084 printf ("%s", name);
1085 if (version_string && *version_string != '\0')
1086 printf (hidden ? "@%s" : "@@%s", version_string);
1087 }
252b5132
RH
1088
1089 if (alloc != NULL)
1090 free (alloc);
1091}
1092
015dc7e1
AM
1093static inline bool
1094sym_ok (bool want_section,
1095 bfd *abfd ATTRIBUTE_UNUSED,
1096 long place,
1097 asection *sec,
1098 struct disassemble_info *inf)
39f0547e
NC
1099{
1100 if (want_section)
1101 {
a8c4d40b
L
1102 /* NB: An object file can have different sections with the same
1103 section name. Compare compare section pointers if they have
1104 the same owner. */
1105 if (sorted_syms[place]->section->owner == sec->owner
1106 && sorted_syms[place]->section != sec)
015dc7e1 1107 return false;
a8c4d40b 1108
39f0547e
NC
1109 /* Note - we cannot just compare section pointers because they could
1110 be different, but the same... Ie the symbol that we are trying to
1111 find could have come from a separate debug info file. Under such
1112 circumstances the symbol will be associated with a section in the
1113 debug info file, whilst the section we want is in a normal file.
1114 So the section pointers will be different, but the section names
1115 will be the same. */
fd361982
AM
1116 if (strcmp (bfd_section_name (sorted_syms[place]->section),
1117 bfd_section_name (sec)) != 0)
015dc7e1 1118 return false;
39f0547e
NC
1119 }
1120
1121 return inf->symbol_is_valid (sorted_syms[place], inf);
1122}
1123
22a398e1
NC
1124/* Locate a symbol given a bfd and a section (from INFO->application_data),
1125 and a VMA. If INFO->application_data->require_sec is TRUE, then always
1126 require the symbol to be in the section. Returns NULL if there is no
1127 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
1128 of the symbol in sorted_syms. */
252b5132
RH
1129
1130static asymbol *
3b9ad1cc 1131find_symbol_for_address (bfd_vma vma,
91d6fa6a 1132 struct disassemble_info *inf,
3b9ad1cc 1133 long *place)
252b5132
RH
1134{
1135 /* @@ Would it speed things up to cache the last two symbols returned,
1136 and maybe their address ranges? For many processors, only one memory
1137 operand can be present at a time, so the 2-entry cache wouldn't be
1138 constantly churned by code doing heavy memory accesses. */
1139
1140 /* Indices in `sorted_syms'. */
1141 long min = 0;
91d6fa6a 1142 long max_count = sorted_symcount;
252b5132 1143 long thisplace;
3b9ad1cc
AM
1144 struct objdump_disasm_info *aux;
1145 bfd *abfd;
1146 asection *sec;
1147 unsigned int opb;
015dc7e1 1148 bool want_section;
0e70b27b 1149 long rel_count;
252b5132
RH
1150
1151 if (sorted_symcount < 1)
1152 return NULL;
1153
91d6fa6a 1154 aux = (struct objdump_disasm_info *) inf->application_data;
3b9ad1cc 1155 abfd = aux->abfd;
f59f8978 1156 sec = inf->section;
91d6fa6a 1157 opb = inf->octets_per_byte;
3b9ad1cc 1158
252b5132 1159 /* Perform a binary search looking for the closest symbol to the
91d6fa6a
NC
1160 required value. We are searching the range (min, max_count]. */
1161 while (min + 1 < max_count)
252b5132
RH
1162 {
1163 asymbol *sym;
1164
91d6fa6a 1165 thisplace = (max_count + min) / 2;
252b5132
RH
1166 sym = sorted_syms[thisplace];
1167
1168 if (bfd_asymbol_value (sym) > vma)
91d6fa6a 1169 max_count = thisplace;
252b5132
RH
1170 else if (bfd_asymbol_value (sym) < vma)
1171 min = thisplace;
1172 else
1173 {
1174 min = thisplace;
1175 break;
1176 }
1177 }
1178
1179 /* The symbol we want is now in min, the low end of the range we
1180 were searching. If there are several symbols with the same
660df28a 1181 value, we want the first one. */
252b5132
RH
1182 thisplace = min;
1183 while (thisplace > 0
1184 && (bfd_asymbol_value (sorted_syms[thisplace])
660df28a 1185 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
252b5132
RH
1186 --thisplace;
1187
2b4590fb
AM
1188 /* Prefer a symbol in the current section if we have multple symbols
1189 with the same value, as can occur with overlays or zero size
1190 sections. */
1191 min = thisplace;
91d6fa6a 1192 while (min < max_count
2b4590fb
AM
1193 && (bfd_asymbol_value (sorted_syms[min])
1194 == bfd_asymbol_value (sorted_syms[thisplace])))
1195 {
015dc7e1 1196 if (sym_ok (true, abfd, min, sec, inf))
2b4590fb
AM
1197 {
1198 thisplace = min;
1199
1200 if (place != NULL)
1201 *place = thisplace;
1202
1203 return sorted_syms[thisplace];
1204 }
1205 ++min;
1206 }
1207
1049f94e 1208 /* If the file is relocatable, and the symbol could be from this
252b5132
RH
1209 section, prefer a symbol from this section over symbols from
1210 others, even if the other symbol's value might be closer.
0af11b59 1211
252b5132
RH
1212 Note that this may be wrong for some symbol references if the
1213 sections have overlapping memory ranges, but in that case there's
1214 no way to tell what's desired without looking at the relocation
e39ff52a 1215 table.
3aade688 1216
e39ff52a
PB
1217 Also give the target a chance to reject symbols. */
1218 want_section = (aux->require_sec
1219 || ((abfd->flags & HAS_RELOC) != 0
fd361982
AM
1220 && vma >= bfd_section_vma (sec)
1221 && vma < (bfd_section_vma (sec)
1222 + bfd_section_size (sec) / opb)));
39f0547e
NC
1223
1224 if (! sym_ok (want_section, abfd, thisplace, sec, inf))
252b5132
RH
1225 {
1226 long i;
2b4590fb 1227 long newplace = sorted_symcount;
98a91d6a 1228
2b4590fb 1229 for (i = min - 1; i >= 0; i--)
252b5132 1230 {
39f0547e 1231 if (sym_ok (want_section, abfd, i, sec, inf))
252b5132 1232 {
e39ff52a
PB
1233 if (newplace == sorted_symcount)
1234 newplace = i;
1235
1236 if (bfd_asymbol_value (sorted_syms[i])
1237 != bfd_asymbol_value (sorted_syms[newplace]))
1238 break;
1239
1240 /* Remember this symbol and keep searching until we reach
1241 an earlier address. */
1242 newplace = i;
252b5132
RH
1243 }
1244 }
1245
e39ff52a
PB
1246 if (newplace != sorted_symcount)
1247 thisplace = newplace;
1248 else
252b5132
RH
1249 {
1250 /* We didn't find a good symbol with a smaller value.
1251 Look for one with a larger value. */
1252 for (i = thisplace + 1; i < sorted_symcount; i++)
1253 {
39f0547e 1254 if (sym_ok (want_section, abfd, i, sec, inf))
252b5132
RH
1255 {
1256 thisplace = i;
1257 break;
1258 }
1259 }
1260 }
1261
39f0547e 1262 if (! sym_ok (want_section, abfd, thisplace, sec, inf))
22a398e1
NC
1263 /* There is no suitable symbol. */
1264 return NULL;
1265 }
1266
a24bb4f0
NC
1267 /* If we have not found an exact match for the specified address
1268 and we have dynamic relocations available, then we can produce
1269 a better result by matching a relocation to the address and
1270 using the symbol associated with that relocation. */
c3f72de4 1271 rel_count = inf->dynrelcount;
a24bb4f0 1272 if (!want_section
a24bb4f0 1273 && sorted_syms[thisplace]->value != vma
0e70b27b 1274 && rel_count > 0
c3f72de4
AM
1275 && inf->dynrelbuf != NULL
1276 && inf->dynrelbuf[0]->address <= vma
1277 && inf->dynrelbuf[rel_count - 1]->address >= vma
a24bb4f0
NC
1278 /* If we have matched a synthetic symbol, then stick with that. */
1279 && (sorted_syms[thisplace]->flags & BSF_SYNTHETIC) == 0)
1280 {
0e70b27b
L
1281 arelent ** rel_low;
1282 arelent ** rel_high;
a24bb4f0 1283
c3f72de4 1284 rel_low = inf->dynrelbuf;
0e70b27b
L
1285 rel_high = rel_low + rel_count - 1;
1286 while (rel_low <= rel_high)
a24bb4f0 1287 {
0e70b27b
L
1288 arelent **rel_mid = &rel_low[(rel_high - rel_low) / 2];
1289 arelent * rel = *rel_mid;
a24bb4f0 1290
0e70b27b 1291 if (rel->address == vma)
a24bb4f0 1292 {
0e70b27b
L
1293 /* Absolute relocations do not provide a more helpful
1294 symbolic address. Find a non-absolute relocation
1295 with the same address. */
1296 arelent **rel_vma = rel_mid;
1297 for (rel_mid--;
1298 rel_mid >= rel_low && rel_mid[0]->address == vma;
1299 rel_mid--)
1300 rel_vma = rel_mid;
1301
1302 for (; rel_vma <= rel_high && rel_vma[0]->address == vma;
1303 rel_vma++)
1304 {
1305 rel = *rel_vma;
1306 if (rel->sym_ptr_ptr != NULL
1307 && ! bfd_is_abs_section ((* rel->sym_ptr_ptr)->section))
1308 {
1309 if (place != NULL)
1310 * place = thisplace;
1311 return * rel->sym_ptr_ptr;
1312 }
1313 }
1314 break;
a24bb4f0
NC
1315 }
1316
0e70b27b
L
1317 if (vma < rel->address)
1318 rel_high = rel_mid;
1319 else if (vma >= rel_mid[1]->address)
1320 rel_low = rel_mid + 1;
1321 else
a24bb4f0
NC
1322 break;
1323 }
1324 }
1325
252b5132
RH
1326 if (place != NULL)
1327 *place = thisplace;
1328
1329 return sorted_syms[thisplace];
1330}
1331
155e0d23 1332/* Print an address and the offset to the nearest symbol. */
252b5132
RH
1333
1334static void
46dca2e0 1335objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
91d6fa6a 1336 bfd_vma vma, struct disassemble_info *inf,
015dc7e1 1337 bool skip_zeroes)
252b5132 1338{
b1bc1394
AM
1339 if (!no_addresses)
1340 {
1341 objdump_print_value (vma, inf, skip_zeroes);
1342 (*inf->fprintf_func) (inf->stream, " ");
1343 }
252b5132
RH
1344
1345 if (sym == NULL)
1346 {
1347 bfd_vma secaddr;
1348
b1bc1394 1349 (*inf->fprintf_func) (inf->stream, "<%s",
fd361982
AM
1350 sanitize_string (bfd_section_name (sec)));
1351 secaddr = bfd_section_vma (sec);
252b5132
RH
1352 if (vma < secaddr)
1353 {
91d6fa6a 1354 (*inf->fprintf_func) (inf->stream, "-0x");
015dc7e1 1355 objdump_print_value (secaddr - vma, inf, true);
252b5132
RH
1356 }
1357 else if (vma > secaddr)
1358 {
91d6fa6a 1359 (*inf->fprintf_func) (inf->stream, "+0x");
015dc7e1 1360 objdump_print_value (vma - secaddr, inf, true);
252b5132 1361 }
91d6fa6a 1362 (*inf->fprintf_func) (inf->stream, ">");
252b5132
RH
1363 }
1364 else
1365 {
b1bc1394 1366 (*inf->fprintf_func) (inf->stream, "<");
a24bb4f0 1367
91d6fa6a 1368 objdump_print_symname (abfd, inf, sym);
a24bb4f0
NC
1369
1370 if (bfd_asymbol_value (sym) == vma)
1371 ;
1372 /* Undefined symbols in an executables and dynamic objects do not have
1373 a value associated with them, so it does not make sense to display
1374 an offset relative to them. Normally we would not be provided with
1375 this kind of symbol, but the target backend might choose to do so,
1376 and the code in find_symbol_for_address might return an as yet
1377 unresolved symbol associated with a dynamic reloc. */
1378 else if ((bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
1379 && bfd_is_und_section (sym->section))
1380 ;
1381 else if (bfd_asymbol_value (sym) > vma)
252b5132 1382 {
91d6fa6a 1383 (*inf->fprintf_func) (inf->stream, "-0x");
015dc7e1 1384 objdump_print_value (bfd_asymbol_value (sym) - vma, inf, true);
252b5132
RH
1385 }
1386 else if (vma > bfd_asymbol_value (sym))
1387 {
91d6fa6a 1388 (*inf->fprintf_func) (inf->stream, "+0x");
015dc7e1 1389 objdump_print_value (vma - bfd_asymbol_value (sym), inf, true);
252b5132 1390 }
a24bb4f0 1391
91d6fa6a 1392 (*inf->fprintf_func) (inf->stream, ">");
252b5132 1393 }
98ec6e72
NC
1394
1395 if (display_file_offsets)
91d6fa6a 1396 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
98ec6e72 1397 (long int)(sec->filepos + (vma - sec->vma)));
252b5132
RH
1398}
1399
155e0d23
NC
1400/* Print an address (VMA), symbolically if possible.
1401 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
252b5132
RH
1402
1403static void
3b9ad1cc 1404objdump_print_addr (bfd_vma vma,
91d6fa6a 1405 struct disassemble_info *inf,
015dc7e1 1406 bool skip_zeroes)
252b5132 1407{
3b9ad1cc 1408 struct objdump_disasm_info *aux;
d253b654 1409 asymbol *sym = NULL;
015dc7e1 1410 bool skip_find = false;
252b5132 1411
91d6fa6a 1412 aux = (struct objdump_disasm_info *) inf->application_data;
32760852 1413
252b5132
RH
1414 if (sorted_symcount < 1)
1415 {
b1bc1394
AM
1416 if (!no_addresses)
1417 {
1418 (*inf->fprintf_func) (inf->stream, "0x");
1419 objdump_print_value (vma, inf, skip_zeroes);
1420 }
32760852
NC
1421
1422 if (display_file_offsets)
91d6fa6a 1423 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
f59f8978
AM
1424 (long int) (inf->section->filepos
1425 + (vma - inf->section->vma)));
252b5132
RH
1426 return;
1427 }
1428
ce04548a
NC
1429 if (aux->reloc != NULL
1430 && aux->reloc->sym_ptr_ptr != NULL
1431 && * aux->reloc->sym_ptr_ptr != NULL)
1432 {
1433 sym = * aux->reloc->sym_ptr_ptr;
1434
1435 /* Adjust the vma to the reloc. */
1436 vma += bfd_asymbol_value (sym);
1437
e6f7f6d1 1438 if (bfd_is_und_section (bfd_asymbol_section (sym)))
015dc7e1 1439 skip_find = true;
ce04548a
NC
1440 }
1441
1442 if (!skip_find)
91d6fa6a 1443 sym = find_symbol_for_address (vma, inf, NULL);
ce04548a 1444
f59f8978 1445 objdump_print_addr_with_sym (aux->abfd, inf->section, sym, vma, inf,
252b5132
RH
1446 skip_zeroes);
1447}
1448
1449/* Print VMA to INFO. This function is passed to the disassembler
1450 routine. */
1451
1452static void
91d6fa6a 1453objdump_print_address (bfd_vma vma, struct disassemble_info *inf)
252b5132 1454{
91d6fa6a 1455 objdump_print_addr (vma, inf, ! prefix_addresses);
252b5132
RH
1456}
1457
2ae86dfc 1458/* Determine if the given address has a symbol associated with it. */
252b5132 1459
a2e66773 1460static asymbol *
91d6fa6a 1461objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
252b5132 1462{
252b5132
RH
1463 asymbol * sym;
1464
91d6fa6a 1465 sym = find_symbol_for_address (vma, inf, NULL);
a2e66773
AM
1466 if (sym != NULL && bfd_asymbol_value (sym) == vma)
1467 return sym;
252b5132 1468
a2e66773 1469 return NULL;
252b5132
RH
1470}
1471
1472/* Hold the last function name and the last line number we displayed
1473 in a disassembly. */
1474
1475static char *prev_functionname;
1476static unsigned int prev_line;
9b8d1a36 1477static unsigned int prev_discriminator;
252b5132
RH
1478
1479/* We keep a list of all files that we have seen when doing a
50c2245b 1480 disassembly with source, so that we know how much of the file to
252b5132
RH
1481 display. This can be important for inlined functions. */
1482
1483struct print_file_list
1484{
1485 struct print_file_list *next;
43ac9881
AM
1486 const char *filename;
1487 const char *modname;
3aade688 1488 const char *map;
e8f5eee4 1489 size_t mapsize;
3aade688 1490 const char **linemap;
e8f5eee4
NC
1491 unsigned maxline;
1492 unsigned last_line;
43339b1d 1493 unsigned max_printed;
e8f5eee4 1494 int first;
252b5132
RH
1495};
1496
1497static struct print_file_list *print_files;
1498
1499/* The number of preceding context lines to show when we start
1500 displaying a file for the first time. */
1501
1502#define SHOW_PRECEDING_CONTEXT_LINES (5)
1503
417ed8af 1504/* Read a complete file into memory. */
e8f5eee4
NC
1505
1506static const char *
5ef2d51b 1507slurp_file (const char *fn, size_t *size, struct stat *fst)
e8f5eee4
NC
1508{
1509#ifdef HAVE_MMAP
1510 int ps = getpagesize ();
1511 size_t msize;
1512#endif
1513 const char *map;
417ed8af 1514 int fd = open (fn, O_RDONLY | O_BINARY);
e8f5eee4
NC
1515
1516 if (fd < 0)
1517 return NULL;
5ef2d51b 1518 if (fstat (fd, fst) < 0)
6c713012
AM
1519 {
1520 close (fd);
1521 return NULL;
1522 }
5ef2d51b 1523 *size = fst->st_size;
e8f5eee4
NC
1524#ifdef HAVE_MMAP
1525 msize = (*size + ps - 1) & ~(ps - 1);
1526 map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
6c713012 1527 if (map != (char *) -1L)
e8f5eee4 1528 {
6c713012
AM
1529 close (fd);
1530 return map;
e8f5eee4
NC
1531 }
1532#endif
3f5e193b 1533 map = (const char *) malloc (*size);
6c713012
AM
1534 if (!map || (size_t) read (fd, (char *) map, *size) != *size)
1535 {
1536 free ((void *) map);
e8f5eee4
NC
1537 map = NULL;
1538 }
1539 close (fd);
6c713012 1540 return map;
e8f5eee4
NC
1541}
1542
1543#define line_map_decrease 5
1544
1545/* Precompute array of lines for a mapped file. */
1546
3aade688
L
1547static const char **
1548index_file (const char *map, size_t size, unsigned int *maxline)
e8f5eee4
NC
1549{
1550 const char *p, *lstart, *end;
1551 int chars_per_line = 45; /* First iteration will use 40. */
1552 unsigned int lineno;
3aade688 1553 const char **linemap = NULL;
e8f5eee4 1554 unsigned long line_map_size = 0;
3aade688 1555
e8f5eee4
NC
1556 lineno = 0;
1557 lstart = map;
1558 end = map + size;
1559
3aade688
L
1560 for (p = map; p < end; p++)
1561 {
1562 if (*p == '\n')
1563 {
1564 if (p + 1 < end && p[1] == '\r')
1565 p++;
1566 }
1567 else if (*p == '\r')
1568 {
e8f5eee4
NC
1569 if (p + 1 < end && p[1] == '\n')
1570 p++;
1571 }
1572 else
1573 continue;
3aade688 1574
e8f5eee4
NC
1575 /* End of line found. */
1576
3aade688
L
1577 if (linemap == NULL || line_map_size < lineno + 1)
1578 {
e8f5eee4
NC
1579 unsigned long newsize;
1580
1581 chars_per_line -= line_map_decrease;
1582 if (chars_per_line <= 1)
1583 chars_per_line = 1;
1584 line_map_size = size / chars_per_line + 1;
1585 if (line_map_size < lineno + 1)
1586 line_map_size = lineno + 1;
1587 newsize = line_map_size * sizeof (char *);
3f5e193b 1588 linemap = (const char **) xrealloc (linemap, newsize);
e8f5eee4
NC
1589 }
1590
3aade688
L
1591 linemap[lineno++] = lstart;
1592 lstart = p + 1;
e8f5eee4 1593 }
3aade688
L
1594
1595 *maxline = lineno;
e8f5eee4
NC
1596 return linemap;
1597}
1598
43ac9881
AM
1599/* Tries to open MODNAME, and if successful adds a node to print_files
1600 linked list and returns that node. Returns NULL on failure. */
1601
1602static struct print_file_list *
5ef2d51b 1603try_print_file_open (const char *origname, const char *modname, struct stat *fst)
43ac9881
AM
1604{
1605 struct print_file_list *p;
43ac9881 1606
3f5e193b 1607 p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
43ac9881 1608
5ef2d51b 1609 p->map = slurp_file (modname, &p->mapsize, fst);
e8f5eee4 1610 if (p->map == NULL)
43ac9881 1611 {
e8f5eee4
NC
1612 free (p);
1613 return NULL;
43ac9881 1614 }
3aade688 1615
e8f5eee4
NC
1616 p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1617 p->last_line = 0;
43339b1d 1618 p->max_printed = 0;
43ac9881
AM
1619 p->filename = origname;
1620 p->modname = modname;
43ac9881 1621 p->next = print_files;
e8f5eee4 1622 p->first = 1;
43ac9881
AM
1623 print_files = p;
1624 return p;
1625}
1626
a8685210 1627/* If the source file, as described in the symtab, is not found
43ac9881
AM
1628 try to locate it in one of the paths specified with -I
1629 If found, add location to print_files linked list. */
1630
1631static struct print_file_list *
5ef2d51b 1632update_source_path (const char *filename, bfd *abfd)
43ac9881
AM
1633{
1634 struct print_file_list *p;
1635 const char *fname;
5ef2d51b 1636 struct stat fst;
43ac9881
AM
1637 int i;
1638
5ef2d51b
AM
1639 p = try_print_file_open (filename, filename, &fst);
1640 if (p == NULL)
1641 {
1642 if (include_path_count == 0)
1643 return NULL;
43ac9881 1644
5ef2d51b
AM
1645 /* Get the name of the file. */
1646 fname = lbasename (filename);
43ac9881 1647
5ef2d51b
AM
1648 /* If file exists under a new path, we need to add it to the list
1649 so that show_line knows about it. */
1650 for (i = 0; i < include_path_count; i++)
1651 {
1652 char *modname = concat (include_paths[i], "/", fname,
1653 (const char *) 0);
43ac9881 1654
5ef2d51b
AM
1655 p = try_print_file_open (filename, modname, &fst);
1656 if (p)
1657 break;
43ac9881 1658
5ef2d51b
AM
1659 free (modname);
1660 }
1661 }
1662
1663 if (p != NULL)
1664 {
1665 long mtime = bfd_get_mtime (abfd);
43ac9881 1666
5ef2d51b
AM
1667 if (fst.st_mtime > mtime)
1668 warn (_("source file %s is more recent than object file\n"),
1669 filename);
43ac9881
AM
1670 }
1671
5ef2d51b 1672 return p;
43ac9881
AM
1673}
1674
e8f5eee4 1675/* Print a source file line. */
252b5132 1676
3aade688 1677static void
91d6fa6a 1678print_line (struct print_file_list *p, unsigned int linenum)
252b5132 1679{
e8f5eee4 1680 const char *l;
615f3149 1681 size_t len;
3aade688
L
1682
1683 --linenum;
91d6fa6a 1684 if (linenum >= p->maxline)
e8f5eee4 1685 return;
91d6fa6a 1686 l = p->linemap [linenum];
a1c110a3
NC
1687 if (source_comment != NULL && strlen (l) > 0)
1688 printf ("%s", source_comment);
615f3149 1689 len = strcspn (l, "\n\r");
a1c110a3 1690 /* Test fwrite return value to quiet glibc warning. */
615f3149
AM
1691 if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1692 putchar ('\n');
1693}
252b5132 1694
e8f5eee4 1695/* Print a range of source code lines. */
252b5132 1696
e8f5eee4
NC
1697static void
1698dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1699{
1700 if (p->map == NULL)
1701 return;
3aade688 1702 while (start <= end)
e8f5eee4
NC
1703 {
1704 print_line (p, start);
1705 start++;
252b5132 1706 }
0af11b59 1707}
252b5132 1708
50c2245b 1709/* Show the line number, or the source line, in a disassembly
252b5132
RH
1710 listing. */
1711
1712static void
46dca2e0 1713show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
252b5132 1714{
b1f88ebe
AM
1715 const char *filename;
1716 const char *functionname;
91d6fa6a 1717 unsigned int linenumber;
9b8d1a36 1718 unsigned int discriminator;
015dc7e1 1719 bool reloc;
e1fa0163 1720 char *path = NULL;
252b5132
RH
1721
1722 if (! with_line_numbers && ! with_source_code)
1723 return;
1724
9b8d1a36 1725 if (! bfd_find_nearest_line_discriminator (abfd, section, syms, addr_offset,
8b5b2529
AM
1726 &filename, &functionname,
1727 &linenumber, &discriminator))
252b5132
RH
1728 return;
1729
1730 if (filename != NULL && *filename == '\0')
1731 filename = NULL;
1732 if (functionname != NULL && *functionname == '\0')
1733 functionname = NULL;
1734
0dafdf3f
L
1735 if (filename
1736 && IS_ABSOLUTE_PATH (filename)
1737 && prefix)
1738 {
1739 char *path_up;
1740 const char *fname = filename;
e1fa0163 1741
13acb58d 1742 path = xmalloc (prefix_length + 1 + strlen (filename));
0dafdf3f
L
1743
1744 if (prefix_length)
1745 memcpy (path, prefix, prefix_length);
1746 path_up = path + prefix_length;
1747
1748 /* Build relocated filename, stripping off leading directories
e1fa0163 1749 from the initial filename if requested. */
0dafdf3f
L
1750 if (prefix_strip > 0)
1751 {
1752 int level = 0;
1753 const char *s;
1754
e1fa0163 1755 /* Skip selected directory levels. */
0dafdf3f 1756 for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
82a9ed20 1757 if (IS_DIR_SEPARATOR (*s))
0dafdf3f
L
1758 {
1759 fname = s;
1760 level++;
1761 }
1762 }
1763
e1fa0163 1764 /* Update complete filename. */
13acb58d 1765 strcpy (path_up, fname);
0dafdf3f
L
1766
1767 filename = path;
015dc7e1 1768 reloc = true;
0dafdf3f
L
1769 }
1770 else
015dc7e1 1771 reloc = false;
0dafdf3f 1772
252b5132
RH
1773 if (with_line_numbers)
1774 {
1775 if (functionname != NULL
1776 && (prev_functionname == NULL
1777 || strcmp (functionname, prev_functionname) != 0))
8b5b2529 1778 {
741cb839
EC
1779 char *demangle_alloc = NULL;
1780 if (do_demangle && functionname[0] != '\0')
1781 {
1782 /* Demangle the name. */
1783 demangle_alloc = bfd_demangle (abfd, functionname,
1784 demangle_flags);
1785 }
1786
1787 /* Demangling adds trailing parens, so don't print those. */
1788 if (demangle_alloc != NULL)
1789 printf ("%s:\n", sanitize_string (demangle_alloc));
1790 else
1791 printf ("%s():\n", sanitize_string (functionname));
1792
8b5b2529 1793 prev_line = -1;
741cb839 1794 free (demangle_alloc);
8b5b2529
AM
1795 }
1796 if (linenumber > 0
1797 && (linenumber != prev_line
1798 || discriminator != prev_discriminator))
1799 {
1800 if (discriminator > 0)
1801 printf ("%s:%u (discriminator %u)\n",
12add40e 1802 filename == NULL ? "???" : sanitize_string (filename),
8b5b2529
AM
1803 linenumber, discriminator);
1804 else
12add40e
NC
1805 printf ("%s:%u\n", filename == NULL
1806 ? "???" : sanitize_string (filename),
8b5b2529
AM
1807 linenumber);
1808 }
4a14e306
AK
1809 if (unwind_inlines)
1810 {
1811 const char *filename2;
1812 const char *functionname2;
1813 unsigned line2;
1814
1815 while (bfd_find_inliner_info (abfd, &filename2, &functionname2,
1816 &line2))
12add40e
NC
1817 {
1818 printf ("inlined by %s:%u",
1819 sanitize_string (filename2), line2);
1820 printf (" (%s)\n", sanitize_string (functionname2));
1821 }
4a14e306 1822 }
252b5132
RH
1823 }
1824
1825 if (with_source_code
1826 && filename != NULL
91d6fa6a 1827 && linenumber > 0)
252b5132
RH
1828 {
1829 struct print_file_list **pp, *p;
e8f5eee4 1830 unsigned l;
252b5132
RH
1831
1832 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
8b6efd89 1833 if (filename_cmp ((*pp)->filename, filename) == 0)
252b5132
RH
1834 break;
1835 p = *pp;
1836
e8f5eee4 1837 if (p == NULL)
0dafdf3f
L
1838 {
1839 if (reloc)
1840 filename = xstrdup (filename);
5ef2d51b 1841 p = update_source_path (filename, abfd);
0dafdf3f 1842 }
252b5132 1843
91d6fa6a 1844 if (p != NULL && linenumber != p->last_line)
e8f5eee4 1845 {
3aade688 1846 if (file_start_context && p->first)
e8f5eee4 1847 l = 1;
3aade688 1848 else
252b5132 1849 {
91d6fa6a 1850 l = linenumber - SHOW_PRECEDING_CONTEXT_LINES;
3aade688 1851 if (l >= linenumber)
e8f5eee4 1852 l = 1;
43339b1d
AM
1853 if (p->max_printed >= l)
1854 {
1855 if (p->max_printed < linenumber)
1856 l = p->max_printed + 1;
1857 else
1858 l = linenumber;
1859 }
252b5132 1860 }
91d6fa6a 1861 dump_lines (p, l, linenumber);
43339b1d
AM
1862 if (p->max_printed < linenumber)
1863 p->max_printed = linenumber;
91d6fa6a 1864 p->last_line = linenumber;
e8f5eee4 1865 p->first = 0;
252b5132
RH
1866 }
1867 }
1868
1869 if (functionname != NULL
1870 && (prev_functionname == NULL
1871 || strcmp (functionname, prev_functionname) != 0))
1872 {
1873 if (prev_functionname != NULL)
1874 free (prev_functionname);
3f5e193b 1875 prev_functionname = (char *) xmalloc (strlen (functionname) + 1);
252b5132
RH
1876 strcpy (prev_functionname, functionname);
1877 }
1878
91d6fa6a
NC
1879 if (linenumber > 0 && linenumber != prev_line)
1880 prev_line = linenumber;
9b8d1a36
CC
1881
1882 if (discriminator != prev_discriminator)
1883 prev_discriminator = discriminator;
e1fa0163
NC
1884
1885 if (path)
1886 free (path);
252b5132
RH
1887}
1888
1889/* Pseudo FILE object for strings. */
1890typedef struct
1891{
1892 char *buffer;
6f104306
NS
1893 size_t pos;
1894 size_t alloc;
252b5132
RH
1895} SFILE;
1896
46dca2e0 1897/* sprintf to a "stream". */
252b5132 1898
0fd3a477 1899static int ATTRIBUTE_PRINTF_2
46dca2e0 1900objdump_sprintf (SFILE *f, const char *format, ...)
252b5132 1901{
252b5132 1902 size_t n;
46dca2e0 1903 va_list args;
252b5132 1904
6f104306 1905 while (1)
252b5132 1906 {
6f104306 1907 size_t space = f->alloc - f->pos;
3aade688 1908
6f104306
NS
1909 va_start (args, format);
1910 n = vsnprintf (f->buffer + f->pos, space, format, args);
451dad9c 1911 va_end (args);
252b5132 1912
6f104306
NS
1913 if (space > n)
1914 break;
3aade688 1915
6f104306 1916 f->alloc = (f->alloc + n) * 2;
3f5e193b 1917 f->buffer = (char *) xrealloc (f->buffer, f->alloc);
252b5132 1918 }
6f104306 1919 f->pos += n;
3aade688 1920
252b5132
RH
1921 return n;
1922}
1923
1d67fe3b
TT
1924/* Code for generating (colored) diagrams of control flow start and end
1925 points. */
1926
1927/* Structure used to store the properties of a jump. */
1928
1929struct jump_info
1930{
1931 /* The next jump, or NULL if this is the last object. */
1932 struct jump_info *next;
1933 /* The previous jump, or NULL if this is the first object. */
1934 struct jump_info *prev;
1935 /* The start addresses of the jump. */
1936 struct
1937 {
1938 /* The list of start addresses. */
1939 bfd_vma *addresses;
1940 /* The number of elements. */
1941 size_t count;
1942 /* The maximum number of elements that fit into the array. */
1943 size_t max_count;
1944 } start;
1945 /* The end address of the jump. */
1946 bfd_vma end;
1947 /* The drawing level of the jump. */
1948 int level;
1949};
1950
1951/* Construct a jump object for a jump from start
1952 to end with the corresponding level. */
1953
1954static struct jump_info *
1955jump_info_new (bfd_vma start, bfd_vma end, int level)
1956{
1957 struct jump_info *result = xmalloc (sizeof (struct jump_info));
1958
1959 result->next = NULL;
1960 result->prev = NULL;
1961 result->start.addresses = xmalloc (sizeof (bfd_vma *) * 2);
1962 result->start.addresses[0] = start;
1963 result->start.count = 1;
1964 result->start.max_count = 2;
1965 result->end = end;
1966 result->level = level;
1967
1968 return result;
1969}
1970
1971/* Free a jump object and return the next object
1972 or NULL if this was the last one. */
1973
1974static struct jump_info *
1975jump_info_free (struct jump_info *ji)
1976{
1977 struct jump_info *result = NULL;
1978
1979 if (ji)
1980 {
1981 result = ji->next;
1982 if (ji->start.addresses)
1983 free (ji->start.addresses);
1984 free (ji);
1985 }
1986
1987 return result;
1988}
1989
1990/* Get the smallest value of all start and end addresses. */
1991
1992static bfd_vma
1993jump_info_min_address (const struct jump_info *ji)
1994{
1995 bfd_vma min_address = ji->end;
1996 size_t i;
1997
1998 for (i = ji->start.count; i-- > 0;)
1999 if (ji->start.addresses[i] < min_address)
2000 min_address = ji->start.addresses[i];
2001 return min_address;
2002}
2003
2004/* Get the largest value of all start and end addresses. */
2005
2006static bfd_vma
2007jump_info_max_address (const struct jump_info *ji)
2008{
2009 bfd_vma max_address = ji->end;
2010 size_t i;
2011
2012 for (i = ji->start.count; i-- > 0;)
2013 if (ji->start.addresses[i] > max_address)
2014 max_address = ji->start.addresses[i];
2015 return max_address;
2016}
2017
2018/* Get the target address of a jump. */
2019
2020static bfd_vma
2021jump_info_end_address (const struct jump_info *ji)
2022{
2023 return ji->end;
2024}
2025
2026/* Test if an address is one of the start addresses of a jump. */
2027
015dc7e1 2028static bool
1d67fe3b
TT
2029jump_info_is_start_address (const struct jump_info *ji, bfd_vma address)
2030{
015dc7e1 2031 bool result = false;
1d67fe3b
TT
2032 size_t i;
2033
2034 for (i = ji->start.count; i-- > 0;)
2035 if (address == ji->start.addresses[i])
2036 {
015dc7e1 2037 result = true;
1d67fe3b
TT
2038 break;
2039 }
2040
2041 return result;
2042}
2043
2044/* Test if an address is the target address of a jump. */
2045
015dc7e1 2046static bool
1d67fe3b
TT
2047jump_info_is_end_address (const struct jump_info *ji, bfd_vma address)
2048{
2049 return (address == ji->end);
2050}
2051
2052/* Get the difference between the smallest and largest address of a jump. */
2053
2054static bfd_vma
2055jump_info_size (const struct jump_info *ji)
2056{
2057 return jump_info_max_address (ji) - jump_info_min_address (ji);
2058}
2059
2060/* Unlink a jump object from a list. */
2061
2062static void
2063jump_info_unlink (struct jump_info *node,
2064 struct jump_info **base)
2065{
2066 if (node->next)
2067 node->next->prev = node->prev;
2068 if (node->prev)
2069 node->prev->next = node->next;
2070 else
2071 *base = node->next;
2072 node->next = NULL;
2073 node->prev = NULL;
2074}
2075
2076/* Insert unlinked jump info node into a list. */
2077
2078static void
2079jump_info_insert (struct jump_info *node,
2080 struct jump_info *target,
2081 struct jump_info **base)
2082{
2083 node->next = target;
2084 node->prev = target->prev;
2085 target->prev = node;
2086 if (node->prev)
2087 node->prev->next = node;
2088 else
2089 *base = node;
2090}
2091
2092/* Add unlinked node to the front of a list. */
2093
2094static void
2095jump_info_add_front (struct jump_info *node,
2096 struct jump_info **base)
2097{
2098 node->next = *base;
2099 if (node->next)
2100 node->next->prev = node;
2101 node->prev = NULL;
2102 *base = node;
2103}
2104
2105/* Move linked node to target position. */
2106
2107static void
2108jump_info_move_linked (struct jump_info *node,
2109 struct jump_info *target,
2110 struct jump_info **base)
2111{
2112 /* Unlink node. */
2113 jump_info_unlink (node, base);
2114 /* Insert node at target position. */
2115 jump_info_insert (node, target, base);
2116}
2117
2118/* Test if two jumps intersect. */
2119
015dc7e1 2120static bool
1d67fe3b
TT
2121jump_info_intersect (const struct jump_info *a,
2122 const struct jump_info *b)
2123{
2124 return ((jump_info_max_address (a) >= jump_info_min_address (b))
2125 && (jump_info_min_address (a) <= jump_info_max_address (b)));
2126}
2127
2128/* Merge two compatible jump info objects. */
2129
2130static void
2131jump_info_merge (struct jump_info **base)
2132{
2133 struct jump_info *a;
2134
2135 for (a = *base; a; a = a->next)
2136 {
2137 struct jump_info *b;
2138
2139 for (b = a->next; b; b = b->next)
2140 {
2141 /* Merge both jumps into one. */
2142 if (a->end == b->end)
2143 {
2144 /* Reallocate addresses. */
2145 size_t needed_size = a->start.count + b->start.count;
2146 size_t i;
2147
2148 if (needed_size > a->start.max_count)
2149 {
2150 a->start.max_count += b->start.max_count;
2151 a->start.addresses =
2152 xrealloc (a->start.addresses,
82a9ed20 2153 a->start.max_count * sizeof (bfd_vma *));
1d67fe3b
TT
2154 }
2155
2156 /* Append start addresses. */
2157 for (i = 0; i < b->start.count; ++i)
2158 a->start.addresses[a->start.count++] =
2159 b->start.addresses[i];
2160
2161 /* Remove and delete jump. */
2162 struct jump_info *tmp = b->prev;
2163 jump_info_unlink (b, base);
2164 jump_info_free (b);
2165 b = tmp;
2166 }
2167 }
2168 }
2169}
2170
2171/* Sort jumps by their size and starting point using a stable
2172 minsort. This could be improved if sorting performance is
2173 an issue, for example by using mergesort. */
2174
2175static void
2176jump_info_sort (struct jump_info **base)
2177{
2178 struct jump_info *current_element = *base;
2179
2180 while (current_element)
2181 {
2182 struct jump_info *best_match = current_element;
2183 struct jump_info *runner = current_element->next;
2184 bfd_vma best_size = jump_info_size (best_match);
2185
2186 while (runner)
2187 {
2188 bfd_vma runner_size = jump_info_size (runner);
2189
2190 if ((runner_size < best_size)
2191 || ((runner_size == best_size)
2192 && (jump_info_min_address (runner)
2193 < jump_info_min_address (best_match))))
2194 {
2195 best_match = runner;
2196 best_size = runner_size;
2197 }
2198
2199 runner = runner->next;
2200 }
2201
2202 if (best_match == current_element)
2203 current_element = current_element->next;
2204 else
2205 jump_info_move_linked (best_match, current_element, base);
2206 }
2207}
2208
2209/* Visualize all jumps at a given address. */
2210
2211static void
82a9ed20 2212jump_info_visualize_address (bfd_vma address,
1d67fe3b
TT
2213 int max_level,
2214 char *line_buffer,
2215 uint8_t *color_buffer)
2216{
82a9ed20 2217 struct jump_info *ji = detected_jumps;
1d67fe3b 2218 size_t len = (max_level + 1) * 3;
1d67fe3b
TT
2219
2220 /* Clear line buffer. */
82a9ed20
TT
2221 memset (line_buffer, ' ', len);
2222 memset (color_buffer, 0, len);
1d67fe3b
TT
2223
2224 /* Iterate over jumps and add their ASCII art. */
82a9ed20 2225 while (ji)
1d67fe3b 2226 {
82a9ed20
TT
2227 /* Discard jumps that are never needed again. */
2228 if (jump_info_max_address (ji) < address)
2229 {
2230 struct jump_info *tmp = ji;
2231
2232 ji = ji->next;
2233 jump_info_unlink (tmp, &detected_jumps);
2234 jump_info_free (tmp);
2235 continue;
2236 }
2237
2238 /* This jump intersects with the current address. */
2239 if (jump_info_min_address (ji) <= address)
1d67fe3b
TT
2240 {
2241 /* Hash target address to get an even
2242 distribution between all values. */
2243 bfd_vma hash_address = jump_info_end_address (ji);
2244 uint8_t color = iterative_hash_object (hash_address, 0);
2245 /* Fetch line offset. */
2246 int offset = (max_level - ji->level) * 3;
2247
2248 /* Draw start line. */
2249 if (jump_info_is_start_address (ji, address))
2250 {
2251 size_t i = offset + 1;
2252
2253 for (; i < len - 1; ++i)
2254 if (line_buffer[i] == ' ')
2255 {
2256 line_buffer[i] = '-';
2257 color_buffer[i] = color;
2258 }
2259
2260 if (line_buffer[i] == ' ')
2261 {
2262 line_buffer[i] = '-';
2263 color_buffer[i] = color;
2264 }
2265 else if (line_buffer[i] == '>')
2266 {
2267 line_buffer[i] = 'X';
2268 color_buffer[i] = color;
2269 }
2270
2271 if (line_buffer[offset] == ' ')
2272 {
2273 if (address <= ji->end)
2274 line_buffer[offset] =
2275 (jump_info_min_address (ji) == address) ? '/': '+';
2276 else
2277 line_buffer[offset] =
2278 (jump_info_max_address (ji) == address) ? '\\': '+';
2279 color_buffer[offset] = color;
2280 }
2281 }
2282 /* Draw jump target. */
2283 else if (jump_info_is_end_address (ji, address))
2284 {
2285 size_t i = offset + 1;
2286
2287 for (; i < len - 1; ++i)
2288 if (line_buffer[i] == ' ')
2289 {
2290 line_buffer[i] = '-';
2291 color_buffer[i] = color;
2292 }
2293
2294 if (line_buffer[i] == ' ')
2295 {
2296 line_buffer[i] = '>';
2297 color_buffer[i] = color;
2298 }
2299 else if (line_buffer[i] == '-')
2300 {
2301 line_buffer[i] = 'X';
2302 color_buffer[i] = color;
2303 }
2304
2305 if (line_buffer[offset] == ' ')
2306 {
2307 if (jump_info_min_address (ji) < address)
2308 line_buffer[offset] =
2309 (jump_info_max_address (ji) > address) ? '>' : '\\';
2310 else
2311 line_buffer[offset] = '/';
2312 color_buffer[offset] = color;
2313 }
2314 }
2315 /* Draw intermediate line segment. */
2316 else if (line_buffer[offset] == ' ')
2317 {
2318 line_buffer[offset] = '|';
2319 color_buffer[offset] = color;
2320 }
2321 }
82a9ed20
TT
2322
2323 ji = ji->next;
1d67fe3b
TT
2324 }
2325}
2326
2327/* Clone of disassemble_bytes to detect jumps inside a function. */
2328/* FIXME: is this correct? Can we strip it down even further? */
2329
2330static struct jump_info *
2331disassemble_jumps (struct disassemble_info * inf,
2332 disassembler_ftype disassemble_fn,
2333 bfd_vma start_offset,
2334 bfd_vma stop_offset,
2335 bfd_vma rel_offset,
2336 arelent *** relppp,
2337 arelent ** relppend)
2338{
2339 struct objdump_disasm_info *aux;
2340 struct jump_info *jumps = NULL;
2341 asection *section;
2342 bfd_vma addr_offset;
2343 unsigned int opb = inf->octets_per_byte;
2344 int octets = opb;
2345 SFILE sfile;
2346
2347 aux = (struct objdump_disasm_info *) inf->application_data;
2348 section = inf->section;
2349
2350 sfile.alloc = 120;
2351 sfile.buffer = (char *) xmalloc (sfile.alloc);
2352 sfile.pos = 0;
2353
2354 inf->insn_info_valid = 0;
2355 inf->fprintf_func = (fprintf_ftype) objdump_sprintf;
2356 inf->stream = &sfile;
2357
2358 addr_offset = start_offset;
2359 while (addr_offset < stop_offset)
2360 {
2361 int previous_octets;
2362
2363 /* Remember the length of the previous instruction. */
2364 previous_octets = octets;
2365 octets = 0;
2366
2367 sfile.pos = 0;
2368 inf->bytes_per_line = 0;
2369 inf->bytes_per_chunk = 0;
2370 inf->flags = ((disassemble_all ? DISASSEMBLE_DATA : 0)
2371 | (wide_output ? WIDE_OUTPUT : 0));
2372 if (machine)
2373 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
2374
2375 if (inf->disassembler_needs_relocs
2376 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
2377 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
2378 && *relppp < relppend)
2379 {
2380 bfd_signed_vma distance_to_rel;
2381
2382 distance_to_rel = (**relppp)->address - (rel_offset + addr_offset);
2383
2384 /* Check to see if the current reloc is associated with
2385 the instruction that we are about to disassemble. */
2386 if (distance_to_rel == 0
2387 /* FIXME: This is wrong. We are trying to catch
2388 relocs that are addressed part way through the
2389 current instruction, as might happen with a packed
2390 VLIW instruction. Unfortunately we do not know the
2391 length of the current instruction since we have not
2392 disassembled it yet. Instead we take a guess based
2393 upon the length of the previous instruction. The
2394 proper solution is to have a new target-specific
2395 disassembler function which just returns the length
2396 of an instruction at a given address without trying
2397 to display its disassembly. */
2398 || (distance_to_rel > 0
2399 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
2400 {
2401 inf->flags |= INSN_HAS_RELOC;
2402 }
2403 }
2404
2405 if (! disassemble_all
2406 && (section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
2407 == (SEC_CODE | SEC_HAS_CONTENTS))
2408 /* Set a stop_vma so that the disassembler will not read
2409 beyond the next symbol. We assume that symbols appear on
2410 the boundaries between instructions. We only do this when
2411 disassembling code of course, and when -D is in effect. */
2412 inf->stop_vma = section->vma + stop_offset;
2413
2414 inf->stop_offset = stop_offset;
2415
2416 /* Extract jump information. */
2417 inf->insn_info_valid = 0;
2418 octets = (*disassemble_fn) (section->vma + addr_offset, inf);
2419 /* Test if a jump was detected. */
2420 if (inf->insn_info_valid
2421 && ((inf->insn_type == dis_branch)
2422 || (inf->insn_type == dis_condbranch)
2423 || (inf->insn_type == dis_jsr)
2424 || (inf->insn_type == dis_condjsr))
2425 && (inf->target >= section->vma + start_offset)
2426 && (inf->target < section->vma + stop_offset))
2427 {
2428 struct jump_info *ji =
2429 jump_info_new (section->vma + addr_offset, inf->target, -1);
2430 jump_info_add_front (ji, &jumps);
2431 }
2432
2433 inf->stop_vma = 0;
2434
2435 addr_offset += octets / opb;
2436 }
2437
2438 inf->fprintf_func = (fprintf_ftype) fprintf;
2439 inf->stream = stdout;
2440
2441 free (sfile.buffer);
2442
2443 /* Merge jumps. */
2444 jump_info_merge (&jumps);
2445 /* Process jumps. */
2446 jump_info_sort (&jumps);
2447
2448 /* Group jumps by level. */
2449 struct jump_info *last_jump = jumps;
2450 int max_level = -1;
2451
2452 while (last_jump)
2453 {
2454 /* The last jump is part of the next group. */
2455 struct jump_info *base = last_jump;
2456 /* Increment level. */
2457 base->level = ++max_level;
2458
2459 /* Find jumps that can be combined on the same
2460 level, with the largest jumps tested first.
2461 This has the advantage that large jumps are on
2462 lower levels and do not intersect with small
2463 jumps that get grouped on higher levels. */
2464 struct jump_info *exchange_item = last_jump->next;
2465 struct jump_info *it = exchange_item;
2466
2467 for (; it; it = it->next)
2468 {
2469 /* Test if the jump intersects with any
2470 jump from current group. */
015dc7e1 2471 bool ok = true;
1d67fe3b
TT
2472 struct jump_info *it_collision;
2473
2474 for (it_collision = base;
2475 it_collision != exchange_item;
2476 it_collision = it_collision->next)
2477 {
2478 /* This jump intersects so we leave it out. */
2479 if (jump_info_intersect (it_collision, it))
2480 {
015dc7e1 2481 ok = false;
1d67fe3b
TT
2482 break;
2483 }
2484 }
2485
2486 /* Add jump to group. */
2487 if (ok)
2488 {
2489 /* Move current element to the front. */
2490 if (it != exchange_item)
2491 {
2492 struct jump_info *save = it->prev;
2493 jump_info_move_linked (it, exchange_item, &jumps);
2494 last_jump = it;
2495 it = save;
2496 }
2497 else
2498 {
2499 last_jump = exchange_item;
2500 exchange_item = exchange_item->next;
2501 }
2502 last_jump->level = max_level;
2503 }
2504 }
2505
2506 /* Move to next group. */
2507 last_jump = exchange_item;
2508 }
2509
2510 return jumps;
2511}
2512
252b5132
RH
2513/* The number of zeroes we want to see before we start skipping them.
2514 The number is arbitrarily chosen. */
2515
0bcb06d2 2516#define DEFAULT_SKIP_ZEROES 8
252b5132
RH
2517
2518/* The number of zeroes to skip at the end of a section. If the
2519 number of zeroes at the end is between SKIP_ZEROES_AT_END and
2520 SKIP_ZEROES, they will be disassembled. If there are fewer than
2521 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
2522 attempt to avoid disassembling zeroes inserted by section
2523 alignment. */
2524
0bcb06d2 2525#define DEFAULT_SKIP_ZEROES_AT_END 3
252b5132 2526
aebcfb76
NC
2527static int
2528null_print (const void * stream ATTRIBUTE_UNUSED, const char * format ATTRIBUTE_UNUSED, ...)
2529{
2530 return 1;
2531}
2532
ece12829
TT
2533/* Print out jump visualization. */
2534
2535static void
2536print_jump_visualisation (bfd_vma addr, int max_level, char *line_buffer,
2537 uint8_t *color_buffer)
2538{
2539 if (!line_buffer)
2540 return;
2541
2542 jump_info_visualize_address (addr, max_level, line_buffer, color_buffer);
2543
2544 size_t line_buffer_size = strlen (line_buffer);
2545 char last_color = 0;
2546 size_t i;
2547
2548 for (i = 0; i <= line_buffer_size; ++i)
2549 {
2550 if (color_output)
2551 {
2552 uint8_t color = (i < line_buffer_size) ? color_buffer[i]: 0;
2553
2554 if (color != last_color)
2555 {
2556 if (color)
2557 if (extended_color_output)
2558 /* Use extended 8bit color, but
2559 do not choose dark colors. */
2560 printf ("\033[38;5;%dm", 124 + (color % 108));
2561 else
2562 /* Use simple terminal colors. */
2563 printf ("\033[%dm", 31 + (color % 7));
2564 else
2565 /* Clear color. */
2566 printf ("\033[0m");
2567 last_color = color;
2568 }
2569 }
2570 putchar ((i < line_buffer_size) ? line_buffer[i]: ' ');
2571 }
2572}
2573
252b5132
RH
2574/* Disassemble some data in memory between given values. */
2575
2576static void
015dc7e1
AM
2577disassemble_bytes (struct disassemble_info *inf,
2578 disassembler_ftype disassemble_fn,
2579 bool insns,
2580 bfd_byte *data,
2581 bfd_vma start_offset,
2582 bfd_vma stop_offset,
2583 bfd_vma rel_offset,
2584 arelent ***relppp,
2585 arelent **relppend)
252b5132
RH
2586{
2587 struct objdump_disasm_info *aux;
2588 asection *section;
60832332
AM
2589 unsigned int octets_per_line;
2590 unsigned int skip_addr_chars;
940b2b78 2591 bfd_vma addr_offset;
91d6fa6a
NC
2592 unsigned int opb = inf->octets_per_byte;
2593 unsigned int skip_zeroes = inf->skip_zeroes;
2594 unsigned int skip_zeroes_at_end = inf->skip_zeroes_at_end;
60832332 2595 size_t octets;
6f104306 2596 SFILE sfile;
252b5132 2597
91d6fa6a 2598 aux = (struct objdump_disasm_info *) inf->application_data;
f59f8978 2599 section = inf->section;
252b5132 2600
6f104306 2601 sfile.alloc = 120;
3f5e193b 2602 sfile.buffer = (char *) xmalloc (sfile.alloc);
6f104306 2603 sfile.pos = 0;
3aade688 2604
3dcb3fcb
L
2605 if (insn_width)
2606 octets_per_line = insn_width;
2607 else if (insns)
940b2b78 2608 octets_per_line = 4;
252b5132 2609 else
940b2b78 2610 octets_per_line = 16;
252b5132
RH
2611
2612 /* Figure out how many characters to skip at the start of an
2613 address, to make the disassembly look nicer. We discard leading
2614 zeroes in chunks of 4, ensuring that there is always a leading
2615 zero remaining. */
2616 skip_addr_chars = 0;
b1bc1394 2617 if (!no_addresses && !prefix_addresses)
252b5132
RH
2618 {
2619 char buf[30];
17ceb936
AM
2620
2621 bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
2622
2623 while (buf[skip_addr_chars] == '0')
2624 ++skip_addr_chars;
2625
2626 /* Don't discard zeros on overflow. */
2627 if (buf[skip_addr_chars] == '\0' && section->vma != 0)
2628 skip_addr_chars = 0;
2629
2630 if (skip_addr_chars != 0)
2631 skip_addr_chars = (skip_addr_chars - 1) & -4;
252b5132
RH
2632 }
2633
91d6fa6a 2634 inf->insn_info_valid = 0;
252b5132 2635
1d67fe3b 2636 /* Determine maximum level. */
82a9ed20
TT
2637 uint8_t *color_buffer = NULL;
2638 char *line_buffer = NULL;
1d67fe3b 2639 int max_level = -1;
1d67fe3b 2640
82a9ed20
TT
2641 /* Some jumps were detected. */
2642 if (detected_jumps)
1d67fe3b 2643 {
82a9ed20
TT
2644 struct jump_info *ji;
2645
2646 /* Find maximum jump level. */
2647 for (ji = detected_jumps; ji; ji = ji->next)
1d67fe3b 2648 {
82a9ed20
TT
2649 if (ji->level > max_level)
2650 max_level = ji->level;
1d67fe3b 2651 }
1d67fe3b 2652
82a9ed20
TT
2653 /* Allocate buffers. */
2654 size_t len = (max_level + 1) * 3 + 1;
2655 line_buffer = xmalloc (len);
1d67fe3b 2656 line_buffer[len - 1] = 0;
82a9ed20 2657 color_buffer = xmalloc (len);
1d67fe3b
TT
2658 color_buffer[len - 1] = 0;
2659 }
2660
940b2b78
TW
2661 addr_offset = start_offset;
2662 while (addr_offset < stop_offset)
252b5132 2663 {
015dc7e1 2664 bool need_nl = false;
ce04548a 2665
ce04548a 2666 octets = 0;
252b5132 2667
bb7c70ed
NC
2668 /* Make sure we don't use relocs from previous instructions. */
2669 aux->reloc = NULL;
2670
940b2b78 2671 /* If we see more than SKIP_ZEROES octets of zeroes, we just
43ac9881 2672 print `...'. */
60832332
AM
2673 if (! disassemble_zeroes)
2674 for (; addr_offset * opb + octets < stop_offset * opb; octets++)
2675 if (data[addr_offset * opb + octets] != 0)
2676 break;
252b5132 2677 if (! disassemble_zeroes
91d6fa6a
NC
2678 && (inf->insn_info_valid == 0
2679 || inf->branch_delay_insns == 0)
60832332
AM
2680 && (octets >= skip_zeroes
2681 || (addr_offset * opb + octets == stop_offset * opb
2682 && octets < skip_zeroes_at_end)))
252b5132 2683 {
940b2b78 2684 /* If there are more nonzero octets to follow, we only skip
43ac9881
AM
2685 zeroes in multiples of 4, to try to avoid running over
2686 the start of an instruction which happens to start with
2687 zero. */
60832332
AM
2688 if (addr_offset * opb + octets != stop_offset * opb)
2689 octets &= ~3;
98ec6e72
NC
2690
2691 /* If we are going to display more data, and we are displaying
2692 file offsets, then tell the user how many zeroes we skip
2693 and the file offset from where we resume dumping. */
60832332
AM
2694 if (display_file_offsets
2695 && addr_offset + octets / opb < stop_offset)
2696 printf (_("\t... (skipping %lu zeroes, "
2697 "resuming at file offset: 0x%lx)\n"),
2698 (unsigned long) (octets / opb),
0af1713e 2699 (unsigned long) (section->filepos
60832332 2700 + addr_offset + octets / opb));
98ec6e72
NC
2701 else
2702 printf ("\t...\n");
252b5132
RH
2703 }
2704 else
2705 {
2706 char buf[50];
60832332
AM
2707 unsigned int bpc = 0;
2708 unsigned int pb = 0;
252b5132 2709
252b5132 2710 if (with_line_numbers || with_source_code)
bc79cded 2711 show_line (aux->abfd, section, addr_offset);
252b5132 2712
b1bc1394
AM
2713 if (no_addresses)
2714 printf ("\t");
2715 else if (!prefix_addresses)
252b5132
RH
2716 {
2717 char *s;
2718
d8180c76 2719 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
252b5132
RH
2720 for (s = buf + skip_addr_chars; *s == '0'; s++)
2721 *s = ' ';
2722 if (*s == '\0')
2723 *--s = '0';
2724 printf ("%s:\t", buf + skip_addr_chars);
2725 }
2726 else
2727 {
015dc7e1 2728 aux->require_sec = true;
91d6fa6a 2729 objdump_print_address (section->vma + addr_offset, inf);
015dc7e1 2730 aux->require_sec = false;
252b5132
RH
2731 putchar (' ');
2732 }
2733
ece12829
TT
2734 print_jump_visualisation (section->vma + addr_offset,
2735 max_level, line_buffer,
2736 color_buffer);
1d67fe3b 2737
252b5132
RH
2738 if (insns)
2739 {
60832332
AM
2740 int insn_size;
2741
6f104306 2742 sfile.pos = 0;
91d6fa6a
NC
2743 inf->fprintf_func = (fprintf_ftype) objdump_sprintf;
2744 inf->stream = &sfile;
2745 inf->bytes_per_line = 0;
2746 inf->bytes_per_chunk = 0;
dd7efa79
PB
2747 inf->flags = ((disassemble_all ? DISASSEMBLE_DATA : 0)
2748 | (wide_output ? WIDE_OUTPUT : 0));
0313a2b8 2749 if (machine)
91d6fa6a 2750 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
252b5132 2751
91d6fa6a 2752 if (inf->disassembler_needs_relocs
7df428b1
RS
2753 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
2754 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
d99b6465 2755 && *relppp < relppend)
ce04548a
NC
2756 {
2757 bfd_signed_vma distance_to_rel;
0a4632b5
AM
2758 int max_reloc_offset
2759 = aux->abfd->arch_info->max_reloc_offset_into_insn;
ce04548a 2760
0a4632b5
AM
2761 distance_to_rel = ((**relppp)->address - rel_offset
2762 - addr_offset);
ce04548a 2763
60832332 2764 insn_size = 0;
aebcfb76 2765 if (distance_to_rel > 0
0a4632b5
AM
2766 && (max_reloc_offset < 0
2767 || distance_to_rel <= max_reloc_offset))
aebcfb76
NC
2768 {
2769 /* This reloc *might* apply to the current insn,
2770 starting somewhere inside it. Discover the length
2771 of the current insn so that the check below will
2772 work. */
2773 if (insn_width)
2774 insn_size = insn_width;
2775 else
2776 {
2777 /* We find the length by calling the dissassembler
2778 function with a dummy print handler. This should
2779 work unless the disassembler is not expecting to
2780 be called multiple times for the same address.
2781
2782 This does mean disassembling the instruction
2783 twice, but we only do this when there is a high
2784 probability that there is a reloc that will
2785 affect the instruction. */
2786 inf->fprintf_func = (fprintf_ftype) null_print;
2787 insn_size = disassemble_fn (section->vma
2788 + addr_offset, inf);
2789 inf->fprintf_func = (fprintf_ftype) objdump_sprintf;
2790 }
2791 }
2792
ce04548a
NC
2793 /* Check to see if the current reloc is associated with
2794 the instruction that we are about to disassemble. */
2795 if (distance_to_rel == 0
ce04548a 2796 || (distance_to_rel > 0
0a4632b5 2797 && distance_to_rel < insn_size / (int) opb))
ce04548a 2798 {
91d6fa6a 2799 inf->flags |= INSN_HAS_RELOC;
ce04548a
NC
2800 aux->reloc = **relppp;
2801 }
ce04548a 2802 }
d99b6465 2803
bdc4de1b 2804 if (! disassemble_all
60832332
AM
2805 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
2806 == (SEC_CODE | SEC_HAS_CONTENTS)))
bdc4de1b
NC
2807 /* Set a stop_vma so that the disassembler will not read
2808 beyond the next symbol. We assume that symbols appear on
2809 the boundaries between instructions. We only do this when
2810 disassembling code of course, and when -D is in effect. */
2811 inf->stop_vma = section->vma + stop_offset;
3aade688 2812
53b2f36b 2813 inf->stop_offset = stop_offset;
60832332
AM
2814 insn_size = (*disassemble_fn) (section->vma + addr_offset, inf);
2815 octets = insn_size;
bdc4de1b
NC
2816
2817 inf->stop_vma = 0;
91d6fa6a
NC
2818 inf->fprintf_func = (fprintf_ftype) fprintf;
2819 inf->stream = stdout;
2820 if (insn_width == 0 && inf->bytes_per_line != 0)
2821 octets_per_line = inf->bytes_per_line;
60832332 2822 if (insn_size < (int) opb)
e07bf1ac 2823 {
6f104306 2824 if (sfile.pos)
e07bf1ac 2825 printf ("%s\n", sfile.buffer);
60832332 2826 if (insn_size >= 0)
a8c62f1c
AM
2827 {
2828 non_fatal (_("disassemble_fn returned length %d"),
60832332 2829 insn_size);
a8c62f1c
AM
2830 exit_status = 1;
2831 }
e07bf1ac
ILT
2832 break;
2833 }
252b5132
RH
2834 }
2835 else
2836 {
b4c96d0d 2837 bfd_vma j;
252b5132 2838
940b2b78
TW
2839 octets = octets_per_line;
2840 if (addr_offset + octets / opb > stop_offset)
2841 octets = (stop_offset - addr_offset) * opb;
252b5132 2842
940b2b78 2843 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
252b5132 2844 {
3882b010 2845 if (ISPRINT (data[j]))
940b2b78 2846 buf[j - addr_offset * opb] = data[j];
252b5132 2847 else
940b2b78 2848 buf[j - addr_offset * opb] = '.';
252b5132 2849 }
940b2b78 2850 buf[j - addr_offset * opb] = '\0';
252b5132
RH
2851 }
2852
2853 if (prefix_addresses
2854 ? show_raw_insn > 0
2855 : show_raw_insn >= 0)
2856 {
b4c96d0d 2857 bfd_vma j;
252b5132
RH
2858
2859 /* If ! prefix_addresses and ! wide_output, we print
43ac9881 2860 octets_per_line octets per line. */
940b2b78
TW
2861 pb = octets;
2862 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
2863 pb = octets_per_line;
252b5132 2864
91d6fa6a
NC
2865 if (inf->bytes_per_chunk)
2866 bpc = inf->bytes_per_chunk;
252b5132
RH
2867 else
2868 bpc = 1;
2869
940b2b78 2870 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
252b5132 2871 {
ae87f7e7
NC
2872 /* PR 21580: Check for a buffer ending early. */
2873 if (j + bpc <= stop_offset * opb)
252b5132 2874 {
60832332 2875 unsigned int k;
ae87f7e7
NC
2876
2877 if (inf->display_endian == BFD_ENDIAN_LITTLE)
2878 {
60832332 2879 for (k = bpc; k-- != 0; )
ae87f7e7
NC
2880 printf ("%02x", (unsigned) data[j + k]);
2881 }
2882 else
2883 {
2884 for (k = 0; k < bpc; k++)
2885 printf ("%02x", (unsigned) data[j + k]);
2886 }
252b5132 2887 }
ae87f7e7 2888 putchar (' ');
252b5132
RH
2889 }
2890
940b2b78 2891 for (; pb < octets_per_line; pb += bpc)
252b5132 2892 {
60832332 2893 unsigned int k;
252b5132
RH
2894
2895 for (k = 0; k < bpc; k++)
2896 printf (" ");
2897 putchar (' ');
2898 }
2899
2900 /* Separate raw data from instruction by extra space. */
2901 if (insns)
2902 putchar ('\t');
2903 else
2904 printf (" ");
2905 }
2906
2907 if (! insns)
2908 printf ("%s", buf);
6f104306
NS
2909 else if (sfile.pos)
2910 printf ("%s", sfile.buffer);
252b5132
RH
2911
2912 if (prefix_addresses
2913 ? show_raw_insn > 0
2914 : show_raw_insn >= 0)
2915 {
940b2b78 2916 while (pb < octets)
252b5132 2917 {
b4c96d0d 2918 bfd_vma j;
252b5132
RH
2919 char *s;
2920
2921 putchar ('\n');
940b2b78 2922 j = addr_offset * opb + pb;
252b5132 2923
b1bc1394
AM
2924 if (no_addresses)
2925 printf ("\t");
2926 else
2927 {
2928 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
2929 for (s = buf + skip_addr_chars; *s == '0'; s++)
2930 *s = ' ';
2931 if (*s == '\0')
2932 *--s = '0';
2933 printf ("%s:\t", buf + skip_addr_chars);
2934 }
252b5132 2935
ece12829
TT
2936 print_jump_visualisation (section->vma + j / opb,
2937 max_level, line_buffer,
2938 color_buffer);
2939
940b2b78
TW
2940 pb += octets_per_line;
2941 if (pb > octets)
2942 pb = octets;
2943 for (; j < addr_offset * opb + pb; j += bpc)
252b5132 2944 {
d16fdddb
NC
2945 /* PR 21619: Check for a buffer ending early. */
2946 if (j + bpc <= stop_offset * opb)
252b5132 2947 {
60832332 2948 unsigned int k;
d16fdddb
NC
2949
2950 if (inf->display_endian == BFD_ENDIAN_LITTLE)
2951 {
60832332 2952 for (k = bpc; k-- != 0; )
d16fdddb
NC
2953 printf ("%02x", (unsigned) data[j + k]);
2954 }
2955 else
2956 {
2957 for (k = 0; k < bpc; k++)
2958 printf ("%02x", (unsigned) data[j + k]);
2959 }
252b5132 2960 }
d16fdddb 2961 putchar (' ');
252b5132
RH
2962 }
2963 }
2964 }
2965
2966 if (!wide_output)
2967 putchar ('\n');
2968 else
015dc7e1 2969 need_nl = true;
252b5132
RH
2970 }
2971
fd7bb956
AM
2972 while ((*relppp) < relppend
2973 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
252b5132 2974 {
fd7bb956 2975 if (dump_reloc_info || dump_dynamic_reloc_info)
252b5132
RH
2976 {
2977 arelent *q;
2978
2979 q = **relppp;
2980
2981 if (wide_output)
2982 putchar ('\t');
2983 else
2984 printf ("\t\t\t");
2985
b1bc1394
AM
2986 if (!no_addresses)
2987 {
2988 objdump_print_value (section->vma - rel_offset + q->address,
015dc7e1 2989 inf, true);
b1bc1394
AM
2990 printf (": ");
2991 }
252b5132 2992
f9ecb0a4 2993 if (q->howto == NULL)
b1bc1394 2994 printf ("*unknown*\t");
f9ecb0a4 2995 else if (q->howto->name)
b1bc1394 2996 printf ("%s\t", q->howto->name);
f9ecb0a4 2997 else
b1bc1394 2998 printf ("%d\t", q->howto->type);
252b5132
RH
2999
3000 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
3001 printf ("*unknown*");
3002 else
3003 {
3004 const char *sym_name;
3005
3006 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
3007 if (sym_name != NULL && *sym_name != '\0')
91d6fa6a 3008 objdump_print_symname (aux->abfd, inf, *q->sym_ptr_ptr);
252b5132
RH
3009 else
3010 {
3011 asection *sym_sec;
3012
e6f7f6d1 3013 sym_sec = bfd_asymbol_section (*q->sym_ptr_ptr);
fd361982 3014 sym_name = bfd_section_name (sym_sec);
252b5132
RH
3015 if (sym_name == NULL || *sym_name == '\0')
3016 sym_name = "*unknown*";
12add40e 3017 printf ("%s", sanitize_string (sym_name));
252b5132
RH
3018 }
3019 }
3020
3021 if (q->addend)
3022 {
839f41a3
AM
3023 bfd_vma addend = q->addend;
3024 if ((bfd_signed_vma) addend < 0)
343dbc36
L
3025 {
3026 printf ("-0x");
3027 addend = -addend;
3028 }
3029 else
3030 printf ("+0x");
015dc7e1 3031 objdump_print_value (addend, inf, true);
252b5132
RH
3032 }
3033
3034 printf ("\n");
015dc7e1 3035 need_nl = false;
252b5132 3036 }
fd7bb956 3037 ++(*relppp);
252b5132
RH
3038 }
3039
3040 if (need_nl)
3041 printf ("\n");
3042
940b2b78 3043 addr_offset += octets / opb;
252b5132 3044 }
6f104306
NS
3045
3046 free (sfile.buffer);
1d67fe3b
TT
3047 free (line_buffer);
3048 free (color_buffer);
252b5132
RH
3049}
3050
155e0d23 3051static void
91d6fa6a 3052disassemble_section (bfd *abfd, asection *section, void *inf)
155e0d23 3053{
015dc7e1
AM
3054 const struct elf_backend_data *bed;
3055 bfd_vma sign_adjust = 0;
3056 struct disassemble_info *pinfo = (struct disassemble_info *) inf;
3057 struct objdump_disasm_info *paux;
3058 unsigned int opb = pinfo->octets_per_byte;
3059 bfd_byte *data = NULL;
3060 bfd_size_type datasize = 0;
3061 arelent **rel_pp = NULL;
3062 arelent **rel_ppstart = NULL;
3063 arelent **rel_ppend;
3064 bfd_vma stop_offset;
3065 asymbol *sym = NULL;
3066 long place = 0;
3067 long rel_count;
3068 bfd_vma rel_offset;
3069 unsigned long addr_offset;
3070 bool do_print;
baae986a
NC
3071 enum loop_control
3072 {
3073 stop_offset_reached,
3074 function_sym,
3075 next_sym
3076 } loop_until;
155e0d23
NC
3077
3078 /* Sections that do not contain machine
3079 code are not normally disassembled. */
3080 if (! disassemble_all
70ecb384 3081 && only_list == NULL
46212538
AM
3082 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
3083 != (SEC_CODE | SEC_HAS_CONTENTS)))
155e0d23
NC
3084 return;
3085
3086 if (! process_section_p (section))
3087 return;
3088
fd361982 3089 datasize = bfd_section_size (section);
60a02042 3090 if (datasize == 0)
155e0d23
NC
3091 return;
3092
643902a4
AS
3093 if (start_address == (bfd_vma) -1
3094 || start_address < section->vma)
3095 addr_offset = 0;
3096 else
3097 addr_offset = start_address - section->vma;
3098
3099 if (stop_address == (bfd_vma) -1)
3100 stop_offset = datasize / opb;
3101 else
3102 {
3103 if (stop_address < section->vma)
3104 stop_offset = 0;
3105 else
3106 stop_offset = stop_address - section->vma;
3107 if (stop_offset > datasize / opb)
3108 stop_offset = datasize / opb;
3109 }
3110
3111 if (addr_offset >= stop_offset)
3112 return;
3113
155e0d23 3114 /* Decide which set of relocs to use. Load them if necessary. */
3b9ad1cc 3115 paux = (struct objdump_disasm_info *) pinfo->application_data;
c3f72de4 3116 if (pinfo->dynrelbuf && dump_dynamic_reloc_info)
155e0d23 3117 {
c3f72de4
AM
3118 rel_pp = pinfo->dynrelbuf;
3119 rel_count = pinfo->dynrelcount;
155e0d23 3120 /* Dynamic reloc addresses are absolute, non-dynamic are section
50c2245b 3121 relative. REL_OFFSET specifies the reloc address corresponding
155e0d23 3122 to the start of this section. */
68b3b8dc 3123 rel_offset = section->vma;
155e0d23
NC
3124 }
3125 else
3126 {
3127 rel_count = 0;
3128 rel_pp = NULL;
3129 rel_offset = 0;
3130
3131 if ((section->flags & SEC_RELOC) != 0
d99b6465 3132 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
155e0d23
NC
3133 {
3134 long relsize;
3135
3136 relsize = bfd_get_reloc_upper_bound (abfd, section);
3137 if (relsize < 0)
3138 bfd_fatal (bfd_get_filename (abfd));
3139
3140 if (relsize > 0)
3141 {
3f5e193b 3142 rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
155e0d23
NC
3143 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
3144 if (rel_count < 0)
3145 bfd_fatal (bfd_get_filename (abfd));
3146
3147 /* Sort the relocs by address. */
3148 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
3149 }
3150 }
155e0d23
NC
3151 }
3152 rel_ppend = rel_pp + rel_count;
3153
bae7501e 3154 if (!bfd_malloc_and_get_section (abfd, section, &data))
b02cd3e9
AM
3155 {
3156 non_fatal (_("Reading section %s failed because: %s"),
3157 section->name, bfd_errmsg (bfd_get_error ()));
3158 return;
3159 }
155e0d23 3160
155e0d23
NC
3161 pinfo->buffer = data;
3162 pinfo->buffer_vma = section->vma;
3163 pinfo->buffer_length = datasize;
3164 pinfo->section = section;
3165
660df28a
AM
3166 /* Sort the symbols into value and section order. */
3167 compare_section = section;
41da0822
AM
3168 if (sorted_symcount > 1)
3169 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
660df28a 3170
155e0d23
NC
3171 /* Skip over the relocs belonging to addresses below the
3172 start address. */
3173 while (rel_pp < rel_ppend
3174 && (*rel_pp)->address < rel_offset + addr_offset)
3175 ++rel_pp;
3176
12add40e 3177 printf (_("\nDisassembly of section %s:\n"), sanitize_string (section->name));
155e0d23
NC
3178
3179 /* Find the nearest symbol forwards from our current position. */
015dc7e1 3180 paux->require_sec = true;
3f5e193b 3181 sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
91d6fa6a 3182 (struct disassemble_info *) inf,
3f5e193b 3183 &place);
015dc7e1 3184 paux->require_sec = false;
155e0d23 3185
46bc35a9
RS
3186 /* PR 9774: If the target used signed addresses then we must make
3187 sure that we sign extend the value that we calculate for 'addr'
3188 in the loop below. */
1b0adfe0
NC
3189 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
3190 && (bed = get_elf_backend_data (abfd)) != NULL
3191 && bed->sign_extend_vma)
46bc35a9 3192 sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
1b0adfe0 3193
155e0d23
NC
3194 /* Disassemble a block of instructions up to the address associated with
3195 the symbol we have just found. Then print the symbol and find the
3196 next symbol on. Repeat until we have disassembled the entire section
3197 or we have reached the end of the address range we are interested in. */
baae986a
NC
3198 do_print = paux->symbol == NULL;
3199 loop_until = stop_offset_reached;
3200
155e0d23
NC
3201 while (addr_offset < stop_offset)
3202 {
22a398e1 3203 bfd_vma addr;
155e0d23 3204 asymbol *nextsym;
bdc4de1b 3205 bfd_vma nextstop_offset;
015dc7e1 3206 bool insns;
155e0d23 3207
22a398e1 3208 addr = section->vma + addr_offset;
095ad3b8 3209 addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
22a398e1
NC
3210
3211 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
155e0d23
NC
3212 {
3213 int x;
3214
3215 for (x = place;
3216 (x < sorted_symcount
22a398e1 3217 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
155e0d23
NC
3218 ++x)
3219 continue;
3220
22a398e1 3221 pinfo->symbols = sorted_syms + place;
155e0d23 3222 pinfo->num_symbols = x - place;
2087ad84 3223 pinfo->symtab_pos = place;
155e0d23
NC
3224 }
3225 else
22a398e1
NC
3226 {
3227 pinfo->symbols = NULL;
3228 pinfo->num_symbols = 0;
2087ad84 3229 pinfo->symtab_pos = -1;
22a398e1 3230 }
155e0d23 3231
baae986a
NC
3232 /* If we are only disassembling from a specific symbol,
3233 check to see if we should start or stop displaying. */
d3def5d7
MY
3234 if (sym && paux->symbol)
3235 {
baae986a
NC
3236 if (do_print)
3237 {
3238 /* See if we should stop printing. */
3239 switch (loop_until)
3240 {
3241 case function_sym:
3242 if (sym->flags & BSF_FUNCTION)
015dc7e1 3243 do_print = false;
baae986a
NC
3244 break;
3245
3246 case stop_offset_reached:
3247 /* Handled by the while loop. */
3248 break;
d3def5d7 3249
baae986a
NC
3250 case next_sym:
3251 /* FIXME: There is an implicit assumption here
3252 that the name of sym is different from
3253 paux->symbol. */
3254 if (! bfd_is_local_label (abfd, sym))
015dc7e1 3255 do_print = false;
baae986a
NC
3256 break;
3257 }
3258 }
3259 else
d3def5d7 3260 {
baae986a
NC
3261 const char * name = bfd_asymbol_name (sym);
3262 char * alloc = NULL;
3263
3264 if (do_demangle && name[0] != '\0')
3265 {
3266 /* Demangle the name. */
3267 alloc = bfd_demangle (abfd, name, demangle_flags);
3268 if (alloc != NULL)
3269 name = alloc;
3270 }
3271
3272 /* We are not currently printing. Check to see
3273 if the current symbol matches the requested symbol. */
3274 if (streq (name, paux->symbol))
3275 {
015dc7e1 3276 do_print = true;
baae986a
NC
3277
3278 if (sym->flags & BSF_FUNCTION)
3279 {
3280 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
3281 && ((elf_symbol_type *) sym)->internal_elf_sym.st_size > 0)
3282 {
3283 /* Sym is a function symbol with a size associated
3284 with it. Turn on automatic disassembly for the
3285 next VALUE bytes. */
3286 stop_offset = addr_offset
3287 + ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
3288 loop_until = stop_offset_reached;
3289 }
3290 else
3291 {
3292 /* Otherwise we need to tell the loop heuristic to
3293 loop until the next function symbol is encountered. */
3294 loop_until = function_sym;
3295 }
3296 }
3297 else
3298 {
3299 /* Otherwise loop until the next symbol is encountered. */
3300 loop_until = next_sym;
3301 }
3302 }
3303
3304 free (alloc);
d3def5d7 3305 }
d3def5d7
MY
3306 }
3307
3308 if (! prefix_addresses && do_print)
155e0d23
NC
3309 {
3310 pinfo->fprintf_func (pinfo->stream, "\n");
22a398e1 3311 objdump_print_addr_with_sym (abfd, section, sym, addr,
015dc7e1 3312 pinfo, false);
155e0d23
NC
3313 pinfo->fprintf_func (pinfo->stream, ":\n");
3314 }
3315
22a398e1 3316 if (sym != NULL && bfd_asymbol_value (sym) > addr)
155e0d23
NC
3317 nextsym = sym;
3318 else if (sym == NULL)
3319 nextsym = NULL;
3320 else
3321 {
22a398e1 3322#define is_valid_next_sym(SYM) \
fd361982 3323 (strcmp (bfd_section_name ((SYM)->section), bfd_section_name (section)) == 0 \
22a398e1
NC
3324 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
3325 && pinfo->symbol_is_valid (SYM, pinfo))
3aade688 3326
155e0d23
NC
3327 /* Search forward for the next appropriate symbol in
3328 SECTION. Note that all the symbols are sorted
3329 together into one big array, and that some sections
3330 may have overlapping addresses. */
3331 while (place < sorted_symcount
22a398e1 3332 && ! is_valid_next_sym (sorted_syms [place]))
155e0d23 3333 ++place;
22a398e1 3334
155e0d23
NC
3335 if (place >= sorted_symcount)
3336 nextsym = NULL;
3337 else
3338 nextsym = sorted_syms[place];
3339 }
3340
22a398e1
NC
3341 if (sym != NULL && bfd_asymbol_value (sym) > addr)
3342 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
155e0d23
NC
3343 else if (nextsym == NULL)
3344 nextstop_offset = stop_offset;
3345 else
22a398e1
NC
3346 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
3347
84d7b001
NC
3348 if (nextstop_offset > stop_offset
3349 || nextstop_offset <= addr_offset)
22a398e1 3350 nextstop_offset = stop_offset;
155e0d23
NC
3351
3352 /* If a symbol is explicitly marked as being an object
3353 rather than a function, just dump the bytes without
3354 disassembling them. */
3355 if (disassemble_all
3356 || sym == NULL
abf71725 3357 || sym->section != section
22a398e1 3358 || bfd_asymbol_value (sym) > addr
155e0d23
NC
3359 || ((sym->flags & BSF_OBJECT) == 0
3360 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
3361 == NULL)
3362 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
3363 == NULL))
3364 || (sym->flags & BSF_FUNCTION) != 0)
015dc7e1 3365 insns = true;
155e0d23 3366 else
015dc7e1 3367 insns = false;
155e0d23 3368
d3def5d7 3369 if (do_print)
1d67fe3b
TT
3370 {
3371 /* Resolve symbol name. */
3372 if (visualize_jumps && abfd && sym && sym->name)
3373 {
3374 struct disassemble_info di;
3375 SFILE sf;
3376
3377 sf.alloc = strlen (sym->name) + 40;
3378 sf.buffer = (char*) xmalloc (sf.alloc);
3379 sf.pos = 0;
3380 di.fprintf_func = (fprintf_ftype) objdump_sprintf;
3381 di.stream = &sf;
3382
3383 objdump_print_symname (abfd, &di, sym);
3384
3385 /* Fetch jump information. */
3386 detected_jumps = disassemble_jumps
3387 (pinfo, paux->disassemble_fn,
3388 addr_offset, nextstop_offset,
3389 rel_offset, &rel_pp, rel_ppend);
3390
3391 /* Free symbol name. */
3392 free (sf.buffer);
3393 }
3394
3395 /* Add jumps to output. */
3396 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
3397 addr_offset, nextstop_offset,
3398 rel_offset, &rel_pp, rel_ppend);
3399
3400 /* Free jumps. */
3401 while (detected_jumps)
3402 {
3403 detected_jumps = jump_info_free (detected_jumps);
3404 }
3405 }
3aade688 3406
155e0d23
NC
3407 addr_offset = nextstop_offset;
3408 sym = nextsym;
3409 }
3410
3411 free (data);
3412
3413 if (rel_ppstart != NULL)
3414 free (rel_ppstart);
3415}
3416
252b5132
RH
3417/* Disassemble the contents of an object file. */
3418
3419static void
46dca2e0 3420disassemble_data (bfd *abfd)
252b5132 3421{
252b5132
RH
3422 struct disassemble_info disasm_info;
3423 struct objdump_disasm_info aux;
4c45e5c9 3424 long i;
252b5132
RH
3425
3426 print_files = NULL;
3427 prev_functionname = NULL;
3428 prev_line = -1;
9b8d1a36 3429 prev_discriminator = 0;
252b5132
RH
3430
3431 /* We make a copy of syms to sort. We don't want to sort syms
3432 because that will screw up the relocs. */
4c45e5c9 3433 sorted_symcount = symcount ? symcount : dynsymcount;
3f5e193b
NC
3434 sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
3435 * sizeof (asymbol *));
41da0822
AM
3436 if (sorted_symcount != 0)
3437 {
3438 memcpy (sorted_syms, symcount ? syms : dynsyms,
3439 sorted_symcount * sizeof (asymbol *));
252b5132 3440
41da0822
AM
3441 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
3442 }
4c45e5c9
JJ
3443
3444 for (i = 0; i < synthcount; ++i)
3445 {
3446 sorted_syms[sorted_symcount] = synthsyms + i;
3447 ++sorted_symcount;
3448 }
252b5132 3449
22a398e1 3450 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
98a91d6a 3451
46dca2e0 3452 disasm_info.application_data = (void *) &aux;
252b5132 3453 aux.abfd = abfd;
015dc7e1 3454 aux.require_sec = false;
c3f72de4
AM
3455 disasm_info.dynrelbuf = NULL;
3456 disasm_info.dynrelcount = 0;
ce04548a 3457 aux.reloc = NULL;
d3def5d7 3458 aux.symbol = disasm_sym;
155e0d23 3459
252b5132
RH
3460 disasm_info.print_address_func = objdump_print_address;
3461 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
3462
d3ba0551 3463 if (machine != NULL)
252b5132 3464 {
91d6fa6a 3465 const bfd_arch_info_type *inf = bfd_scan_arch (machine);
98a91d6a 3466
91d6fa6a 3467 if (inf == NULL)
a8c62f1c 3468 fatal (_("can't use supplied machine %s"), machine);
98a91d6a 3469
91d6fa6a 3470 abfd->arch_info = inf;
252b5132
RH
3471 }
3472
3473 if (endian != BFD_ENDIAN_UNKNOWN)
3474 {
3475 struct bfd_target *xvec;
3476
3f5e193b 3477 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
252b5132
RH
3478 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
3479 xvec->byteorder = endian;
3480 abfd->xvec = xvec;
3481 }
3482
155e0d23 3483 /* Use libopcodes to locate a suitable disassembler. */
003ca0fd
YQ
3484 aux.disassemble_fn = disassembler (bfd_get_arch (abfd),
3485 bfd_big_endian (abfd),
3486 bfd_get_mach (abfd), abfd);
155e0d23 3487 if (!aux.disassemble_fn)
252b5132 3488 {
a8c62f1c 3489 non_fatal (_("can't disassemble for architecture %s\n"),
37cc8ec1 3490 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
75cd796a 3491 exit_status = 1;
252b5132
RH
3492 return;
3493 }
3494
3495 disasm_info.flavour = bfd_get_flavour (abfd);
3496 disasm_info.arch = bfd_get_arch (abfd);
3497 disasm_info.mach = bfd_get_mach (abfd);
dd92f639 3498 disasm_info.disassembler_options = disassembler_options;
61826503 3499 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd, NULL);
0bcb06d2
AS
3500 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
3501 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
015dc7e1 3502 disasm_info.disassembler_needs_relocs = false;
0af11b59 3503
252b5132 3504 if (bfd_big_endian (abfd))
a8a9050d 3505 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
252b5132 3506 else if (bfd_little_endian (abfd))
a8a9050d 3507 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
252b5132
RH
3508 else
3509 /* ??? Aborting here seems too drastic. We could default to big or little
3510 instead. */
3511 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
3512
b3db6d07
JM
3513 disasm_info.endian_code = disasm_info.endian;
3514
22a398e1
NC
3515 /* Allow the target to customize the info structure. */
3516 disassemble_init_for_target (& disasm_info);
3517
a24bb4f0 3518 /* Pre-load the dynamic relocs as we may need them during the disassembly. */
c3f72de4 3519 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3aade688 3520
c3f72de4
AM
3521 if (relsize < 0 && dump_dynamic_reloc_info)
3522 bfd_fatal (bfd_get_filename (abfd));
fd7bb956 3523
c3f72de4
AM
3524 if (relsize > 0)
3525 {
3526 disasm_info.dynrelbuf = (arelent **) xmalloc (relsize);
3527 disasm_info.dynrelcount
3528 = bfd_canonicalize_dynamic_reloc (abfd, disasm_info.dynrelbuf, dynsyms);
3529 if (disasm_info.dynrelcount < 0)
3530 bfd_fatal (bfd_get_filename (abfd));
fd7bb956 3531
c3f72de4
AM
3532 /* Sort the relocs by address. */
3533 qsort (disasm_info.dynrelbuf, disasm_info.dynrelcount, sizeof (arelent *),
3534 compare_relocs);
fd7bb956 3535 }
c3f72de4 3536
2087ad84
PB
3537 disasm_info.symtab = sorted_syms;
3538 disasm_info.symtab_size = sorted_symcount;
fd7bb956 3539
155e0d23 3540 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
98a91d6a 3541
c3f72de4
AM
3542 free (disasm_info.dynrelbuf);
3543 disasm_info.dynrelbuf = NULL;
252b5132 3544 free (sorted_syms);
20135676 3545 disassemble_free_target (&disasm_info);
252b5132
RH
3546}
3547\f
015dc7e1 3548static bool
7bcbeb0f
CC
3549load_specific_debug_section (enum dwarf_section_display_enum debug,
3550 asection *sec, void *file)
365544c3
L
3551{
3552 struct dwarf_section *section = &debug_displays [debug].section;
3f5e193b 3553 bfd *abfd = (bfd *) file;
bfec0f11 3554 bfd_byte *contents;
f2023ce7 3555 bfd_size_type amt;
63455780 3556 size_t alloced;
015dc7e1 3557 bool ret;
365544c3 3558
365544c3 3559 if (section->start != NULL)
dda8d76d
NC
3560 {
3561 /* If it is already loaded, do nothing. */
3562 if (streq (section->filename, bfd_get_filename (abfd)))
015dc7e1 3563 return true;
dda8d76d
NC
3564 free (section->start);
3565 }
365544c3 3566
dda8d76d 3567 section->filename = bfd_get_filename (abfd);
d1c4b12b 3568 section->reloc_info = NULL;
3aade688 3569 section->num_relocs = 0;
fd361982 3570 section->address = bfd_section_vma (sec);
fd361982 3571 section->size = bfd_section_size (sec);
63455780
NC
3572 /* PR 24360: On 32-bit hosts sizeof (size_t) < sizeof (bfd_size_type). */
3573 alloced = amt = section->size + 1;
3574 if (alloced != amt || alloced == 0)
11fa9f13 3575 {
787bbc56 3576 section->start = NULL;
11fa9f13
NC
3577 free_debug_section (debug);
3578 printf (_("\nSection '%s' has an invalid size: %#llx.\n"),
12add40e
NC
3579 sanitize_string (section->name),
3580 (unsigned long long) section->size);
015dc7e1 3581 return false;
11fa9f13 3582 }
208599d9
AM
3583
3584 section->start = contents = xmalloc (alloced);
4f1881b9
AM
3585 /* Ensure any string section has a terminating NUL. */
3586 section->start[section->size] = 0;
1b315056 3587
2e8136f9
NC
3588 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
3589 && debug_displays [debug].relocate)
0acf065b 3590 {
0acf065b
CC
3591 ret = bfd_simple_get_relocated_section_contents (abfd,
3592 sec,
3593 section->start,
3594 syms) != NULL;
208599d9 3595 if (ret)
d1c4b12b 3596 {
208599d9 3597 long reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
d1c4b12b 3598
208599d9 3599 if (reloc_size > 0)
d1c4b12b 3600 {
208599d9
AM
3601 unsigned long reloc_count;
3602 arelent **relocs;
3603
3604 relocs = (arelent **) xmalloc (reloc_size);
3605
3606 reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
3607 if (reloc_count == 0)
3608 free (relocs);
3609 else
3610 {
3611 section->reloc_info = relocs;
3612 section->num_relocs = reloc_count;
3613 }
d1c4b12b
NC
3614 }
3615 }
bdc4de1b 3616 }
208599d9
AM
3617 else
3618 ret = bfd_get_full_section_contents (abfd, sec, &contents);
3619
3620 if (!ret)
3621 {
3622 free_debug_section (debug);
3623 printf (_("\nCan't get contents for section '%s'.\n"),
3624 sanitize_string (section->name));
015dc7e1 3625 return false;
208599d9 3626 }
0acf065b 3627
015dc7e1 3628 return true;
7bcbeb0f
CC
3629}
3630
015dc7e1 3631bool
d1c4b12b
NC
3632reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
3633{
3634 arelent ** relocs;
3635 arelent * rp;
3636
3637 if (dsec == NULL || dsec->reloc_info == NULL)
015dc7e1 3638 return false;
d1c4b12b
NC
3639
3640 relocs = (arelent **) dsec->reloc_info;
3641
3642 for (; (rp = * relocs) != NULL; ++ relocs)
3643 if (rp->address == offset)
015dc7e1 3644 return true;
d1c4b12b 3645
015dc7e1 3646 return false;
d1c4b12b
NC
3647}
3648
015dc7e1 3649bool
7bcbeb0f
CC
3650load_debug_section (enum dwarf_section_display_enum debug, void *file)
3651{
3652 struct dwarf_section *section = &debug_displays [debug].section;
3f5e193b 3653 bfd *abfd = (bfd *) file;
7bcbeb0f
CC
3654 asection *sec;
3655
3656 /* If it is already loaded, do nothing. */
3657 if (section->start != NULL)
dda8d76d
NC
3658 {
3659 if (streq (section->filename, bfd_get_filename (abfd)))
015dc7e1 3660 return true;
dda8d76d 3661 }
7bcbeb0f
CC
3662
3663 /* Locate the debug section. */
3664 sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
3665 if (sec != NULL)
3666 section->name = section->uncompressed_name;
3667 else
3668 {
3669 sec = bfd_get_section_by_name (abfd, section->compressed_name);
3670 if (sec != NULL)
3671 section->name = section->compressed_name;
3672 }
3673 if (sec == NULL)
015dc7e1 3674 return false;
7bcbeb0f
CC
3675
3676 return load_specific_debug_section (debug, sec, file);
365544c3
L
3677}
3678
3679void
3680free_debug_section (enum dwarf_section_display_enum debug)
3681{
3682 struct dwarf_section *section = &debug_displays [debug].section;
3683
365544c3
L
3684 free ((char *) section->start);
3685 section->start = NULL;
3686 section->address = 0;
3687 section->size = 0;
3688}
3689
dda8d76d
NC
3690void
3691close_debug_file (void * file)
3692{
3693 bfd * abfd = (bfd *) file;
3694
3695 bfd_close (abfd);
3696}
3697
3698void *
3699open_debug_file (const char * pathname)
3700{
3701 bfd * data;
3702
3703 data = bfd_openr (pathname, NULL);
3704 if (data == NULL)
3705 return NULL;
3706
3707 if (! bfd_check_format (data, bfd_object))
3708 return NULL;
3709
3710 return data;
3711}
3712
301a9420
AM
3713#if HAVE_LIBDEBUGINFOD
3714/* Return a hex string represention of the build-id. */
3715
3716unsigned char *
3717get_build_id (void * data)
3718{
3719 unsigned i;
3720 char * build_id_str;
3721 bfd * abfd = (bfd *) data;
3722 const struct bfd_build_id * build_id;
3723
3724 build_id = abfd->build_id;
3725 if (build_id == NULL)
3726 return NULL;
3727
3728 build_id_str = malloc (build_id->size * 2 + 1);
3729 if (build_id_str == NULL)
3730 return NULL;
3731
3732 for (i = 0; i < build_id->size; i++)
3733 sprintf (build_id_str + (i * 2), "%02x", build_id->data[i]);
3734 build_id_str[build_id->size * 2] = '\0';
3735
3736 return (unsigned char *)build_id_str;
3737}
3738#endif /* HAVE_LIBDEBUGINFOD */
3739
365544c3
L
3740static void
3741dump_dwarf_section (bfd *abfd, asection *section,
3742 void *arg ATTRIBUTE_UNUSED)
3743{
fd361982 3744 const char *name = bfd_section_name (section);
365544c3 3745 const char *match;
3f5e193b 3746 int i;
365544c3 3747
08dedd66 3748 if (startswith (name, ".gnu.linkonce.wi."))
365544c3
L
3749 match = ".debug_info";
3750 else
3751 match = name;
3752
3753 for (i = 0; i < max; i++)
4cb93e3b
TG
3754 if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
3755 || strcmp (debug_displays [i].section.compressed_name, match) == 0)
3756 && debug_displays [i].enabled != NULL
3757 && *debug_displays [i].enabled)
365544c3 3758 {
c8450da8 3759 struct dwarf_section *sec = &debug_displays [i].section;
365544c3 3760
c8450da8
TG
3761 if (strcmp (sec->uncompressed_name, match) == 0)
3762 sec->name = sec->uncompressed_name;
3763 else
3764 sec->name = sec->compressed_name;
3f5e193b
NC
3765 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
3766 section, abfd))
c8450da8
TG
3767 {
3768 debug_displays [i].display (sec, abfd);
3aade688 3769
c8450da8 3770 if (i != info && i != abbrev)
3f5e193b 3771 free_debug_section ((enum dwarf_section_display_enum) i);
365544c3
L
3772 }
3773 break;
3774 }
3775}
3776
3777/* Dump the dwarf debugging information. */
3778
3779static void
3780dump_dwarf (bfd *abfd)
3781{
39f0547e
NC
3782 /* The byte_get pointer should have been set at the start of dump_bfd(). */
3783 if (byte_get == NULL)
f41e4712
NC
3784 {
3785 warn (_("File %s does not contain any dwarf debug information\n"),
3786 bfd_get_filename (abfd));
3787 return;
3788 }
365544c3 3789
b129eb0e 3790 switch (bfd_get_arch (abfd))
2dc4cec1 3791 {
8ab159a9
AM
3792 case bfd_arch_s12z:
3793 /* S12Z has a 24 bit address space. But the only known
3794 producer of dwarf_info encodes addresses into 32 bits. */
3795 eh_addr_size = 4;
3796 break;
3797
b129eb0e 3798 default:
229a22cf 3799 eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
b129eb0e 3800 break;
2dc4cec1
L
3801 }
3802
229a22cf
AB
3803 init_dwarf_regnames_by_bfd_arch_and_mach (bfd_get_arch (abfd),
3804 bfd_get_mach (abfd));
3805
365544c3 3806 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
365544c3
L
3807}
3808\f
29ca8dc5
NS
3809/* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
3810 it. Return NULL on failure. */
252b5132 3811
bae7501e 3812static bfd_byte *
7d9813f1
NA
3813read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr,
3814 bfd_size_type *entsize_ptr)
252b5132 3815{
29ca8dc5 3816 asection *stabsect;
bae7501e 3817 bfd_byte *contents;
252b5132 3818
29ca8dc5 3819 stabsect = bfd_get_section_by_name (abfd, sect_name);
155e0d23 3820 if (stabsect == NULL)
252b5132 3821 {
12add40e
NC
3822 printf (_("No %s section present\n\n"),
3823 sanitize_string (sect_name));
015dc7e1 3824 return false;
252b5132
RH
3825 }
3826
bae7501e 3827 if (!bfd_malloc_and_get_section (abfd, stabsect, &contents))
252b5132 3828 {
a8c62f1c 3829 non_fatal (_("reading %s section of %s failed: %s"),
29ca8dc5 3830 sect_name, bfd_get_filename (abfd),
37cc8ec1 3831 bfd_errmsg (bfd_get_error ()));
75cd796a 3832 exit_status = 1;
a8c62f1c 3833 free (contents);
29ca8dc5 3834 return NULL;
252b5132
RH
3835 }
3836
fd361982 3837 *size_ptr = bfd_section_size (stabsect);
7d9813f1
NA
3838 if (entsize_ptr)
3839 *entsize_ptr = stabsect->entsize;
252b5132 3840
29ca8dc5 3841 return contents;
252b5132
RH
3842}
3843
3844/* Stabs entries use a 12 byte format:
3845 4 byte string table index
3846 1 byte stab type
3847 1 byte stab other field
3848 2 byte stab desc field
3849 4 byte stab value
3850 FIXME: This will have to change for a 64 bit object format. */
3851
46dca2e0
NC
3852#define STRDXOFF (0)
3853#define TYPEOFF (4)
3854#define OTHEROFF (5)
3855#define DESCOFF (6)
3856#define VALOFF (8)
252b5132
RH
3857#define STABSIZE (12)
3858
3859/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
3860 using string table section STRSECT_NAME (in `strtab'). */
3861
3862static void
3b9ad1cc
AM
3863print_section_stabs (bfd *abfd,
3864 const char *stabsect_name,
3865 unsigned *string_offset_ptr)
252b5132
RH
3866{
3867 int i;
46dca2e0 3868 unsigned file_string_table_offset = 0;
29ca8dc5 3869 unsigned next_file_string_table_offset = *string_offset_ptr;
252b5132
RH
3870 bfd_byte *stabp, *stabs_end;
3871
3872 stabp = stabs;
3873 stabs_end = stabp + stab_size;
3874
12add40e 3875 printf (_("Contents of %s section:\n\n"), sanitize_string (stabsect_name));
252b5132
RH
3876 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
3877
3878 /* Loop through all symbols and print them.
3879
3880 We start the index at -1 because there is a dummy symbol on
3881 the front of stabs-in-{coff,elf} sections that supplies sizes. */
f41e4712 3882 for (i = -1; stabp <= stabs_end - STABSIZE; stabp += STABSIZE, i++)
252b5132
RH
3883 {
3884 const char *name;
3885 unsigned long strx;
3886 unsigned char type, other;
3887 unsigned short desc;
3888 bfd_vma value;
3889
3890 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
3891 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
3892 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
3893 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
3894 value = bfd_h_get_32 (abfd, stabp + VALOFF);
3895
3896 printf ("\n%-6d ", i);
3897 /* Either print the stab name, or, if unnamed, print its number
0af11b59 3898 again (makes consistent formatting for tools like awk). */
252b5132
RH
3899 name = bfd_get_stab_name (type);
3900 if (name != NULL)
12add40e 3901 printf ("%-6s", sanitize_string (name));
252b5132
RH
3902 else if (type == N_UNDF)
3903 printf ("HdrSym");
3904 else
3905 printf ("%-6d", type);
3906 printf (" %-6d %-6d ", other, desc);
d8180c76 3907 bfd_printf_vma (abfd, value);
252b5132
RH
3908 printf (" %-6lu", strx);
3909
3910 /* Symbols with type == 0 (N_UNDF) specify the length of the
3911 string table associated with this file. We use that info
3912 to know how to relocate the *next* file's string table indices. */
252b5132
RH
3913 if (type == N_UNDF)
3914 {
3915 file_string_table_offset = next_file_string_table_offset;
3916 next_file_string_table_offset += value;
3917 }
3918 else
3919 {
f41e4712
NC
3920 bfd_size_type amt = strx + file_string_table_offset;
3921
252b5132
RH
3922 /* Using the (possibly updated) string table offset, print the
3923 string (if any) associated with this symbol. */
f41e4712 3924 if (amt < stabstr_size)
12add40e
NC
3925 /* PR 17512: file: 079-79389-0.001:0.1.
3926 FIXME: May need to sanitize this string before displaying. */
f41e4712 3927 printf (" %.*s", (int)(stabstr_size - amt), strtab + amt);
252b5132
RH
3928 else
3929 printf (" *");
3930 }
3931 }
3932 printf ("\n\n");
29ca8dc5 3933 *string_offset_ptr = next_file_string_table_offset;
252b5132
RH
3934}
3935
155e0d23
NC
3936typedef struct
3937{
3938 const char * section_name;
3939 const char * string_section_name;
29ca8dc5 3940 unsigned string_offset;
155e0d23
NC
3941}
3942stab_section_names;
3943
252b5132 3944static void
155e0d23 3945find_stabs_section (bfd *abfd, asection *section, void *names)
252b5132 3946{
155e0d23
NC
3947 int len;
3948 stab_section_names * sought = (stab_section_names *) names;
252b5132
RH
3949
3950 /* Check for section names for which stabsect_name is a prefix, to
29ca8dc5 3951 handle .stab.N, etc. */
155e0d23
NC
3952 len = strlen (sought->section_name);
3953
3954 /* If the prefix matches, and the files section name ends with a
3955 nul or a digit, then we match. I.e., we want either an exact
3956 match or a section followed by a number. */
3957 if (strncmp (sought->section_name, section->name, len) == 0
3958 && (section->name[len] == 0
29ca8dc5 3959 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
252b5132 3960 {
29ca8dc5
NS
3961 if (strtab == NULL)
3962 strtab = read_section_stabs (abfd, sought->string_section_name,
7d9813f1 3963 &stabstr_size, NULL);
3aade688 3964
29ca8dc5 3965 if (strtab)
252b5132 3966 {
7d9813f1 3967 stabs = read_section_stabs (abfd, section->name, &stab_size, NULL);
29ca8dc5
NS
3968 if (stabs)
3969 print_section_stabs (abfd, section->name, &sought->string_offset);
252b5132
RH
3970 }
3971 }
3972}
98a91d6a 3973
155e0d23
NC
3974static void
3975dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
3976{
3977 stab_section_names s;
3978
3979 s.section_name = stabsect_name;
3980 s.string_section_name = strsect_name;
29ca8dc5
NS
3981 s.string_offset = 0;
3982
155e0d23 3983 bfd_map_over_sections (abfd, find_stabs_section, & s);
29ca8dc5
NS
3984
3985 free (strtab);
3986 strtab = NULL;
155e0d23
NC
3987}
3988
3989/* Dump the any sections containing stabs debugging information. */
3990
3991static void
3992dump_stabs (bfd *abfd)
3993{
3994 dump_stabs_section (abfd, ".stab", ".stabstr");
3995 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
3996 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
62bb81b8
TG
3997
3998 /* For Darwin. */
3999 dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
4000
155e0d23
NC
4001 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
4002}
252b5132
RH
4003\f
4004static void
46dca2e0 4005dump_bfd_header (bfd *abfd)
252b5132
RH
4006{
4007 char *comma = "";
4008
4009 printf (_("architecture: %s, "),
4010 bfd_printable_arch_mach (bfd_get_arch (abfd),
4011 bfd_get_mach (abfd)));
6b6bc957 4012 printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
252b5132 4013
82a9ed20 4014#define PF(x, y) if (abfd->flags & x) {printf ("%s%s", comma, y); comma=", ";}
252b5132
RH
4015 PF (HAS_RELOC, "HAS_RELOC");
4016 PF (EXEC_P, "EXEC_P");
4017 PF (HAS_LINENO, "HAS_LINENO");
4018 PF (HAS_DEBUG, "HAS_DEBUG");
4019 PF (HAS_SYMS, "HAS_SYMS");
4020 PF (HAS_LOCALS, "HAS_LOCALS");
4021 PF (DYNAMIC, "DYNAMIC");
4022 PF (WP_TEXT, "WP_TEXT");
4023 PF (D_PAGED, "D_PAGED");
4024 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
4025 printf (_("\nstart address 0x"));
d8180c76 4026 bfd_printf_vma (abfd, abfd->start_address);
252b5132
RH
4027 printf ("\n");
4028}
7d9813f1
NA
4029\f
4030
094e34f2 4031#ifdef ENABLE_LIBCTF
7d9813f1
NA
4032/* Formatting callback function passed to ctf_dump. Returns either the pointer
4033 it is passed, or a pointer to newly-allocated storage, in which case
4034 dump_ctf() will free it when it no longer needs it. */
4035
4036static char *
4037dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
4038 char *s, void *arg)
4039{
63160fc9 4040 const char *blanks = arg;
7d9813f1
NA
4041 char *new_s;
4042
63160fc9 4043 if (asprintf (&new_s, "%s%s", blanks, s) < 0)
7d9813f1
NA
4044 return s;
4045 return new_s;
4046}
4047
4048/* Make a ctfsect suitable for ctf_bfdopen_ctfsect(). */
4049static ctf_sect_t
4050make_ctfsect (const char *name, bfd_byte *data,
4051 bfd_size_type size)
4052{
4053 ctf_sect_t ctfsect;
4054
4055 ctfsect.cts_name = name;
7d9813f1 4056 ctfsect.cts_entsize = 1;
7d9813f1
NA
4057 ctfsect.cts_size = size;
4058 ctfsect.cts_data = data;
4059
4060 return ctfsect;
4061}
4062
926c9e76
NA
4063/* Dump CTF errors/warnings. */
4064static void
139633c3 4065dump_ctf_errs (ctf_dict_t *fp)
926c9e76
NA
4066{
4067 ctf_next_t *it = NULL;
4068 char *errtext;
4069 int is_warning;
4070 int err;
4071
4072 /* Dump accumulated errors and warnings. */
4073 while ((errtext = ctf_errwarning_next (fp, &it, &is_warning, &err)) != NULL)
4074 {
5e9b84f7 4075 non_fatal (_("%s: %s"), is_warning ? _("warning"): _("error"),
926c9e76
NA
4076 errtext);
4077 free (errtext);
4078 }
4079 if (err != ECTF_NEXT_END)
4080 {
4081 non_fatal (_("CTF error: cannot get CTF errors: `%s'"),
4082 ctf_errmsg (err));
4083 }
4084}
4085
7d9813f1
NA
4086/* Dump one CTF archive member. */
4087
4088static int
139633c3 4089dump_ctf_archive_member (ctf_dict_t *ctf, const char *name, void *arg)
7d9813f1 4090{
139633c3 4091 ctf_dict_t *parent = (ctf_dict_t *) arg;
9b32cba4
NA
4092 const char *things[] = {"Header", "Labels", "Data objects",
4093 "Function objects", "Variables", "Types", "Strings",
4094 ""};
7d9813f1
NA
4095 const char **thing;
4096 size_t i;
4097
4098 /* Only print out the name of non-default-named archive members.
4099 The name .ctf appears everywhere, even for things that aren't
fd86991b
NA
4100 really archives, so printing it out is liable to be confusing.
4101
4102 The parent, if there is one, is the default-owned archive member:
4103 avoid importing it into itself. (This does no harm, but looks
4104 confusing.) */
4105
7d9813f1 4106 if (strcmp (name, ".ctf") != 0)
fd86991b
NA
4107 {
4108 printf (_("\nCTF archive member: %s:\n"), sanitize_string (name));
4109 ctf_import (ctf, parent);
4110 }
7d9813f1 4111
9b32cba4 4112 for (i = 0, thing = things; *thing[0]; thing++, i++)
7d9813f1
NA
4113 {
4114 ctf_dump_state_t *s = NULL;
4115 char *item;
4116
4117 printf ("\n %s:\n", *thing);
4118 while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
4119 (void *) " ")) != NULL)
4120 {
4121 printf ("%s\n", item);
4122 free (item);
4123 }
4124
4125 if (ctf_errno (ctf))
4126 {
3dd6b890 4127 non_fatal (_("Iteration failed: %s, %s"), *thing,
7d9813f1
NA
4128 ctf_errmsg (ctf_errno (ctf)));
4129 break;
4130 }
4131 }
8b37e7b6 4132
926c9e76 4133 dump_ctf_errs (ctf);
8b37e7b6 4134
7d9813f1
NA
4135 return 0;
4136}
4137
4138/* Dump the CTF debugging information. */
4139
4140static void
4141dump_ctf (bfd *abfd, const char *sect_name, const char *parent_name)
4142{
fd86991b 4143 ctf_archive_t *ctfa, *parenta = NULL, *lookparent;
7d9813f1
NA
4144 bfd_byte *ctfdata, *parentdata = NULL;
4145 bfd_size_type ctfsize, parentsize;
4146 ctf_sect_t ctfsect;
139633c3 4147 ctf_dict_t *parent = NULL;
7d9813f1
NA
4148 int err;
4149
4150 if ((ctfdata = read_section_stabs (abfd, sect_name, &ctfsize, NULL)) == NULL)
4151 bfd_fatal (bfd_get_filename (abfd));
4152
4153 if (parent_name
4154 && (parentdata = read_section_stabs (abfd, parent_name, &parentsize,
4155 NULL)) == NULL)
4156 bfd_fatal (bfd_get_filename (abfd));
4157
4158 /* Load the CTF file and dump it. */
4159
4160 ctfsect = make_ctfsect (sect_name, ctfdata, ctfsize);
4161 if ((ctfa = ctf_bfdopen_ctfsect (abfd, &ctfsect, &err)) == NULL)
4162 {
926c9e76 4163 dump_ctf_errs (NULL);
3dd6b890 4164 non_fatal (_("CTF open failure: %s"), ctf_errmsg (err));
7d9813f1
NA
4165 bfd_fatal (bfd_get_filename (abfd));
4166 }
4167
4168 if (parentdata)
4169 {
4170 ctfsect = make_ctfsect (parent_name, parentdata, parentsize);
4171 if ((parenta = ctf_bfdopen_ctfsect (abfd, &ctfsect, &err)) == NULL)
4172 {
926c9e76 4173 dump_ctf_errs (NULL);
3dd6b890 4174 non_fatal (_("CTF open failure: %s"), ctf_errmsg (err));
7d9813f1
NA
4175 bfd_fatal (bfd_get_filename (abfd));
4176 }
4177
fd86991b
NA
4178 lookparent = parenta;
4179 }
4180 else
4181 lookparent = ctfa;
4182
4183 /* Assume that the applicable parent archive member is the default one.
4184 (This is what all known implementations are expected to do, if they
4185 put CTFs and their parents in archives together.) */
ae41200b 4186 if ((parent = ctf_dict_open (lookparent, NULL, &err)) == NULL)
fd86991b 4187 {
926c9e76 4188 dump_ctf_errs (NULL);
3dd6b890 4189 non_fatal (_("CTF open failure: %s"), ctf_errmsg (err));
fd86991b 4190 bfd_fatal (bfd_get_filename (abfd));
7d9813f1
NA
4191 }
4192
4193 printf (_("Contents of CTF section %s:\n"), sanitize_string (sect_name));
4194
83d59285
NA
4195 if ((err = ctf_archive_iter (ctfa, dump_ctf_archive_member, parent)) != 0)
4196 {
4197 dump_ctf_errs (NULL);
4198 non_fatal (_("CTF archive member open failure: %s"), ctf_errmsg (err));
4199 bfd_fatal (bfd_get_filename (abfd));
4200 }
139633c3 4201 ctf_dict_close (parent);
7d9813f1
NA
4202 ctf_close (ctfa);
4203 ctf_close (parenta);
4204 free (parentdata);
4205 free (ctfdata);
4206}
094e34f2
NA
4207#else
4208static void
4209dump_ctf (bfd *abfd ATTRIBUTE_UNUSED, const char *sect_name ATTRIBUTE_UNUSED,
4210 const char *parent_name ATTRIBUTE_UNUSED) {}
4211#endif
98a91d6a 4212
79b377b3 4213\f
252b5132 4214static void
46dca2e0 4215dump_bfd_private_header (bfd *abfd)
252b5132 4216{
7d272a55
AM
4217 if (!bfd_print_private_bfd_data (abfd, stdout))
4218 non_fatal (_("warning: private headers incomplete: %s"),
4219 bfd_errmsg (bfd_get_error ()));
252b5132
RH
4220}
4221
6abcee90
TG
4222static void
4223dump_target_specific (bfd *abfd)
4224{
4225 const struct objdump_private_desc * const *desc;
4226 struct objdump_private_option *opt;
4227 char *e, *b;
4228
4229 /* Find the desc. */
4230 for (desc = objdump_private_vectors; *desc != NULL; desc++)
4231 if ((*desc)->filter (abfd))
4232 break;
4233
c32d6f7b 4234 if (*desc == NULL)
6abcee90
TG
4235 {
4236 non_fatal (_("option -P/--private not supported by this file"));
4237 return;
4238 }
4239
4240 /* Clear all options. */
4241 for (opt = (*desc)->options; opt->name; opt++)
015dc7e1 4242 opt->selected = false;
6abcee90
TG
4243
4244 /* Decode options. */
4245 b = dump_private_options;
4246 do
4247 {
4248 e = strchr (b, ',');
4249
4250 if (e)
4251 *e = 0;
4252
4253 for (opt = (*desc)->options; opt->name; opt++)
4254 if (strcmp (opt->name, b) == 0)
4255 {
015dc7e1 4256 opt->selected = true;
6abcee90
TG
4257 break;
4258 }
4259 if (opt->name == NULL)
4260 non_fatal (_("target specific dump '%s' not supported"), b);
4261
4262 if (e)
4263 {
4264 *e = ',';
4265 b = e + 1;
4266 }
4267 }
4268 while (e != NULL);
4269
4270 /* Dump. */
4271 (*desc)->dump (abfd);
4272}
155e0d23
NC
4273\f
4274/* Display a section in hexadecimal format with associated characters.
4275 Each line prefixed by the zero padded address. */
d24de309 4276
252b5132 4277static void
155e0d23 4278dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
252b5132 4279{
cfd14a50 4280 bfd_byte *data = NULL;
155e0d23 4281 bfd_size_type datasize;
bdc4de1b
NC
4282 bfd_vma addr_offset;
4283 bfd_vma start_offset;
4284 bfd_vma stop_offset;
61826503 4285 unsigned int opb = bfd_octets_per_byte (abfd, section);
155e0d23
NC
4286 /* Bytes per line. */
4287 const int onaline = 16;
4288 char buf[64];
4289 int count;
4290 int width;
4291
8fab9282 4292 if (! process_section_p (section))
155e0d23
NC
4293 return;
4294
8fab9282 4295 if ((section->flags & SEC_HAS_CONTENTS) == 0)
155e0d23 4296 return;
3aade688 4297
fd361982 4298 if ((datasize = bfd_section_size (section)) == 0)
155e0d23
NC
4299 return;
4300
155e0d23
NC
4301 /* Compute the address range to display. */
4302 if (start_address == (bfd_vma) -1
4303 || start_address < section->vma)
4304 start_offset = 0;
4305 else
4306 start_offset = start_address - section->vma;
4307
4308 if (stop_address == (bfd_vma) -1)
4309 stop_offset = datasize / opb;
4310 else
252b5132 4311 {
155e0d23
NC
4312 if (stop_address < section->vma)
4313 stop_offset = 0;
4314 else
4315 stop_offset = stop_address - section->vma;
252b5132 4316
155e0d23
NC
4317 if (stop_offset > datasize / opb)
4318 stop_offset = datasize / opb;
252b5132
RH
4319 }
4320
32760852
NC
4321 if (start_offset >= stop_offset)
4322 return;
3aade688 4323
12add40e 4324 printf (_("Contents of section %s:"), sanitize_string (section->name));
32760852 4325 if (display_file_offsets)
0af1713e
AM
4326 printf (_(" (Starting at file offset: 0x%lx)"),
4327 (unsigned long) (section->filepos + start_offset));
32760852
NC
4328 printf ("\n");
4329
4a114e3e
L
4330 if (!bfd_get_full_section_contents (abfd, section, &data))
4331 {
0821d5b1
NC
4332 non_fatal (_("Reading section %s failed because: %s"),
4333 section->name, bfd_errmsg (bfd_get_error ()));
4a114e3e
L
4334 return;
4335 }
32760852 4336
155e0d23 4337 width = 4;
026df7c5 4338
155e0d23
NC
4339 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
4340 if (strlen (buf) >= sizeof (buf))
4341 abort ();
026df7c5 4342
155e0d23
NC
4343 count = 0;
4344 while (buf[count] == '0' && buf[count+1] != '\0')
4345 count++;
4346 count = strlen (buf) - count;
4347 if (count > width)
4348 width = count;
252b5132 4349
155e0d23
NC
4350 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
4351 if (strlen (buf) >= sizeof (buf))
4352 abort ();
026df7c5 4353
155e0d23
NC
4354 count = 0;
4355 while (buf[count] == '0' && buf[count+1] != '\0')
4356 count++;
4357 count = strlen (buf) - count;
4358 if (count > width)
4359 width = count;
026df7c5 4360
155e0d23
NC
4361 for (addr_offset = start_offset;
4362 addr_offset < stop_offset; addr_offset += onaline / opb)
d24de309 4363 {
155e0d23 4364 bfd_size_type j;
d24de309 4365
155e0d23
NC
4366 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
4367 count = strlen (buf);
4368 if ((size_t) count >= sizeof (buf))
4369 abort ();
d24de309 4370
155e0d23
NC
4371 putchar (' ');
4372 while (count < width)
252b5132 4373 {
155e0d23
NC
4374 putchar ('0');
4375 count++;
4376 }
4377 fputs (buf + count - width, stdout);
4378 putchar (' ');
252b5132 4379
155e0d23
NC
4380 for (j = addr_offset * opb;
4381 j < addr_offset * opb + onaline; j++)
4382 {
4383 if (j < stop_offset * opb)
4384 printf ("%02x", (unsigned) (data[j]));
4385 else
4386 printf (" ");
4387 if ((j & 3) == 3)
4388 printf (" ");
252b5132
RH
4389 }
4390
155e0d23
NC
4391 printf (" ");
4392 for (j = addr_offset * opb;
4393 j < addr_offset * opb + onaline; j++)
4394 {
4395 if (j >= stop_offset * opb)
4396 printf (" ");
4397 else
4398 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
4399 }
4400 putchar ('\n');
252b5132 4401 }
155e0d23 4402 free (data);
252b5132 4403}
155e0d23 4404
98a91d6a 4405/* Actually display the various requested regions. */
252b5132
RH
4406
4407static void
46dca2e0 4408dump_data (bfd *abfd)
252b5132 4409{
155e0d23 4410 bfd_map_over_sections (abfd, dump_section, NULL);
252b5132
RH
4411}
4412
98a91d6a
NC
4413/* Should perhaps share code and display with nm? */
4414
252b5132 4415static void
015dc7e1 4416dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bool dynamic)
252b5132
RH
4417{
4418 asymbol **current;
91d6fa6a 4419 long max_count;
252b5132
RH
4420 long count;
4421
4422 if (dynamic)
4423 {
4424 current = dynsyms;
91d6fa6a 4425 max_count = dynsymcount;
252b5132
RH
4426 printf ("DYNAMIC SYMBOL TABLE:\n");
4427 }
4428 else
4429 {
4430 current = syms;
91d6fa6a 4431 max_count = symcount;
252b5132
RH
4432 printf ("SYMBOL TABLE:\n");
4433 }
4434
91d6fa6a 4435 if (max_count == 0)
a1df01d1
AM
4436 printf (_("no symbols\n"));
4437
91d6fa6a 4438 for (count = 0; count < max_count; count++)
252b5132 4439 {
155e0d23
NC
4440 bfd *cur_bfd;
4441
4442 if (*current == NULL)
83ef0798 4443 printf (_("no information for symbol number %ld\n"), count);
155e0d23
NC
4444
4445 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
83ef0798 4446 printf (_("could not determine the type of symbol number %ld\n"),
155e0d23
NC
4447 count);
4448
661f7c35
NC
4449 else if (process_section_p ((* current)->section)
4450 && (dump_special_syms
4451 || !bfd_is_target_special_symbol (cur_bfd, *current)))
252b5132 4452 {
155e0d23 4453 const char *name = (*current)->name;
252b5132 4454
155e0d23 4455 if (do_demangle && name != NULL && *name != '\0')
252b5132 4456 {
252b5132
RH
4457 char *alloc;
4458
155e0d23
NC
4459 /* If we want to demangle the name, we demangle it
4460 here, and temporarily clobber it while calling
4461 bfd_print_symbol. FIXME: This is a gross hack. */
af03af8f 4462 alloc = bfd_demangle (cur_bfd, name, demangle_flags);
ed180cc5
AM
4463 if (alloc != NULL)
4464 (*current)->name = alloc;
252b5132
RH
4465 bfd_print_symbol (cur_bfd, stdout, *current,
4466 bfd_print_symbol_all);
ed180cc5
AM
4467 if (alloc != NULL)
4468 {
4469 (*current)->name = name;
4470 free (alloc);
4471 }
252b5132 4472 }
252b5132 4473 else
155e0d23
NC
4474 bfd_print_symbol (cur_bfd, stdout, *current,
4475 bfd_print_symbol_all);
83ef0798 4476 printf ("\n");
252b5132 4477 }
661f7c35 4478
155e0d23 4479 current++;
252b5132 4480 }
155e0d23 4481 printf ("\n\n");
252b5132 4482}
155e0d23 4483\f
252b5132 4484static void
46dca2e0 4485dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
252b5132
RH
4486{
4487 arelent **p;
4488 char *last_filename, *last_functionname;
4489 unsigned int last_line;
9b8d1a36 4490 unsigned int last_discriminator;
252b5132
RH
4491
4492 /* Get column headers lined up reasonably. */
4493 {
4494 static int width;
98a91d6a 4495
252b5132
RH
4496 if (width == 0)
4497 {
4498 char buf[30];
155e0d23 4499
d8180c76 4500 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
252b5132
RH
4501 width = strlen (buf) - 7;
4502 }
4503 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
4504 }
4505
4506 last_filename = NULL;
4507 last_functionname = NULL;
4508 last_line = 0;
9b8d1a36 4509 last_discriminator = 0;
252b5132 4510
d3ba0551 4511 for (p = relpp; relcount && *p != NULL; p++, relcount--)
252b5132
RH
4512 {
4513 arelent *q = *p;
4514 const char *filename, *functionname;
91d6fa6a 4515 unsigned int linenumber;
9b8d1a36 4516 unsigned int discriminator;
252b5132
RH
4517 const char *sym_name;
4518 const char *section_name;
bf03e632 4519 bfd_vma addend2 = 0;
252b5132
RH
4520
4521 if (start_address != (bfd_vma) -1
4522 && q->address < start_address)
4523 continue;
4524 if (stop_address != (bfd_vma) -1
4525 && q->address > stop_address)
4526 continue;
4527
4528 if (with_line_numbers
4529 && sec != NULL
9b8d1a36
CC
4530 && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
4531 &filename, &functionname,
4532 &linenumber, &discriminator))
252b5132
RH
4533 {
4534 if (functionname != NULL
4535 && (last_functionname == NULL
4536 || strcmp (functionname, last_functionname) != 0))
4537 {
12add40e 4538 printf ("%s():\n", sanitize_string (functionname));
252b5132
RH
4539 if (last_functionname != NULL)
4540 free (last_functionname);
4541 last_functionname = xstrdup (functionname);
4542 }
98a91d6a 4543
91d6fa6a
NC
4544 if (linenumber > 0
4545 && (linenumber != last_line
252b5132
RH
4546 || (filename != NULL
4547 && last_filename != NULL
9b8d1a36
CC
4548 && filename_cmp (filename, last_filename) != 0)
4549 || (discriminator != last_discriminator)))
252b5132 4550 {
9b8d1a36 4551 if (discriminator > 0)
12add40e
NC
4552 printf ("%s:%u\n", filename == NULL ? "???" :
4553 sanitize_string (filename), linenumber);
9b8d1a36 4554 else
12add40e
NC
4555 printf ("%s:%u (discriminator %u)\n",
4556 filename == NULL ? "???" : sanitize_string (filename),
9b8d1a36 4557 linenumber, discriminator);
91d6fa6a 4558 last_line = linenumber;
9b8d1a36 4559 last_discriminator = discriminator;
252b5132
RH
4560 if (last_filename != NULL)
4561 free (last_filename);
4562 if (filename == NULL)
4563 last_filename = NULL;
4564 else
4565 last_filename = xstrdup (filename);
4566 }
4567 }
4568
4569 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
4570 {
4571 sym_name = (*(q->sym_ptr_ptr))->name;
4572 section_name = (*(q->sym_ptr_ptr))->section->name;
4573 }
4574 else
4575 {
4576 sym_name = NULL;
4577 section_name = NULL;
4578 }
98a91d6a 4579
f9ecb0a4
JJ
4580 bfd_printf_vma (abfd, q->address);
4581 if (q->howto == NULL)
4582 printf (" *unknown* ");
4583 else if (q->howto->name)
bf03e632
DM
4584 {
4585 const char *name = q->howto->name;
4586
4587 /* R_SPARC_OLO10 relocations contain two addends.
4588 But because 'arelent' lacks enough storage to
4589 store them both, the 64-bit ELF Sparc backend
4590 records this as two relocations. One R_SPARC_LO10
4591 and one R_SPARC_13, both pointing to the same
4592 address. This is merely so that we have some
4593 place to store both addend fields.
4594
4595 Undo this transformation, otherwise the output
4596 will be confusing. */
4597 if (abfd->xvec->flavour == bfd_target_elf_flavour
82a9ed20 4598 && elf_tdata (abfd)->elf_header->e_machine == EM_SPARCV9
bf03e632
DM
4599 && relcount > 1
4600 && !strcmp (q->howto->name, "R_SPARC_LO10"))
4601 {
4602 arelent *q2 = *(p + 1);
4603 if (q2 != NULL
4604 && q2->howto
4605 && q->address == q2->address
4606 && !strcmp (q2->howto->name, "R_SPARC_13"))
4607 {
4608 name = "R_SPARC_OLO10";
4609 addend2 = q2->addend;
4610 p++;
4611 }
4612 }
4613 printf (" %-16s ", name);
4614 }
f9ecb0a4
JJ
4615 else
4616 printf (" %-16d ", q->howto->type);
171191ba 4617
252b5132 4618 if (sym_name)
171191ba
NC
4619 {
4620 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
171191ba 4621 }
252b5132
RH
4622 else
4623 {
d3ba0551 4624 if (section_name == NULL)
252b5132 4625 section_name = "*unknown*";
12add40e 4626 printf ("[%s]", sanitize_string (section_name));
252b5132 4627 }
98a91d6a 4628
252b5132
RH
4629 if (q->addend)
4630 {
343dbc36
L
4631 bfd_signed_vma addend = q->addend;
4632 if (addend < 0)
4633 {
4634 printf ("-0x");
4635 addend = -addend;
4636 }
4637 else
4638 printf ("+0x");
4639 bfd_printf_vma (abfd, addend);
252b5132 4640 }
bf03e632
DM
4641 if (addend2)
4642 {
4643 printf ("+0x");
4644 bfd_printf_vma (abfd, addend2);
4645 }
98a91d6a 4646
252b5132
RH
4647 printf ("\n");
4648 }
4b41844b
NC
4649
4650 if (last_filename != NULL)
4651 free (last_filename);
4652 if (last_functionname != NULL)
4653 free (last_functionname);
252b5132 4654}
43ac9881 4655
155e0d23 4656static void
3b9ad1cc
AM
4657dump_relocs_in_section (bfd *abfd,
4658 asection *section,
4659 void *dummy ATTRIBUTE_UNUSED)
155e0d23 4660{
e8fba7f6 4661 arelent **relpp = NULL;
155e0d23
NC
4662 long relcount;
4663 long relsize;
4664
4665 if ( bfd_is_abs_section (section)
4666 || bfd_is_und_section (section)
4667 || bfd_is_com_section (section)
4668 || (! process_section_p (section))
4669 || ((section->flags & SEC_RELOC) == 0))
4670 return;
4671
12add40e 4672 printf ("RELOCATION RECORDS FOR [%s]:", sanitize_string (section->name));
155e0d23 4673
7a6e0d89 4674 relsize = bfd_get_reloc_upper_bound (abfd, section);
155e0d23
NC
4675 if (relsize == 0)
4676 {
4677 printf (" (none)\n\n");
4678 return;
4679 }
4680
7a6e0d89
AM
4681 if (relsize < 0)
4682 relcount = relsize;
4683 else
4684 {
4685 relpp = (arelent **) xmalloc (relsize);
4686 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
39ff1b79
NC
4687 }
4688
155e0d23 4689 if (relcount < 0)
5a3f568b
NC
4690 {
4691 printf ("\n");
7a6e0d89
AM
4692 non_fatal (_("failed to read relocs in: %s"),
4693 sanitize_string (bfd_get_filename (abfd)));
5a3f568b
NC
4694 bfd_fatal (_("error message was"));
4695 }
155e0d23
NC
4696 else if (relcount == 0)
4697 printf (" (none)\n\n");
4698 else
4699 {
4700 printf ("\n");
4701 dump_reloc_set (abfd, section, relpp, relcount);
4702 printf ("\n\n");
4703 }
4704 free (relpp);
4705}
4706
4707static void
4708dump_relocs (bfd *abfd)
4709{
4710 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
4711}
4712
4713static void
4714dump_dynamic_relocs (bfd *abfd)
4715{
4716 long relsize;
4717 arelent **relpp;
4718 long relcount;
4719
4720 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
4721 if (relsize < 0)
4722 bfd_fatal (bfd_get_filename (abfd));
4723
4724 printf ("DYNAMIC RELOCATION RECORDS");
4725
4726 if (relsize == 0)
4727 printf (" (none)\n\n");
4728 else
4729 {
3f5e193b 4730 relpp = (arelent **) xmalloc (relsize);
155e0d23
NC
4731 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
4732
4733 if (relcount < 0)
4734 bfd_fatal (bfd_get_filename (abfd));
4735 else if (relcount == 0)
4736 printf (" (none)\n\n");
4737 else
4738 {
4739 printf ("\n");
4740 dump_reloc_set (abfd, NULL, relpp, relcount);
4741 printf ("\n\n");
4742 }
4743 free (relpp);
4744 }
4745}
4746
43ac9881
AM
4747/* Creates a table of paths, to search for source files. */
4748
4749static void
4750add_include_path (const char *path)
4751{
4752 if (path[0] == 0)
4753 return;
4754 include_path_count++;
3f5e193b
NC
4755 include_paths = (const char **)
4756 xrealloc (include_paths, include_path_count * sizeof (*include_paths));
43ac9881
AM
4757#ifdef HAVE_DOS_BASED_FILE_SYSTEM
4758 if (path[1] == ':' && path[2] == 0)
4759 path = concat (path, ".", (const char *) 0);
4760#endif
4761 include_paths[include_path_count - 1] = path;
4762}
155e0d23
NC
4763
4764static void
3b9ad1cc
AM
4765adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
4766 asection *section,
bc79cded 4767 void *arg)
155e0d23 4768{
bc79cded
L
4769 if ((section->flags & SEC_DEBUGGING) == 0)
4770 {
015dc7e1 4771 bool *has_reloc_p = (bool *) arg;
bc79cded
L
4772 section->vma += adjust_section_vma;
4773 if (*has_reloc_p)
4774 section->lma += adjust_section_vma;
4775 }
155e0d23
NC
4776}
4777
2379f9c4
FS
4778/* Return the sign-extended form of an ARCH_SIZE sized VMA. */
4779
4780static bfd_vma
4781sign_extend_address (bfd *abfd ATTRIBUTE_UNUSED,
4782 bfd_vma vma,
4783 unsigned arch_size)
4784{
4785 bfd_vma mask;
4786 mask = (bfd_vma) 1 << (arch_size - 1);
4787 return (((vma & ((mask << 1) - 1)) ^ mask) - mask);
4788}
4789
155e0d23
NC
4790/* Dump selected contents of ABFD. */
4791
4792static void
015dc7e1 4793dump_bfd (bfd *abfd, bool is_mainfile)
155e0d23 4794{
2379f9c4
FS
4795 const struct elf_backend_data * bed;
4796
39f0547e
NC
4797 if (bfd_big_endian (abfd))
4798 byte_get = byte_get_big_endian;
4799 else if (bfd_little_endian (abfd))
4800 byte_get = byte_get_little_endian;
4801 else
4802 byte_get = NULL;
4803
4804 /* Load any separate debug information files.
4805 We do this now and without checking do_follow_links because separate
4806 debug info files may contain symbol tables that we will need when
4807 displaying information about the main file. Any memory allocated by
4808 load_separate_debug_files will be released when we call
4809 free_debug_memory below.
4810
4811 The test on is_mainfile is there because the chain of separate debug
4812 info files is a global variable shared by all invocations of dump_bfd. */
4813 if (is_mainfile)
4814 {
4815 load_separate_debug_files (abfd, bfd_get_filename (abfd));
4816
4817 /* If asked to do so, recursively dump the separate files. */
4818 if (do_follow_links)
4819 {
4820 separate_info * i;
4821
4822 for (i = first_separate_info; i != NULL; i = i->next)
015dc7e1 4823 dump_bfd (i->handle, false);
39f0547e
NC
4824 }
4825 }
4826
2379f9c4
FS
4827 /* Adjust user-specified start and stop limits for targets that use
4828 signed addresses. */
4829 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
4830 && (bed = get_elf_backend_data (abfd)) != NULL
4831 && bed->sign_extend_vma)
4832 {
4833 start_address = sign_extend_address (abfd, start_address,
4834 bed->s->arch_size);
4835 stop_address = sign_extend_address (abfd, stop_address,
4836 bed->s->arch_size);
4837 }
4838
155e0d23
NC
4839 /* If we are adjusting section VMA's, change them all now. Changing
4840 the BFD information is a hack. However, we must do it, or
4841 bfd_find_nearest_line will not do the right thing. */
4842 if (adjust_section_vma != 0)
bc79cded 4843 {
015dc7e1 4844 bool has_reloc = (abfd->flags & HAS_RELOC);
bc79cded
L
4845 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
4846 }
155e0d23 4847
ca0e11aa
NC
4848 if (! is_mainfile && ! process_links)
4849 return;
4850
fd2f0033 4851 if (! dump_debugging_tags && ! suppress_bfd_header)
12add40e
NC
4852 printf (_("\n%s: file format %s\n"),
4853 sanitize_string (bfd_get_filename (abfd)),
155e0d23
NC
4854 abfd->xvec->name);
4855 if (dump_ar_hdrs)
015dc7e1 4856 print_arelt_descr (stdout, abfd, true, false);
155e0d23
NC
4857 if (dump_file_header)
4858 dump_bfd_header (abfd);
4859 if (dump_private_headers)
4860 dump_bfd_private_header (abfd);
6abcee90
TG
4861 if (dump_private_options != NULL)
4862 dump_target_specific (abfd);
fd2f0033 4863 if (! dump_debugging_tags && ! suppress_bfd_header)
155e0d23 4864 putchar ('\n');
155e0d23 4865
365544c3
L
4866 if (dump_symtab
4867 || dump_reloc_info
4868 || disassemble
4869 || dump_debugging
4870 || dump_dwarf_section_info)
39f0547e
NC
4871 {
4872 syms = slurp_symtab (abfd);
4873
4874 /* If following links, load any symbol tables from the linked files as well. */
4875 if (do_follow_links && is_mainfile)
4876 {
4877 separate_info * i;
4878
4879 for (i = first_separate_info; i != NULL; i = i->next)
4880 {
4881 asymbol ** extra_syms;
4882 long old_symcount = symcount;
4883
4884 extra_syms = slurp_symtab (i->handle);
4885
4886 if (extra_syms)
4887 {
4888 if (old_symcount == 0)
4889 {
4890 syms = extra_syms;
4891 }
4892 else
4893 {
1944212b
AM
4894 syms = xrealloc (syms, ((symcount + old_symcount + 1)
4895 * sizeof (asymbol *)));
39f0547e
NC
4896 memcpy (syms + old_symcount,
4897 extra_syms,
1944212b 4898 (symcount + 1) * sizeof (asymbol *));
39f0547e
NC
4899 }
4900 }
4901
4902 symcount += old_symcount;
4903 }
4904 }
4905 }
a29a8af8
KT
4906
4907 if (dump_section_headers)
4908 dump_headers (abfd);
4909
4c45e5c9
JJ
4910 if (dump_dynamic_symtab || dump_dynamic_reloc_info
4911 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
155e0d23 4912 dynsyms = slurp_dynamic_symtab (abfd);
39f0547e 4913
90e3cdf2 4914 if (disassemble)
4c45e5c9 4915 {
c9727e01
AM
4916 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
4917 dynsymcount, dynsyms, &synthsyms);
4918 if (synthcount < 0)
4919 synthcount = 0;
4c45e5c9 4920 }
155e0d23
NC
4921
4922 if (dump_symtab)
015dc7e1 4923 dump_symbols (abfd, false);
155e0d23 4924 if (dump_dynamic_symtab)
015dc7e1 4925 dump_symbols (abfd, true);
365544c3
L
4926 if (dump_dwarf_section_info)
4927 dump_dwarf (abfd);
7d9813f1
NA
4928 if (dump_ctf_section_info)
4929 dump_ctf (abfd, dump_ctf_section_name, dump_ctf_parent_name);
155e0d23
NC
4930 if (dump_stab_section_info)
4931 dump_stabs (abfd);
4932 if (dump_reloc_info && ! disassemble)
4933 dump_relocs (abfd);
4934 if (dump_dynamic_reloc_info && ! disassemble)
4935 dump_dynamic_relocs (abfd);
4936 if (dump_section_contents)
4937 dump_data (abfd);
4938 if (disassemble)
4939 disassemble_data (abfd);
4940
4941 if (dump_debugging)
4942 {
4943 void *dhandle;
4944
015dc7e1 4945 dhandle = read_debugging_info (abfd, syms, symcount, true);
155e0d23
NC
4946 if (dhandle != NULL)
4947 {
ed180cc5
AM
4948 if (!print_debugging_info (stdout, dhandle, abfd, syms,
4949 bfd_demangle,
63b4cc53 4950 dump_debugging_tags != 0))
155e0d23
NC
4951 {
4952 non_fatal (_("%s: printing debugging information failed"),
4953 bfd_get_filename (abfd));
4954 exit_status = 1;
4955 }
cf0ad5bb
NC
4956
4957 free (dhandle);
155e0d23 4958 }
fdef3943
AM
4959 /* PR 6483: If there was no STABS debug info in the file, try
4960 DWARF instead. */
b922d590
NC
4961 else if (! dump_dwarf_section_info)
4962 {
3aade688 4963 dwarf_select_sections_all ();
b922d590
NC
4964 dump_dwarf (abfd);
4965 }
155e0d23
NC
4966 }
4967
4968 if (syms)
4969 {
4970 free (syms);
4971 syms = NULL;
4972 }
4973
4974 if (dynsyms)
4975 {
4976 free (dynsyms);
4977 dynsyms = NULL;
4978 }
4c45e5c9
JJ
4979
4980 if (synthsyms)
4981 {
4982 free (synthsyms);
4983 synthsyms = NULL;
4984 }
4985
4986 symcount = 0;
4987 dynsymcount = 0;
4988 synthcount = 0;
39f0547e
NC
4989
4990 if (is_mainfile)
4991 free_debug_memory ();
155e0d23
NC
4992}
4993
4994static void
1598539f 4995display_object_bfd (bfd *abfd)
155e0d23
NC
4996{
4997 char **matching;
4998
4999 if (bfd_check_format_matches (abfd, bfd_object, &matching))
5000 {
015dc7e1 5001 dump_bfd (abfd, true);
155e0d23
NC
5002 return;
5003 }
5004
5005 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
5006 {
5007 nonfatal (bfd_get_filename (abfd));
5008 list_matching_formats (matching);
5009 free (matching);
5010 return;
5011 }
5012
5013 if (bfd_get_error () != bfd_error_file_not_recognized)
5014 {
5015 nonfatal (bfd_get_filename (abfd));
5016 return;
5017 }
5018
5019 if (bfd_check_format_matches (abfd, bfd_core, &matching))
5020 {
015dc7e1 5021 dump_bfd (abfd, true);
155e0d23
NC
5022 return;
5023 }
5024
5025 nonfatal (bfd_get_filename (abfd));
5026
5027 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
5028 {
5029 list_matching_formats (matching);
5030 free (matching);
5031 }
5032}
5033
5034static void
1598539f 5035display_any_bfd (bfd *file, int level)
155e0d23 5036{
4a114e3e
L
5037 /* Decompress sections unless dumping the section contents. */
5038 if (!dump_section_contents)
5039 file->flags |= BFD_DECOMPRESS;
5040
155e0d23
NC
5041 /* If the file is an archive, process all of its elements. */
5042 if (bfd_check_format (file, bfd_archive))
5043 {
1598539f 5044 bfd *arfile = NULL;
155e0d23 5045 bfd *last_arfile = NULL;
bdc4de1b 5046
1598539f 5047 if (level == 0)
12add40e 5048 printf (_("In archive %s:\n"), sanitize_string (bfd_get_filename (file)));
c88f5b8e
NC
5049 else if (level > 100)
5050 {
5051 /* Prevent corrupted files from spinning us into an
5052 infinite loop. 100 is an arbitrary heuristic. */
64d29018 5053 fatal (_("Archive nesting is too deep"));
c88f5b8e
NC
5054 return;
5055 }
1598539f 5056 else
12add40e
NC
5057 printf (_("In nested archive %s:\n"),
5058 sanitize_string (bfd_get_filename (file)));
1598539f 5059
155e0d23
NC
5060 for (;;)
5061 {
5062 bfd_set_error (bfd_error_no_error);
5063
5064 arfile = bfd_openr_next_archived_file (file, arfile);
5065 if (arfile == NULL)
5066 {
5067 if (bfd_get_error () != bfd_error_no_more_archived_files)
5068 nonfatal (bfd_get_filename (file));
5069 break;
5070 }
5071
1598539f 5072 display_any_bfd (arfile, level + 1);
155e0d23
NC
5073
5074 if (last_arfile != NULL)
f64e188b
NC
5075 {
5076 bfd_close (last_arfile);
5077 /* PR 17512: file: ac585d01. */
5078 if (arfile == last_arfile)
5079 {
5080 last_arfile = NULL;
5081 break;
5082 }
5083 }
155e0d23
NC
5084 last_arfile = arfile;
5085 }
5086
5087 if (last_arfile != NULL)
5088 bfd_close (last_arfile);
5089 }
5090 else
1598539f
TG
5091 display_object_bfd (file);
5092}
5093
5094static void
015dc7e1 5095display_file (char *filename, char *target, bool last_file)
1598539f
TG
5096{
5097 bfd *file;
5098
5099 if (get_file_size (filename) < 1)
5100 {
5101 exit_status = 1;
5102 return;
5103 }
5104
5105 file = bfd_openr (filename, target);
5106 if (file == NULL)
5107 {
5108 nonfatal (filename);
5109 return;
5110 }
5111
5112 display_any_bfd (file, 0);
155e0d23 5113
cd6581da
NC
5114 /* This is an optimization to improve the speed of objdump, especially when
5115 dumping a file with lots of associated debug informatiom. Calling
5116 bfd_close on such a file can take a non-trivial amount of time as there
5117 are lots of lists to walk and buffers to free. This is only really
5118 necessary however if we are about to load another file and we need the
5119 memory back. Otherwise, if we are about to exit, then we can save (a lot
5120 of) time by only doing a quick close, and allowing the OS to reclaim the
5121 memory for us. */
5122 if (! last_file)
5123 bfd_close (file);
5124 else
5125 bfd_close_all_done (file);
155e0d23 5126}
252b5132 5127\f
252b5132 5128int
46dca2e0 5129main (int argc, char **argv)
252b5132
RH
5130{
5131 int c;
5132 char *target = default_target;
015dc7e1 5133 bool seenflag = false;
252b5132 5134
87b9f255 5135#ifdef HAVE_LC_MESSAGES
252b5132 5136 setlocale (LC_MESSAGES, "");
3882b010 5137#endif
3882b010 5138 setlocale (LC_CTYPE, "");
155e0d23 5139
252b5132
RH
5140 bindtextdomain (PACKAGE, LOCALEDIR);
5141 textdomain (PACKAGE);
5142
5143 program_name = *argv;
5144 xmalloc_set_program_name (program_name);
86eafac0 5145 bfd_set_error_program_name (program_name);
252b5132
RH
5146
5147 START_PROGRESS (program_name, 0);
5148
869b9d07
MM
5149 expandargv (&argc, &argv);
5150
bf2dd8d7
AM
5151 if (bfd_init () != BFD_INIT_MAGIC)
5152 fatal (_("fatal error: libbfd ABI mismatch"));
252b5132
RH
5153 set_default_bfd_target ();
5154
4cb93e3b 5155 while ((c = getopt_long (argc, argv,
6abcee90 5156 "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
252b5132
RH
5157 long_options, (int *) 0))
5158 != EOF)
5159 {
252b5132
RH
5160 switch (c)
5161 {
5162 case 0:
8b53311e 5163 break; /* We've been given a long option. */
252b5132
RH
5164 case 'm':
5165 machine = optarg;
5166 break;
dd92f639 5167 case 'M':
65b48a81
PB
5168 {
5169 char *options;
5170 if (disassembler_options)
5171 /* Ignore potential memory leak for now. */
5172 options = concat (disassembler_options, ",",
5173 optarg, (const char *) NULL);
5174 else
5175 options = optarg;
5176 disassembler_options = remove_whitespace_and_extra_commas (options);
5177 }
dd92f639 5178 break;
252b5132 5179 case 'j':
70ecb384 5180 add_only (optarg);
252b5132 5181 break;
98ec6e72 5182 case 'F':
015dc7e1 5183 display_file_offsets = true;
98ec6e72 5184 break;
252b5132 5185 case 'l':
015dc7e1 5186 with_line_numbers = true;
252b5132
RH
5187 break;
5188 case 'b':
5189 target = optarg;
5190 break;
1dada9c5 5191 case 'C':
015dc7e1 5192 do_demangle = true;
28c309a2
NC
5193 if (optarg != NULL)
5194 {
5195 enum demangling_styles style;
8b53311e 5196
28c309a2 5197 style = cplus_demangle_name_to_style (optarg);
0af11b59 5198 if (style == unknown_demangling)
28c309a2
NC
5199 fatal (_("unknown demangling style `%s'"),
5200 optarg);
8b53311e 5201
28c309a2 5202 cplus_demangle_set_style (style);
0af11b59 5203 }
1dada9c5 5204 break;
af03af8f
NC
5205 case OPTION_RECURSE_LIMIT:
5206 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
5207 break;
5208 case OPTION_NO_RECURSE_LIMIT:
5209 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
5210 break;
1dada9c5 5211 case 'w':
015dc7e1 5212 do_wide = wide_output = true;
1dada9c5
NC
5213 break;
5214 case OPTION_ADJUST_VMA:
5215 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
5216 break;
5217 case OPTION_START_ADDRESS:
5218 start_address = parse_vma (optarg, "--start-address");
98ec6e72
NC
5219 if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
5220 fatal (_("error: the start address should be before the end address"));
1dada9c5
NC
5221 break;
5222 case OPTION_STOP_ADDRESS:
5223 stop_address = parse_vma (optarg, "--stop-address");
98ec6e72
NC
5224 if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
5225 fatal (_("error: the stop address should be after the start address"));
1dada9c5 5226 break;
0dafdf3f
L
5227 case OPTION_PREFIX:
5228 prefix = optarg;
5229 prefix_length = strlen (prefix);
5230 /* Remove an unnecessary trailing '/' */
5231 while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
5232 prefix_length--;
5233 break;
5234 case OPTION_PREFIX_STRIP:
5235 prefix_strip = atoi (optarg);
5236 if (prefix_strip < 0)
5237 fatal (_("error: prefix strip must be non-negative"));
5238 break;
3dcb3fcb
L
5239 case OPTION_INSN_WIDTH:
5240 insn_width = strtoul (optarg, NULL, 0);
5241 if (insn_width <= 0)
5242 fatal (_("error: instruction width must be positive"));
5243 break;
4a14e306 5244 case OPTION_INLINES:
015dc7e1 5245 unwind_inlines = true;
4a14e306 5246 break;
1d67fe3b 5247 case OPTION_VISUALIZE_JUMPS:
015dc7e1
AM
5248 visualize_jumps = true;
5249 color_output = false;
5250 extended_color_output = false;
1d67fe3b
TT
5251 if (optarg != NULL)
5252 {
5253 if (streq (optarg, "color"))
015dc7e1 5254 color_output = true;
1d67fe3b
TT
5255 else if (streq (optarg, "extended-color"))
5256 {
015dc7e1
AM
5257 color_output = true;
5258 extended_color_output = true;
1d67fe3b
TT
5259 }
5260 else if (streq (optarg, "off"))
015dc7e1 5261 visualize_jumps = false;
1d67fe3b
TT
5262 else
5263 nonfatal (_("unrecognized argument to --visualize-option"));
5264 }
5265 break;
1dada9c5
NC
5266 case 'E':
5267 if (strcmp (optarg, "B") == 0)
5268 endian = BFD_ENDIAN_BIG;
5269 else if (strcmp (optarg, "L") == 0)
5270 endian = BFD_ENDIAN_LITTLE;
5271 else
5272 {
a8c62f1c 5273 nonfatal (_("unrecognized -E option"));
1dada9c5
NC
5274 usage (stderr, 1);
5275 }
5276 break;
5277 case OPTION_ENDIAN:
5278 if (strncmp (optarg, "big", strlen (optarg)) == 0)
5279 endian = BFD_ENDIAN_BIG;
5280 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
5281 endian = BFD_ENDIAN_LITTLE;
5282 else
5283 {
37cc8ec1 5284 non_fatal (_("unrecognized --endian type `%s'"), optarg);
a8c62f1c 5285 exit_status = 1;
1dada9c5
NC
5286 usage (stderr, 1);
5287 }
5288 break;
8b53311e 5289
252b5132 5290 case 'f':
015dc7e1
AM
5291 dump_file_header = true;
5292 seenflag = true;
252b5132
RH
5293 break;
5294 case 'i':
015dc7e1
AM
5295 formats_info = true;
5296 seenflag = true;
252b5132 5297 break;
43ac9881
AM
5298 case 'I':
5299 add_include_path (optarg);
5300 break;
252b5132 5301 case 'p':
015dc7e1
AM
5302 dump_private_headers = true;
5303 seenflag = true;
252b5132 5304 break;
6abcee90
TG
5305 case 'P':
5306 dump_private_options = optarg;
015dc7e1 5307 seenflag = true;
6abcee90 5308 break;
252b5132 5309 case 'x':
015dc7e1
AM
5310 dump_private_headers = true;
5311 dump_symtab = true;
5312 dump_reloc_info = true;
5313 dump_file_header = true;
5314 dump_ar_hdrs = true;
5315 dump_section_headers = true;
5316 seenflag = true;
252b5132
RH
5317 break;
5318 case 't':
015dc7e1
AM
5319 dump_symtab = true;
5320 seenflag = true;
252b5132
RH
5321 break;
5322 case 'T':
015dc7e1
AM
5323 dump_dynamic_symtab = true;
5324 seenflag = true;
252b5132
RH
5325 break;
5326 case 'd':
015dc7e1
AM
5327 disassemble = true;
5328 seenflag = true;
d3def5d7 5329 disasm_sym = optarg;
1dada9c5
NC
5330 break;
5331 case 'z':
015dc7e1 5332 disassemble_zeroes = true;
252b5132
RH
5333 break;
5334 case 'D':
015dc7e1
AM
5335 disassemble = true;
5336 disassemble_all = true;
5337 seenflag = true;
252b5132
RH
5338 break;
5339 case 'S':
015dc7e1
AM
5340 disassemble = true;
5341 with_source_code = true;
5342 seenflag = true;
1dada9c5 5343 break;
a1c110a3 5344 case OPTION_SOURCE_COMMENT:
015dc7e1
AM
5345 disassemble = true;
5346 with_source_code = true;
5347 seenflag = true;
a1c110a3
NC
5348 if (optarg)
5349 source_comment = xstrdup (sanitize_string (optarg));
5350 else
5351 source_comment = xstrdup ("# ");
5352 break;
1dada9c5
NC
5353 case 'g':
5354 dump_debugging = 1;
015dc7e1 5355 seenflag = true;
1dada9c5 5356 break;
51cdc6e0
NC
5357 case 'e':
5358 dump_debugging = 1;
5359 dump_debugging_tags = 1;
015dc7e1
AM
5360 do_demangle = true;
5361 seenflag = true;
51cdc6e0 5362 break;
ca0e11aa 5363 case 'L':
015dc7e1
AM
5364 process_links = true;
5365 do_follow_links = true;
ca0e11aa 5366 break;
365544c3 5367 case 'W':
015dc7e1
AM
5368 dump_dwarf_section_info = true;
5369 seenflag = true;
4cb93e3b
TG
5370 if (optarg)
5371 dwarf_select_sections_by_letters (optarg);
5372 else
5373 dwarf_select_sections_all ();
5374 break;
5375 case OPTION_DWARF:
015dc7e1
AM
5376 dump_dwarf_section_info = true;
5377 seenflag = true;
4cb93e3b
TG
5378 if (optarg)
5379 dwarf_select_sections_by_names (optarg);
5380 else
5381 dwarf_select_sections_all ();
365544c3 5382 break;
fd2f0033
TT
5383 case OPTION_DWARF_DEPTH:
5384 {
5385 char *cp;
5386 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
5387 }
5388 break;
5389 case OPTION_DWARF_START:
5390 {
5391 char *cp;
5392 dwarf_start_die = strtoul (optarg, & cp, 0);
5393 suppress_bfd_header = 1;
5394 }
5395 break;
4723351a 5396 case OPTION_DWARF_CHECK:
015dc7e1 5397 dwarf_check = true;
4723351a 5398 break;
094e34f2 5399#ifdef ENABLE_LIBCTF
d344b407 5400 case OPTION_CTF:
015dc7e1 5401 dump_ctf_section_info = true;
d344b407 5402 dump_ctf_section_name = xstrdup (optarg);
015dc7e1 5403 seenflag = true;
d344b407 5404 break;
7d9813f1
NA
5405 case OPTION_CTF_PARENT:
5406 dump_ctf_parent_name = xstrdup (optarg);
5407 break;
094e34f2 5408#endif
1dada9c5 5409 case 'G':
015dc7e1
AM
5410 dump_stab_section_info = true;
5411 seenflag = true;
252b5132
RH
5412 break;
5413 case 's':
015dc7e1
AM
5414 dump_section_contents = true;
5415 seenflag = true;
252b5132
RH
5416 break;
5417 case 'r':
015dc7e1
AM
5418 dump_reloc_info = true;
5419 seenflag = true;
252b5132
RH
5420 break;
5421 case 'R':
015dc7e1
AM
5422 dump_dynamic_reloc_info = true;
5423 seenflag = true;
252b5132
RH
5424 break;
5425 case 'a':
015dc7e1
AM
5426 dump_ar_hdrs = true;
5427 seenflag = true;
252b5132
RH
5428 break;
5429 case 'h':
015dc7e1
AM
5430 dump_section_headers = true;
5431 seenflag = true;
252b5132 5432 break;
8b53311e 5433 case 'v':
252b5132 5434 case 'V':
015dc7e1
AM
5435 show_version = true;
5436 seenflag = true;
252b5132 5437 break;
0af11b59 5438
aebcf7b7
NC
5439 case 'H':
5440 usage (stdout, 0);
5441 /* No need to set seenflag or to break - usage() does not return. */
252b5132
RH
5442 default:
5443 usage (stderr, 1);
5444 }
5445 }
5446
5447 if (show_version)
5448 print_version ("objdump");
5449
b34976b6 5450 if (!seenflag)
1dada9c5 5451 usage (stderr, 2);
252b5132
RH
5452
5453 if (formats_info)
06d86cf7 5454 exit_status = display_info ();
252b5132
RH
5455 else
5456 {
5457 if (optind == argc)
015dc7e1 5458 display_file ("a.out", target, true);
252b5132
RH
5459 else
5460 for (; optind < argc;)
cd6581da
NC
5461 {
5462 display_file (argv[optind], target, optind == argc - 1);
5463 optind++;
5464 }
252b5132
RH
5465 }
5466
70ecb384 5467 free_only_list ();
7d9813f1
NA
5468 free (dump_ctf_section_name);
5469 free (dump_ctf_parent_name);
a1c110a3 5470 free ((void *) source_comment);
79b377b3 5471
252b5132
RH
5472 END_PROGRESS (program_name);
5473
75cd796a 5474 return exit_status;
252b5132 5475}