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