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