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