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