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