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