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