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