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