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