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