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