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