]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/objdump.c
Use disassemble_info.private_data in place of insn_sets
[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 149 bfd * abfd;
155e0d23
NC
150 bfd_boolean require_sec;
151 arelent ** dynrelbuf;
152 long dynrelcount;
153 disassembler_ftype disassemble_fn;
ce04548a 154 arelent * reloc;
d3def5d7 155 const char * symbol;
252b5132
RH
156};
157
158/* Architecture to disassemble for, or default if NULL. */
d3ba0551 159static char *machine = NULL;
252b5132 160
dd92f639 161/* Target specific options to the disassembler. */
d3ba0551 162static char *disassembler_options = NULL;
dd92f639 163
252b5132
RH
164/* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
165static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
166
167/* The symbol table. */
168static asymbol **syms;
169
170/* Number of symbols in `syms'. */
171static long symcount = 0;
172
173/* The sorted symbol table. */
174static asymbol **sorted_syms;
175
176/* Number of symbols in `sorted_syms'. */
177static long sorted_symcount = 0;
178
179/* The dynamic symbol table. */
180static asymbol **dynsyms;
181
4c45e5c9
JJ
182/* The synthetic symbol table. */
183static asymbol *synthsyms;
184static long synthcount = 0;
185
252b5132
RH
186/* Number of symbols in `dynsyms'. */
187static long dynsymcount = 0;
188
98a91d6a
NC
189static bfd_byte *stabs;
190static bfd_size_type stab_size;
191
bae7501e 192static bfd_byte *strtab;
98a91d6a 193static bfd_size_type stabstr_size;
41e92641 194
6abcee90
TG
195/* Handlers for -P/--private. */
196static const struct objdump_private_desc * const objdump_private_vectors[] =
197 {
198 OBJDUMP_PRIVATE_VECTORS
199 NULL
200 };
252b5132 201\f
aebcf7b7 202static void usage (FILE *, int) ATTRIBUTE_NORETURN;
252b5132 203static void
46dca2e0 204usage (FILE *stream, int status)
252b5132 205{
8b53311e
NC
206 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
207 fprintf (stream, _(" Display information from object <file(s)>.\n"));
208 fprintf (stream, _(" At least one of the following switches must be given:\n"));
252b5132 209 fprintf (stream, _("\
86d65c94
MK
210 -a, --archive-headers Display archive header information\n\
211 -f, --file-headers Display the contents of the overall file header\n\
212 -p, --private-headers Display object format specific file header contents\n\
6abcee90 213 -P, --private=OPT,OPT... Display object format specific contents\n\
86d65c94
MK
214 -h, --[section-]headers Display the contents of the section headers\n\
215 -x, --all-headers Display the contents of all headers\n\
216 -d, --disassemble Display assembler contents of executable sections\n\
217 -D, --disassemble-all Display assembler contents of all sections\n\
d3def5d7 218 --disassemble=<sym> Display assembler contents from <sym>\n\
86d65c94 219 -S, --source Intermix source code with disassembly\n\
a1c110a3 220 --source-comment[=<txt>] Prefix lines of source code with <txt>\n\
86d65c94
MK
221 -s, --full-contents Display the full contents of all sections requested\n\
222 -g, --debugging Display debug information in object file\n\
51cdc6e0 223 -e, --debugging-tags Display debug information using ctags style\n\
86d65c94 224 -G, --stabs Display (in raw form) any STABS info in the file\n\
dda8d76d 225 -W[lLiaprmfFsoRtUuTgAckK] or\n\
1ed06042 226 --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
6f875884 227 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
657d0d47 228 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
dda8d76d 229 =addr,=cu_index,=links,=follow-links]\n\
79b377b3
NC
230 Display DWARF info in the file\n\
231 --ctf=SECTION Display CTF info from SECTION\n\
86d65c94
MK
232 -t, --syms Display the contents of the symbol table(s)\n\
233 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
234 -r, --reloc Display the relocation entries in the file\n\
235 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
07012eee 236 @<file> Read options from <file>\n\
8b53311e 237 -v, --version Display this program's version number\n\
86d65c94
MK
238 -i, --info List object formats and architectures supported\n\
239 -H, --help Display this information\n\
1dada9c5
NC
240"));
241 if (status != 2)
242 {
6abcee90
TG
243 const struct objdump_private_desc * const *desc;
244
1dada9c5
NC
245 fprintf (stream, _("\n The following switches are optional:\n"));
246 fprintf (stream, _("\
86d65c94
MK
247 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
248 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
249 -j, --section=NAME Only display information for section NAME\n\
250 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
1dada9c5
NC
251 -EB --endian=big Assume big endian format when disassembling\n\
252 -EL --endian=little Assume little endian format when disassembling\n\
f1563258 253 --file-start-context Include context from start of file (with -S)\n\
43ac9881 254 -I, --include=DIR Add DIR to search list for source files\n\
86d65c94 255 -l, --line-numbers Include line numbers and filenames in output\n\
98ec6e72 256 -F, --file-offsets Include file offsets when displaying information\n\
28c309a2 257 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
f0c8c24a
NC
258 The STYLE, if specified, can be `auto', `gnu',\n\
259 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
260 or `gnat'\n\
af03af8f
NC
261 --recurse-limit Enable a limit on recursion whilst demangling. [Default]\n\
262 --no-recurse-limit Disable a limit on recursion whilst demangling\n\
86d65c94
MK
263 -w, --wide Format output for more than 80 columns\n\
264 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
f0c8c24a 265 --start-address=ADDR Only process data whose address is >= ADDR\n\
831bd6aa 266 --stop-address=ADDR Only process data whose address is < ADDR\n\
1dada9c5
NC
267 --prefix-addresses Print complete address alongside disassembly\n\
268 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
505f1412 269 --insn-width=WIDTH Display WIDTH bytes on a single line for -d\n\
86d65c94 270 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
3c9458e9 271 --special-syms Include special symbols in symbol dumps\n\
4a14e306 272 --inlines Print all inlines for source line (with -l)\n\
0dafdf3f 273 --prefix=PREFIX Add PREFIX to absolute paths for -S\n\
fd2f0033
TT
274 --prefix-strip=LEVEL Strip initial directory names for -S\n"));
275 fprintf (stream, _("\
276 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
277 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4723351a
CC
278 or deeper\n\
279 --dwarf-check Make additional dwarf internal consistency checks.\
79b377b3 280 \n\
7d9813f1 281 --ctf-parent=SECTION Use SECTION as the CTF parent\n\n"));
1dada9c5 282 list_supported_targets (program_name, stream);
2f83960e 283 list_supported_architectures (program_name, stream);
86d65c94 284
94470b23 285 disassembler_usage (stream);
6abcee90
TG
286
287 if (objdump_private_vectors[0] != NULL)
288 {
289 fprintf (stream,
290 _("\nOptions supported for -P/--private switch:\n"));
291 for (desc = objdump_private_vectors; *desc != NULL; desc++)
292 (*desc)->help (stream);
293 }
1dada9c5 294 }
92f01d61 295 if (REPORT_BUGS_TO[0] && status == 0)
86d65c94 296 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
252b5132
RH
297 exit (status);
298}
299
300/* 150 isn't special; it's just an arbitrary non-ASCII char value. */
46dca2e0
NC
301enum option_values
302 {
303 OPTION_ENDIAN=150,
304 OPTION_START_ADDRESS,
305 OPTION_STOP_ADDRESS,
4cb93e3b 306 OPTION_DWARF,
0dafdf3f
L
307 OPTION_PREFIX,
308 OPTION_PREFIX_STRIP,
3dcb3fcb 309 OPTION_INSN_WIDTH,
fd2f0033
TT
310 OPTION_ADJUST_VMA,
311 OPTION_DWARF_DEPTH,
4723351a 312 OPTION_DWARF_CHECK,
4a14e306 313 OPTION_DWARF_START,
af03af8f
NC
314 OPTION_RECURSE_LIMIT,
315 OPTION_NO_RECURSE_LIMIT,
79b377b3 316 OPTION_INLINES,
a1c110a3 317 OPTION_SOURCE_COMMENT,
7d9813f1 318 OPTION_CTF,
79b377b3 319 OPTION_CTF_PARENT
46dca2e0 320 };
252b5132
RH
321
322static struct option long_options[]=
323{
324 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
325 {"all-headers", no_argument, NULL, 'x'},
326 {"private-headers", no_argument, NULL, 'p'},
6abcee90 327 {"private", required_argument, NULL, 'P'},
252b5132
RH
328 {"architecture", required_argument, NULL, 'm'},
329 {"archive-headers", no_argument, NULL, 'a'},
1dada9c5 330 {"debugging", no_argument, NULL, 'g'},
51cdc6e0 331 {"debugging-tags", no_argument, NULL, 'e'},
28c309a2 332 {"demangle", optional_argument, NULL, 'C'},
d3def5d7 333 {"disassemble", optional_argument, NULL, 'd'},
252b5132 334 {"disassemble-all", no_argument, NULL, 'D'},
dd92f639 335 {"disassembler-options", required_argument, NULL, 'M'},
1dada9c5 336 {"disassemble-zeroes", no_argument, NULL, 'z'},
252b5132
RH
337 {"dynamic-reloc", no_argument, NULL, 'R'},
338 {"dynamic-syms", no_argument, NULL, 'T'},
339 {"endian", required_argument, NULL, OPTION_ENDIAN},
340 {"file-headers", no_argument, NULL, 'f'},
98ec6e72 341 {"file-offsets", no_argument, NULL, 'F'},
f1563258 342 {"file-start-context", no_argument, &file_start_context, 1},
252b5132
RH
343 {"full-contents", no_argument, NULL, 's'},
344 {"headers", no_argument, NULL, 'h'},
345 {"help", no_argument, NULL, 'H'},
346 {"info", no_argument, NULL, 'i'},
347 {"line-numbers", no_argument, NULL, 'l'},
348 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
349 {"prefix-addresses", no_argument, &prefix_addresses, 1},
af03af8f
NC
350 {"recurse-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
351 {"recursion-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
352 {"no-recurse-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
353 {"no-recursion-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
252b5132
RH
354 {"reloc", no_argument, NULL, 'r'},
355 {"section", required_argument, NULL, 'j'},
356 {"section-headers", no_argument, NULL, 'h'},
357 {"show-raw-insn", no_argument, &show_raw_insn, 1},
358 {"source", no_argument, NULL, 'S'},
a1c110a3 359 {"source-comment", optional_argument, NULL, OPTION_SOURCE_COMMENT},
3c9458e9 360 {"special-syms", no_argument, &dump_special_syms, 1},
43ac9881 361 {"include", required_argument, NULL, 'I'},
4cb93e3b 362 {"dwarf", optional_argument, NULL, OPTION_DWARF},
7d9813f1
NA
363 {"ctf", required_argument, NULL, OPTION_CTF},
364 {"ctf-parent", required_argument, NULL, OPTION_CTF_PARENT},
1dada9c5 365 {"stabs", no_argument, NULL, 'G'},
252b5132
RH
366 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
367 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
368 {"syms", no_argument, NULL, 't'},
369 {"target", required_argument, NULL, 'b'},
1dada9c5
NC
370 {"version", no_argument, NULL, 'V'},
371 {"wide", no_argument, NULL, 'w'},
0dafdf3f
L
372 {"prefix", required_argument, NULL, OPTION_PREFIX},
373 {"prefix-strip", required_argument, NULL, OPTION_PREFIX_STRIP},
3dcb3fcb 374 {"insn-width", required_argument, NULL, OPTION_INSN_WIDTH},
dda8d76d
NC
375 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
376 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
377 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
378 {"inlines", no_argument, 0, OPTION_INLINES},
252b5132
RH
379 {0, no_argument, 0, 0}
380};
381\f
382static void
46dca2e0 383nonfatal (const char *msg)
75cd796a
ILT
384{
385 bfd_nonfatal (msg);
386 exit_status = 1;
387}
12add40e
NC
388
389/* Returns a version of IN with any control characters
390 replaced by escape sequences. Uses a static buffer
391 if necessary. */
392
393static const char *
394sanitize_string (const char * in)
395{
63455780
NC
396 static char * buffer = NULL;
397 static size_t buffer_len = 0;
398 const char * original = in;
399 char * out;
12add40e
NC
400
401 /* Paranoia. */
402 if (in == NULL)
403 return "";
404
405 /* See if any conversion is necessary. In the majority
406 of cases it will not be needed. */
407 do
408 {
409 char c = *in++;
410
411 if (c == 0)
412 return original;
413
414 if (ISCNTRL (c))
415 break;
416 }
417 while (1);
418
419 /* Copy the input, translating as needed. */
420 in = original;
421 if (buffer_len < (strlen (in) * 2))
422 {
423 free ((void *) buffer);
424 buffer_len = strlen (in) * 2;
425 buffer = xmalloc (buffer_len + 1);
426 }
427
428 out = buffer;
429 do
430 {
431 char c = *in++;
432
433 if (c == 0)
434 break;
435
436 if (!ISCNTRL (c))
437 *out++ = c;
438 else
439 {
440 *out++ = '^';
441 *out++ = c + 0x40;
442 }
443 }
444 while (1);
445
446 *out = 0;
447 return buffer;
448}
449
75cd796a 450\f
d2fcac5c
NC
451/* Returns TRUE if the specified section should be dumped. */
452
453static bfd_boolean
454process_section_p (asection * section)
455{
70ecb384 456 struct only * only;
d2fcac5c 457
70ecb384 458 if (only_list == NULL)
d2fcac5c
NC
459 return TRUE;
460
70ecb384
NC
461 for (only = only_list; only; only = only->next)
462 if (strcmp (only->name, section->name) == 0)
463 {
464 only->seen = TRUE;
465 return TRUE;
466 }
d2fcac5c
NC
467
468 return FALSE;
469}
70ecb384
NC
470
471/* Add an entry to the 'only' list. */
472
473static void
474add_only (char * name)
475{
476 struct only * only;
477
478 /* First check to make sure that we do not
479 already have an entry for this name. */
480 for (only = only_list; only; only = only->next)
481 if (strcmp (only->name, name) == 0)
482 return;
483
484 only = xmalloc (sizeof * only);
485 only->name = name;
486 only->seen = FALSE;
487 only->next = only_list;
488 only_list = only;
489}
490
491/* Release the memory used by the 'only' list.
492 PR 11225: Issue a warning message for unseen sections.
493 Only do this if none of the sections were seen. This is mainly to support
494 tools like the GAS testsuite where an object file is dumped with a list of
495 generic section names known to be present in a range of different file
496 formats. */
497
498static void
499free_only_list (void)
500{
501 bfd_boolean at_least_one_seen = FALSE;
502 struct only * only;
503 struct only * next;
504
505 if (only_list == NULL)
506 return;
507
508 for (only = only_list; only; only = only->next)
509 if (only->seen)
510 {
511 at_least_one_seen = TRUE;
512 break;
513 }
514
515 for (only = only_list; only; only = next)
516 {
517 if (! at_least_one_seen)
518 {
a8c62f1c
AM
519 non_fatal (_("section '%s' mentioned in a -j option, "
520 "but not found in any input file"),
70ecb384
NC
521 only->name);
522 exit_status = 1;
523 }
524 next = only->next;
525 free (only);
526 }
527}
528
d2fcac5c 529\f
75cd796a 530static void
1737c640 531dump_section_header (bfd *abfd, asection *section, void *data)
252b5132
RH
532{
533 char *comma = "";
61826503 534 unsigned int opb = bfd_octets_per_byte (abfd, section);
1737c640 535 int longest_section_name = *((int *) data);
252b5132 536
3bee8bcd
L
537 /* Ignore linker created section. See elfNN_ia64_object_p in
538 bfd/elfxx-ia64.c. */
539 if (section->flags & SEC_LINKER_CREATED)
540 return;
541
d2fcac5c
NC
542 /* PR 10413: Skip sections that we are ignoring. */
543 if (! process_section_p (section))
544 return;
545
1737c640 546 printf ("%3d %-*s %08lx ", section->index, longest_section_name,
fd361982
AM
547 sanitize_string (bfd_section_name (section)),
548 (unsigned long) bfd_section_size (section) / opb);
549 bfd_printf_vma (abfd, bfd_section_vma (section));
252b5132 550 printf (" ");
d8180c76 551 bfd_printf_vma (abfd, section->lma);
e59b4dfb 552 printf (" %08lx 2**%u", (unsigned long) section->filepos,
fd361982 553 bfd_section_alignment (section));
252b5132
RH
554 if (! wide_output)
555 printf ("\n ");
556 printf (" ");
557
558#define PF(x, y) \
559 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
560
561 PF (SEC_HAS_CONTENTS, "CONTENTS");
562 PF (SEC_ALLOC, "ALLOC");
563 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
252b5132
RH
564 PF (SEC_LOAD, "LOAD");
565 PF (SEC_RELOC, "RELOC");
252b5132
RH
566 PF (SEC_READONLY, "READONLY");
567 PF (SEC_CODE, "CODE");
568 PF (SEC_DATA, "DATA");
569 PF (SEC_ROM, "ROM");
570 PF (SEC_DEBUGGING, "DEBUGGING");
571 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
572 PF (SEC_EXCLUDE, "EXCLUDE");
573 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
ebe372c1
L
574 if (bfd_get_arch (abfd) == bfd_arch_tic54x)
575 {
576 PF (SEC_TIC54X_BLOCK, "BLOCK");
577 PF (SEC_TIC54X_CLINK, "CLINK");
578 }
24c411ed 579 PF (SEC_SMALL_DATA, "SMALL_DATA");
ebe372c1 580 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
91f68a68
MG
581 {
582 PF (SEC_COFF_SHARED, "SHARED");
583 PF (SEC_COFF_NOREAD, "NOREAD");
584 }
585 else if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
61826503
CE
586 {
587 PF (SEC_ELF_OCTETS, "OCTETS");
588 PF (SEC_ELF_PURECODE, "PURECODE");
589 }
13ae64f3 590 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
64c1196b 591 PF (SEC_GROUP, "GROUP");
91f68a68
MG
592 if (bfd_get_arch (abfd) == bfd_arch_mep)
593 {
594 PF (SEC_MEP_VLIW, "VLIW");
595 }
252b5132
RH
596
597 if ((section->flags & SEC_LINK_ONCE) != 0)
598 {
599 const char *ls;
082b7297 600 struct coff_comdat_info *comdat;
252b5132
RH
601
602 switch (section->flags & SEC_LINK_DUPLICATES)
603 {
604 default:
605 abort ();
606 case SEC_LINK_DUPLICATES_DISCARD:
607 ls = "LINK_ONCE_DISCARD";
608 break;
609 case SEC_LINK_DUPLICATES_ONE_ONLY:
610 ls = "LINK_ONCE_ONE_ONLY";
611 break;
612 case SEC_LINK_DUPLICATES_SAME_SIZE:
613 ls = "LINK_ONCE_SAME_SIZE";
614 break;
615 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
616 ls = "LINK_ONCE_SAME_CONTENTS";
617 break;
618 }
619 printf ("%s%s", comma, ls);
deecf979 620
082b7297
L
621 comdat = bfd_coff_get_comdat_section (abfd, section);
622 if (comdat != NULL)
623 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
deecf979 624
252b5132
RH
625 comma = ", ";
626 }
627
628 printf ("\n");
629#undef PF
630}
631
1737c640
AB
632/* Called on each SECTION in ABFD, update the int variable pointed to by
633 DATA which contains the string length of the longest section name. */
634
635static void
fd361982
AM
636find_longest_section_name (bfd *abfd ATTRIBUTE_UNUSED,
637 asection *section, void *data)
1737c640
AB
638{
639 int *longest_so_far = (int *) data;
640 const char *name;
641 int len;
642
643 /* Ignore linker created section. */
644 if (section->flags & SEC_LINKER_CREATED)
645 return;
646
647 /* Skip sections that we are ignoring. */
648 if (! process_section_p (section))
649 return;
650
fd361982 651 name = bfd_section_name (section);
1737c640
AB
652 len = (int) strlen (name);
653 if (len > *longest_so_far)
654 *longest_so_far = len;
655}
656
252b5132 657static void
46dca2e0 658dump_headers (bfd *abfd)
252b5132 659{
1737c640
AB
660 /* The default width of 13 is just an arbitrary choice. */
661 int max_section_name_length = 13;
662 int bfd_vma_width;
8bea4d5c 663
252b5132 664#ifndef BFD64
1737c640 665 bfd_vma_width = 10;
252b5132 666#else
21611032
TS
667 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
668 if (bfd_get_arch_size (abfd) == 32)
1737c640 669 bfd_vma_width = 10;
21611032 670 else
1737c640 671 bfd_vma_width = 18;
252b5132 672#endif
8bea4d5c 673
1737c640
AB
674 printf (_("Sections:\n"));
675
676 if (wide_output)
677 bfd_map_over_sections (abfd, find_longest_section_name,
678 &max_section_name_length);
679
680 printf (_("Idx %-*s Size %-*s%-*sFile off Algn"),
681 max_section_name_length, "Name",
682 bfd_vma_width, "VMA",
683 bfd_vma_width, "LMA");
684
8bea4d5c
ILT
685 if (wide_output)
686 printf (_(" Flags"));
687 printf ("\n");
688
1737c640
AB
689 bfd_map_over_sections (abfd, dump_section_header,
690 &max_section_name_length);
252b5132
RH
691}
692\f
693static asymbol **
46dca2e0 694slurp_symtab (bfd *abfd)
252b5132 695{
d3ba0551 696 asymbol **sy = NULL;
252b5132
RH
697 long storage;
698
699 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
700 {
252b5132
RH
701 symcount = 0;
702 return NULL;
703 }
704
705 storage = bfd_get_symtab_upper_bound (abfd);
706 if (storage < 0)
5a3f568b
NC
707 {
708 non_fatal (_("failed to read symbol table from: %s"), bfd_get_filename (abfd));
709 bfd_fatal (_("error message was"));
710 }
252b5132 711 if (storage)
781152ec
NC
712 {
713 off_t filesize = bfd_get_file_size (abfd);
714
715 /* qv PR 24707. */
7e56c51c
NC
716 if (filesize > 0
717 && filesize < storage
718 /* The MMO file format supports its own special compression
719 technique, so its sections can be larger than the file size. */
720 && bfd_get_flavour (abfd) != bfd_target_mmo_flavour)
781152ec
NC
721 {
722 bfd_nonfatal_message (bfd_get_filename (abfd), abfd, NULL,
723 _("error: symbol table size (%#lx) is larger than filesize (%#lx)"),
724 storage, (long) filesize);
725 exit_status = 1;
726 symcount = 0;
727 return NULL;
728 }
729
730 sy = (asymbol **) xmalloc (storage);
731 }
28b18af1 732
252b5132
RH
733 symcount = bfd_canonicalize_symtab (abfd, sy);
734 if (symcount < 0)
735 bfd_fatal (bfd_get_filename (abfd));
252b5132
RH
736 return sy;
737}
738
739/* Read in the dynamic symbols. */
740
741static asymbol **
46dca2e0 742slurp_dynamic_symtab (bfd *abfd)
252b5132 743{
d3ba0551 744 asymbol **sy = NULL;
252b5132
RH
745 long storage;
746
747 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
748 if (storage < 0)
749 {
750 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
751 {
37cc8ec1 752 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
a8c62f1c 753 exit_status = 1;
252b5132
RH
754 dynsymcount = 0;
755 return NULL;
756 }
757
758 bfd_fatal (bfd_get_filename (abfd));
759 }
252b5132 760 if (storage)
3f5e193b 761 sy = (asymbol **) xmalloc (storage);
28b18af1 762
252b5132
RH
763 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
764 if (dynsymcount < 0)
765 bfd_fatal (bfd_get_filename (abfd));
252b5132
RH
766 return sy;
767}
768
a24bb4f0
NC
769/* Some symbol names are significant and should be kept in the
770 table of sorted symbol names, even if they are marked as
771 debugging/section symbols. */
772
773static bfd_boolean
774is_significant_symbol_name (const char * name)
775{
0e70b27b 776 return strncmp (name, ".plt", 4) == 0 || strcmp (name, ".got") == 0;
a24bb4f0
NC
777}
778
252b5132
RH
779/* Filter out (in place) symbols that are useless for disassembly.
780 COUNT is the number of elements in SYMBOLS.
0af11b59 781 Return the number of useful symbols. */
252b5132
RH
782
783static long
46dca2e0 784remove_useless_symbols (asymbol **symbols, long count)
252b5132 785{
46dca2e0 786 asymbol **in_ptr = symbols, **out_ptr = symbols;
252b5132
RH
787
788 while (--count >= 0)
789 {
790 asymbol *sym = *in_ptr++;
791
792 if (sym->name == NULL || sym->name[0] == '\0')
793 continue;
a24bb4f0
NC
794 if ((sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
795 && ! is_significant_symbol_name (sym->name))
252b5132
RH
796 continue;
797 if (bfd_is_und_section (sym->section)
798 || bfd_is_com_section (sym->section))
799 continue;
800
801 *out_ptr++ = sym;
802 }
803 return out_ptr - symbols;
804}
805
806/* Sort symbols into value order. */
807
0af11b59 808static int
46dca2e0 809compare_symbols (const void *ap, const void *bp)
252b5132 810{
46dca2e0
NC
811 const asymbol *a = * (const asymbol **) ap;
812 const asymbol *b = * (const asymbol **) bp;
813 const char *an;
814 const char *bn;
815 size_t anl;
816 size_t bnl;
817 bfd_boolean af;
818 bfd_boolean bf;
819 flagword aflags;
820 flagword bflags;
252b5132
RH
821
822 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
823 return 1;
824 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
825 return -1;
826
827 if (a->section > b->section)
828 return 1;
829 else if (a->section < b->section)
830 return -1;
831
832 an = bfd_asymbol_name (a);
833 bn = bfd_asymbol_name (b);
834 anl = strlen (an);
835 bnl = strlen (bn);
836
837 /* The symbols gnu_compiled and gcc2_compiled convey no real
838 information, so put them after other symbols with the same value. */
252b5132
RH
839 af = (strstr (an, "gnu_compiled") != NULL
840 || strstr (an, "gcc2_compiled") != NULL);
841 bf = (strstr (bn, "gnu_compiled") != NULL
842 || strstr (bn, "gcc2_compiled") != NULL);
843
844 if (af && ! bf)
845 return 1;
846 if (! af && bf)
847 return -1;
848
849 /* We use a heuristic for the file name, to try to sort it after
850 more useful symbols. It may not work on non Unix systems, but it
851 doesn't really matter; the only difference is precisely which
852 symbol names get printed. */
853
854#define file_symbol(s, sn, snl) \
855 (((s)->flags & BSF_FILE) != 0 \
856 || ((sn)[(snl) - 2] == '.' \
857 && ((sn)[(snl) - 1] == 'o' \
858 || (sn)[(snl) - 1] == 'a')))
859
860 af = file_symbol (a, an, anl);
861 bf = file_symbol (b, bn, bnl);
862
863 if (af && ! bf)
864 return 1;
865 if (! af && bf)
866 return -1;
867
868 /* Try to sort global symbols before local symbols before function
869 symbols before debugging symbols. */
870
871 aflags = a->flags;
872 bflags = b->flags;
873
874 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
875 {
876 if ((aflags & BSF_DEBUGGING) != 0)
877 return 1;
878 else
879 return -1;
880 }
881 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
882 {
883 if ((aflags & BSF_FUNCTION) != 0)
884 return -1;
885 else
886 return 1;
887 }
888 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
889 {
890 if ((aflags & BSF_LOCAL) != 0)
891 return 1;
892 else
893 return -1;
894 }
895 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
896 {
897 if ((aflags & BSF_GLOBAL) != 0)
898 return -1;
899 else
900 return 1;
901 }
902
32a0481f
AM
903 if (bfd_get_flavour (bfd_asymbol_bfd (a)) == bfd_target_elf_flavour
904 && bfd_get_flavour (bfd_asymbol_bfd (b)) == bfd_target_elf_flavour)
905 {
906 bfd_vma asz, bsz;
907
908 asz = 0;
160b1a61 909 if ((a->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
32a0481f
AM
910 asz = ((elf_symbol_type *) a)->internal_elf_sym.st_size;
911 bsz = 0;
160b1a61 912 if ((b->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
32a0481f
AM
913 bsz = ((elf_symbol_type *) b)->internal_elf_sym.st_size;
914 if (asz != bsz)
915 return asz > bsz ? -1 : 1;
916 }
917
252b5132
RH
918 /* Symbols that start with '.' might be section names, so sort them
919 after symbols that don't start with '.'. */
920 if (an[0] == '.' && bn[0] != '.')
921 return 1;
922 if (an[0] != '.' && bn[0] == '.')
923 return -1;
924
925 /* Finally, if we can't distinguish them in any other way, try to
926 get consistent results by sorting the symbols by name. */
927 return strcmp (an, bn);
928}
929
930/* Sort relocs into address order. */
931
932static int
46dca2e0 933compare_relocs (const void *ap, const void *bp)
252b5132 934{
46dca2e0
NC
935 const arelent *a = * (const arelent **) ap;
936 const arelent *b = * (const arelent **) bp;
252b5132
RH
937
938 if (a->address > b->address)
939 return 1;
940 else if (a->address < b->address)
941 return -1;
942
943 /* So that associated relocations tied to the same address show up
944 in the correct order, we don't do any further sorting. */
945 if (a > b)
946 return 1;
947 else if (a < b)
948 return -1;
949 else
950 return 0;
951}
952
155e0d23
NC
953/* Print an address (VMA) to the output stream in INFO.
954 If SKIP_ZEROES is TRUE, omit leading zeroes. */
252b5132
RH
955
956static void
91d6fa6a 957objdump_print_value (bfd_vma vma, struct disassemble_info *inf,
46dca2e0 958 bfd_boolean skip_zeroes)
252b5132
RH
959{
960 char buf[30];
961 char *p;
3b9ad1cc 962 struct objdump_disasm_info *aux;
252b5132 963
91d6fa6a 964 aux = (struct objdump_disasm_info *) inf->application_data;
d8180c76 965 bfd_sprintf_vma (aux->abfd, buf, vma);
252b5132
RH
966 if (! skip_zeroes)
967 p = buf;
968 else
969 {
970 for (p = buf; *p == '0'; ++p)
971 ;
972 if (*p == '\0')
973 --p;
974 }
91d6fa6a 975 (*inf->fprintf_func) (inf->stream, "%s", p);
252b5132
RH
976}
977
978/* Print the name of a symbol. */
979
980static void
91d6fa6a 981objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
46dca2e0 982 asymbol *sym)
252b5132
RH
983{
984 char *alloc;
bb4d2ac2
L
985 const char *name, *version_string = NULL;
986 bfd_boolean hidden = FALSE;
252b5132
RH
987
988 alloc = NULL;
989 name = bfd_asymbol_name (sym);
a6637ec0 990 if (do_demangle && name[0] != '\0')
252b5132
RH
991 {
992 /* Demangle the name. */
af03af8f 993 alloc = bfd_demangle (abfd, name, demangle_flags);
ed180cc5
AM
994 if (alloc != NULL)
995 name = alloc;
252b5132
RH
996 }
997
160b1a61 998 if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
f2b2af2c 999 version_string = bfd_get_symbol_version_string (abfd, sym, &hidden);
bb4d2ac2 1000
e6f7f6d1 1001 if (bfd_is_und_section (bfd_asymbol_section (sym)))
bb4d2ac2
L
1002 hidden = TRUE;
1003
12add40e
NC
1004 name = sanitize_string (name);
1005
91d6fa6a 1006 if (inf != NULL)
bb4d2ac2
L
1007 {
1008 (*inf->fprintf_func) (inf->stream, "%s", name);
1009 if (version_string && *version_string != '\0')
1010 (*inf->fprintf_func) (inf->stream, hidden ? "@%s" : "@@%s",
1011 version_string);
1012 }
252b5132 1013 else
bb4d2ac2
L
1014 {
1015 printf ("%s", name);
1016 if (version_string && *version_string != '\0')
1017 printf (hidden ? "@%s" : "@@%s", version_string);
1018 }
252b5132
RH
1019
1020 if (alloc != NULL)
1021 free (alloc);
1022}
1023
39f0547e
NC
1024static inline bfd_boolean
1025sym_ok (bfd_boolean want_section,
1026 bfd * abfd ATTRIBUTE_UNUSED,
1027 long place,
1028 asection * sec,
1029 struct disassemble_info * inf)
1030{
1031 if (want_section)
1032 {
1033 /* Note - we cannot just compare section pointers because they could
1034 be different, but the same... Ie the symbol that we are trying to
1035 find could have come from a separate debug info file. Under such
1036 circumstances the symbol will be associated with a section in the
1037 debug info file, whilst the section we want is in a normal file.
1038 So the section pointers will be different, but the section names
1039 will be the same. */
fd361982
AM
1040 if (strcmp (bfd_section_name (sorted_syms[place]->section),
1041 bfd_section_name (sec)) != 0)
39f0547e
NC
1042 return FALSE;
1043 }
1044
1045 return inf->symbol_is_valid (sorted_syms[place], inf);
1046}
1047
22a398e1
NC
1048/* Locate a symbol given a bfd and a section (from INFO->application_data),
1049 and a VMA. If INFO->application_data->require_sec is TRUE, then always
1050 require the symbol to be in the section. Returns NULL if there is no
1051 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
1052 of the symbol in sorted_syms. */
252b5132
RH
1053
1054static asymbol *
3b9ad1cc 1055find_symbol_for_address (bfd_vma vma,
91d6fa6a 1056 struct disassemble_info *inf,
3b9ad1cc 1057 long *place)
252b5132
RH
1058{
1059 /* @@ Would it speed things up to cache the last two symbols returned,
1060 and maybe their address ranges? For many processors, only one memory
1061 operand can be present at a time, so the 2-entry cache wouldn't be
1062 constantly churned by code doing heavy memory accesses. */
1063
1064 /* Indices in `sorted_syms'. */
1065 long min = 0;
91d6fa6a 1066 long max_count = sorted_symcount;
252b5132 1067 long thisplace;
3b9ad1cc
AM
1068 struct objdump_disasm_info *aux;
1069 bfd *abfd;
1070 asection *sec;
1071 unsigned int opb;
e39ff52a 1072 bfd_boolean want_section;
0e70b27b 1073 long rel_count;
252b5132
RH
1074
1075 if (sorted_symcount < 1)
1076 return NULL;
1077
91d6fa6a 1078 aux = (struct objdump_disasm_info *) inf->application_data;
3b9ad1cc 1079 abfd = aux->abfd;
f59f8978 1080 sec = inf->section;
91d6fa6a 1081 opb = inf->octets_per_byte;
3b9ad1cc 1082
252b5132 1083 /* Perform a binary search looking for the closest symbol to the
91d6fa6a
NC
1084 required value. We are searching the range (min, max_count]. */
1085 while (min + 1 < max_count)
252b5132
RH
1086 {
1087 asymbol *sym;
1088
91d6fa6a 1089 thisplace = (max_count + min) / 2;
252b5132
RH
1090 sym = sorted_syms[thisplace];
1091
1092 if (bfd_asymbol_value (sym) > vma)
91d6fa6a 1093 max_count = thisplace;
252b5132
RH
1094 else if (bfd_asymbol_value (sym) < vma)
1095 min = thisplace;
1096 else
1097 {
1098 min = thisplace;
1099 break;
1100 }
1101 }
1102
1103 /* The symbol we want is now in min, the low end of the range we
1104 were searching. If there are several symbols with the same
a24bb4f0 1105 value, we want the first (non-section/non-debugging) one. */
252b5132
RH
1106 thisplace = min;
1107 while (thisplace > 0
1108 && (bfd_asymbol_value (sorted_syms[thisplace])
a24bb4f0
NC
1109 == bfd_asymbol_value (sorted_syms[thisplace - 1]))
1110 && ((sorted_syms[thisplace - 1]->flags
1111 & (BSF_SECTION_SYM | BSF_DEBUGGING)) == 0)
1112 )
252b5132
RH
1113 --thisplace;
1114
2b4590fb
AM
1115 /* Prefer a symbol in the current section if we have multple symbols
1116 with the same value, as can occur with overlays or zero size
1117 sections. */
1118 min = thisplace;
91d6fa6a 1119 while (min < max_count
2b4590fb
AM
1120 && (bfd_asymbol_value (sorted_syms[min])
1121 == bfd_asymbol_value (sorted_syms[thisplace])))
1122 {
39f0547e 1123 if (sym_ok (TRUE, abfd, min, sec, inf))
2b4590fb
AM
1124 {
1125 thisplace = min;
1126
1127 if (place != NULL)
1128 *place = thisplace;
1129
1130 return sorted_syms[thisplace];
1131 }
1132 ++min;
1133 }
1134
1049f94e 1135 /* If the file is relocatable, and the symbol could be from this
252b5132
RH
1136 section, prefer a symbol from this section over symbols from
1137 others, even if the other symbol's value might be closer.
0af11b59 1138
252b5132
RH
1139 Note that this may be wrong for some symbol references if the
1140 sections have overlapping memory ranges, but in that case there's
1141 no way to tell what's desired without looking at the relocation
e39ff52a 1142 table.
3aade688 1143
e39ff52a
PB
1144 Also give the target a chance to reject symbols. */
1145 want_section = (aux->require_sec
1146 || ((abfd->flags & HAS_RELOC) != 0
fd361982
AM
1147 && vma >= bfd_section_vma (sec)
1148 && vma < (bfd_section_vma (sec)
1149 + bfd_section_size (sec) / opb)));
39f0547e
NC
1150
1151 if (! sym_ok (want_section, abfd, thisplace, sec, inf))
252b5132
RH
1152 {
1153 long i;
2b4590fb 1154 long newplace = sorted_symcount;
98a91d6a 1155
2b4590fb 1156 for (i = min - 1; i >= 0; i--)
252b5132 1157 {
39f0547e 1158 if (sym_ok (want_section, abfd, i, sec, inf))
252b5132 1159 {
e39ff52a
PB
1160 if (newplace == sorted_symcount)
1161 newplace = i;
1162
1163 if (bfd_asymbol_value (sorted_syms[i])
1164 != bfd_asymbol_value (sorted_syms[newplace]))
1165 break;
1166
1167 /* Remember this symbol and keep searching until we reach
1168 an earlier address. */
1169 newplace = i;
252b5132
RH
1170 }
1171 }
1172
e39ff52a
PB
1173 if (newplace != sorted_symcount)
1174 thisplace = newplace;
1175 else
252b5132
RH
1176 {
1177 /* We didn't find a good symbol with a smaller value.
1178 Look for one with a larger value. */
1179 for (i = thisplace + 1; i < sorted_symcount; i++)
1180 {
39f0547e 1181 if (sym_ok (want_section, abfd, i, sec, inf))
252b5132
RH
1182 {
1183 thisplace = i;
1184 break;
1185 }
1186 }
1187 }
1188
39f0547e 1189 if (! sym_ok (want_section, abfd, thisplace, sec, inf))
22a398e1
NC
1190 /* There is no suitable symbol. */
1191 return NULL;
1192 }
1193
a24bb4f0
NC
1194 /* If we have not found an exact match for the specified address
1195 and we have dynamic relocations available, then we can produce
1196 a better result by matching a relocation to the address and
1197 using the symbol associated with that relocation. */
0e70b27b 1198 rel_count = aux->dynrelcount;
a24bb4f0 1199 if (!want_section
a24bb4f0 1200 && sorted_syms[thisplace]->value != vma
0e70b27b
L
1201 && rel_count > 0
1202 && aux->dynrelbuf != NULL
1203 && aux->dynrelbuf[0]->address <= vma
1204 && aux->dynrelbuf[rel_count - 1]->address >= vma
a24bb4f0
NC
1205 /* If we have matched a synthetic symbol, then stick with that. */
1206 && (sorted_syms[thisplace]->flags & BSF_SYNTHETIC) == 0)
1207 {
0e70b27b
L
1208 arelent ** rel_low;
1209 arelent ** rel_high;
a24bb4f0 1210
0e70b27b
L
1211 rel_low = aux->dynrelbuf;
1212 rel_high = rel_low + rel_count - 1;
1213 while (rel_low <= rel_high)
a24bb4f0 1214 {
0e70b27b
L
1215 arelent **rel_mid = &rel_low[(rel_high - rel_low) / 2];
1216 arelent * rel = *rel_mid;
a24bb4f0 1217
0e70b27b 1218 if (rel->address == vma)
a24bb4f0 1219 {
0e70b27b
L
1220 /* Absolute relocations do not provide a more helpful
1221 symbolic address. Find a non-absolute relocation
1222 with the same address. */
1223 arelent **rel_vma = rel_mid;
1224 for (rel_mid--;
1225 rel_mid >= rel_low && rel_mid[0]->address == vma;
1226 rel_mid--)
1227 rel_vma = rel_mid;
1228
1229 for (; rel_vma <= rel_high && rel_vma[0]->address == vma;
1230 rel_vma++)
1231 {
1232 rel = *rel_vma;
1233 if (rel->sym_ptr_ptr != NULL
1234 && ! bfd_is_abs_section ((* rel->sym_ptr_ptr)->section))
1235 {
1236 if (place != NULL)
1237 * place = thisplace;
1238 return * rel->sym_ptr_ptr;
1239 }
1240 }
1241 break;
a24bb4f0
NC
1242 }
1243
0e70b27b
L
1244 if (vma < rel->address)
1245 rel_high = rel_mid;
1246 else if (vma >= rel_mid[1]->address)
1247 rel_low = rel_mid + 1;
1248 else
a24bb4f0
NC
1249 break;
1250 }
1251 }
1252
252b5132
RH
1253 if (place != NULL)
1254 *place = thisplace;
1255
1256 return sorted_syms[thisplace];
1257}
1258
155e0d23 1259/* Print an address and the offset to the nearest symbol. */
252b5132
RH
1260
1261static void
46dca2e0 1262objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
91d6fa6a 1263 bfd_vma vma, struct disassemble_info *inf,
46dca2e0 1264 bfd_boolean skip_zeroes)
252b5132 1265{
91d6fa6a 1266 objdump_print_value (vma, inf, skip_zeroes);
252b5132
RH
1267
1268 if (sym == NULL)
1269 {
1270 bfd_vma secaddr;
1271
91d6fa6a 1272 (*inf->fprintf_func) (inf->stream, " <%s",
fd361982
AM
1273 sanitize_string (bfd_section_name (sec)));
1274 secaddr = bfd_section_vma (sec);
252b5132
RH
1275 if (vma < secaddr)
1276 {
91d6fa6a
NC
1277 (*inf->fprintf_func) (inf->stream, "-0x");
1278 objdump_print_value (secaddr - vma, inf, TRUE);
252b5132
RH
1279 }
1280 else if (vma > secaddr)
1281 {
91d6fa6a
NC
1282 (*inf->fprintf_func) (inf->stream, "+0x");
1283 objdump_print_value (vma - secaddr, inf, TRUE);
252b5132 1284 }
91d6fa6a 1285 (*inf->fprintf_func) (inf->stream, ">");
252b5132
RH
1286 }
1287 else
1288 {
91d6fa6a 1289 (*inf->fprintf_func) (inf->stream, " <");
a24bb4f0 1290
91d6fa6a 1291 objdump_print_symname (abfd, inf, sym);
a24bb4f0
NC
1292
1293 if (bfd_asymbol_value (sym) == vma)
1294 ;
1295 /* Undefined symbols in an executables and dynamic objects do not have
1296 a value associated with them, so it does not make sense to display
1297 an offset relative to them. Normally we would not be provided with
1298 this kind of symbol, but the target backend might choose to do so,
1299 and the code in find_symbol_for_address might return an as yet
1300 unresolved symbol associated with a dynamic reloc. */
1301 else if ((bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
1302 && bfd_is_und_section (sym->section))
1303 ;
1304 else if (bfd_asymbol_value (sym) > vma)
252b5132 1305 {
91d6fa6a
NC
1306 (*inf->fprintf_func) (inf->stream, "-0x");
1307 objdump_print_value (bfd_asymbol_value (sym) - vma, inf, TRUE);
252b5132
RH
1308 }
1309 else if (vma > bfd_asymbol_value (sym))
1310 {
91d6fa6a
NC
1311 (*inf->fprintf_func) (inf->stream, "+0x");
1312 objdump_print_value (vma - bfd_asymbol_value (sym), inf, TRUE);
252b5132 1313 }
a24bb4f0 1314
91d6fa6a 1315 (*inf->fprintf_func) (inf->stream, ">");
252b5132 1316 }
98ec6e72
NC
1317
1318 if (display_file_offsets)
91d6fa6a 1319 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
98ec6e72 1320 (long int)(sec->filepos + (vma - sec->vma)));
252b5132
RH
1321}
1322
155e0d23
NC
1323/* Print an address (VMA), symbolically if possible.
1324 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
252b5132
RH
1325
1326static void
3b9ad1cc 1327objdump_print_addr (bfd_vma vma,
91d6fa6a 1328 struct disassemble_info *inf,
46dca2e0 1329 bfd_boolean skip_zeroes)
252b5132 1330{
3b9ad1cc 1331 struct objdump_disasm_info *aux;
d253b654 1332 asymbol *sym = NULL;
ce04548a 1333 bfd_boolean skip_find = FALSE;
252b5132 1334
91d6fa6a 1335 aux = (struct objdump_disasm_info *) inf->application_data;
32760852 1336
252b5132
RH
1337 if (sorted_symcount < 1)
1338 {
91d6fa6a
NC
1339 (*inf->fprintf_func) (inf->stream, "0x");
1340 objdump_print_value (vma, inf, skip_zeroes);
32760852
NC
1341
1342 if (display_file_offsets)
91d6fa6a 1343 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
f59f8978
AM
1344 (long int) (inf->section->filepos
1345 + (vma - inf->section->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
f59f8978 1365 objdump_print_addr_with_sym (aux->abfd, inf->section, 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;
f59f8978 1874 section = inf->section;
252b5132 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 2386
155e0d23
NC
2387 pinfo->buffer = data;
2388 pinfo->buffer_vma = section->vma;
2389 pinfo->buffer_length = datasize;
2390 pinfo->section = section;
2391
155e0d23
NC
2392 /* Skip over the relocs belonging to addresses below the
2393 start address. */
2394 while (rel_pp < rel_ppend
2395 && (*rel_pp)->address < rel_offset + addr_offset)
2396 ++rel_pp;
2397
12add40e 2398 printf (_("\nDisassembly of section %s:\n"), sanitize_string (section->name));
155e0d23
NC
2399
2400 /* Find the nearest symbol forwards from our current position. */
3b9ad1cc 2401 paux->require_sec = TRUE;
3f5e193b 2402 sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
91d6fa6a 2403 (struct disassemble_info *) inf,
3f5e193b 2404 &place);
3b9ad1cc 2405 paux->require_sec = FALSE;
155e0d23 2406
46bc35a9
RS
2407 /* PR 9774: If the target used signed addresses then we must make
2408 sure that we sign extend the value that we calculate for 'addr'
2409 in the loop below. */
1b0adfe0
NC
2410 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2411 && (bed = get_elf_backend_data (abfd)) != NULL
2412 && bed->sign_extend_vma)
46bc35a9 2413 sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
1b0adfe0 2414
155e0d23
NC
2415 /* Disassemble a block of instructions up to the address associated with
2416 the symbol we have just found. Then print the symbol and find the
2417 next symbol on. Repeat until we have disassembled the entire section
2418 or we have reached the end of the address range we are interested in. */
baae986a
NC
2419 do_print = paux->symbol == NULL;
2420 loop_until = stop_offset_reached;
2421
155e0d23
NC
2422 while (addr_offset < stop_offset)
2423 {
22a398e1 2424 bfd_vma addr;
155e0d23 2425 asymbol *nextsym;
bdc4de1b 2426 bfd_vma nextstop_offset;
155e0d23
NC
2427 bfd_boolean insns;
2428
22a398e1 2429 addr = section->vma + addr_offset;
095ad3b8 2430 addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
22a398e1
NC
2431
2432 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
155e0d23
NC
2433 {
2434 int x;
2435
2436 for (x = place;
2437 (x < sorted_symcount
22a398e1 2438 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
155e0d23
NC
2439 ++x)
2440 continue;
2441
22a398e1 2442 pinfo->symbols = sorted_syms + place;
155e0d23 2443 pinfo->num_symbols = x - place;
2087ad84 2444 pinfo->symtab_pos = place;
155e0d23
NC
2445 }
2446 else
22a398e1
NC
2447 {
2448 pinfo->symbols = NULL;
2449 pinfo->num_symbols = 0;
2087ad84 2450 pinfo->symtab_pos = -1;
22a398e1 2451 }
155e0d23 2452
baae986a
NC
2453 /* If we are only disassembling from a specific symbol,
2454 check to see if we should start or stop displaying. */
d3def5d7
MY
2455 if (sym && paux->symbol)
2456 {
baae986a
NC
2457 if (do_print)
2458 {
2459 /* See if we should stop printing. */
2460 switch (loop_until)
2461 {
2462 case function_sym:
2463 if (sym->flags & BSF_FUNCTION)
2464 do_print = FALSE;
2465 break;
2466
2467 case stop_offset_reached:
2468 /* Handled by the while loop. */
2469 break;
d3def5d7 2470
baae986a
NC
2471 case next_sym:
2472 /* FIXME: There is an implicit assumption here
2473 that the name of sym is different from
2474 paux->symbol. */
2475 if (! bfd_is_local_label (abfd, sym))
2476 do_print = FALSE;
2477 break;
2478 }
2479 }
2480 else
d3def5d7 2481 {
baae986a
NC
2482 const char * name = bfd_asymbol_name (sym);
2483 char * alloc = NULL;
2484
2485 if (do_demangle && name[0] != '\0')
2486 {
2487 /* Demangle the name. */
2488 alloc = bfd_demangle (abfd, name, demangle_flags);
2489 if (alloc != NULL)
2490 name = alloc;
2491 }
2492
2493 /* We are not currently printing. Check to see
2494 if the current symbol matches the requested symbol. */
2495 if (streq (name, paux->symbol))
2496 {
2497 do_print = TRUE;
2498
2499 if (sym->flags & BSF_FUNCTION)
2500 {
2501 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2502 && ((elf_symbol_type *) sym)->internal_elf_sym.st_size > 0)
2503 {
2504 /* Sym is a function symbol with a size associated
2505 with it. Turn on automatic disassembly for the
2506 next VALUE bytes. */
2507 stop_offset = addr_offset
2508 + ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
2509 loop_until = stop_offset_reached;
2510 }
2511 else
2512 {
2513 /* Otherwise we need to tell the loop heuristic to
2514 loop until the next function symbol is encountered. */
2515 loop_until = function_sym;
2516 }
2517 }
2518 else
2519 {
2520 /* Otherwise loop until the next symbol is encountered. */
2521 loop_until = next_sym;
2522 }
2523 }
2524
2525 free (alloc);
d3def5d7 2526 }
d3def5d7
MY
2527 }
2528
2529 if (! prefix_addresses && do_print)
155e0d23
NC
2530 {
2531 pinfo->fprintf_func (pinfo->stream, "\n");
22a398e1 2532 objdump_print_addr_with_sym (abfd, section, sym, addr,
155e0d23
NC
2533 pinfo, FALSE);
2534 pinfo->fprintf_func (pinfo->stream, ":\n");
2535 }
2536
22a398e1 2537 if (sym != NULL && bfd_asymbol_value (sym) > addr)
155e0d23
NC
2538 nextsym = sym;
2539 else if (sym == NULL)
2540 nextsym = NULL;
2541 else
2542 {
22a398e1 2543#define is_valid_next_sym(SYM) \
fd361982 2544 (strcmp (bfd_section_name ((SYM)->section), bfd_section_name (section)) == 0 \
22a398e1
NC
2545 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
2546 && pinfo->symbol_is_valid (SYM, pinfo))
3aade688 2547
155e0d23
NC
2548 /* Search forward for the next appropriate symbol in
2549 SECTION. Note that all the symbols are sorted
2550 together into one big array, and that some sections
2551 may have overlapping addresses. */
2552 while (place < sorted_symcount
22a398e1 2553 && ! is_valid_next_sym (sorted_syms [place]))
155e0d23 2554 ++place;
22a398e1 2555
155e0d23
NC
2556 if (place >= sorted_symcount)
2557 nextsym = NULL;
2558 else
2559 nextsym = sorted_syms[place];
2560 }
2561
22a398e1
NC
2562 if (sym != NULL && bfd_asymbol_value (sym) > addr)
2563 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
155e0d23
NC
2564 else if (nextsym == NULL)
2565 nextstop_offset = stop_offset;
2566 else
22a398e1
NC
2567 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
2568
84d7b001
NC
2569 if (nextstop_offset > stop_offset
2570 || nextstop_offset <= addr_offset)
22a398e1 2571 nextstop_offset = stop_offset;
155e0d23
NC
2572
2573 /* If a symbol is explicitly marked as being an object
2574 rather than a function, just dump the bytes without
2575 disassembling them. */
2576 if (disassemble_all
2577 || sym == NULL
abf71725 2578 || sym->section != section
22a398e1 2579 || bfd_asymbol_value (sym) > addr
155e0d23
NC
2580 || ((sym->flags & BSF_OBJECT) == 0
2581 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
2582 == NULL)
2583 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
2584 == NULL))
2585 || (sym->flags & BSF_FUNCTION) != 0)
2586 insns = TRUE;
2587 else
2588 insns = FALSE;
2589
d3def5d7 2590 if (do_print)
baae986a
NC
2591 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2592 addr_offset, nextstop_offset,
2593 rel_offset, &rel_pp, rel_ppend);
3aade688 2594
155e0d23
NC
2595 addr_offset = nextstop_offset;
2596 sym = nextsym;
2597 }
2598
2599 free (data);
2600
2601 if (rel_ppstart != NULL)
2602 free (rel_ppstart);
2603}
2604
252b5132
RH
2605/* Disassemble the contents of an object file. */
2606
2607static void
46dca2e0 2608disassemble_data (bfd *abfd)
252b5132 2609{
252b5132
RH
2610 struct disassemble_info disasm_info;
2611 struct objdump_disasm_info aux;
4c45e5c9 2612 long i;
252b5132
RH
2613
2614 print_files = NULL;
2615 prev_functionname = NULL;
2616 prev_line = -1;
9b8d1a36 2617 prev_discriminator = 0;
252b5132
RH
2618
2619 /* We make a copy of syms to sort. We don't want to sort syms
2620 because that will screw up the relocs. */
4c45e5c9 2621 sorted_symcount = symcount ? symcount : dynsymcount;
3f5e193b
NC
2622 sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2623 * sizeof (asymbol *));
4c45e5c9
JJ
2624 memcpy (sorted_syms, symcount ? syms : dynsyms,
2625 sorted_symcount * sizeof (asymbol *));
252b5132 2626
4c45e5c9
JJ
2627 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2628
2629 for (i = 0; i < synthcount; ++i)
2630 {
2631 sorted_syms[sorted_symcount] = synthsyms + i;
2632 ++sorted_symcount;
2633 }
252b5132 2634
98a91d6a 2635 /* Sort the symbols into section and symbol order. */
252b5132
RH
2636 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2637
22a398e1 2638 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
98a91d6a 2639
46dca2e0 2640 disasm_info.application_data = (void *) &aux;
252b5132 2641 aux.abfd = abfd;
b34976b6 2642 aux.require_sec = FALSE;
155e0d23
NC
2643 aux.dynrelbuf = NULL;
2644 aux.dynrelcount = 0;
ce04548a 2645 aux.reloc = NULL;
d3def5d7 2646 aux.symbol = disasm_sym;
155e0d23 2647
252b5132
RH
2648 disasm_info.print_address_func = objdump_print_address;
2649 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2650
d3ba0551 2651 if (machine != NULL)
252b5132 2652 {
91d6fa6a 2653 const bfd_arch_info_type *inf = bfd_scan_arch (machine);
98a91d6a 2654
91d6fa6a 2655 if (inf == NULL)
a8c62f1c 2656 fatal (_("can't use supplied machine %s"), machine);
98a91d6a 2657
91d6fa6a 2658 abfd->arch_info = inf;
252b5132
RH
2659 }
2660
2661 if (endian != BFD_ENDIAN_UNKNOWN)
2662 {
2663 struct bfd_target *xvec;
2664
3f5e193b 2665 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
252b5132
RH
2666 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2667 xvec->byteorder = endian;
2668 abfd->xvec = xvec;
2669 }
2670
155e0d23 2671 /* Use libopcodes to locate a suitable disassembler. */
003ca0fd
YQ
2672 aux.disassemble_fn = disassembler (bfd_get_arch (abfd),
2673 bfd_big_endian (abfd),
2674 bfd_get_mach (abfd), abfd);
155e0d23 2675 if (!aux.disassemble_fn)
252b5132 2676 {
a8c62f1c 2677 non_fatal (_("can't disassemble for architecture %s\n"),
37cc8ec1 2678 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
75cd796a 2679 exit_status = 1;
252b5132
RH
2680 return;
2681 }
2682
2683 disasm_info.flavour = bfd_get_flavour (abfd);
2684 disasm_info.arch = bfd_get_arch (abfd);
2685 disasm_info.mach = bfd_get_mach (abfd);
dd92f639 2686 disasm_info.disassembler_options = disassembler_options;
61826503 2687 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd, NULL);
0bcb06d2
AS
2688 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2689 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
d99b6465 2690 disasm_info.disassembler_needs_relocs = FALSE;
0af11b59 2691
252b5132 2692 if (bfd_big_endian (abfd))
a8a9050d 2693 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
252b5132 2694 else if (bfd_little_endian (abfd))
a8a9050d 2695 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
252b5132
RH
2696 else
2697 /* ??? Aborting here seems too drastic. We could default to big or little
2698 instead. */
2699 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2700
22a398e1
NC
2701 /* Allow the target to customize the info structure. */
2702 disassemble_init_for_target (& disasm_info);
2703
a24bb4f0 2704 /* Pre-load the dynamic relocs as we may need them during the disassembly. */
fd7bb956
AM
2705 {
2706 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3aade688 2707
a24bb4f0 2708 if (relsize < 0 && dump_dynamic_reloc_info)
fd7bb956
AM
2709 bfd_fatal (bfd_get_filename (abfd));
2710
2711 if (relsize > 0)
2712 {
3f5e193b 2713 aux.dynrelbuf = (arelent **) xmalloc (relsize);
3b9ad1cc
AM
2714 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2715 aux.dynrelbuf,
2716 dynsyms);
155e0d23 2717 if (aux.dynrelcount < 0)
fd7bb956
AM
2718 bfd_fatal (bfd_get_filename (abfd));
2719
2720 /* Sort the relocs by address. */
3b9ad1cc
AM
2721 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2722 compare_relocs);
fd7bb956
AM
2723 }
2724 }
2087ad84
PB
2725 disasm_info.symtab = sorted_syms;
2726 disasm_info.symtab_size = sorted_symcount;
fd7bb956 2727
155e0d23 2728 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
98a91d6a 2729
155e0d23
NC
2730 if (aux.dynrelbuf != NULL)
2731 free (aux.dynrelbuf);
252b5132
RH
2732 free (sorted_syms);
2733}
2734\f
dda8d76d 2735static bfd_boolean
7bcbeb0f
CC
2736load_specific_debug_section (enum dwarf_section_display_enum debug,
2737 asection *sec, void *file)
365544c3
L
2738{
2739 struct dwarf_section *section = &debug_displays [debug].section;
3f5e193b 2740 bfd *abfd = (bfd *) file;
bfec0f11 2741 bfd_byte *contents;
f2023ce7 2742 bfd_size_type amt;
63455780 2743 size_t alloced;
365544c3 2744
365544c3 2745 if (section->start != NULL)
dda8d76d
NC
2746 {
2747 /* If it is already loaded, do nothing. */
2748 if (streq (section->filename, bfd_get_filename (abfd)))
2749 return TRUE;
2750 free (section->start);
2751 }
365544c3 2752
dda8d76d 2753 section->filename = bfd_get_filename (abfd);
d1c4b12b 2754 section->reloc_info = NULL;
3aade688 2755 section->num_relocs = 0;
fd361982 2756 section->address = bfd_section_vma (sec);
11fa9f13 2757 section->user_data = sec;
fd361982 2758 section->size = bfd_section_size (sec);
63455780
NC
2759 /* PR 24360: On 32-bit hosts sizeof (size_t) < sizeof (bfd_size_type). */
2760 alloced = amt = section->size + 1;
2761 if (alloced != amt || alloced == 0)
11fa9f13
NC
2762 {
2763 section->start = NULL;
2764 free_debug_section (debug);
2765 printf (_("\nSection '%s' has an invalid size: %#llx.\n"),
12add40e
NC
2766 sanitize_string (section->name),
2767 (unsigned long long) section->size);
11fa9f13
NC
2768 return FALSE;
2769 }
63455780 2770 section->start = contents = malloc (alloced);
11fa9f13 2771 if (section->start == NULL
bfec0f11 2772 || !bfd_get_full_section_contents (abfd, sec, &contents))
365544c3
L
2773 {
2774 free_debug_section (debug);
2775 printf (_("\nCan't get contents for section '%s'.\n"),
12add40e 2776 sanitize_string (section->name));
dda8d76d 2777 return FALSE;
1b315056 2778 }
4f1881b9
AM
2779 /* Ensure any string section has a terminating NUL. */
2780 section->start[section->size] = 0;
1b315056 2781
2e8136f9
NC
2782 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
2783 && debug_displays [debug].relocate)
0acf065b 2784 {
dda8d76d
NC
2785 long reloc_size;
2786 bfd_boolean ret;
2787
8a72cc6e 2788 bfd_cache_section_contents (sec, section->start);
0acf065b
CC
2789
2790 ret = bfd_simple_get_relocated_section_contents (abfd,
2791 sec,
2792 section->start,
2793 syms) != NULL;
2794
2795 if (! ret)
2796 {
2797 free_debug_section (debug);
2798 printf (_("\nCan't get contents for section '%s'.\n"),
12add40e 2799 sanitize_string (section->name));
dda8d76d 2800 return FALSE;
0acf065b 2801 }
d1c4b12b 2802
d1c4b12b
NC
2803 reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
2804 if (reloc_size > 0)
2805 {
2806 unsigned long reloc_count;
2807 arelent **relocs;
2808
2809 relocs = (arelent **) xmalloc (reloc_size);
2810
2811 reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
2812 if (reloc_count == 0)
2813 free (relocs);
2814 else
2815 {
2816 section->reloc_info = relocs;
2817 section->num_relocs = reloc_count;
2818 }
2819 }
bdc4de1b 2820 }
0acf065b 2821
dda8d76d 2822 return TRUE;
7bcbeb0f
CC
2823}
2824
d1c4b12b
NC
2825bfd_boolean
2826reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
2827{
2828 arelent ** relocs;
2829 arelent * rp;
2830
2831 if (dsec == NULL || dsec->reloc_info == NULL)
2832 return FALSE;
2833
2834 relocs = (arelent **) dsec->reloc_info;
2835
2836 for (; (rp = * relocs) != NULL; ++ relocs)
2837 if (rp->address == offset)
2838 return TRUE;
2839
2840 return FALSE;
2841}
2842
dda8d76d 2843bfd_boolean
7bcbeb0f
CC
2844load_debug_section (enum dwarf_section_display_enum debug, void *file)
2845{
2846 struct dwarf_section *section = &debug_displays [debug].section;
3f5e193b 2847 bfd *abfd = (bfd *) file;
7bcbeb0f
CC
2848 asection *sec;
2849
2850 /* If it is already loaded, do nothing. */
2851 if (section->start != NULL)
dda8d76d
NC
2852 {
2853 if (streq (section->filename, bfd_get_filename (abfd)))
2854 return TRUE;
2855 }
7bcbeb0f
CC
2856
2857 /* Locate the debug section. */
2858 sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2859 if (sec != NULL)
2860 section->name = section->uncompressed_name;
2861 else
2862 {
2863 sec = bfd_get_section_by_name (abfd, section->compressed_name);
2864 if (sec != NULL)
2865 section->name = section->compressed_name;
2866 }
2867 if (sec == NULL)
dda8d76d 2868 return FALSE;
7bcbeb0f
CC
2869
2870 return load_specific_debug_section (debug, sec, file);
365544c3
L
2871}
2872
2873void
2874free_debug_section (enum dwarf_section_display_enum debug)
2875{
2876 struct dwarf_section *section = &debug_displays [debug].section;
2877
2878 if (section->start == NULL)
2879 return;
2880
06614111
NC
2881 /* PR 17512: file: 0f67f69d. */
2882 if (section->user_data != NULL)
2883 {
2884 asection * sec = (asection *) section->user_data;
2885
2886 /* If we are freeing contents that are also pointed to by the BFD
2887 library's section structure then make sure to update those pointers
2888 too. Otherwise, the next time we try to load data for this section
2889 we can end up using a stale pointer. */
2890 if (section->start == sec->contents)
2891 {
2892 sec->contents = NULL;
2893 sec->flags &= ~ SEC_IN_MEMORY;
db6b071a 2894 sec->compress_status = COMPRESS_SECTION_NONE;
06614111
NC
2895 }
2896 }
2897
365544c3
L
2898 free ((char *) section->start);
2899 section->start = NULL;
2900 section->address = 0;
2901 section->size = 0;
2902}
2903
dda8d76d
NC
2904void
2905close_debug_file (void * file)
2906{
2907 bfd * abfd = (bfd *) file;
2908
2909 bfd_close (abfd);
2910}
2911
2912void *
2913open_debug_file (const char * pathname)
2914{
2915 bfd * data;
2916
2917 data = bfd_openr (pathname, NULL);
2918 if (data == NULL)
2919 return NULL;
2920
2921 if (! bfd_check_format (data, bfd_object))
2922 return NULL;
2923
2924 return data;
2925}
2926
365544c3
L
2927static void
2928dump_dwarf_section (bfd *abfd, asection *section,
2929 void *arg ATTRIBUTE_UNUSED)
2930{
fd361982 2931 const char *name = bfd_section_name (section);
365544c3 2932 const char *match;
3f5e193b 2933 int i;
365544c3 2934
0112cd26 2935 if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
365544c3
L
2936 match = ".debug_info";
2937 else
2938 match = name;
2939
2940 for (i = 0; i < max; i++)
4cb93e3b
TG
2941 if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2942 || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2943 && debug_displays [i].enabled != NULL
2944 && *debug_displays [i].enabled)
365544c3 2945 {
c8450da8 2946 struct dwarf_section *sec = &debug_displays [i].section;
365544c3 2947
c8450da8
TG
2948 if (strcmp (sec->uncompressed_name, match) == 0)
2949 sec->name = sec->uncompressed_name;
2950 else
2951 sec->name = sec->compressed_name;
3f5e193b
NC
2952 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2953 section, abfd))
c8450da8
TG
2954 {
2955 debug_displays [i].display (sec, abfd);
3aade688 2956
c8450da8 2957 if (i != info && i != abbrev)
3f5e193b 2958 free_debug_section ((enum dwarf_section_display_enum) i);
365544c3
L
2959 }
2960 break;
2961 }
2962}
2963
2964/* Dump the dwarf debugging information. */
2965
2966static void
2967dump_dwarf (bfd *abfd)
2968{
39f0547e
NC
2969 /* The byte_get pointer should have been set at the start of dump_bfd(). */
2970 if (byte_get == NULL)
f41e4712
NC
2971 {
2972 warn (_("File %s does not contain any dwarf debug information\n"),
2973 bfd_get_filename (abfd));
2974 return;
2975 }
365544c3 2976
b129eb0e 2977 switch (bfd_get_arch (abfd))
2dc4cec1 2978 {
8ab159a9
AM
2979 case bfd_arch_s12z:
2980 /* S12Z has a 24 bit address space. But the only known
2981 producer of dwarf_info encodes addresses into 32 bits. */
2982 eh_addr_size = 4;
2983 break;
2984
b129eb0e 2985 default:
229a22cf 2986 eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
b129eb0e 2987 break;
2dc4cec1
L
2988 }
2989
229a22cf
AB
2990 init_dwarf_regnames_by_bfd_arch_and_mach (bfd_get_arch (abfd),
2991 bfd_get_mach (abfd));
2992
365544c3 2993 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
365544c3
L
2994}
2995\f
29ca8dc5
NS
2996/* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2997 it. Return NULL on failure. */
252b5132 2998
bae7501e 2999static bfd_byte *
7d9813f1
NA
3000read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr,
3001 bfd_size_type *entsize_ptr)
252b5132 3002{
29ca8dc5 3003 asection *stabsect;
bae7501e 3004 bfd_byte *contents;
252b5132 3005
29ca8dc5 3006 stabsect = bfd_get_section_by_name (abfd, sect_name);
155e0d23 3007 if (stabsect == NULL)
252b5132 3008 {
12add40e
NC
3009 printf (_("No %s section present\n\n"),
3010 sanitize_string (sect_name));
b34976b6 3011 return FALSE;
252b5132
RH
3012 }
3013
bae7501e 3014 if (!bfd_malloc_and_get_section (abfd, stabsect, &contents))
252b5132 3015 {
a8c62f1c 3016 non_fatal (_("reading %s section of %s failed: %s"),
29ca8dc5 3017 sect_name, bfd_get_filename (abfd),
37cc8ec1 3018 bfd_errmsg (bfd_get_error ()));
75cd796a 3019 exit_status = 1;
a8c62f1c 3020 free (contents);
29ca8dc5 3021 return NULL;
252b5132
RH
3022 }
3023
fd361982 3024 *size_ptr = bfd_section_size (stabsect);
7d9813f1
NA
3025 if (entsize_ptr)
3026 *entsize_ptr = stabsect->entsize;
252b5132 3027
29ca8dc5 3028 return contents;
252b5132
RH
3029}
3030
3031/* Stabs entries use a 12 byte format:
3032 4 byte string table index
3033 1 byte stab type
3034 1 byte stab other field
3035 2 byte stab desc field
3036 4 byte stab value
3037 FIXME: This will have to change for a 64 bit object format. */
3038
46dca2e0
NC
3039#define STRDXOFF (0)
3040#define TYPEOFF (4)
3041#define OTHEROFF (5)
3042#define DESCOFF (6)
3043#define VALOFF (8)
252b5132
RH
3044#define STABSIZE (12)
3045
3046/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
3047 using string table section STRSECT_NAME (in `strtab'). */
3048
3049static void
3b9ad1cc
AM
3050print_section_stabs (bfd *abfd,
3051 const char *stabsect_name,
3052 unsigned *string_offset_ptr)
252b5132
RH
3053{
3054 int i;
46dca2e0 3055 unsigned file_string_table_offset = 0;
29ca8dc5 3056 unsigned next_file_string_table_offset = *string_offset_ptr;
252b5132
RH
3057 bfd_byte *stabp, *stabs_end;
3058
3059 stabp = stabs;
3060 stabs_end = stabp + stab_size;
3061
12add40e 3062 printf (_("Contents of %s section:\n\n"), sanitize_string (stabsect_name));
252b5132
RH
3063 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
3064
3065 /* Loop through all symbols and print them.
3066
3067 We start the index at -1 because there is a dummy symbol on
3068 the front of stabs-in-{coff,elf} sections that supplies sizes. */
f41e4712 3069 for (i = -1; stabp <= stabs_end - STABSIZE; stabp += STABSIZE, i++)
252b5132
RH
3070 {
3071 const char *name;
3072 unsigned long strx;
3073 unsigned char type, other;
3074 unsigned short desc;
3075 bfd_vma value;
3076
3077 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
3078 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
3079 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
3080 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
3081 value = bfd_h_get_32 (abfd, stabp + VALOFF);
3082
3083 printf ("\n%-6d ", i);
3084 /* Either print the stab name, or, if unnamed, print its number
0af11b59 3085 again (makes consistent formatting for tools like awk). */
252b5132
RH
3086 name = bfd_get_stab_name (type);
3087 if (name != NULL)
12add40e 3088 printf ("%-6s", sanitize_string (name));
252b5132
RH
3089 else if (type == N_UNDF)
3090 printf ("HdrSym");
3091 else
3092 printf ("%-6d", type);
3093 printf (" %-6d %-6d ", other, desc);
d8180c76 3094 bfd_printf_vma (abfd, value);
252b5132
RH
3095 printf (" %-6lu", strx);
3096
3097 /* Symbols with type == 0 (N_UNDF) specify the length of the
3098 string table associated with this file. We use that info
3099 to know how to relocate the *next* file's string table indices. */
252b5132
RH
3100 if (type == N_UNDF)
3101 {
3102 file_string_table_offset = next_file_string_table_offset;
3103 next_file_string_table_offset += value;
3104 }
3105 else
3106 {
f41e4712
NC
3107 bfd_size_type amt = strx + file_string_table_offset;
3108
252b5132
RH
3109 /* Using the (possibly updated) string table offset, print the
3110 string (if any) associated with this symbol. */
f41e4712 3111 if (amt < stabstr_size)
12add40e
NC
3112 /* PR 17512: file: 079-79389-0.001:0.1.
3113 FIXME: May need to sanitize this string before displaying. */
f41e4712 3114 printf (" %.*s", (int)(stabstr_size - amt), strtab + amt);
252b5132
RH
3115 else
3116 printf (" *");
3117 }
3118 }
3119 printf ("\n\n");
29ca8dc5 3120 *string_offset_ptr = next_file_string_table_offset;
252b5132
RH
3121}
3122
155e0d23
NC
3123typedef struct
3124{
3125 const char * section_name;
3126 const char * string_section_name;
29ca8dc5 3127 unsigned string_offset;
155e0d23
NC
3128}
3129stab_section_names;
3130
252b5132 3131static void
155e0d23 3132find_stabs_section (bfd *abfd, asection *section, void *names)
252b5132 3133{
155e0d23
NC
3134 int len;
3135 stab_section_names * sought = (stab_section_names *) names;
252b5132
RH
3136
3137 /* Check for section names for which stabsect_name is a prefix, to
29ca8dc5 3138 handle .stab.N, etc. */
155e0d23
NC
3139 len = strlen (sought->section_name);
3140
3141 /* If the prefix matches, and the files section name ends with a
3142 nul or a digit, then we match. I.e., we want either an exact
3143 match or a section followed by a number. */
3144 if (strncmp (sought->section_name, section->name, len) == 0
3145 && (section->name[len] == 0
29ca8dc5 3146 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
252b5132 3147 {
29ca8dc5
NS
3148 if (strtab == NULL)
3149 strtab = read_section_stabs (abfd, sought->string_section_name,
7d9813f1 3150 &stabstr_size, NULL);
3aade688 3151
29ca8dc5 3152 if (strtab)
252b5132 3153 {
7d9813f1 3154 stabs = read_section_stabs (abfd, section->name, &stab_size, NULL);
29ca8dc5
NS
3155 if (stabs)
3156 print_section_stabs (abfd, section->name, &sought->string_offset);
252b5132
RH
3157 }
3158 }
3159}
98a91d6a 3160
155e0d23
NC
3161static void
3162dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
3163{
3164 stab_section_names s;
3165
3166 s.section_name = stabsect_name;
3167 s.string_section_name = strsect_name;
29ca8dc5
NS
3168 s.string_offset = 0;
3169
155e0d23 3170 bfd_map_over_sections (abfd, find_stabs_section, & s);
29ca8dc5
NS
3171
3172 free (strtab);
3173 strtab = NULL;
155e0d23
NC
3174}
3175
3176/* Dump the any sections containing stabs debugging information. */
3177
3178static void
3179dump_stabs (bfd *abfd)
3180{
3181 dump_stabs_section (abfd, ".stab", ".stabstr");
3182 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
3183 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
62bb81b8
TG
3184
3185 /* For Darwin. */
3186 dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
3187
155e0d23
NC
3188 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
3189}
252b5132
RH
3190\f
3191static void
46dca2e0 3192dump_bfd_header (bfd *abfd)
252b5132
RH
3193{
3194 char *comma = "";
3195
3196 printf (_("architecture: %s, "),
3197 bfd_printable_arch_mach (bfd_get_arch (abfd),
3198 bfd_get_mach (abfd)));
6b6bc957 3199 printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
252b5132
RH
3200
3201#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
3202 PF (HAS_RELOC, "HAS_RELOC");
3203 PF (EXEC_P, "EXEC_P");
3204 PF (HAS_LINENO, "HAS_LINENO");
3205 PF (HAS_DEBUG, "HAS_DEBUG");
3206 PF (HAS_SYMS, "HAS_SYMS");
3207 PF (HAS_LOCALS, "HAS_LOCALS");
3208 PF (DYNAMIC, "DYNAMIC");
3209 PF (WP_TEXT, "WP_TEXT");
3210 PF (D_PAGED, "D_PAGED");
3211 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
3212 printf (_("\nstart address 0x"));
d8180c76 3213 bfd_printf_vma (abfd, abfd->start_address);
252b5132
RH
3214 printf ("\n");
3215}
7d9813f1
NA
3216\f
3217
3218/* Formatting callback function passed to ctf_dump. Returns either the pointer
3219 it is passed, or a pointer to newly-allocated storage, in which case
3220 dump_ctf() will free it when it no longer needs it. */
3221
3222static char *
3223dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
3224 char *s, void *arg)
3225{
63160fc9 3226 const char *blanks = arg;
7d9813f1
NA
3227 char *new_s;
3228
63160fc9 3229 if (asprintf (&new_s, "%s%s", blanks, s) < 0)
7d9813f1
NA
3230 return s;
3231 return new_s;
3232}
3233
3234/* Make a ctfsect suitable for ctf_bfdopen_ctfsect(). */
3235static ctf_sect_t
3236make_ctfsect (const char *name, bfd_byte *data,
3237 bfd_size_type size)
3238{
3239 ctf_sect_t ctfsect;
3240
3241 ctfsect.cts_name = name;
7d9813f1 3242 ctfsect.cts_entsize = 1;
7d9813f1
NA
3243 ctfsect.cts_size = size;
3244 ctfsect.cts_data = data;
3245
3246 return ctfsect;
3247}
3248
3249/* Dump one CTF archive member. */
3250
3251static int
3252dump_ctf_archive_member (ctf_file_t *ctf, const char *name, void *arg)
3253{
3254 ctf_file_t *parent = (ctf_file_t *) arg;
9b32cba4
NA
3255 const char *things[] = {"Header", "Labels", "Data objects",
3256 "Function objects", "Variables", "Types", "Strings",
3257 ""};
7d9813f1
NA
3258 const char **thing;
3259 size_t i;
3260
3261 /* Only print out the name of non-default-named archive members.
3262 The name .ctf appears everywhere, even for things that aren't
fd86991b
NA
3263 really archives, so printing it out is liable to be confusing.
3264
3265 The parent, if there is one, is the default-owned archive member:
3266 avoid importing it into itself. (This does no harm, but looks
3267 confusing.) */
3268
7d9813f1 3269 if (strcmp (name, ".ctf") != 0)
fd86991b
NA
3270 {
3271 printf (_("\nCTF archive member: %s:\n"), sanitize_string (name));
3272 ctf_import (ctf, parent);
3273 }
7d9813f1 3274
9b32cba4 3275 for (i = 0, thing = things; *thing[0]; thing++, i++)
7d9813f1
NA
3276 {
3277 ctf_dump_state_t *s = NULL;
3278 char *item;
3279
3280 printf ("\n %s:\n", *thing);
3281 while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
3282 (void *) " ")) != NULL)
3283 {
3284 printf ("%s\n", item);
3285 free (item);
3286 }
3287
3288 if (ctf_errno (ctf))
3289 {
3290 non_fatal (_("Iteration failed: %s, %s\n"), *thing,
3291 ctf_errmsg (ctf_errno (ctf)));
3292 break;
3293 }
3294 }
3295 return 0;
3296}
3297
3298/* Dump the CTF debugging information. */
3299
3300static void
3301dump_ctf (bfd *abfd, const char *sect_name, const char *parent_name)
3302{
fd86991b 3303 ctf_archive_t *ctfa, *parenta = NULL, *lookparent;
7d9813f1
NA
3304 bfd_byte *ctfdata, *parentdata = NULL;
3305 bfd_size_type ctfsize, parentsize;
3306 ctf_sect_t ctfsect;
3307 ctf_file_t *parent = NULL;
3308 int err;
3309
3310 if ((ctfdata = read_section_stabs (abfd, sect_name, &ctfsize, NULL)) == NULL)
3311 bfd_fatal (bfd_get_filename (abfd));
3312
3313 if (parent_name
3314 && (parentdata = read_section_stabs (abfd, parent_name, &parentsize,
3315 NULL)) == NULL)
3316 bfd_fatal (bfd_get_filename (abfd));
3317
3318 /* Load the CTF file and dump it. */
3319
3320 ctfsect = make_ctfsect (sect_name, ctfdata, ctfsize);
3321 if ((ctfa = ctf_bfdopen_ctfsect (abfd, &ctfsect, &err)) == NULL)
3322 {
3323 non_fatal (_("CTF open failure: %s\n"), ctf_errmsg (err));
3324 bfd_fatal (bfd_get_filename (abfd));
3325 }
3326
3327 if (parentdata)
3328 {
3329 ctfsect = make_ctfsect (parent_name, parentdata, parentsize);
3330 if ((parenta = ctf_bfdopen_ctfsect (abfd, &ctfsect, &err)) == NULL)
3331 {
3332 non_fatal (_("CTF open failure: %s\n"), ctf_errmsg (err));
3333 bfd_fatal (bfd_get_filename (abfd));
3334 }
3335
fd86991b
NA
3336 lookparent = parenta;
3337 }
3338 else
3339 lookparent = ctfa;
3340
3341 /* Assume that the applicable parent archive member is the default one.
3342 (This is what all known implementations are expected to do, if they
3343 put CTFs and their parents in archives together.) */
3344 if ((parent = ctf_arc_open_by_name (lookparent, NULL, &err)) == NULL)
3345 {
3346 non_fatal (_("CTF open failure: %s\n"), ctf_errmsg (err));
3347 bfd_fatal (bfd_get_filename (abfd));
7d9813f1
NA
3348 }
3349
3350 printf (_("Contents of CTF section %s:\n"), sanitize_string (sect_name));
3351
3352 ctf_archive_iter (ctfa, dump_ctf_archive_member, parent);
3353 ctf_file_close (parent);
3354 ctf_close (ctfa);
3355 ctf_close (parenta);
3356 free (parentdata);
3357 free (ctfdata);
3358}
98a91d6a 3359
79b377b3 3360\f
252b5132 3361static void
46dca2e0 3362dump_bfd_private_header (bfd *abfd)
252b5132 3363{
7d272a55
AM
3364 if (!bfd_print_private_bfd_data (abfd, stdout))
3365 non_fatal (_("warning: private headers incomplete: %s"),
3366 bfd_errmsg (bfd_get_error ()));
252b5132
RH
3367}
3368
6abcee90
TG
3369static void
3370dump_target_specific (bfd *abfd)
3371{
3372 const struct objdump_private_desc * const *desc;
3373 struct objdump_private_option *opt;
3374 char *e, *b;
3375
3376 /* Find the desc. */
3377 for (desc = objdump_private_vectors; *desc != NULL; desc++)
3378 if ((*desc)->filter (abfd))
3379 break;
3380
c32d6f7b 3381 if (*desc == NULL)
6abcee90
TG
3382 {
3383 non_fatal (_("option -P/--private not supported by this file"));
3384 return;
3385 }
3386
3387 /* Clear all options. */
3388 for (opt = (*desc)->options; opt->name; opt++)
3389 opt->selected = FALSE;
3390
3391 /* Decode options. */
3392 b = dump_private_options;
3393 do
3394 {
3395 e = strchr (b, ',');
3396
3397 if (e)
3398 *e = 0;
3399
3400 for (opt = (*desc)->options; opt->name; opt++)
3401 if (strcmp (opt->name, b) == 0)
3402 {
3403 opt->selected = TRUE;
3404 break;
3405 }
3406 if (opt->name == NULL)
3407 non_fatal (_("target specific dump '%s' not supported"), b);
3408
3409 if (e)
3410 {
3411 *e = ',';
3412 b = e + 1;
3413 }
3414 }
3415 while (e != NULL);
3416
3417 /* Dump. */
3418 (*desc)->dump (abfd);
3419}
155e0d23
NC
3420\f
3421/* Display a section in hexadecimal format with associated characters.
3422 Each line prefixed by the zero padded address. */
d24de309 3423
252b5132 3424static void
155e0d23 3425dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
252b5132 3426{
cfd14a50 3427 bfd_byte *data = NULL;
155e0d23 3428 bfd_size_type datasize;
bdc4de1b
NC
3429 bfd_vma addr_offset;
3430 bfd_vma start_offset;
3431 bfd_vma stop_offset;
61826503 3432 unsigned int opb = bfd_octets_per_byte (abfd, section);
155e0d23
NC
3433 /* Bytes per line. */
3434 const int onaline = 16;
3435 char buf[64];
3436 int count;
3437 int width;
3438
3439 if ((section->flags & SEC_HAS_CONTENTS) == 0)
3440 return;
3441
3442 if (! process_section_p (section))
3443 return;
3aade688 3444
fd361982 3445 if ((datasize = bfd_section_size (section)) == 0)
155e0d23
NC
3446 return;
3447
155e0d23
NC
3448 /* Compute the address range to display. */
3449 if (start_address == (bfd_vma) -1
3450 || start_address < section->vma)
3451 start_offset = 0;
3452 else
3453 start_offset = start_address - section->vma;
3454
3455 if (stop_address == (bfd_vma) -1)
3456 stop_offset = datasize / opb;
3457 else
252b5132 3458 {
155e0d23
NC
3459 if (stop_address < section->vma)
3460 stop_offset = 0;
3461 else
3462 stop_offset = stop_address - section->vma;
252b5132 3463
155e0d23
NC
3464 if (stop_offset > datasize / opb)
3465 stop_offset = datasize / opb;
252b5132
RH
3466 }
3467
32760852
NC
3468 if (start_offset >= stop_offset)
3469 return;
3aade688 3470
12add40e 3471 printf (_("Contents of section %s:"), sanitize_string (section->name));
32760852 3472 if (display_file_offsets)
0af1713e
AM
3473 printf (_(" (Starting at file offset: 0x%lx)"),
3474 (unsigned long) (section->filepos + start_offset));
32760852
NC
3475 printf ("\n");
3476
4a114e3e
L
3477 if (!bfd_get_full_section_contents (abfd, section, &data))
3478 {
0821d5b1
NC
3479 non_fatal (_("Reading section %s failed because: %s"),
3480 section->name, bfd_errmsg (bfd_get_error ()));
4a114e3e
L
3481 return;
3482 }
32760852 3483
155e0d23 3484 width = 4;
026df7c5 3485
155e0d23
NC
3486 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
3487 if (strlen (buf) >= sizeof (buf))
3488 abort ();
026df7c5 3489
155e0d23
NC
3490 count = 0;
3491 while (buf[count] == '0' && buf[count+1] != '\0')
3492 count++;
3493 count = strlen (buf) - count;
3494 if (count > width)
3495 width = count;
252b5132 3496
155e0d23
NC
3497 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
3498 if (strlen (buf) >= sizeof (buf))
3499 abort ();
026df7c5 3500
155e0d23
NC
3501 count = 0;
3502 while (buf[count] == '0' && buf[count+1] != '\0')
3503 count++;
3504 count = strlen (buf) - count;
3505 if (count > width)
3506 width = count;
026df7c5 3507
155e0d23
NC
3508 for (addr_offset = start_offset;
3509 addr_offset < stop_offset; addr_offset += onaline / opb)
d24de309 3510 {
155e0d23 3511 bfd_size_type j;
d24de309 3512
155e0d23
NC
3513 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
3514 count = strlen (buf);
3515 if ((size_t) count >= sizeof (buf))
3516 abort ();
d24de309 3517
155e0d23
NC
3518 putchar (' ');
3519 while (count < width)
252b5132 3520 {
155e0d23
NC
3521 putchar ('0');
3522 count++;
3523 }
3524 fputs (buf + count - width, stdout);
3525 putchar (' ');
252b5132 3526
155e0d23
NC
3527 for (j = addr_offset * opb;
3528 j < addr_offset * opb + onaline; j++)
3529 {
3530 if (j < stop_offset * opb)
3531 printf ("%02x", (unsigned) (data[j]));
3532 else
3533 printf (" ");
3534 if ((j & 3) == 3)
3535 printf (" ");
252b5132
RH
3536 }
3537
155e0d23
NC
3538 printf (" ");
3539 for (j = addr_offset * opb;
3540 j < addr_offset * opb + onaline; j++)
3541 {
3542 if (j >= stop_offset * opb)
3543 printf (" ");
3544 else
3545 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
3546 }
3547 putchar ('\n');
252b5132 3548 }
155e0d23 3549 free (data);
252b5132 3550}
155e0d23 3551
98a91d6a 3552/* Actually display the various requested regions. */
252b5132
RH
3553
3554static void
46dca2e0 3555dump_data (bfd *abfd)
252b5132 3556{
155e0d23 3557 bfd_map_over_sections (abfd, dump_section, NULL);
252b5132
RH
3558}
3559
98a91d6a
NC
3560/* Should perhaps share code and display with nm? */
3561
252b5132 3562static void
46dca2e0 3563dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
252b5132
RH
3564{
3565 asymbol **current;
91d6fa6a 3566 long max_count;
252b5132
RH
3567 long count;
3568
3569 if (dynamic)
3570 {
3571 current = dynsyms;
91d6fa6a 3572 max_count = dynsymcount;
252b5132
RH
3573 printf ("DYNAMIC SYMBOL TABLE:\n");
3574 }
3575 else
3576 {
3577 current = syms;
91d6fa6a 3578 max_count = symcount;
252b5132
RH
3579 printf ("SYMBOL TABLE:\n");
3580 }
3581
91d6fa6a 3582 if (max_count == 0)
a1df01d1
AM
3583 printf (_("no symbols\n"));
3584
91d6fa6a 3585 for (count = 0; count < max_count; count++)
252b5132 3586 {
155e0d23
NC
3587 bfd *cur_bfd;
3588
3589 if (*current == NULL)
83ef0798 3590 printf (_("no information for symbol number %ld\n"), count);
155e0d23
NC
3591
3592 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
83ef0798 3593 printf (_("could not determine the type of symbol number %ld\n"),
155e0d23
NC
3594 count);
3595
661f7c35
NC
3596 else if (process_section_p ((* current)->section)
3597 && (dump_special_syms
3598 || !bfd_is_target_special_symbol (cur_bfd, *current)))
252b5132 3599 {
155e0d23 3600 const char *name = (*current)->name;
252b5132 3601
155e0d23 3602 if (do_demangle && name != NULL && *name != '\0')
252b5132 3603 {
252b5132
RH
3604 char *alloc;
3605
155e0d23
NC
3606 /* If we want to demangle the name, we demangle it
3607 here, and temporarily clobber it while calling
3608 bfd_print_symbol. FIXME: This is a gross hack. */
af03af8f 3609 alloc = bfd_demangle (cur_bfd, name, demangle_flags);
ed180cc5
AM
3610 if (alloc != NULL)
3611 (*current)->name = alloc;
252b5132
RH
3612 bfd_print_symbol (cur_bfd, stdout, *current,
3613 bfd_print_symbol_all);
ed180cc5
AM
3614 if (alloc != NULL)
3615 {
3616 (*current)->name = name;
3617 free (alloc);
3618 }
252b5132 3619 }
252b5132 3620 else
155e0d23
NC
3621 bfd_print_symbol (cur_bfd, stdout, *current,
3622 bfd_print_symbol_all);
83ef0798 3623 printf ("\n");
252b5132 3624 }
661f7c35 3625
155e0d23 3626 current++;
252b5132 3627 }
155e0d23 3628 printf ("\n\n");
252b5132 3629}
155e0d23 3630\f
252b5132 3631static void
46dca2e0 3632dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
252b5132
RH
3633{
3634 arelent **p;
3635 char *last_filename, *last_functionname;
3636 unsigned int last_line;
9b8d1a36 3637 unsigned int last_discriminator;
252b5132
RH
3638
3639 /* Get column headers lined up reasonably. */
3640 {
3641 static int width;
98a91d6a 3642
252b5132
RH
3643 if (width == 0)
3644 {
3645 char buf[30];
155e0d23 3646
d8180c76 3647 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
252b5132
RH
3648 width = strlen (buf) - 7;
3649 }
3650 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
3651 }
3652
3653 last_filename = NULL;
3654 last_functionname = NULL;
3655 last_line = 0;
9b8d1a36 3656 last_discriminator = 0;
252b5132 3657
d3ba0551 3658 for (p = relpp; relcount && *p != NULL; p++, relcount--)
252b5132
RH
3659 {
3660 arelent *q = *p;
3661 const char *filename, *functionname;
91d6fa6a 3662 unsigned int linenumber;
9b8d1a36 3663 unsigned int discriminator;
252b5132
RH
3664 const char *sym_name;
3665 const char *section_name;
bf03e632 3666 bfd_vma addend2 = 0;
252b5132
RH
3667
3668 if (start_address != (bfd_vma) -1
3669 && q->address < start_address)
3670 continue;
3671 if (stop_address != (bfd_vma) -1
3672 && q->address > stop_address)
3673 continue;
3674
3675 if (with_line_numbers
3676 && sec != NULL
9b8d1a36
CC
3677 && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
3678 &filename, &functionname,
3679 &linenumber, &discriminator))
252b5132
RH
3680 {
3681 if (functionname != NULL
3682 && (last_functionname == NULL
3683 || strcmp (functionname, last_functionname) != 0))
3684 {
12add40e 3685 printf ("%s():\n", sanitize_string (functionname));
252b5132
RH
3686 if (last_functionname != NULL)
3687 free (last_functionname);
3688 last_functionname = xstrdup (functionname);
3689 }
98a91d6a 3690
91d6fa6a
NC
3691 if (linenumber > 0
3692 && (linenumber != last_line
252b5132
RH
3693 || (filename != NULL
3694 && last_filename != NULL
9b8d1a36
CC
3695 && filename_cmp (filename, last_filename) != 0)
3696 || (discriminator != last_discriminator)))
252b5132 3697 {
9b8d1a36 3698 if (discriminator > 0)
12add40e
NC
3699 printf ("%s:%u\n", filename == NULL ? "???" :
3700 sanitize_string (filename), linenumber);
9b8d1a36 3701 else
12add40e
NC
3702 printf ("%s:%u (discriminator %u)\n",
3703 filename == NULL ? "???" : sanitize_string (filename),
9b8d1a36 3704 linenumber, discriminator);
91d6fa6a 3705 last_line = linenumber;
9b8d1a36 3706 last_discriminator = discriminator;
252b5132
RH
3707 if (last_filename != NULL)
3708 free (last_filename);
3709 if (filename == NULL)
3710 last_filename = NULL;
3711 else
3712 last_filename = xstrdup (filename);
3713 }
3714 }
3715
3716 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
3717 {
3718 sym_name = (*(q->sym_ptr_ptr))->name;
3719 section_name = (*(q->sym_ptr_ptr))->section->name;
3720 }
3721 else
3722 {
3723 sym_name = NULL;
3724 section_name = NULL;
3725 }
98a91d6a 3726
f9ecb0a4
JJ
3727 bfd_printf_vma (abfd, q->address);
3728 if (q->howto == NULL)
3729 printf (" *unknown* ");
3730 else if (q->howto->name)
bf03e632
DM
3731 {
3732 const char *name = q->howto->name;
3733
3734 /* R_SPARC_OLO10 relocations contain two addends.
3735 But because 'arelent' lacks enough storage to
3736 store them both, the 64-bit ELF Sparc backend
3737 records this as two relocations. One R_SPARC_LO10
3738 and one R_SPARC_13, both pointing to the same
3739 address. This is merely so that we have some
3740 place to store both addend fields.
3741
3742 Undo this transformation, otherwise the output
3743 will be confusing. */
3744 if (abfd->xvec->flavour == bfd_target_elf_flavour
3745 && elf_tdata(abfd)->elf_header->e_machine == EM_SPARCV9
3746 && relcount > 1
3747 && !strcmp (q->howto->name, "R_SPARC_LO10"))
3748 {
3749 arelent *q2 = *(p + 1);
3750 if (q2 != NULL
3751 && q2->howto
3752 && q->address == q2->address
3753 && !strcmp (q2->howto->name, "R_SPARC_13"))
3754 {
3755 name = "R_SPARC_OLO10";
3756 addend2 = q2->addend;
3757 p++;
3758 }
3759 }
3760 printf (" %-16s ", name);
3761 }
f9ecb0a4
JJ
3762 else
3763 printf (" %-16d ", q->howto->type);
171191ba 3764
252b5132 3765 if (sym_name)
171191ba
NC
3766 {
3767 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
171191ba 3768 }
252b5132
RH
3769 else
3770 {
d3ba0551 3771 if (section_name == NULL)
252b5132 3772 section_name = "*unknown*";
12add40e 3773 printf ("[%s]", sanitize_string (section_name));
252b5132 3774 }
98a91d6a 3775
252b5132
RH
3776 if (q->addend)
3777 {
343dbc36
L
3778 bfd_signed_vma addend = q->addend;
3779 if (addend < 0)
3780 {
3781 printf ("-0x");
3782 addend = -addend;
3783 }
3784 else
3785 printf ("+0x");
3786 bfd_printf_vma (abfd, addend);
252b5132 3787 }
bf03e632
DM
3788 if (addend2)
3789 {
3790 printf ("+0x");
3791 bfd_printf_vma (abfd, addend2);
3792 }
98a91d6a 3793
252b5132
RH
3794 printf ("\n");
3795 }
4b41844b
NC
3796
3797 if (last_filename != NULL)
3798 free (last_filename);
3799 if (last_functionname != NULL)
3800 free (last_functionname);
252b5132 3801}
43ac9881 3802
155e0d23 3803static void
3b9ad1cc
AM
3804dump_relocs_in_section (bfd *abfd,
3805 asection *section,
3806 void *dummy ATTRIBUTE_UNUSED)
155e0d23 3807{
e8fba7f6 3808 arelent **relpp = NULL;
155e0d23
NC
3809 long relcount;
3810 long relsize;
3811
3812 if ( bfd_is_abs_section (section)
3813 || bfd_is_und_section (section)
3814 || bfd_is_com_section (section)
3815 || (! process_section_p (section))
3816 || ((section->flags & SEC_RELOC) == 0))
3817 return;
3818
12add40e 3819 printf ("RELOCATION RECORDS FOR [%s]:", sanitize_string (section->name));
155e0d23 3820
7a6e0d89 3821 relsize = bfd_get_reloc_upper_bound (abfd, section);
155e0d23
NC
3822 if (relsize == 0)
3823 {
3824 printf (" (none)\n\n");
3825 return;
3826 }
3827
7a6e0d89
AM
3828 if (relsize < 0)
3829 relcount = relsize;
3830 else
3831 {
3832 relpp = (arelent **) xmalloc (relsize);
3833 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
39ff1b79
NC
3834 }
3835
155e0d23 3836 if (relcount < 0)
5a3f568b
NC
3837 {
3838 printf ("\n");
7a6e0d89
AM
3839 non_fatal (_("failed to read relocs in: %s"),
3840 sanitize_string (bfd_get_filename (abfd)));
5a3f568b
NC
3841 bfd_fatal (_("error message was"));
3842 }
155e0d23
NC
3843 else if (relcount == 0)
3844 printf (" (none)\n\n");
3845 else
3846 {
3847 printf ("\n");
3848 dump_reloc_set (abfd, section, relpp, relcount);
3849 printf ("\n\n");
3850 }
3851 free (relpp);
3852}
3853
3854static void
3855dump_relocs (bfd *abfd)
3856{
3857 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
3858}
3859
3860static void
3861dump_dynamic_relocs (bfd *abfd)
3862{
3863 long relsize;
3864 arelent **relpp;
3865 long relcount;
3866
3867 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3868 if (relsize < 0)
3869 bfd_fatal (bfd_get_filename (abfd));
3870
3871 printf ("DYNAMIC RELOCATION RECORDS");
3872
3873 if (relsize == 0)
3874 printf (" (none)\n\n");
3875 else
3876 {
3f5e193b 3877 relpp = (arelent **) xmalloc (relsize);
155e0d23
NC
3878 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
3879
3880 if (relcount < 0)
3881 bfd_fatal (bfd_get_filename (abfd));
3882 else if (relcount == 0)
3883 printf (" (none)\n\n");
3884 else
3885 {
3886 printf ("\n");
3887 dump_reloc_set (abfd, NULL, relpp, relcount);
3888 printf ("\n\n");
3889 }
3890 free (relpp);
3891 }
3892}
3893
43ac9881
AM
3894/* Creates a table of paths, to search for source files. */
3895
3896static void
3897add_include_path (const char *path)
3898{
3899 if (path[0] == 0)
3900 return;
3901 include_path_count++;
3f5e193b
NC
3902 include_paths = (const char **)
3903 xrealloc (include_paths, include_path_count * sizeof (*include_paths));
43ac9881
AM
3904#ifdef HAVE_DOS_BASED_FILE_SYSTEM
3905 if (path[1] == ':' && path[2] == 0)
3906 path = concat (path, ".", (const char *) 0);
3907#endif
3908 include_paths[include_path_count - 1] = path;
3909}
155e0d23
NC
3910
3911static void
3b9ad1cc
AM
3912adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
3913 asection *section,
bc79cded 3914 void *arg)
155e0d23 3915{
bc79cded
L
3916 if ((section->flags & SEC_DEBUGGING) == 0)
3917 {
3918 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
3919 section->vma += adjust_section_vma;
3920 if (*has_reloc_p)
3921 section->lma += adjust_section_vma;
3922 }
155e0d23
NC
3923}
3924
2379f9c4
FS
3925/* Return the sign-extended form of an ARCH_SIZE sized VMA. */
3926
3927static bfd_vma
3928sign_extend_address (bfd *abfd ATTRIBUTE_UNUSED,
3929 bfd_vma vma,
3930 unsigned arch_size)
3931{
3932 bfd_vma mask;
3933 mask = (bfd_vma) 1 << (arch_size - 1);
3934 return (((vma & ((mask << 1) - 1)) ^ mask) - mask);
3935}
3936
155e0d23
NC
3937/* Dump selected contents of ABFD. */
3938
3939static void
39f0547e 3940dump_bfd (bfd *abfd, bfd_boolean is_mainfile)
155e0d23 3941{
2379f9c4
FS
3942 const struct elf_backend_data * bed;
3943
39f0547e
NC
3944 if (bfd_big_endian (abfd))
3945 byte_get = byte_get_big_endian;
3946 else if (bfd_little_endian (abfd))
3947 byte_get = byte_get_little_endian;
3948 else
3949 byte_get = NULL;
3950
3951 /* Load any separate debug information files.
3952 We do this now and without checking do_follow_links because separate
3953 debug info files may contain symbol tables that we will need when
3954 displaying information about the main file. Any memory allocated by
3955 load_separate_debug_files will be released when we call
3956 free_debug_memory below.
3957
3958 The test on is_mainfile is there because the chain of separate debug
3959 info files is a global variable shared by all invocations of dump_bfd. */
3960 if (is_mainfile)
3961 {
3962 load_separate_debug_files (abfd, bfd_get_filename (abfd));
3963
3964 /* If asked to do so, recursively dump the separate files. */
3965 if (do_follow_links)
3966 {
3967 separate_info * i;
3968
3969 for (i = first_separate_info; i != NULL; i = i->next)
3970 dump_bfd (i->handle, FALSE);
3971 }
3972 }
3973
2379f9c4
FS
3974 /* Adjust user-specified start and stop limits for targets that use
3975 signed addresses. */
3976 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
3977 && (bed = get_elf_backend_data (abfd)) != NULL
3978 && bed->sign_extend_vma)
3979 {
3980 start_address = sign_extend_address (abfd, start_address,
3981 bed->s->arch_size);
3982 stop_address = sign_extend_address (abfd, stop_address,
3983 bed->s->arch_size);
3984 }
3985
155e0d23
NC
3986 /* If we are adjusting section VMA's, change them all now. Changing
3987 the BFD information is a hack. However, we must do it, or
3988 bfd_find_nearest_line will not do the right thing. */
3989 if (adjust_section_vma != 0)
bc79cded
L
3990 {
3991 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3992 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
3993 }
155e0d23 3994
fd2f0033 3995 if (! dump_debugging_tags && ! suppress_bfd_header)
12add40e
NC
3996 printf (_("\n%s: file format %s\n"),
3997 sanitize_string (bfd_get_filename (abfd)),
155e0d23
NC
3998 abfd->xvec->name);
3999 if (dump_ar_hdrs)
1869e86f 4000 print_arelt_descr (stdout, abfd, TRUE, FALSE);
155e0d23
NC
4001 if (dump_file_header)
4002 dump_bfd_header (abfd);
4003 if (dump_private_headers)
4004 dump_bfd_private_header (abfd);
6abcee90
TG
4005 if (dump_private_options != NULL)
4006 dump_target_specific (abfd);
fd2f0033 4007 if (! dump_debugging_tags && ! suppress_bfd_header)
155e0d23 4008 putchar ('\n');
155e0d23 4009
365544c3
L
4010 if (dump_symtab
4011 || dump_reloc_info
4012 || disassemble
4013 || dump_debugging
4014 || dump_dwarf_section_info)
39f0547e
NC
4015 {
4016 syms = slurp_symtab (abfd);
4017
4018 /* If following links, load any symbol tables from the linked files as well. */
4019 if (do_follow_links && is_mainfile)
4020 {
4021 separate_info * i;
4022
4023 for (i = first_separate_info; i != NULL; i = i->next)
4024 {
4025 asymbol ** extra_syms;
4026 long old_symcount = symcount;
4027
4028 extra_syms = slurp_symtab (i->handle);
4029
4030 if (extra_syms)
4031 {
4032 if (old_symcount == 0)
4033 {
4034 syms = extra_syms;
4035 }
4036 else
4037 {
4038 syms = xrealloc (syms, (symcount + old_symcount) * sizeof (asymbol *));
4039 memcpy (syms + old_symcount,
4040 extra_syms,
4041 symcount * sizeof (asymbol *));
4042 }
4043 }
4044
4045 symcount += old_symcount;
4046 }
4047 }
4048 }
a29a8af8
KT
4049
4050 if (dump_section_headers)
4051 dump_headers (abfd);
4052
4c45e5c9
JJ
4053 if (dump_dynamic_symtab || dump_dynamic_reloc_info
4054 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
155e0d23 4055 dynsyms = slurp_dynamic_symtab (abfd);
39f0547e 4056
90e3cdf2 4057 if (disassemble)
4c45e5c9 4058 {
c9727e01
AM
4059 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
4060 dynsymcount, dynsyms, &synthsyms);
4061 if (synthcount < 0)
4062 synthcount = 0;
4c45e5c9 4063 }
155e0d23
NC
4064
4065 if (dump_symtab)
4066 dump_symbols (abfd, FALSE);
4067 if (dump_dynamic_symtab)
4068 dump_symbols (abfd, TRUE);
365544c3
L
4069 if (dump_dwarf_section_info)
4070 dump_dwarf (abfd);
7d9813f1
NA
4071 if (dump_ctf_section_info)
4072 dump_ctf (abfd, dump_ctf_section_name, dump_ctf_parent_name);
155e0d23
NC
4073 if (dump_stab_section_info)
4074 dump_stabs (abfd);
4075 if (dump_reloc_info && ! disassemble)
4076 dump_relocs (abfd);
4077 if (dump_dynamic_reloc_info && ! disassemble)
4078 dump_dynamic_relocs (abfd);
4079 if (dump_section_contents)
4080 dump_data (abfd);
4081 if (disassemble)
4082 disassemble_data (abfd);
4083
4084 if (dump_debugging)
4085 {
4086 void *dhandle;
4087
b922d590 4088 dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
155e0d23
NC
4089 if (dhandle != NULL)
4090 {
ed180cc5
AM
4091 if (!print_debugging_info (stdout, dhandle, abfd, syms,
4092 bfd_demangle,
4093 dump_debugging_tags ? TRUE : FALSE))
155e0d23
NC
4094 {
4095 non_fatal (_("%s: printing debugging information failed"),
4096 bfd_get_filename (abfd));
4097 exit_status = 1;
4098 }
cf0ad5bb
NC
4099
4100 free (dhandle);
155e0d23 4101 }
fdef3943
AM
4102 /* PR 6483: If there was no STABS debug info in the file, try
4103 DWARF instead. */
b922d590
NC
4104 else if (! dump_dwarf_section_info)
4105 {
3aade688 4106 dwarf_select_sections_all ();
b922d590
NC
4107 dump_dwarf (abfd);
4108 }
155e0d23
NC
4109 }
4110
4111 if (syms)
4112 {
4113 free (syms);
4114 syms = NULL;
4115 }
4116
4117 if (dynsyms)
4118 {
4119 free (dynsyms);
4120 dynsyms = NULL;
4121 }
4c45e5c9
JJ
4122
4123 if (synthsyms)
4124 {
4125 free (synthsyms);
4126 synthsyms = NULL;
4127 }
4128
4129 symcount = 0;
4130 dynsymcount = 0;
4131 synthcount = 0;
39f0547e
NC
4132
4133 if (is_mainfile)
4134 free_debug_memory ();
155e0d23
NC
4135}
4136
4137static void
1598539f 4138display_object_bfd (bfd *abfd)
155e0d23
NC
4139{
4140 char **matching;
4141
4142 if (bfd_check_format_matches (abfd, bfd_object, &matching))
4143 {
39f0547e 4144 dump_bfd (abfd, TRUE);
155e0d23
NC
4145 return;
4146 }
4147
4148 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
4149 {
4150 nonfatal (bfd_get_filename (abfd));
4151 list_matching_formats (matching);
4152 free (matching);
4153 return;
4154 }
4155
4156 if (bfd_get_error () != bfd_error_file_not_recognized)
4157 {
4158 nonfatal (bfd_get_filename (abfd));
4159 return;
4160 }
4161
4162 if (bfd_check_format_matches (abfd, bfd_core, &matching))
4163 {
39f0547e 4164 dump_bfd (abfd, TRUE);
155e0d23
NC
4165 return;
4166 }
4167
4168 nonfatal (bfd_get_filename (abfd));
4169
4170 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
4171 {
4172 list_matching_formats (matching);
4173 free (matching);
4174 }
4175}
4176
4177static void
1598539f 4178display_any_bfd (bfd *file, int level)
155e0d23 4179{
4a114e3e
L
4180 /* Decompress sections unless dumping the section contents. */
4181 if (!dump_section_contents)
4182 file->flags |= BFD_DECOMPRESS;
4183
155e0d23
NC
4184 /* If the file is an archive, process all of its elements. */
4185 if (bfd_check_format (file, bfd_archive))
4186 {
1598539f 4187 bfd *arfile = NULL;
155e0d23 4188 bfd *last_arfile = NULL;
bdc4de1b 4189
1598539f 4190 if (level == 0)
12add40e 4191 printf (_("In archive %s:\n"), sanitize_string (bfd_get_filename (file)));
c88f5b8e
NC
4192 else if (level > 100)
4193 {
4194 /* Prevent corrupted files from spinning us into an
4195 infinite loop. 100 is an arbitrary heuristic. */
64d29018 4196 fatal (_("Archive nesting is too deep"));
c88f5b8e
NC
4197 return;
4198 }
1598539f 4199 else
12add40e
NC
4200 printf (_("In nested archive %s:\n"),
4201 sanitize_string (bfd_get_filename (file)));
1598539f 4202
155e0d23
NC
4203 for (;;)
4204 {
4205 bfd_set_error (bfd_error_no_error);
4206
4207 arfile = bfd_openr_next_archived_file (file, arfile);
4208 if (arfile == NULL)
4209 {
4210 if (bfd_get_error () != bfd_error_no_more_archived_files)
4211 nonfatal (bfd_get_filename (file));
4212 break;
4213 }
4214
1598539f 4215 display_any_bfd (arfile, level + 1);
155e0d23
NC
4216
4217 if (last_arfile != NULL)
f64e188b
NC
4218 {
4219 bfd_close (last_arfile);
4220 /* PR 17512: file: ac585d01. */
4221 if (arfile == last_arfile)
4222 {
4223 last_arfile = NULL;
4224 break;
4225 }
4226 }
155e0d23
NC
4227 last_arfile = arfile;
4228 }
4229
4230 if (last_arfile != NULL)
4231 bfd_close (last_arfile);
4232 }
4233 else
1598539f
TG
4234 display_object_bfd (file);
4235}
4236
4237static void
cd6581da 4238display_file (char *filename, char *target, bfd_boolean last_file)
1598539f
TG
4239{
4240 bfd *file;
4241
4242 if (get_file_size (filename) < 1)
4243 {
4244 exit_status = 1;
4245 return;
4246 }
4247
4248 file = bfd_openr (filename, target);
4249 if (file == NULL)
4250 {
4251 nonfatal (filename);
4252 return;
4253 }
4254
4255 display_any_bfd (file, 0);
155e0d23 4256
cd6581da
NC
4257 /* This is an optimization to improve the speed of objdump, especially when
4258 dumping a file with lots of associated debug informatiom. Calling
4259 bfd_close on such a file can take a non-trivial amount of time as there
4260 are lots of lists to walk and buffers to free. This is only really
4261 necessary however if we are about to load another file and we need the
4262 memory back. Otherwise, if we are about to exit, then we can save (a lot
4263 of) time by only doing a quick close, and allowing the OS to reclaim the
4264 memory for us. */
4265 if (! last_file)
4266 bfd_close (file);
4267 else
4268 bfd_close_all_done (file);
155e0d23 4269}
252b5132 4270\f
252b5132 4271int
46dca2e0 4272main (int argc, char **argv)
252b5132
RH
4273{
4274 int c;
4275 char *target = default_target;
b34976b6 4276 bfd_boolean seenflag = FALSE;
252b5132 4277
155e0d23
NC
4278#if defined (HAVE_SETLOCALE)
4279#if defined (HAVE_LC_MESSAGES)
252b5132 4280 setlocale (LC_MESSAGES, "");
3882b010 4281#endif
3882b010 4282 setlocale (LC_CTYPE, "");
252b5132 4283#endif
155e0d23 4284
252b5132
RH
4285 bindtextdomain (PACKAGE, LOCALEDIR);
4286 textdomain (PACKAGE);
4287
4288 program_name = *argv;
4289 xmalloc_set_program_name (program_name);
86eafac0 4290 bfd_set_error_program_name (program_name);
252b5132
RH
4291
4292 START_PROGRESS (program_name, 0);
4293
869b9d07
MM
4294 expandargv (&argc, &argv);
4295
bf2dd8d7
AM
4296 if (bfd_init () != BFD_INIT_MAGIC)
4297 fatal (_("fatal error: libbfd ABI mismatch"));
252b5132
RH
4298 set_default_bfd_target ();
4299
4cb93e3b 4300 while ((c = getopt_long (argc, argv,
6abcee90 4301 "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
252b5132
RH
4302 long_options, (int *) 0))
4303 != EOF)
4304 {
252b5132
RH
4305 switch (c)
4306 {
4307 case 0:
8b53311e 4308 break; /* We've been given a long option. */
252b5132
RH
4309 case 'm':
4310 machine = optarg;
4311 break;
dd92f639 4312 case 'M':
65b48a81
PB
4313 {
4314 char *options;
4315 if (disassembler_options)
4316 /* Ignore potential memory leak for now. */
4317 options = concat (disassembler_options, ",",
4318 optarg, (const char *) NULL);
4319 else
4320 options = optarg;
4321 disassembler_options = remove_whitespace_and_extra_commas (options);
4322 }
dd92f639 4323 break;
252b5132 4324 case 'j':
70ecb384 4325 add_only (optarg);
252b5132 4326 break;
98ec6e72
NC
4327 case 'F':
4328 display_file_offsets = TRUE;
4329 break;
252b5132 4330 case 'l':
b34976b6 4331 with_line_numbers = TRUE;
252b5132
RH
4332 break;
4333 case 'b':
4334 target = optarg;
4335 break;
1dada9c5 4336 case 'C':
b34976b6 4337 do_demangle = TRUE;
28c309a2
NC
4338 if (optarg != NULL)
4339 {
4340 enum demangling_styles style;
8b53311e 4341
28c309a2 4342 style = cplus_demangle_name_to_style (optarg);
0af11b59 4343 if (style == unknown_demangling)
28c309a2
NC
4344 fatal (_("unknown demangling style `%s'"),
4345 optarg);
8b53311e 4346
28c309a2 4347 cplus_demangle_set_style (style);
0af11b59 4348 }
1dada9c5 4349 break;
af03af8f
NC
4350 case OPTION_RECURSE_LIMIT:
4351 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
4352 break;
4353 case OPTION_NO_RECURSE_LIMIT:
4354 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
4355 break;
1dada9c5 4356 case 'w':
7b5d4822 4357 do_wide = wide_output = TRUE;
1dada9c5
NC
4358 break;
4359 case OPTION_ADJUST_VMA:
4360 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
4361 break;
4362 case OPTION_START_ADDRESS:
4363 start_address = parse_vma (optarg, "--start-address");
98ec6e72
NC
4364 if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
4365 fatal (_("error: the start address should be before the end address"));
1dada9c5
NC
4366 break;
4367 case OPTION_STOP_ADDRESS:
4368 stop_address = parse_vma (optarg, "--stop-address");
98ec6e72
NC
4369 if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
4370 fatal (_("error: the stop address should be after the start address"));
1dada9c5 4371 break;
0dafdf3f
L
4372 case OPTION_PREFIX:
4373 prefix = optarg;
4374 prefix_length = strlen (prefix);
4375 /* Remove an unnecessary trailing '/' */
4376 while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
4377 prefix_length--;
4378 break;
4379 case OPTION_PREFIX_STRIP:
4380 prefix_strip = atoi (optarg);
4381 if (prefix_strip < 0)
4382 fatal (_("error: prefix strip must be non-negative"));
4383 break;
3dcb3fcb
L
4384 case OPTION_INSN_WIDTH:
4385 insn_width = strtoul (optarg, NULL, 0);
4386 if (insn_width <= 0)
4387 fatal (_("error: instruction width must be positive"));
4388 break;
4a14e306
AK
4389 case OPTION_INLINES:
4390 unwind_inlines = TRUE;
4391 break;
1dada9c5
NC
4392 case 'E':
4393 if (strcmp (optarg, "B") == 0)
4394 endian = BFD_ENDIAN_BIG;
4395 else if (strcmp (optarg, "L") == 0)
4396 endian = BFD_ENDIAN_LITTLE;
4397 else
4398 {
a8c62f1c 4399 nonfatal (_("unrecognized -E option"));
1dada9c5
NC
4400 usage (stderr, 1);
4401 }
4402 break;
4403 case OPTION_ENDIAN:
4404 if (strncmp (optarg, "big", strlen (optarg)) == 0)
4405 endian = BFD_ENDIAN_BIG;
4406 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
4407 endian = BFD_ENDIAN_LITTLE;
4408 else
4409 {
37cc8ec1 4410 non_fatal (_("unrecognized --endian type `%s'"), optarg);
a8c62f1c 4411 exit_status = 1;
1dada9c5
NC
4412 usage (stderr, 1);
4413 }
4414 break;
8b53311e 4415
252b5132 4416 case 'f':
b34976b6
AM
4417 dump_file_header = TRUE;
4418 seenflag = TRUE;
252b5132
RH
4419 break;
4420 case 'i':
b34976b6
AM
4421 formats_info = TRUE;
4422 seenflag = TRUE;
252b5132 4423 break;
43ac9881
AM
4424 case 'I':
4425 add_include_path (optarg);
4426 break;
252b5132 4427 case 'p':
b34976b6
AM
4428 dump_private_headers = TRUE;
4429 seenflag = TRUE;
252b5132 4430 break;
6abcee90
TG
4431 case 'P':
4432 dump_private_options = optarg;
4433 seenflag = TRUE;
4434 break;
252b5132 4435 case 'x':
b34976b6
AM
4436 dump_private_headers = TRUE;
4437 dump_symtab = TRUE;
4438 dump_reloc_info = TRUE;
4439 dump_file_header = TRUE;
4440 dump_ar_hdrs = TRUE;
4441 dump_section_headers = TRUE;
4442 seenflag = TRUE;
252b5132
RH
4443 break;
4444 case 't':
b34976b6
AM
4445 dump_symtab = TRUE;
4446 seenflag = TRUE;
252b5132
RH
4447 break;
4448 case 'T':
b34976b6
AM
4449 dump_dynamic_symtab = TRUE;
4450 seenflag = TRUE;
252b5132
RH
4451 break;
4452 case 'd':
b34976b6
AM
4453 disassemble = TRUE;
4454 seenflag = TRUE;
d3def5d7 4455 disasm_sym = optarg;
1dada9c5
NC
4456 break;
4457 case 'z':
b34976b6 4458 disassemble_zeroes = TRUE;
252b5132
RH
4459 break;
4460 case 'D':
b34976b6
AM
4461 disassemble = TRUE;
4462 disassemble_all = TRUE;
4463 seenflag = TRUE;
252b5132
RH
4464 break;
4465 case 'S':
b34976b6
AM
4466 disassemble = TRUE;
4467 with_source_code = TRUE;
4468 seenflag = TRUE;
1dada9c5 4469 break;
a1c110a3
NC
4470 case OPTION_SOURCE_COMMENT:
4471 disassemble = TRUE;
4472 with_source_code = TRUE;
4473 seenflag = TRUE;
4474 if (optarg)
4475 source_comment = xstrdup (sanitize_string (optarg));
4476 else
4477 source_comment = xstrdup ("# ");
4478 break;
1dada9c5
NC
4479 case 'g':
4480 dump_debugging = 1;
b34976b6 4481 seenflag = TRUE;
1dada9c5 4482 break;
51cdc6e0
NC
4483 case 'e':
4484 dump_debugging = 1;
4485 dump_debugging_tags = 1;
4486 do_demangle = TRUE;
4487 seenflag = TRUE;
4488 break;
365544c3
L
4489 case 'W':
4490 dump_dwarf_section_info = TRUE;
4491 seenflag = TRUE;
4cb93e3b
TG
4492 if (optarg)
4493 dwarf_select_sections_by_letters (optarg);
4494 else
4495 dwarf_select_sections_all ();
4496 break;
4497 case OPTION_DWARF:
4498 dump_dwarf_section_info = TRUE;
4499 seenflag = TRUE;
4500 if (optarg)
4501 dwarf_select_sections_by_names (optarg);
4502 else
4503 dwarf_select_sections_all ();
365544c3 4504 break;
fd2f0033
TT
4505 case OPTION_DWARF_DEPTH:
4506 {
4507 char *cp;
4508 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4509 }
4510 break;
4511 case OPTION_DWARF_START:
4512 {
4513 char *cp;
4514 dwarf_start_die = strtoul (optarg, & cp, 0);
4515 suppress_bfd_header = 1;
4516 }
4517 break;
4723351a
CC
4518 case OPTION_DWARF_CHECK:
4519 dwarf_check = TRUE;
4520 break;
d344b407
NA
4521 case OPTION_CTF:
4522 dump_ctf_section_info = TRUE;
4523 dump_ctf_section_name = xstrdup (optarg);
4524 seenflag = TRUE;
4525 break;
7d9813f1
NA
4526 case OPTION_CTF_PARENT:
4527 dump_ctf_parent_name = xstrdup (optarg);
4528 break;
1dada9c5 4529 case 'G':
b34976b6
AM
4530 dump_stab_section_info = TRUE;
4531 seenflag = TRUE;
252b5132
RH
4532 break;
4533 case 's':
b34976b6
AM
4534 dump_section_contents = TRUE;
4535 seenflag = TRUE;
252b5132
RH
4536 break;
4537 case 'r':
b34976b6
AM
4538 dump_reloc_info = TRUE;
4539 seenflag = TRUE;
252b5132
RH
4540 break;
4541 case 'R':
b34976b6
AM
4542 dump_dynamic_reloc_info = TRUE;
4543 seenflag = TRUE;
252b5132
RH
4544 break;
4545 case 'a':
b34976b6
AM
4546 dump_ar_hdrs = TRUE;
4547 seenflag = TRUE;
252b5132
RH
4548 break;
4549 case 'h':
b34976b6
AM
4550 dump_section_headers = TRUE;
4551 seenflag = TRUE;
252b5132 4552 break;
8b53311e 4553 case 'v':
252b5132 4554 case 'V':
b34976b6
AM
4555 show_version = TRUE;
4556 seenflag = TRUE;
252b5132 4557 break;
0af11b59 4558
aebcf7b7
NC
4559 case 'H':
4560 usage (stdout, 0);
4561 /* No need to set seenflag or to break - usage() does not return. */
252b5132
RH
4562 default:
4563 usage (stderr, 1);
4564 }
4565 }
4566
4567 if (show_version)
4568 print_version ("objdump");
4569
b34976b6 4570 if (!seenflag)
1dada9c5 4571 usage (stderr, 2);
252b5132
RH
4572
4573 if (formats_info)
06d86cf7 4574 exit_status = display_info ();
252b5132
RH
4575 else
4576 {
4577 if (optind == argc)
cd6581da 4578 display_file ("a.out", target, TRUE);
252b5132
RH
4579 else
4580 for (; optind < argc;)
cd6581da
NC
4581 {
4582 display_file (argv[optind], target, optind == argc - 1);
4583 optind++;
4584 }
252b5132
RH
4585 }
4586
70ecb384 4587 free_only_list ();
7d9813f1
NA
4588 free (dump_ctf_section_name);
4589 free (dump_ctf_parent_name);
a1c110a3 4590 free ((void *) source_comment);
79b377b3 4591
252b5132
RH
4592 END_PROGRESS (program_name);
4593
75cd796a 4594 return exit_status;
252b5132 4595}