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