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