* core-regset.c (fetch_core_registers): Remove HAVE_GREGSET_T
[deliverable/binutils-gdb.git] / binutils / objdump.c
CommitLineData
252b5132 1/* objdump.c -- dump information about an object file.
8c2bc687
NC
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001
252b5132
RH
4 Free Software Foundation, Inc.
5
6This file is part of GNU Binutils.
7
8This program is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program; if not, write to the Free Software
20Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22#include "bfd.h"
23#include "getopt.h"
24#include "progress.h"
25#include "bucomm.h"
26#include <ctype.h>
27#include "dis-asm.h"
28#include "libiberty.h"
29#include "demangle.h"
30#include "debug.h"
31#include "budbg.h"
32
252b5132
RH
33/* Internal headers for the ELF .stab-dump code - sorry. */
34#define BYTES_IN_WORD 32
35#include "aout/aout64.h"
36
37#ifdef NEED_DECLARATION_FPRINTF
38/* This is needed by INIT_DISASSEMBLE_INFO. */
39extern int fprintf PARAMS ((FILE *, const char *, ...));
40#endif
41
75cd796a
ILT
42/* Exit status. */
43static int exit_status = 0;
44
252b5132
RH
45static char *default_target = NULL; /* default at runtime */
46
47static int show_version = 0; /* show the version number */
48static int dump_section_contents; /* -s */
49static int dump_section_headers; /* -h */
50static boolean dump_file_header; /* -f */
51static int dump_symtab; /* -t */
52static int dump_dynamic_symtab; /* -T */
53static int dump_reloc_info; /* -r */
54static int dump_dynamic_reloc_info; /* -R */
55static int dump_ar_hdrs; /* -a */
56static int dump_private_headers; /* -p */
57static int prefix_addresses; /* --prefix-addresses */
58static int with_line_numbers; /* -l */
59static boolean with_source_code; /* -S */
60static int show_raw_insn; /* --show-raw-insn */
61static int dump_stab_section_info; /* --stabs */
62static int do_demangle; /* -C, --demangle */
63static boolean disassemble; /* -d */
64static boolean disassemble_all; /* -D */
65static int disassemble_zeroes; /* --disassemble-zeroes */
66static boolean formats_info; /* -i */
67static char *only; /* -j secname */
68static int wide_output; /* -w */
69static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
70static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
71static int dump_debugging; /* --debugging */
72static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
f1563258 73static int file_start_context = 0; /* --file-start-context */
252b5132
RH
74
75/* Extra info to pass to the disassembler address printing function. */
76struct objdump_disasm_info {
77 bfd *abfd;
78 asection *sec;
79 boolean require_sec;
80};
81
82/* Architecture to disassemble for, or default if NULL. */
83static char *machine = (char *) NULL;
84
dd92f639
NC
85/* Target specific options to the disassembler. */
86static char *disassembler_options = (char *) NULL;
87
252b5132
RH
88/* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
89static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
90
91/* The symbol table. */
92static asymbol **syms;
93
94/* Number of symbols in `syms'. */
95static long symcount = 0;
96
97/* The sorted symbol table. */
98static asymbol **sorted_syms;
99
100/* Number of symbols in `sorted_syms'. */
101static long sorted_symcount = 0;
102
103/* The dynamic symbol table. */
104static asymbol **dynsyms;
105
106/* Number of symbols in `dynsyms'. */
107static long dynsymcount = 0;
108
109/* Static declarations. */
110
111static void
112usage PARAMS ((FILE *, int));
113
75cd796a
ILT
114static void
115nonfatal PARAMS ((const char *));
116
252b5132
RH
117static void
118display_file PARAMS ((char *filename, char *target));
119
120static void
121dump_section_header PARAMS ((bfd *, asection *, PTR));
122
123static void
124dump_headers PARAMS ((bfd *));
125
126static void
127dump_data PARAMS ((bfd *abfd));
128
129static void
130dump_relocs PARAMS ((bfd *abfd));
131
132static void
133dump_dynamic_relocs PARAMS ((bfd * abfd));
134
135static void
136dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
137
138static void
139dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
140
141static void
142dump_bfd_header PARAMS ((bfd *));
143
144static void
145dump_bfd_private_header PARAMS ((bfd *));
146
147static void
148display_bfd PARAMS ((bfd *abfd));
149
150static void
151display_target_list PARAMS ((void));
152
153static void
154display_info_table PARAMS ((int, int));
155
156static void
157display_target_tables PARAMS ((void));
158
159static void
160display_info PARAMS ((void));
161
162static void
163objdump_print_value PARAMS ((bfd_vma, struct disassemble_info *, boolean));
164
165static void
166objdump_print_symname PARAMS ((bfd *, struct disassemble_info *, asymbol *));
167
168static asymbol *
169find_symbol_for_address PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
170
171static void
172objdump_print_addr_with_sym PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
173 struct disassemble_info *, boolean));
174
175static void
176objdump_print_addr PARAMS ((bfd_vma, struct disassemble_info *, boolean));
177
178static void
179objdump_print_address PARAMS ((bfd_vma, struct disassemble_info *));
180
181static void
182show_line PARAMS ((bfd *, asection *, bfd_vma));
183
184static void
185disassemble_bytes PARAMS ((struct disassemble_info *, disassembler_ftype,
186 boolean, bfd_byte *, bfd_vma, bfd_vma,
187 arelent ***, arelent **));
188
189static void
190disassemble_data PARAMS ((bfd *));
191
192static const char *
193endian_string PARAMS ((enum bfd_endian));
194
195static asymbol **
196slurp_symtab PARAMS ((bfd *));
197
198static asymbol **
199slurp_dynamic_symtab PARAMS ((bfd *));
200
201static long
202remove_useless_symbols PARAMS ((asymbol **, long));
203
204static int
205compare_symbols PARAMS ((const PTR, const PTR));
206
207static int
208compare_relocs PARAMS ((const PTR, const PTR));
209
210static void
211dump_stabs PARAMS ((bfd *));
212
213static boolean
214read_section_stabs PARAMS ((bfd *, const char *, const char *));
215
216static void
217print_section_stabs PARAMS ((bfd *, const char *, const char *));
218\f
219static void
220usage (stream, status)
221 FILE *stream;
222 int status;
223{
86d65c94
MK
224 fprintf (stream, _("Usage: %s OPTION... FILE...\n"), program_name);
225 fprintf (stream, _("Display information from object FILE.\n"));
226 fprintf (stream, _("\n At least one of the following switches must be given:\n"));
252b5132 227 fprintf (stream, _("\
86d65c94
MK
228 -a, --archive-headers Display archive header information\n\
229 -f, --file-headers Display the contents of the overall file header\n\
230 -p, --private-headers Display object format specific file header contents\n\
231 -h, --[section-]headers Display the contents of the section headers\n\
232 -x, --all-headers Display the contents of all headers\n\
233 -d, --disassemble Display assembler contents of executable sections\n\
234 -D, --disassemble-all Display assembler contents of all sections\n\
235 -S, --source Intermix source code with disassembly\n\
236 -s, --full-contents Display the full contents of all sections requested\n\
237 -g, --debugging Display debug information in object file\n\
238 -G, --stabs Display (in raw form) any STABS info in the file\n\
239 -t, --syms Display the contents of the symbol table(s)\n\
240 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
241 -r, --reloc Display the relocation entries in the file\n\
242 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
243 -V, --version Display this program's version number\n\
244 -i, --info List object formats and architectures supported\n\
245 -H, --help Display this information\n\
1dada9c5
NC
246"));
247 if (status != 2)
248 {
249 fprintf (stream, _("\n The following switches are optional:\n"));
250 fprintf (stream, _("\
86d65c94
MK
251 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
252 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
253 -j, --section=NAME Only display information for section NAME\n\
254 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
1dada9c5
NC
255 -EB --endian=big Assume big endian format when disassembling\n\
256 -EL --endian=little Assume little endian format when disassembling\n\
f1563258 257 --file-start-context Include context from start of file (with -S)\n\
86d65c94 258 -l, --line-numbers Include line numbers and filenames in output\n\
28c309a2
NC
259 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
260 The STYLE, if specified, can be `auto', 'gnu',\n\
261 'lucid', 'arm', 'hp', 'edg', or 'gnu-new-abi'\n\
86d65c94
MK
262 -w, --wide Format output for more than 80 columns\n\
263 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
264 --start-address=ADDR Only process data whoes address is >= ADDR\n\
265 --stop-address=ADDR Only process data whoes address is <= ADDR\n\
1dada9c5
NC
266 --prefix-addresses Print complete address alongside disassembly\n\
267 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
86d65c94 268 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
1dada9c5
NC
269\n"));
270 list_supported_targets (program_name, stream);
2f83960e 271 list_supported_architectures (program_name, stream);
86d65c94 272
94470b23 273 disassembler_usage (stream);
1dada9c5 274 }
252b5132 275 if (status == 0)
86d65c94 276 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
252b5132
RH
277 exit (status);
278}
279
280/* 150 isn't special; it's just an arbitrary non-ASCII char value. */
281
282#define OPTION_ENDIAN (150)
283#define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
284#define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
285#define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
286
287static struct option long_options[]=
288{
289 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
290 {"all-headers", no_argument, NULL, 'x'},
291 {"private-headers", no_argument, NULL, 'p'},
292 {"architecture", required_argument, NULL, 'm'},
293 {"archive-headers", no_argument, NULL, 'a'},
1dada9c5 294 {"debugging", no_argument, NULL, 'g'},
28c309a2 295 {"demangle", optional_argument, NULL, 'C'},
252b5132
RH
296 {"disassemble", no_argument, NULL, 'd'},
297 {"disassemble-all", no_argument, NULL, 'D'},
dd92f639 298 {"disassembler-options", required_argument, NULL, 'M'},
1dada9c5 299 {"disassemble-zeroes", no_argument, NULL, 'z'},
252b5132
RH
300 {"dynamic-reloc", no_argument, NULL, 'R'},
301 {"dynamic-syms", no_argument, NULL, 'T'},
302 {"endian", required_argument, NULL, OPTION_ENDIAN},
303 {"file-headers", no_argument, NULL, 'f'},
f1563258 304 {"file-start-context", no_argument, &file_start_context, 1},
252b5132
RH
305 {"full-contents", no_argument, NULL, 's'},
306 {"headers", no_argument, NULL, 'h'},
307 {"help", no_argument, NULL, 'H'},
308 {"info", no_argument, NULL, 'i'},
309 {"line-numbers", no_argument, NULL, 'l'},
310 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
311 {"prefix-addresses", no_argument, &prefix_addresses, 1},
312 {"reloc", no_argument, NULL, 'r'},
313 {"section", required_argument, NULL, 'j'},
314 {"section-headers", no_argument, NULL, 'h'},
315 {"show-raw-insn", no_argument, &show_raw_insn, 1},
316 {"source", no_argument, NULL, 'S'},
1dada9c5 317 {"stabs", no_argument, NULL, 'G'},
252b5132
RH
318 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
319 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
320 {"syms", no_argument, NULL, 't'},
321 {"target", required_argument, NULL, 'b'},
1dada9c5
NC
322 {"version", no_argument, NULL, 'V'},
323 {"wide", no_argument, NULL, 'w'},
252b5132
RH
324 {0, no_argument, 0, 0}
325};
326\f
327static void
75cd796a
ILT
328nonfatal (msg)
329 const char *msg;
330{
331 bfd_nonfatal (msg);
332 exit_status = 1;
333}
334\f
335static void
252b5132 336dump_section_header (abfd, section, ignored)
b4c96d0d 337 bfd *abfd ATTRIBUTE_UNUSED;
252b5132 338 asection *section;
b4c96d0d 339 PTR ignored ATTRIBUTE_UNUSED;
252b5132
RH
340{
341 char *comma = "";
f6af82bd 342 unsigned int opb = bfd_octets_per_byte (abfd);
252b5132
RH
343
344 printf ("%3d %-13s %08lx ", section->index,
345 bfd_get_section_name (abfd, section),
940b2b78 346 (unsigned long) bfd_section_size (abfd, section) / opb);
252b5132
RH
347 printf_vma (bfd_get_section_vma (abfd, section));
348 printf (" ");
349 printf_vma (section->lma);
350 printf (" %08lx 2**%u", section->filepos,
351 bfd_get_section_alignment (abfd, section));
352 if (! wide_output)
353 printf ("\n ");
354 printf (" ");
355
356#define PF(x, y) \
357 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
358
359 PF (SEC_HAS_CONTENTS, "CONTENTS");
360 PF (SEC_ALLOC, "ALLOC");
361 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
362 PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT");
363 PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA");
364 PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS");
365 PF (SEC_LOAD, "LOAD");
366 PF (SEC_RELOC, "RELOC");
367#ifdef SEC_BALIGN
368 PF (SEC_BALIGN, "BALIGN");
369#endif
370 PF (SEC_READONLY, "READONLY");
371 PF (SEC_CODE, "CODE");
372 PF (SEC_DATA, "DATA");
373 PF (SEC_ROM, "ROM");
374 PF (SEC_DEBUGGING, "DEBUGGING");
375 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
376 PF (SEC_EXCLUDE, "EXCLUDE");
377 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
34cbe64e
TW
378 PF (SEC_BLOCK, "BLOCK");
379 PF (SEC_CLINK, "CLINK");
24c411ed
ILT
380 PF (SEC_SMALL_DATA, "SMALL_DATA");
381 PF (SEC_SHARED, "SHARED");
252b5132
RH
382
383 if ((section->flags & SEC_LINK_ONCE) != 0)
384 {
385 const char *ls;
386
387 switch (section->flags & SEC_LINK_DUPLICATES)
388 {
389 default:
390 abort ();
391 case SEC_LINK_DUPLICATES_DISCARD:
392 ls = "LINK_ONCE_DISCARD";
393 break;
394 case SEC_LINK_DUPLICATES_ONE_ONLY:
395 ls = "LINK_ONCE_ONE_ONLY";
396 break;
397 case SEC_LINK_DUPLICATES_SAME_SIZE:
398 ls = "LINK_ONCE_SAME_SIZE";
399 break;
400 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
401 ls = "LINK_ONCE_SAME_CONTENTS";
402 break;
403 }
404 printf ("%s%s", comma, ls);
deecf979
ILT
405
406 if (section->comdat != NULL)
407 printf (" (COMDAT %s %ld)", section->comdat->name,
408 section->comdat->symbol);
409
252b5132
RH
410 comma = ", ";
411 }
412
413 printf ("\n");
414#undef PF
415}
416
417static void
418dump_headers (abfd)
419 bfd *abfd;
420{
421 printf (_("Sections:\n"));
8bea4d5c 422
252b5132 423#ifndef BFD64
8bea4d5c 424 printf (_("Idx Name Size VMA LMA File off Algn"));
252b5132 425#else
8bea4d5c 426 printf (_("Idx Name Size VMA LMA File off Algn"));
252b5132 427#endif
8bea4d5c
ILT
428
429 if (wide_output)
430 printf (_(" Flags"));
431 printf ("\n");
432
252b5132
RH
433 bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
434}
435\f
436static asymbol **
437slurp_symtab (abfd)
438 bfd *abfd;
439{
440 asymbol **sy = (asymbol **) NULL;
441 long storage;
442
443 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
444 {
37cc8ec1 445 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
252b5132
RH
446 symcount = 0;
447 return NULL;
448 }
449
450 storage = bfd_get_symtab_upper_bound (abfd);
451 if (storage < 0)
452 bfd_fatal (bfd_get_filename (abfd));
453
454 if (storage)
455 {
456 sy = (asymbol **) xmalloc (storage);
457 }
458 symcount = bfd_canonicalize_symtab (abfd, sy);
459 if (symcount < 0)
460 bfd_fatal (bfd_get_filename (abfd));
461 if (symcount == 0)
37cc8ec1 462 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
252b5132
RH
463 return sy;
464}
465
466/* Read in the dynamic symbols. */
467
468static asymbol **
469slurp_dynamic_symtab (abfd)
470 bfd *abfd;
471{
472 asymbol **sy = (asymbol **) NULL;
473 long storage;
474
475 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
476 if (storage < 0)
477 {
478 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
479 {
37cc8ec1 480 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
252b5132
RH
481 dynsymcount = 0;
482 return NULL;
483 }
484
485 bfd_fatal (bfd_get_filename (abfd));
486 }
487
488 if (storage)
489 {
490 sy = (asymbol **) xmalloc (storage);
491 }
492 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
493 if (dynsymcount < 0)
494 bfd_fatal (bfd_get_filename (abfd));
495 if (dynsymcount == 0)
37cc8ec1 496 non_fatal (_("%s: No dynamic symbols"), bfd_get_filename (abfd));
252b5132
RH
497 return sy;
498}
499
500/* Filter out (in place) symbols that are useless for disassembly.
501 COUNT is the number of elements in SYMBOLS.
502 Return the number of useful symbols. */
503
504static long
505remove_useless_symbols (symbols, count)
506 asymbol **symbols;
507 long count;
508{
509 register asymbol **in_ptr = symbols, **out_ptr = symbols;
510
511 while (--count >= 0)
512 {
513 asymbol *sym = *in_ptr++;
514
515 if (sym->name == NULL || sym->name[0] == '\0')
516 continue;
517 if (sym->flags & (BSF_DEBUGGING))
518 continue;
519 if (bfd_is_und_section (sym->section)
520 || bfd_is_com_section (sym->section))
521 continue;
522
523 *out_ptr++ = sym;
524 }
525 return out_ptr - symbols;
526}
527
528/* Sort symbols into value order. */
529
530static int
531compare_symbols (ap, bp)
532 const PTR ap;
533 const PTR bp;
534{
535 const asymbol *a = *(const asymbol **)ap;
536 const asymbol *b = *(const asymbol **)bp;
537 const char *an, *bn;
538 size_t anl, bnl;
539 boolean af, bf;
540 flagword aflags, bflags;
541
542 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
543 return 1;
544 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
545 return -1;
546
547 if (a->section > b->section)
548 return 1;
549 else if (a->section < b->section)
550 return -1;
551
552 an = bfd_asymbol_name (a);
553 bn = bfd_asymbol_name (b);
554 anl = strlen (an);
555 bnl = strlen (bn);
556
557 /* The symbols gnu_compiled and gcc2_compiled convey no real
558 information, so put them after other symbols with the same value. */
559
560 af = (strstr (an, "gnu_compiled") != NULL
561 || strstr (an, "gcc2_compiled") != NULL);
562 bf = (strstr (bn, "gnu_compiled") != NULL
563 || strstr (bn, "gcc2_compiled") != NULL);
564
565 if (af && ! bf)
566 return 1;
567 if (! af && bf)
568 return -1;
569
570 /* We use a heuristic for the file name, to try to sort it after
571 more useful symbols. It may not work on non Unix systems, but it
572 doesn't really matter; the only difference is precisely which
573 symbol names get printed. */
574
575#define file_symbol(s, sn, snl) \
576 (((s)->flags & BSF_FILE) != 0 \
577 || ((sn)[(snl) - 2] == '.' \
578 && ((sn)[(snl) - 1] == 'o' \
579 || (sn)[(snl) - 1] == 'a')))
580
581 af = file_symbol (a, an, anl);
582 bf = file_symbol (b, bn, bnl);
583
584 if (af && ! bf)
585 return 1;
586 if (! af && bf)
587 return -1;
588
589 /* Try to sort global symbols before local symbols before function
590 symbols before debugging symbols. */
591
592 aflags = a->flags;
593 bflags = b->flags;
594
595 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
596 {
597 if ((aflags & BSF_DEBUGGING) != 0)
598 return 1;
599 else
600 return -1;
601 }
602 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
603 {
604 if ((aflags & BSF_FUNCTION) != 0)
605 return -1;
606 else
607 return 1;
608 }
609 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
610 {
611 if ((aflags & BSF_LOCAL) != 0)
612 return 1;
613 else
614 return -1;
615 }
616 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
617 {
618 if ((aflags & BSF_GLOBAL) != 0)
619 return -1;
620 else
621 return 1;
622 }
623
624 /* Symbols that start with '.' might be section names, so sort them
625 after symbols that don't start with '.'. */
626 if (an[0] == '.' && bn[0] != '.')
627 return 1;
628 if (an[0] != '.' && bn[0] == '.')
629 return -1;
630
631 /* Finally, if we can't distinguish them in any other way, try to
632 get consistent results by sorting the symbols by name. */
633 return strcmp (an, bn);
634}
635
636/* Sort relocs into address order. */
637
638static int
639compare_relocs (ap, bp)
640 const PTR ap;
641 const PTR bp;
642{
643 const arelent *a = *(const arelent **)ap;
644 const arelent *b = *(const arelent **)bp;
645
646 if (a->address > b->address)
647 return 1;
648 else if (a->address < b->address)
649 return -1;
650
651 /* So that associated relocations tied to the same address show up
652 in the correct order, we don't do any further sorting. */
653 if (a > b)
654 return 1;
655 else if (a < b)
656 return -1;
657 else
658 return 0;
659}
660
661/* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
662
663static void
664objdump_print_value (vma, info, skip_zeroes)
665 bfd_vma vma;
666 struct disassemble_info *info;
667 boolean skip_zeroes;
668{
669 char buf[30];
670 char *p;
671
672 sprintf_vma (buf, vma);
673 if (! skip_zeroes)
674 p = buf;
675 else
676 {
677 for (p = buf; *p == '0'; ++p)
678 ;
679 if (*p == '\0')
680 --p;
681 }
682 (*info->fprintf_func) (info->stream, "%s", p);
683}
684
685/* Print the name of a symbol. */
686
687static void
688objdump_print_symname (abfd, info, sym)
689 bfd *abfd;
690 struct disassemble_info *info;
691 asymbol *sym;
692{
693 char *alloc;
694 const char *name;
695 const char *print;
696
697 alloc = NULL;
698 name = bfd_asymbol_name (sym);
699 if (! do_demangle || name[0] == '\0')
700 print = name;
701 else
702 {
703 /* Demangle the name. */
704 if (bfd_get_symbol_leading_char (abfd) == name[0])
705 ++name;
706
707 alloc = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
708 if (alloc == NULL)
709 print = name;
710 else
711 print = alloc;
712 }
713
714 if (info != NULL)
715 (*info->fprintf_func) (info->stream, "%s", print);
716 else
717 printf ("%s", print);
718
719 if (alloc != NULL)
720 free (alloc);
721}
722
723/* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
724 is true, then always require the symbol to be in the section. This
725 returns NULL if there is no suitable symbol. If PLACE is not NULL,
726 then *PLACE is set to the index of the symbol in sorted_syms. */
727
728static asymbol *
729find_symbol_for_address (abfd, sec, vma, require_sec, place)
730 bfd *abfd;
731 asection *sec;
732 bfd_vma vma;
733 boolean require_sec;
734 long *place;
735{
736 /* @@ Would it speed things up to cache the last two symbols returned,
737 and maybe their address ranges? For many processors, only one memory
738 operand can be present at a time, so the 2-entry cache wouldn't be
739 constantly churned by code doing heavy memory accesses. */
740
741 /* Indices in `sorted_syms'. */
742 long min = 0;
743 long max = sorted_symcount;
744 long thisplace;
f6af82bd 745 unsigned int opb = bfd_octets_per_byte (abfd);
252b5132
RH
746
747 if (sorted_symcount < 1)
748 return NULL;
749
750 /* Perform a binary search looking for the closest symbol to the
751 required value. We are searching the range (min, max]. */
752 while (min + 1 < max)
753 {
754 asymbol *sym;
755
756 thisplace = (max + min) / 2;
757 sym = sorted_syms[thisplace];
758
759 if (bfd_asymbol_value (sym) > vma)
760 max = thisplace;
761 else if (bfd_asymbol_value (sym) < vma)
762 min = thisplace;
763 else
764 {
765 min = thisplace;
766 break;
767 }
768 }
769
770 /* The symbol we want is now in min, the low end of the range we
771 were searching. If there are several symbols with the same
772 value, we want the first one. */
773 thisplace = min;
774 while (thisplace > 0
775 && (bfd_asymbol_value (sorted_syms[thisplace])
776 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
777 --thisplace;
778
779 /* If the file is relocateable, and the symbol could be from this
780 section, prefer a symbol from this section over symbols from
781 others, even if the other symbol's value might be closer.
782
783 Note that this may be wrong for some symbol references if the
784 sections have overlapping memory ranges, but in that case there's
785 no way to tell what's desired without looking at the relocation
786 table. */
787
788 if (sorted_syms[thisplace]->section != sec
789 && (require_sec
790 || ((abfd->flags & HAS_RELOC) != 0
791 && vma >= bfd_get_section_vma (abfd, sec)
792 && vma < (bfd_get_section_vma (abfd, sec)
940b2b78 793 + bfd_section_size (abfd, sec) / opb))))
252b5132
RH
794 {
795 long i;
796
797 for (i = thisplace + 1; i < sorted_symcount; i++)
798 {
799 if (bfd_asymbol_value (sorted_syms[i])
800 != bfd_asymbol_value (sorted_syms[thisplace]))
801 break;
802 }
803 --i;
804 for (; i >= 0; i--)
805 {
806 if (sorted_syms[i]->section == sec
807 && (i == 0
808 || sorted_syms[i - 1]->section != sec
809 || (bfd_asymbol_value (sorted_syms[i])
810 != bfd_asymbol_value (sorted_syms[i - 1]))))
811 {
812 thisplace = i;
813 break;
814 }
815 }
816
817 if (sorted_syms[thisplace]->section != sec)
818 {
819 /* We didn't find a good symbol with a smaller value.
820 Look for one with a larger value. */
821 for (i = thisplace + 1; i < sorted_symcount; i++)
822 {
823 if (sorted_syms[i]->section == sec)
824 {
825 thisplace = i;
826 break;
827 }
828 }
829 }
830
831 if (sorted_syms[thisplace]->section != sec
832 && (require_sec
833 || ((abfd->flags & HAS_RELOC) != 0
834 && vma >= bfd_get_section_vma (abfd, sec)
835 && vma < (bfd_get_section_vma (abfd, sec)
836 + bfd_section_size (abfd, sec)))))
837 {
838 /* There is no suitable symbol. */
839 return NULL;
840 }
841 }
842
843 if (place != NULL)
844 *place = thisplace;
845
846 return sorted_syms[thisplace];
847}
848
849/* Print an address to INFO symbolically. */
850
851static void
852objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
853 bfd *abfd;
854 asection *sec;
855 asymbol *sym;
856 bfd_vma vma;
857 struct disassemble_info *info;
858 boolean skip_zeroes;
859{
860 objdump_print_value (vma, info, skip_zeroes);
861
862 if (sym == NULL)
863 {
864 bfd_vma secaddr;
865
866 (*info->fprintf_func) (info->stream, " <%s",
867 bfd_get_section_name (abfd, sec));
868 secaddr = bfd_get_section_vma (abfd, sec);
869 if (vma < secaddr)
870 {
871 (*info->fprintf_func) (info->stream, "-0x");
872 objdump_print_value (secaddr - vma, info, true);
873 }
874 else if (vma > secaddr)
875 {
876 (*info->fprintf_func) (info->stream, "+0x");
877 objdump_print_value (vma - secaddr, info, true);
878 }
879 (*info->fprintf_func) (info->stream, ">");
880 }
881 else
882 {
883 (*info->fprintf_func) (info->stream, " <");
884 objdump_print_symname (abfd, info, sym);
885 if (bfd_asymbol_value (sym) > vma)
886 {
887 (*info->fprintf_func) (info->stream, "-0x");
888 objdump_print_value (bfd_asymbol_value (sym) - vma, info, true);
889 }
890 else if (vma > bfd_asymbol_value (sym))
891 {
892 (*info->fprintf_func) (info->stream, "+0x");
893 objdump_print_value (vma - bfd_asymbol_value (sym), info, true);
894 }
895 (*info->fprintf_func) (info->stream, ">");
896 }
897}
898
899/* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
900 true, don't output leading zeroes. */
901
902static void
903objdump_print_addr (vma, info, skip_zeroes)
904 bfd_vma vma;
905 struct disassemble_info *info;
906 boolean skip_zeroes;
907{
908 struct objdump_disasm_info *aux;
909 asymbol *sym;
910
911 if (sorted_symcount < 1)
912 {
913 (*info->fprintf_func) (info->stream, "0x");
914 objdump_print_value (vma, info, skip_zeroes);
915 return;
916 }
917
918 aux = (struct objdump_disasm_info *) info->application_data;
919 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
920 (long *) NULL);
921 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
922 skip_zeroes);
923}
924
925/* Print VMA to INFO. This function is passed to the disassembler
926 routine. */
927
928static void
929objdump_print_address (vma, info)
930 bfd_vma vma;
931 struct disassemble_info *info;
932{
933 objdump_print_addr (vma, info, ! prefix_addresses);
934}
935
936/* Determine of the given address has a symbol associated with it. */
937
938static int
939objdump_symbol_at_address (vma, info)
940 bfd_vma vma;
941 struct disassemble_info * info;
942{
943 struct objdump_disasm_info * aux;
944 asymbol * sym;
945
946 /* No symbols - do not bother checking. */
947 if (sorted_symcount < 1)
948 return 0;
949
950 aux = (struct objdump_disasm_info *) info->application_data;
951 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
952 (long *) NULL);
953
954 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
955}
956
957/* Hold the last function name and the last line number we displayed
958 in a disassembly. */
959
960static char *prev_functionname;
961static unsigned int prev_line;
962
963/* We keep a list of all files that we have seen when doing a
964 dissassembly with source, so that we know how much of the file to
965 display. This can be important for inlined functions. */
966
967struct print_file_list
968{
969 struct print_file_list *next;
970 char *filename;
971 unsigned int line;
972 FILE *f;
973};
974
975static struct print_file_list *print_files;
976
977/* The number of preceding context lines to show when we start
978 displaying a file for the first time. */
979
980#define SHOW_PRECEDING_CONTEXT_LINES (5)
981
982/* Skip ahead to a given line in a file, optionally printing each
983 line. */
984
985static void
986skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
987
988static void
989skip_to_line (p, line, show)
990 struct print_file_list *p;
991 unsigned int line;
992 boolean show;
993{
994 while (p->line < line)
995 {
996 char buf[100];
997
998 if (fgets (buf, sizeof buf, p->f) == NULL)
999 {
1000 fclose (p->f);
1001 p->f = NULL;
1002 break;
1003 }
1004
1005 if (show)
1006 printf ("%s", buf);
1007
1008 if (strchr (buf, '\n') != NULL)
1009 ++p->line;
1010 }
1011}
1012
1013/* Show the line number, or the source line, in a dissassembly
1014 listing. */
1015
1016static void
940b2b78 1017show_line (abfd, section, addr_offset)
252b5132
RH
1018 bfd *abfd;
1019 asection *section;
940b2b78 1020 bfd_vma addr_offset;
252b5132
RH
1021{
1022 CONST char *filename;
1023 CONST char *functionname;
1024 unsigned int line;
1025
1026 if (! with_line_numbers && ! with_source_code)
1027 return;
1028
940b2b78 1029 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
252b5132
RH
1030 &functionname, &line))
1031 return;
1032
1033 if (filename != NULL && *filename == '\0')
1034 filename = NULL;
1035 if (functionname != NULL && *functionname == '\0')
1036 functionname = NULL;
1037
1038 if (with_line_numbers)
1039 {
1040 if (functionname != NULL
1041 && (prev_functionname == NULL
1042 || strcmp (functionname, prev_functionname) != 0))
1043 printf ("%s():\n", functionname);
1044 if (line > 0 && line != prev_line)
1045 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1046 }
1047
1048 if (with_source_code
1049 && filename != NULL
1050 && line > 0)
1051 {
1052 struct print_file_list **pp, *p;
1053
1054 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1055 if (strcmp ((*pp)->filename, filename) == 0)
1056 break;
1057 p = *pp;
1058
1059 if (p != NULL)
1060 {
1061 if (p != print_files)
1062 {
1063 int l;
1064
1065 /* We have reencountered a file name which we saw
1066 earlier. This implies that either we are dumping out
1067 code from an included file, or the same file was
1068 linked in more than once. There are two common cases
1069 of an included file: inline functions in a header
1070 file, and a bison or flex skeleton file. In the
1071 former case we want to just start printing (but we
1072 back up a few lines to give context); in the latter
1073 case we want to continue from where we left off. I
1074 can't think of a good way to distinguish the cases,
1075 so I used a heuristic based on the file name. */
1076 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1077 l = p->line;
1078 else
1079 {
1080 l = line - SHOW_PRECEDING_CONTEXT_LINES;
f1563258
TW
1081 if (l < 0)
1082 l = 0;
252b5132
RH
1083 }
1084
1085 if (p->f == NULL)
1086 {
1087 p->f = fopen (p->filename, "r");
1088 p->line = 0;
1089 }
1090 if (p->f != NULL)
1091 skip_to_line (p, l, false);
1092
1093 if (print_files->f != NULL)
1094 {
1095 fclose (print_files->f);
1096 print_files->f = NULL;
1097 }
1098 }
1099
1100 if (p->f != NULL)
1101 {
1102 skip_to_line (p, line, true);
1103 *pp = p->next;
1104 p->next = print_files;
1105 print_files = p;
1106 }
1107 }
1108 else
1109 {
1110 FILE *f;
1111
1112 f = fopen (filename, "r");
1113 if (f != NULL)
1114 {
1115 int l;
1116
1117 p = ((struct print_file_list *)
1118 xmalloc (sizeof (struct print_file_list)));
1119 p->filename = xmalloc (strlen (filename) + 1);
1120 strcpy (p->filename, filename);
1121 p->line = 0;
1122 p->f = f;
1123
1124 if (print_files != NULL && print_files->f != NULL)
1125 {
1126 fclose (print_files->f);
1127 print_files->f = NULL;
1128 }
1129 p->next = print_files;
1130 print_files = p;
1131
f1563258
TW
1132 if (file_start_context)
1133 l = 0;
1134 else
1135 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1136 if (l < 0)
1137 l = 0;
252b5132
RH
1138 skip_to_line (p, l, false);
1139 if (p->f != NULL)
1140 skip_to_line (p, line, true);
1141 }
1142 }
1143 }
1144
1145 if (functionname != NULL
1146 && (prev_functionname == NULL
1147 || strcmp (functionname, prev_functionname) != 0))
1148 {
1149 if (prev_functionname != NULL)
1150 free (prev_functionname);
1151 prev_functionname = xmalloc (strlen (functionname) + 1);
1152 strcpy (prev_functionname, functionname);
1153 }
1154
1155 if (line > 0 && line != prev_line)
1156 prev_line = line;
1157}
1158
1159/* Pseudo FILE object for strings. */
1160typedef struct
1161{
1162 char *buffer;
1163 size_t size;
1164 char *current;
1165} SFILE;
1166
1167/* sprintf to a "stream" */
1168
1169static int
1170#ifdef ANSI_PROTOTYPES
1171objdump_sprintf (SFILE *f, const char *format, ...)
1172#else
1173objdump_sprintf (va_alist)
1174 va_dcl
1175#endif
1176{
1177#ifndef ANSI_PROTOTYPES
1178 SFILE *f;
1179 const char *format;
1180#endif
1181 char *buf;
1182 va_list args;
1183 size_t n;
1184
1185#ifdef ANSI_PROTOTYPES
1186 va_start (args, format);
1187#else
1188 va_start (args);
1189 f = va_arg (args, SFILE *);
1190 format = va_arg (args, const char *);
1191#endif
1192
1193 vasprintf (&buf, format, args);
1194
1195 va_end (args);
1196
1197 if (buf == NULL)
1198 {
37cc8ec1 1199 fatal (_("Out of virtual memory"));
252b5132
RH
1200 }
1201
1202 n = strlen (buf);
1203
b4c96d0d 1204 while ((size_t) ((f->buffer + f->size) - f->current) < n + 1)
252b5132
RH
1205 {
1206 size_t curroff;
1207
1208 curroff = f->current - f->buffer;
1209 f->size *= 2;
1210 f->buffer = xrealloc (f->buffer, f->size);
1211 f->current = f->buffer + curroff;
1212 }
1213
1214 memcpy (f->current, buf, n);
1215 f->current += n;
1216 f->current[0] = '\0';
1217
1218 free (buf);
1219
1220 return n;
1221}
1222
1223/* The number of zeroes we want to see before we start skipping them.
1224 The number is arbitrarily chosen. */
1225
20fe0649 1226#ifndef SKIP_ZEROES
252b5132 1227#define SKIP_ZEROES (8)
20fe0649 1228#endif
252b5132
RH
1229
1230/* The number of zeroes to skip at the end of a section. If the
1231 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1232 SKIP_ZEROES, they will be disassembled. If there are fewer than
1233 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1234 attempt to avoid disassembling zeroes inserted by section
1235 alignment. */
1236
20fe0649 1237#ifndef SKIP_ZEROES_AT_END
252b5132 1238#define SKIP_ZEROES_AT_END (3)
20fe0649 1239#endif
252b5132
RH
1240
1241/* Disassemble some data in memory between given values. */
1242
1243static void
940b2b78
TW
1244disassemble_bytes (info, disassemble_fn, insns, data,
1245 start_offset, stop_offset, relppp,
252b5132
RH
1246 relppend)
1247 struct disassemble_info *info;
1248 disassembler_ftype disassemble_fn;
1249 boolean insns;
1250 bfd_byte *data;
940b2b78
TW
1251 bfd_vma start_offset;
1252 bfd_vma stop_offset;
252b5132
RH
1253 arelent ***relppp;
1254 arelent **relppend;
1255{
1256 struct objdump_disasm_info *aux;
1257 asection *section;
940b2b78 1258 int octets_per_line;
252b5132
RH
1259 boolean done_dot;
1260 int skip_addr_chars;
940b2b78
TW
1261 bfd_vma addr_offset;
1262 int opb = info->octets_per_byte;
252b5132
RH
1263
1264 aux = (struct objdump_disasm_info *) info->application_data;
1265 section = aux->sec;
1266
1267 if (insns)
940b2b78 1268 octets_per_line = 4;
252b5132 1269 else
940b2b78 1270 octets_per_line = 16;
252b5132
RH
1271
1272 /* Figure out how many characters to skip at the start of an
1273 address, to make the disassembly look nicer. We discard leading
1274 zeroes in chunks of 4, ensuring that there is always a leading
1275 zero remaining. */
1276 skip_addr_chars = 0;
1277 if (! prefix_addresses)
1278 {
1279 char buf[30];
1280 char *s;
1281
940b2b78
TW
1282 sprintf_vma (buf, section->vma +
1283 bfd_section_size (section->owner, section) / opb);
252b5132
RH
1284 s = buf;
1285 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1286 && s[4] == '0')
1287 {
1288 skip_addr_chars += 4;
1289 s += 4;
1290 }
1291 }
1292
1293 info->insn_info_valid = 0;
1294
1295 done_dot = false;
940b2b78
TW
1296 addr_offset = start_offset;
1297 while (addr_offset < stop_offset)
252b5132
RH
1298 {
1299 bfd_vma z;
940b2b78 1300 int octets = 0;
252b5132
RH
1301 boolean need_nl = false;
1302
940b2b78 1303 /* If we see more than SKIP_ZEROES octets of zeroes, we just
252b5132 1304 print `...'. */
940b2b78 1305 for (z = addr_offset * opb; z < stop_offset * opb; z++)
252b5132
RH
1306 if (data[z] != 0)
1307 break;
1308 if (! disassemble_zeroes
1309 && (info->insn_info_valid == 0
1310 || info->branch_delay_insns == 0)
940b2b78
TW
1311 && (z - addr_offset * opb >= SKIP_ZEROES
1312 || (z == stop_offset * opb &&
1313 z - addr_offset * opb < SKIP_ZEROES_AT_END)))
252b5132
RH
1314 {
1315 printf ("\t...\n");
1316
940b2b78 1317 /* If there are more nonzero octets to follow, we only skip
252b5132
RH
1318 zeroes in multiples of 4, to try to avoid running over
1319 the start of an instruction which happens to start with
1320 zero. */
940b2b78
TW
1321 if (z != stop_offset * opb)
1322 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
252b5132 1323
940b2b78 1324 octets = z - addr_offset * opb;
252b5132
RH
1325 }
1326 else
1327 {
1328 char buf[50];
1329 SFILE sfile;
1330 int bpc = 0;
1331 int pb = 0;
1332
1333 done_dot = false;
1334
1335 if (with_line_numbers || with_source_code)
76a406e5
NC
1336 /* The line number tables will refer to unadjusted
1337 section VMAs, so we must undo any VMA modifications
1338 when calling show_line. */
1339 show_line (aux->abfd, section, addr_offset - adjust_section_vma);
252b5132
RH
1340
1341 if (! prefix_addresses)
1342 {
1343 char *s;
1344
940b2b78 1345 sprintf_vma (buf, section->vma + addr_offset);
252b5132
RH
1346 for (s = buf + skip_addr_chars; *s == '0'; s++)
1347 *s = ' ';
1348 if (*s == '\0')
1349 *--s = '0';
1350 printf ("%s:\t", buf + skip_addr_chars);
1351 }
1352 else
1353 {
1354 aux->require_sec = true;
940b2b78 1355 objdump_print_address (section->vma + addr_offset, info);
252b5132
RH
1356 aux->require_sec = false;
1357 putchar (' ');
1358 }
1359
1360 if (insns)
1361 {
1362 sfile.size = 120;
1363 sfile.buffer = xmalloc (sfile.size);
1364 sfile.current = sfile.buffer;
1365 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1366 info->stream = (FILE *) &sfile;
1367 info->bytes_per_line = 0;
1368 info->bytes_per_chunk = 0;
1369
8b1e6df3 1370#ifdef DISASSEMBLER_NEEDS_RELOCS
940b2b78 1371 /* FIXME: This is wrong. It tests the number of octets
252b5132
RH
1372 in the last instruction, not the current one. */
1373 if (*relppp < relppend
940b2b78 1374 && (**relppp)->address >= addr_offset
8b1e6df3 1375 && (**relppp)->address <= addr_offset + octets / opb)
252b5132
RH
1376 info->flags = INSN_HAS_RELOC;
1377 else
8b1e6df3 1378#endif
252b5132
RH
1379 info->flags = 0;
1380
940b2b78 1381 octets = (*disassemble_fn) (section->vma + addr_offset, info);
252b5132
RH
1382 info->fprintf_func = (fprintf_ftype) fprintf;
1383 info->stream = stdout;
1384 if (info->bytes_per_line != 0)
940b2b78
TW
1385 octets_per_line = info->bytes_per_line;
1386 if (octets < 0)
e07bf1ac
ILT
1387 {
1388 if (sfile.current != sfile.buffer)
1389 printf ("%s\n", sfile.buffer);
1390 free (sfile.buffer);
1391 break;
1392 }
252b5132
RH
1393 }
1394 else
1395 {
b4c96d0d 1396 bfd_vma j;
252b5132 1397
940b2b78
TW
1398 octets = octets_per_line;
1399 if (addr_offset + octets / opb > stop_offset)
1400 octets = (stop_offset - addr_offset) * opb;
252b5132 1401
940b2b78 1402 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
252b5132
RH
1403 {
1404 if (isprint (data[j]))
940b2b78 1405 buf[j - addr_offset * opb] = data[j];
252b5132 1406 else
940b2b78 1407 buf[j - addr_offset * opb] = '.';
252b5132 1408 }
940b2b78 1409 buf[j - addr_offset * opb] = '\0';
252b5132
RH
1410 }
1411
1412 if (prefix_addresses
1413 ? show_raw_insn > 0
1414 : show_raw_insn >= 0)
1415 {
b4c96d0d 1416 bfd_vma j;
252b5132
RH
1417
1418 /* If ! prefix_addresses and ! wide_output, we print
940b2b78
TW
1419 octets_per_line octets per line. */
1420 pb = octets;
1421 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1422 pb = octets_per_line;
252b5132
RH
1423
1424 if (info->bytes_per_chunk)
1425 bpc = info->bytes_per_chunk;
1426 else
1427 bpc = 1;
1428
940b2b78 1429 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
252b5132
RH
1430 {
1431 int k;
1432 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1433 {
1434 for (k = bpc - 1; k >= 0; k--)
1435 printf ("%02x", (unsigned) data[j + k]);
1436 putchar (' ');
1437 }
1438 else
1439 {
1440 for (k = 0; k < bpc; k++)
1441 printf ("%02x", (unsigned) data[j + k]);
1442 putchar (' ');
1443 }
1444 }
1445
940b2b78 1446 for (; pb < octets_per_line; pb += bpc)
252b5132
RH
1447 {
1448 int k;
1449
1450 for (k = 0; k < bpc; k++)
1451 printf (" ");
1452 putchar (' ');
1453 }
1454
1455 /* Separate raw data from instruction by extra space. */
1456 if (insns)
1457 putchar ('\t');
1458 else
1459 printf (" ");
1460 }
1461
1462 if (! insns)
1463 printf ("%s", buf);
1464 else
1465 {
1466 printf ("%s", sfile.buffer);
1467 free (sfile.buffer);
1468 }
1469
1470 if (prefix_addresses
1471 ? show_raw_insn > 0
1472 : show_raw_insn >= 0)
1473 {
940b2b78 1474 while (pb < octets)
252b5132 1475 {
b4c96d0d 1476 bfd_vma j;
252b5132
RH
1477 char *s;
1478
1479 putchar ('\n');
940b2b78 1480 j = addr_offset * opb + pb;
252b5132 1481
940b2b78 1482 sprintf_vma (buf, section->vma + j / opb);
252b5132
RH
1483 for (s = buf + skip_addr_chars; *s == '0'; s++)
1484 *s = ' ';
1485 if (*s == '\0')
1486 *--s = '0';
1487 printf ("%s:\t", buf + skip_addr_chars);
1488
940b2b78
TW
1489 pb += octets_per_line;
1490 if (pb > octets)
1491 pb = octets;
1492 for (; j < addr_offset * opb + pb; j += bpc)
252b5132
RH
1493 {
1494 int k;
1495
1496 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1497 {
1498 for (k = bpc - 1; k >= 0; k--)
1499 printf ("%02x", (unsigned) data[j + k]);
1500 putchar (' ');
1501 }
1502 else
1503 {
1504 for (k = 0; k < bpc; k++)
1505 printf ("%02x", (unsigned) data[j + k]);
1506 putchar (' ');
1507 }
1508 }
1509 }
1510 }
1511
1512 if (!wide_output)
1513 putchar ('\n');
1514 else
1515 need_nl = true;
1516 }
1517
8b1e6df3
NC
1518 if ((section->flags & SEC_RELOC) != 0
1519#ifndef DISASSEMBLER_NEEDS_RELOCS
1520 && dump_reloc_info
1521#endif
1522 )
252b5132
RH
1523 {
1524 while ((*relppp) < relppend
940b2b78
TW
1525 && ((**relppp)->address >= (bfd_vma) addr_offset
1526 && (**relppp)->address < (bfd_vma) addr_offset + octets / opb))
8b1e6df3
NC
1527#ifdef DISASSEMBLER_NEEDS_RELOCS
1528 if (! dump_reloc_info)
1529 ++(*relppp);
1530 else
1531#endif
252b5132
RH
1532 {
1533 arelent *q;
1534
1535 q = **relppp;
1536
1537 if (wide_output)
1538 putchar ('\t');
1539 else
1540 printf ("\t\t\t");
1541
1542 objdump_print_value (section->vma + q->address, info, true);
1543
1544 printf (": %s\t", q->howto->name);
1545
1546 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1547 printf ("*unknown*");
1548 else
1549 {
1550 const char *sym_name;
1551
1552 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1553 if (sym_name != NULL && *sym_name != '\0')
1554 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1555 else
1556 {
1557 asection *sym_sec;
1558
1559 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1560 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1561 if (sym_name == NULL || *sym_name == '\0')
1562 sym_name = "*unknown*";
1563 printf ("%s", sym_name);
1564 }
1565 }
1566
1567 if (q->addend)
1568 {
1569 printf ("+0x");
1570 objdump_print_value (q->addend, info, true);
1571 }
1572
1573 printf ("\n");
1574 need_nl = false;
1575 ++(*relppp);
1576 }
1577 }
1578
1579 if (need_nl)
1580 printf ("\n");
1581
940b2b78 1582 addr_offset += octets / opb;
252b5132
RH
1583 }
1584}
1585
1586/* Disassemble the contents of an object file. */
1587
1588static void
1589disassemble_data (abfd)
1590 bfd *abfd;
1591{
f6af82bd 1592 unsigned long addr_offset;
252b5132
RH
1593 disassembler_ftype disassemble_fn;
1594 struct disassemble_info disasm_info;
1595 struct objdump_disasm_info aux;
1596 asection *section;
ea584125 1597 unsigned int opb;
252b5132
RH
1598
1599 print_files = NULL;
1600 prev_functionname = NULL;
1601 prev_line = -1;
1602
1603 /* We make a copy of syms to sort. We don't want to sort syms
1604 because that will screw up the relocs. */
1605 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1606 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1607
1608 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1609
1610 /* Sort the symbols into section and symbol order */
1611 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1612
1613 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1614 disasm_info.application_data = (PTR) &aux;
1615 aux.abfd = abfd;
1616 aux.require_sec = false;
1617 disasm_info.print_address_func = objdump_print_address;
1618 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1619
1620 if (machine != (char *) NULL)
1621 {
1622 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1623 if (info == NULL)
1624 {
37cc8ec1 1625 fatal (_("Can't use supplied machine %s"), machine);
252b5132
RH
1626 }
1627 abfd->arch_info = info;
1628 }
1629
1630 if (endian != BFD_ENDIAN_UNKNOWN)
1631 {
1632 struct bfd_target *xvec;
1633
1634 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1635 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1636 xvec->byteorder = endian;
1637 abfd->xvec = xvec;
1638 }
1639
1640 disassemble_fn = disassembler (abfd);
1641 if (!disassemble_fn)
1642 {
37cc8ec1
AM
1643 non_fatal (_("Can't disassemble for architecture %s\n"),
1644 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
75cd796a 1645 exit_status = 1;
252b5132
RH
1646 return;
1647 }
1648
ea584125
TW
1649 opb = bfd_octets_per_byte (abfd);
1650
252b5132
RH
1651 disasm_info.flavour = bfd_get_flavour (abfd);
1652 disasm_info.arch = bfd_get_arch (abfd);
1653 disasm_info.mach = bfd_get_mach (abfd);
dd92f639 1654 disasm_info.disassembler_options = disassembler_options;
ea584125 1655 disasm_info.octets_per_byte = opb;
dd92f639 1656
252b5132 1657 if (bfd_big_endian (abfd))
a8a9050d 1658 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
252b5132 1659 else if (bfd_little_endian (abfd))
a8a9050d 1660 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
252b5132
RH
1661 else
1662 /* ??? Aborting here seems too drastic. We could default to big or little
1663 instead. */
1664 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1665
1666 for (section = abfd->sections;
1667 section != (asection *) NULL;
1668 section = section->next)
1669 {
1670 bfd_byte *data = NULL;
1671 bfd_size_type datasize = 0;
1672 arelent **relbuf = NULL;
1673 arelent **relpp = NULL;
1674 arelent **relppend = NULL;
f6af82bd 1675 unsigned long stop_offset;
252b5132
RH
1676 asymbol *sym = NULL;
1677 long place = 0;
1678
1679 if ((section->flags & SEC_LOAD) == 0
1680 || (! disassemble_all
1681 && only == NULL
1682 && (section->flags & SEC_CODE) == 0))
1683 continue;
1684 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1685 continue;
1686
8b1e6df3
NC
1687 if ((section->flags & SEC_RELOC) != 0
1688#ifndef DISASSEMBLER_NEEDS_RELOCS
1689 && dump_reloc_info
1690#endif
1691 )
252b5132
RH
1692 {
1693 long relsize;
1694
1695 relsize = bfd_get_reloc_upper_bound (abfd, section);
1696 if (relsize < 0)
1697 bfd_fatal (bfd_get_filename (abfd));
1698
1699 if (relsize > 0)
1700 {
1701 long relcount;
1702
1703 relbuf = (arelent **) xmalloc (relsize);
1704 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1705 if (relcount < 0)
1706 bfd_fatal (bfd_get_filename (abfd));
1707
1708 /* Sort the relocs by address. */
1709 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1710
1711 relpp = relbuf;
1712 relppend = relpp + relcount;
1713
1714 /* Skip over the relocs belonging to addresses below the
1715 start address. */
1716 if (start_address != (bfd_vma) -1)
1717 {
1718 while (relpp < relppend
1719 && (*relpp)->address < start_address)
1720 ++relpp;
1721 }
1722 }
1723 }
1724
1725 printf (_("Disassembly of section %s:\n"), section->name);
1726
1727 datasize = bfd_get_section_size_before_reloc (section);
1728 if (datasize == 0)
1729 continue;
1730
1731 data = (bfd_byte *) xmalloc ((size_t) datasize);
1732
1733 bfd_get_section_contents (abfd, section, data, 0, datasize);
1734
1735 aux.sec = section;
1736 disasm_info.buffer = data;
1737 disasm_info.buffer_vma = section->vma;
1738 disasm_info.buffer_length = datasize;
1739 if (start_address == (bfd_vma) -1
1740 || start_address < disasm_info.buffer_vma)
940b2b78 1741 addr_offset = 0;
252b5132 1742 else
940b2b78 1743 addr_offset = start_address - disasm_info.buffer_vma;
252b5132 1744 if (stop_address == (bfd_vma) -1)
940b2b78 1745 stop_offset = datasize / opb;
252b5132
RH
1746 else
1747 {
1748 if (stop_address < disasm_info.buffer_vma)
940b2b78 1749 stop_offset = 0;
252b5132 1750 else
940b2b78
TW
1751 stop_offset = stop_address - disasm_info.buffer_vma;
1752 if (stop_offset > disasm_info.buffer_length / opb)
1753 stop_offset = disasm_info.buffer_length / opb;
252b5132
RH
1754 }
1755
940b2b78 1756 sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
252b5132
RH
1757 true, &place);
1758
940b2b78 1759 while (addr_offset < stop_offset)
252b5132
RH
1760 {
1761 asymbol *nextsym;
f6af82bd 1762 unsigned long nextstop_offset;
252b5132
RH
1763 boolean insns;
1764
940b2b78 1765 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset)
252b5132
RH
1766 {
1767 int x;
1768
1769 for (x = place;
1770 (x < sorted_symcount
940b2b78 1771 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset);
252b5132
RH
1772 ++x)
1773 continue;
1774 disasm_info.symbols = & sorted_syms[place];
1775 disasm_info.num_symbols = x - place;
1776 }
1777 else
1778 disasm_info.symbols = NULL;
1779
1780 if (! prefix_addresses)
1781 {
1782 printf ("\n");
1783 objdump_print_addr_with_sym (abfd, section, sym,
940b2b78 1784 section->vma + addr_offset,
252b5132
RH
1785 &disasm_info,
1786 false);
1787 printf (":\n");
1788 }
1789
940b2b78 1790 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
252b5132
RH
1791 nextsym = sym;
1792 else if (sym == NULL)
1793 nextsym = NULL;
1794 else
1795 {
f1f8ce07
ILT
1796 /* Search forward for the next appropriate symbol in
1797 SECTION. Note that all the symbols are sorted
1798 together into one big array, and that some sections
1799 may have overlapping addresses. */
252b5132 1800 while (place < sorted_symcount
252b5132
RH
1801 && (sorted_syms[place]->section != section
1802 || (bfd_asymbol_value (sorted_syms[place])
1803 <= bfd_asymbol_value (sym))))
1804 ++place;
1805 if (place >= sorted_symcount)
1806 nextsym = NULL;
1807 else
1808 nextsym = sorted_syms[place];
1809 }
1810
940b2b78 1811 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
252b5132 1812 {
940b2b78
TW
1813 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1814 if (nextstop_offset > stop_offset)
1815 nextstop_offset = stop_offset;
252b5132
RH
1816 }
1817 else if (nextsym == NULL)
940b2b78 1818 nextstop_offset = stop_offset;
252b5132
RH
1819 else
1820 {
940b2b78
TW
1821 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1822 if (nextstop_offset > stop_offset)
1823 nextstop_offset = stop_offset;
252b5132
RH
1824 }
1825
1826 /* If a symbol is explicitly marked as being an object
1827 rather than a function, just dump the bytes without
1828 disassembling them. */
1829 if (disassemble_all
1830 || sym == NULL
940b2b78 1831 || bfd_asymbol_value (sym) > section->vma + addr_offset
252b5132
RH
1832 || ((sym->flags & BSF_OBJECT) == 0
1833 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1834 == NULL)
1835 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1836 == NULL))
1837 || (sym->flags & BSF_FUNCTION) != 0)
1838 insns = true;
1839 else
1840 insns = false;
1841
940b2b78
TW
1842 disassemble_bytes (&disasm_info, disassemble_fn, insns, data,
1843 addr_offset, nextstop_offset, &relpp, relppend);
252b5132 1844
940b2b78 1845 addr_offset = nextstop_offset;
252b5132
RH
1846 sym = nextsym;
1847 }
1848
1849 free (data);
1850 if (relbuf != NULL)
1851 free (relbuf);
1852 }
1853 free (sorted_syms);
1854}
1855\f
1856
1857/* Define a table of stab values and print-strings. We wish the initializer
1858 could be a direct-mapped table, but instead we build one the first
1859 time we need it. */
1860
1861static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1862 char *strsect_name));
1863
1864/* Dump the stabs sections from an object file that has a section that
1865 uses Sun stabs encoding. */
1866
1867static void
1868dump_stabs (abfd)
1869 bfd *abfd;
1870{
1871 dump_section_stabs (abfd, ".stab", ".stabstr");
1872 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1873 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1874 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1875}
1876
1877static bfd_byte *stabs;
1878static bfd_size_type stab_size;
1879
1880static char *strtab;
1881static bfd_size_type stabstr_size;
1882
1883/* Read ABFD's stabs section STABSECT_NAME into `stabs'
1884 and string table section STRSECT_NAME into `strtab'.
1885 If the section exists and was read, allocate the space and return true.
1886 Otherwise return false. */
1887
1888static boolean
1889read_section_stabs (abfd, stabsect_name, strsect_name)
1890 bfd *abfd;
1891 const char *stabsect_name;
1892 const char *strsect_name;
1893{
1894 asection *stabsect, *stabstrsect;
1895
1896 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1897 if (0 == stabsect)
1898 {
1899 printf (_("No %s section present\n\n"), stabsect_name);
1900 return false;
1901 }
1902
1903 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1904 if (0 == stabstrsect)
1905 {
37cc8ec1
AM
1906 non_fatal (_("%s has no %s section"),
1907 bfd_get_filename (abfd), strsect_name);
75cd796a 1908 exit_status = 1;
252b5132
RH
1909 return false;
1910 }
1911
1912 stab_size = bfd_section_size (abfd, stabsect);
1913 stabstr_size = bfd_section_size (abfd, stabstrsect);
1914
1915 stabs = (bfd_byte *) xmalloc (stab_size);
1916 strtab = (char *) xmalloc (stabstr_size);
1917
1918 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1919 {
37cc8ec1
AM
1920 non_fatal (_("Reading %s section of %s failed: %s"),
1921 stabsect_name, bfd_get_filename (abfd),
1922 bfd_errmsg (bfd_get_error ()));
252b5132
RH
1923 free (stabs);
1924 free (strtab);
75cd796a 1925 exit_status = 1;
252b5132
RH
1926 return false;
1927 }
1928
1929 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1930 stabstr_size))
1931 {
37cc8ec1
AM
1932 non_fatal (_("Reading %s section of %s failed: %s\n"),
1933 strsect_name, bfd_get_filename (abfd),
1934 bfd_errmsg (bfd_get_error ()));
252b5132
RH
1935 free (stabs);
1936 free (strtab);
75cd796a 1937 exit_status = 1;
252b5132
RH
1938 return false;
1939 }
1940
1941 return true;
1942}
1943
1944/* Stabs entries use a 12 byte format:
1945 4 byte string table index
1946 1 byte stab type
1947 1 byte stab other field
1948 2 byte stab desc field
1949 4 byte stab value
1950 FIXME: This will have to change for a 64 bit object format. */
1951
1952#define STRDXOFF (0)
1953#define TYPEOFF (4)
1954#define OTHEROFF (5)
1955#define DESCOFF (6)
1956#define VALOFF (8)
1957#define STABSIZE (12)
1958
1959/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1960 using string table section STRSECT_NAME (in `strtab'). */
1961
1962static void
1963print_section_stabs (abfd, stabsect_name, strsect_name)
1964 bfd *abfd;
1965 const char *stabsect_name;
b4c96d0d 1966 const char *strsect_name ATTRIBUTE_UNUSED;
252b5132
RH
1967{
1968 int i;
1969 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1970 bfd_byte *stabp, *stabs_end;
1971
1972 stabp = stabs;
1973 stabs_end = stabp + stab_size;
1974
1975 printf (_("Contents of %s section:\n\n"), stabsect_name);
1976 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1977
1978 /* Loop through all symbols and print them.
1979
1980 We start the index at -1 because there is a dummy symbol on
1981 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1982
1983 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1984 {
1985 const char *name;
1986 unsigned long strx;
1987 unsigned char type, other;
1988 unsigned short desc;
1989 bfd_vma value;
1990
1991 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1992 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1993 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1994 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1995 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1996
1997 printf ("\n%-6d ", i);
1998 /* Either print the stab name, or, if unnamed, print its number
1999 again (makes consistent formatting for tools like awk). */
2000 name = bfd_get_stab_name (type);
2001 if (name != NULL)
2002 printf ("%-6s", name);
2003 else if (type == N_UNDF)
2004 printf ("HdrSym");
2005 else
2006 printf ("%-6d", type);
2007 printf (" %-6d %-6d ", other, desc);
2008 printf_vma (value);
2009 printf (" %-6lu", strx);
2010
2011 /* Symbols with type == 0 (N_UNDF) specify the length of the
2012 string table associated with this file. We use that info
2013 to know how to relocate the *next* file's string table indices. */
2014
2015 if (type == N_UNDF)
2016 {
2017 file_string_table_offset = next_file_string_table_offset;
2018 next_file_string_table_offset += value;
2019 }
2020 else
2021 {
2022 /* Using the (possibly updated) string table offset, print the
2023 string (if any) associated with this symbol. */
2024
2025 if ((strx + file_string_table_offset) < stabstr_size)
2026 printf (" %s", &strtab[strx + file_string_table_offset]);
2027 else
2028 printf (" *");
2029 }
2030 }
2031 printf ("\n\n");
2032}
2033
2034static void
2035dump_section_stabs (abfd, stabsect_name, strsect_name)
2036 bfd *abfd;
2037 char *stabsect_name;
2038 char *strsect_name;
2039{
2040 asection *s;
2041
2042 /* Check for section names for which stabsect_name is a prefix, to
2043 handle .stab0, etc. */
2044 for (s = abfd->sections;
2045 s != NULL;
2046 s = s->next)
2047 {
2048 int len;
2049
2050 len = strlen (stabsect_name);
2051
2052 /* If the prefix matches, and the files section name ends with a
2053 nul or a digit, then we match. I.e., we want either an exact
2054 match or a section followed by a number. */
2055 if (strncmp (stabsect_name, s->name, len) == 0
2056 && (s->name[len] == '\000'
2057 || isdigit ((unsigned char) s->name[len])))
2058 {
2059 if (read_section_stabs (abfd, s->name, strsect_name))
2060 {
2061 print_section_stabs (abfd, s->name, strsect_name);
2062 free (stabs);
2063 free (strtab);
2064 }
2065 }
2066 }
2067}
2068\f
2069static void
2070dump_bfd_header (abfd)
2071 bfd *abfd;
2072{
2073 char *comma = "";
2074
2075 printf (_("architecture: %s, "),
2076 bfd_printable_arch_mach (bfd_get_arch (abfd),
2077 bfd_get_mach (abfd)));
2078 printf (_("flags 0x%08x:\n"), abfd->flags);
2079
2080#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2081 PF (HAS_RELOC, "HAS_RELOC");
2082 PF (EXEC_P, "EXEC_P");
2083 PF (HAS_LINENO, "HAS_LINENO");
2084 PF (HAS_DEBUG, "HAS_DEBUG");
2085 PF (HAS_SYMS, "HAS_SYMS");
2086 PF (HAS_LOCALS, "HAS_LOCALS");
2087 PF (DYNAMIC, "DYNAMIC");
2088 PF (WP_TEXT, "WP_TEXT");
2089 PF (D_PAGED, "D_PAGED");
2090 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2091 printf (_("\nstart address 0x"));
2092 printf_vma (abfd->start_address);
2093 printf ("\n");
2094}
2095\f
2096static void
2097dump_bfd_private_header (abfd)
2098bfd *abfd;
2099{
2100 bfd_print_private_bfd_data (abfd, stdout);
2101}
2102
d24de309
ILT
2103/* Dump selected contents of ABFD */
2104
252b5132 2105static void
d24de309 2106dump_bfd (abfd)
252b5132
RH
2107 bfd *abfd;
2108{
252b5132
RH
2109 /* If we are adjusting section VMA's, change them all now. Changing
2110 the BFD information is a hack. However, we must do it, or
2111 bfd_find_nearest_line will not do the right thing. */
2112 if (adjust_section_vma != 0)
2113 {
2114 asection *s;
2115
2116 for (s = abfd->sections; s != NULL; s = s->next)
2117 {
2118 s->vma += adjust_section_vma;
2119 s->lma += adjust_section_vma;
2120 }
2121 }
2122
2123 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2124 abfd->xvec->name);
2125 if (dump_ar_hdrs)
2126 print_arelt_descr (stdout, abfd, true);
2127 if (dump_file_header)
2128 dump_bfd_header (abfd);
2129 if (dump_private_headers)
2130 dump_bfd_private_header (abfd);
2131 putchar ('\n');
2132 if (dump_section_headers)
2133 dump_headers (abfd);
2134 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2135 {
2136 syms = slurp_symtab (abfd);
2137 }
2138 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2139 {
2140 dynsyms = slurp_dynamic_symtab (abfd);
2141 }
2142 if (dump_symtab)
2143 dump_symbols (abfd, false);
2144 if (dump_dynamic_symtab)
2145 dump_symbols (abfd, true);
2146 if (dump_stab_section_info)
2147 dump_stabs (abfd);
2148 if (dump_reloc_info && ! disassemble)
2149 dump_relocs (abfd);
2150 if (dump_dynamic_reloc_info)
2151 dump_dynamic_relocs (abfd);
2152 if (dump_section_contents)
2153 dump_data (abfd);
2154 if (disassemble)
2155 disassemble_data (abfd);
2156 if (dump_debugging)
2157 {
2158 PTR dhandle;
2159
2160 dhandle = read_debugging_info (abfd, syms, symcount);
2161 if (dhandle != NULL)
2162 {
2163 if (! print_debugging_info (stdout, dhandle))
75cd796a 2164 {
37cc8ec1
AM
2165 non_fatal (_("%s: printing debugging information failed"),
2166 bfd_get_filename (abfd));
75cd796a
ILT
2167 exit_status = 1;
2168 }
252b5132
RH
2169 }
2170 }
2171 if (syms)
2172 {
2173 free (syms);
2174 syms = NULL;
2175 }
2176 if (dynsyms)
2177 {
2178 free (dynsyms);
2179 dynsyms = NULL;
2180 }
2181}
2182
d24de309
ILT
2183static void
2184display_bfd (abfd)
2185 bfd *abfd;
2186{
2187 char **matching;
2188
2189 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2190 {
2191 dump_bfd (abfd);
2192 return;
2193 }
2194
2195 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2196 {
2197 nonfatal (bfd_get_filename (abfd));
2198 list_matching_formats (matching);
2199 free (matching);
2200 return;
2201 }
2202
2203 if (bfd_get_error () != bfd_error_file_not_recognized)
2204 {
2205 nonfatal (bfd_get_filename (abfd));
2206 return;
2207 }
2208
2209 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2210 {
2211 dump_bfd (abfd);
2212 return;
2213 }
2214
2215 nonfatal (bfd_get_filename (abfd));
2216
2217 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2218 {
2219 list_matching_formats (matching);
2220 free (matching);
2221 }
2222}
2223
252b5132
RH
2224static void
2225display_file (filename, target)
2226 char *filename;
2227 char *target;
2228{
2229 bfd *file, *arfile = (bfd *) NULL;
2230
2231 file = bfd_openr (filename, target);
2232 if (file == NULL)
2233 {
75cd796a 2234 nonfatal (filename);
252b5132
RH
2235 return;
2236 }
2237
2238 if (bfd_check_format (file, bfd_archive) == true)
2239 {
2240 bfd *last_arfile = NULL;
2241
2242 printf (_("In archive %s:\n"), bfd_get_filename (file));
2243 for (;;)
2244 {
2245 bfd_set_error (bfd_error_no_error);
2246
2247 arfile = bfd_openr_next_archived_file (file, arfile);
2248 if (arfile == NULL)
2249 {
2250 if (bfd_get_error () != bfd_error_no_more_archived_files)
75cd796a 2251 nonfatal (bfd_get_filename (file));
252b5132
RH
2252 break;
2253 }
2254
2255 display_bfd (arfile);
2256
2257 if (last_arfile != NULL)
2258 bfd_close (last_arfile);
2259 last_arfile = arfile;
2260 }
2261
2262 if (last_arfile != NULL)
2263 bfd_close (last_arfile);
2264 }
2265 else
2266 display_bfd (file);
2267
2268 bfd_close (file);
2269}
2270\f
2271/* Actually display the various requested regions */
2272
2273static void
2274dump_data (abfd)
2275 bfd *abfd;
2276{
2277 asection *section;
2278 bfd_byte *data = 0;
2279 bfd_size_type datasize = 0;
940b2b78
TW
2280 bfd_size_type addr_offset;
2281 bfd_size_type start_offset, stop_offset;
f6af82bd 2282 unsigned int opb = bfd_octets_per_byte (abfd);
252b5132
RH
2283
2284 for (section = abfd->sections; section != NULL; section =
2285 section->next)
2286 {
2287 int onaline = 16;
2288
2289 if (only == (char *) NULL ||
2290 strcmp (only, section->name) == 0)
2291 {
2292 if (section->flags & SEC_HAS_CONTENTS)
2293 {
2294 printf (_("Contents of section %s:\n"), section->name);
2295
2296 if (bfd_section_size (abfd, section) == 0)
2297 continue;
2298 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2299 datasize = bfd_section_size (abfd, section);
2300
2301
2302 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2303
2304 if (start_address == (bfd_vma) -1
2305 || start_address < section->vma)
940b2b78 2306 start_offset = 0;
252b5132 2307 else
940b2b78 2308 start_offset = start_address - section->vma;
252b5132 2309 if (stop_address == (bfd_vma) -1)
940b2b78 2310 stop_offset = bfd_section_size (abfd, section) / opb;
252b5132
RH
2311 else
2312 {
2313 if (stop_address < section->vma)
940b2b78 2314 stop_offset = 0;
252b5132 2315 else
940b2b78
TW
2316 stop_offset = stop_address - section->vma;
2317 if (stop_offset > bfd_section_size (abfd, section) / opb)
2318 stop_offset = bfd_section_size (abfd, section) / opb;
252b5132 2319 }
940b2b78
TW
2320 for (addr_offset = start_offset;
2321 addr_offset < stop_offset; addr_offset += onaline)
252b5132
RH
2322 {
2323 bfd_size_type j;
2324
940b2b78
TW
2325 printf (" %04lx ", (unsigned long int)
2326 (addr_offset + section->vma));
2327 for (j = addr_offset * opb;
2328 j < addr_offset * opb + onaline; j++)
252b5132 2329 {
940b2b78 2330 if (j < stop_offset * opb)
252b5132
RH
2331 printf ("%02x", (unsigned) (data[j]));
2332 else
2333 printf (" ");
2334 if ((j & 3) == 3)
2335 printf (" ");
2336 }
2337
2338 printf (" ");
940b2b78 2339 for (j = addr_offset; j < addr_offset * opb + onaline; j++)
252b5132 2340 {
940b2b78 2341 if (j >= stop_offset * opb)
252b5132
RH
2342 printf (" ");
2343 else
2344 printf ("%c", isprint (data[j]) ? data[j] : '.');
2345 }
2346 putchar ('\n');
2347 }
2348 free (data);
2349 }
2350 }
2351 }
2352}
2353
2354/* Should perhaps share code and display with nm? */
2355static void
2356dump_symbols (abfd, dynamic)
b4c96d0d 2357 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
2358 boolean dynamic;
2359{
2360 asymbol **current;
2361 long max;
2362 long count;
2363
2364 if (dynamic)
2365 {
2366 current = dynsyms;
2367 max = dynsymcount;
2368 if (max == 0)
2369 return;
2370 printf ("DYNAMIC SYMBOL TABLE:\n");
2371 }
2372 else
2373 {
2374 current = syms;
2375 max = symcount;
2376 if (max == 0)
2377 return;
2378 printf ("SYMBOL TABLE:\n");
2379 }
2380
2381 for (count = 0; count < max; count++)
2382 {
2383 if (*current)
2384 {
2385 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2386
2387 if (cur_bfd != NULL)
2388 {
2389 const char *name;
2390 char *alloc;
2391
2392 name = bfd_asymbol_name (*current);
2393 alloc = NULL;
2394 if (do_demangle && name != NULL && *name != '\0')
2395 {
2396 const char *n;
2397
2398 /* If we want to demangle the name, we demangle it
2399 here, and temporarily clobber it while calling
2400 bfd_print_symbol. FIXME: This is a gross hack. */
2401
2402 n = name;
2403 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2404 ++n;
2405 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2406 if (alloc != NULL)
2407 (*current)->name = alloc;
2408 else
2409 (*current)->name = n;
2410 }
2411
2412 bfd_print_symbol (cur_bfd, stdout, *current,
2413 bfd_print_symbol_all);
2414
2415 (*current)->name = name;
2416 if (alloc != NULL)
2417 free (alloc);
2418
2419 printf ("\n");
2420 }
2421 }
2422 current++;
2423 }
2424 printf ("\n");
2425 printf ("\n");
2426}
2427
2428static void
2429dump_relocs (abfd)
2430 bfd *abfd;
2431{
2432 arelent **relpp;
2433 long relcount;
2434 asection *a;
2435
2436 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2437 {
2438 long relsize;
2439
2440 if (bfd_is_abs_section (a))
2441 continue;
2442 if (bfd_is_und_section (a))
2443 continue;
2444 if (bfd_is_com_section (a))
2445 continue;
2446
2447 if (only)
2448 {
2449 if (strcmp (only, a->name))
2450 continue;
2451 }
2452 else if ((a->flags & SEC_RELOC) == 0)
2453 continue;
2454
2455 relsize = bfd_get_reloc_upper_bound (abfd, a);
2456 if (relsize < 0)
2457 bfd_fatal (bfd_get_filename (abfd));
2458
2459 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2460
2461 if (relsize == 0)
2462 {
2463 printf (" (none)\n\n");
2464 }
2465 else
2466 {
2467 relpp = (arelent **) xmalloc (relsize);
2468 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2469 if (relcount < 0)
2470 bfd_fatal (bfd_get_filename (abfd));
2471 else if (relcount == 0)
2472 {
2473 printf (" (none)\n\n");
2474 }
2475 else
2476 {
2477 printf ("\n");
2478 dump_reloc_set (abfd, a, relpp, relcount);
2479 printf ("\n\n");
2480 }
2481 free (relpp);
2482 }
2483 }
2484}
2485
2486static void
2487dump_dynamic_relocs (abfd)
2488 bfd *abfd;
2489{
2490 long relsize;
2491 arelent **relpp;
2492 long relcount;
2493
2494 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2495 if (relsize < 0)
2496 bfd_fatal (bfd_get_filename (abfd));
2497
2498 printf ("DYNAMIC RELOCATION RECORDS");
2499
2500 if (relsize == 0)
2501 {
2502 printf (" (none)\n\n");
2503 }
2504 else
2505 {
2506 relpp = (arelent **) xmalloc (relsize);
2507 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2508 if (relcount < 0)
2509 bfd_fatal (bfd_get_filename (abfd));
2510 else if (relcount == 0)
2511 {
2512 printf (" (none)\n\n");
2513 }
2514 else
2515 {
2516 printf ("\n");
2517 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2518 printf ("\n\n");
2519 }
2520 free (relpp);
2521 }
2522}
2523
2524static void
2525dump_reloc_set (abfd, sec, relpp, relcount)
2526 bfd *abfd;
2527 asection *sec;
2528 arelent **relpp;
2529 long relcount;
2530{
2531 arelent **p;
2532 char *last_filename, *last_functionname;
2533 unsigned int last_line;
2534
2535 /* Get column headers lined up reasonably. */
2536 {
2537 static int width;
2538 if (width == 0)
2539 {
2540 char buf[30];
2541 sprintf_vma (buf, (bfd_vma) -1);
2542 width = strlen (buf) - 7;
2543 }
2544 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2545 }
2546
2547 last_filename = NULL;
2548 last_functionname = NULL;
2549 last_line = 0;
2550
2551 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2552 {
2553 arelent *q = *p;
2554 const char *filename, *functionname;
2555 unsigned int line;
2556 const char *sym_name;
2557 const char *section_name;
2558
2559 if (start_address != (bfd_vma) -1
2560 && q->address < start_address)
2561 continue;
2562 if (stop_address != (bfd_vma) -1
2563 && q->address > stop_address)
2564 continue;
2565
2566 if (with_line_numbers
2567 && sec != NULL
2568 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2569 &filename, &functionname, &line))
2570 {
2571 if (functionname != NULL
2572 && (last_functionname == NULL
2573 || strcmp (functionname, last_functionname) != 0))
2574 {
2575 printf ("%s():\n", functionname);
2576 if (last_functionname != NULL)
2577 free (last_functionname);
2578 last_functionname = xstrdup (functionname);
2579 }
2580 if (line > 0
2581 && (line != last_line
2582 || (filename != NULL
2583 && last_filename != NULL
2584 && strcmp (filename, last_filename) != 0)))
2585 {
2586 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2587 last_line = line;
2588 if (last_filename != NULL)
2589 free (last_filename);
2590 if (filename == NULL)
2591 last_filename = NULL;
2592 else
2593 last_filename = xstrdup (filename);
2594 }
2595 }
2596
2597 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2598 {
2599 sym_name = (*(q->sym_ptr_ptr))->name;
2600 section_name = (*(q->sym_ptr_ptr))->section->name;
2601 }
2602 else
2603 {
2604 sym_name = NULL;
2605 section_name = NULL;
2606 }
2607 if (sym_name)
2608 {
2609 printf_vma (q->address);
09cda596
DD
2610 if (q->howto->name)
2611 printf (" %-16s ", q->howto->name);
2612 else
2613 printf (" %-16d ", q->howto->type);
252b5132
RH
2614 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2615 *q->sym_ptr_ptr);
2616 }
2617 else
2618 {
2619 if (section_name == (CONST char *) NULL)
2620 section_name = "*unknown*";
2621 printf_vma (q->address);
2622 printf (" %-16s [%s]",
2623 q->howto->name,
2624 section_name);
2625 }
2626 if (q->addend)
2627 {
2628 printf ("+0x");
2629 printf_vma (q->addend);
2630 }
2631 printf ("\n");
2632 }
2633}
2634\f
2635/* The length of the longest architecture name + 1. */
2ac374c4 2636#define LONGEST_ARCH sizeof("powerpc:common")
252b5132
RH
2637
2638static const char *
2639endian_string (endian)
2640 enum bfd_endian endian;
2641{
2642 if (endian == BFD_ENDIAN_BIG)
2643 return "big endian";
2644 else if (endian == BFD_ENDIAN_LITTLE)
2645 return "little endian";
2646 else
2647 return "endianness unknown";
2648}
2649
2650/* List the targets that BFD is configured to support, each followed
2651 by its endianness and the architectures it supports. */
2652
2653static void
2654display_target_list ()
2655{
7340082d 2656 extern const bfd_target *const *bfd_target_vector;
252b5132
RH
2657 char *dummy_name;
2658 int t;
2659
5ee1baa2 2660 dummy_name = make_temp_file (NULL);
252b5132
RH
2661 for (t = 0; bfd_target_vector[t]; t++)
2662 {
7340082d 2663 const bfd_target *p = bfd_target_vector[t];
252b5132
RH
2664 bfd *abfd = bfd_openw (dummy_name, p->name);
2665 int a;
2666
2667 printf ("%s\n (header %s, data %s)\n", p->name,
2668 endian_string (p->header_byteorder),
2669 endian_string (p->byteorder));
2670
2671 if (abfd == NULL)
2672 {
75cd796a 2673 nonfatal (dummy_name);
252b5132
RH
2674 continue;
2675 }
2676
2677 if (! bfd_set_format (abfd, bfd_object))
2678 {
2679 if (bfd_get_error () != bfd_error_invalid_operation)
75cd796a 2680 nonfatal (p->name);
fb101ead 2681 bfd_close_all_done (abfd);
252b5132
RH
2682 continue;
2683 }
2684
2685 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2686 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2687 printf (" %s\n",
2688 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
fb101ead 2689 bfd_close_all_done (abfd);
252b5132
RH
2690 }
2691 unlink (dummy_name);
2692 free (dummy_name);
2693}
2694
2695/* Print a table showing which architectures are supported for entries
2696 FIRST through LAST-1 of bfd_target_vector (targets across,
2697 architectures down). */
2698
2699static void
2700display_info_table (first, last)
2701 int first;
2702 int last;
2703{
7340082d 2704 extern const bfd_target *const *bfd_target_vector;
252b5132
RH
2705 int t, a;
2706 char *dummy_name;
2707
2708 /* Print heading of target names. */
2709 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2710 for (t = first; t < last && bfd_target_vector[t]; t++)
2711 printf ("%s ", bfd_target_vector[t]->name);
2712 putchar ('\n');
2713
5ee1baa2 2714 dummy_name = make_temp_file (NULL);
252b5132
RH
2715 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2716 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2717 {
2718 printf ("%*s ", (int) LONGEST_ARCH - 1,
2719 bfd_printable_arch_mach (a, 0));
2720 for (t = first; t < last && bfd_target_vector[t]; t++)
2721 {
7340082d 2722 const bfd_target *p = bfd_target_vector[t];
252b5132
RH
2723 boolean ok = true;
2724 bfd *abfd = bfd_openw (dummy_name, p->name);
2725
2726 if (abfd == NULL)
2727 {
75cd796a 2728 nonfatal (p->name);
252b5132
RH
2729 ok = false;
2730 }
2731
2732 if (ok)
2733 {
2734 if (! bfd_set_format (abfd, bfd_object))
2735 {
2736 if (bfd_get_error () != bfd_error_invalid_operation)
75cd796a 2737 nonfatal (p->name);
252b5132
RH
2738 ok = false;
2739 }
2740 }
2741
2742 if (ok)
2743 {
2744 if (! bfd_set_arch_mach (abfd, a, 0))
2745 ok = false;
2746 }
2747
2748 if (ok)
2749 printf ("%s ", p->name);
2750 else
2751 {
2752 int l = strlen (p->name);
2753 while (l--)
2754 putchar ('-');
2755 putchar (' ');
2756 }
f190c5c4 2757 if (abfd != NULL)
fb101ead 2758 bfd_close_all_done (abfd);
252b5132
RH
2759 }
2760 putchar ('\n');
2761 }
2762 unlink (dummy_name);
2763 free (dummy_name);
2764}
2765
2766/* Print tables of all the target-architecture combinations that
2767 BFD has been configured to support. */
2768
2769static void
2770display_target_tables ()
2771{
2772 int t, columns;
7340082d 2773 extern const bfd_target *const *bfd_target_vector;
252b5132
RH
2774 char *colum;
2775
2776 columns = 0;
2777 colum = getenv ("COLUMNS");
2778 if (colum != NULL)
2779 columns = atoi (colum);
2780 if (columns == 0)
2781 columns = 80;
2782
2783 t = 0;
2784 while (bfd_target_vector[t] != NULL)
2785 {
2786 int oldt = t, wid;
2787
2788 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2789 ++t;
2790 while (wid < columns && bfd_target_vector[t] != NULL)
2791 {
2792 int newwid;
2793
2794 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2795 if (newwid >= columns)
2796 break;
2797 wid = newwid;
2798 ++t;
2799 }
2800 display_info_table (oldt, t);
2801 }
2802}
2803
2804static void
2805display_info ()
2806{
2807 printf (_("BFD header file version %s\n"), BFD_VERSION);
2808 display_target_list ();
2809 display_target_tables ();
2810}
2811
2812int
2813main (argc, argv)
2814 int argc;
2815 char **argv;
2816{
2817 int c;
2818 char *target = default_target;
2819 boolean seenflag = false;
2820
2821#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2822 setlocale (LC_MESSAGES, "");
2823#endif
2824 bindtextdomain (PACKAGE, LOCALEDIR);
2825 textdomain (PACKAGE);
2826
2827 program_name = *argv;
2828 xmalloc_set_program_name (program_name);
2829
2830 START_PROGRESS (program_name, 0);
2831
2832 bfd_init ();
2833 set_default_bfd_target ();
2834
1dada9c5 2835 while ((c = getopt_long (argc, argv, "pib:m:M:VCdDlfahHrRtTxsSj:wE:zgG",
252b5132
RH
2836 long_options, (int *) 0))
2837 != EOF)
2838 {
252b5132
RH
2839 switch (c)
2840 {
2841 case 0:
2842 break; /* we've been given a long option */
2843 case 'm':
2844 machine = optarg;
2845 break;
dd92f639
NC
2846 case 'M':
2847 disassembler_options = optarg;
2848 break;
252b5132
RH
2849 case 'j':
2850 only = optarg;
2851 break;
2852 case 'l':
1dada9c5 2853 with_line_numbers = true;
252b5132
RH
2854 break;
2855 case 'b':
2856 target = optarg;
2857 break;
1dada9c5
NC
2858 case 'C':
2859 do_demangle = true;
28c309a2
NC
2860 if (optarg != NULL)
2861 {
2862 enum demangling_styles style;
2863
2864 style = cplus_demangle_name_to_style (optarg);
2865 if (style == unknown_demangling)
2866 fatal (_("unknown demangling style `%s'"),
2867 optarg);
2868
2869 cplus_demangle_set_style (style);
2870 }
1dada9c5
NC
2871 break;
2872 case 'w':
2873 wide_output = true;
2874 break;
2875 case OPTION_ADJUST_VMA:
2876 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2877 break;
2878 case OPTION_START_ADDRESS:
2879 start_address = parse_vma (optarg, "--start-address");
2880 break;
2881 case OPTION_STOP_ADDRESS:
2882 stop_address = parse_vma (optarg, "--stop-address");
2883 break;
2884 case 'E':
2885 if (strcmp (optarg, "B") == 0)
2886 endian = BFD_ENDIAN_BIG;
2887 else if (strcmp (optarg, "L") == 0)
2888 endian = BFD_ENDIAN_LITTLE;
2889 else
2890 {
37cc8ec1 2891 non_fatal (_("unrecognized -E option"));
1dada9c5
NC
2892 usage (stderr, 1);
2893 }
2894 break;
2895 case OPTION_ENDIAN:
2896 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2897 endian = BFD_ENDIAN_BIG;
2898 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2899 endian = BFD_ENDIAN_LITTLE;
2900 else
2901 {
37cc8ec1 2902 non_fatal (_("unrecognized --endian type `%s'"), optarg);
1dada9c5
NC
2903 usage (stderr, 1);
2904 }
2905 break;
2906
252b5132
RH
2907 case 'f':
2908 dump_file_header = true;
1dada9c5 2909 seenflag = true;
252b5132
RH
2910 break;
2911 case 'i':
2912 formats_info = true;
1dada9c5 2913 seenflag = true;
252b5132
RH
2914 break;
2915 case 'p':
1dada9c5
NC
2916 dump_private_headers = true;
2917 seenflag = true;
252b5132
RH
2918 break;
2919 case 'x':
1dada9c5
NC
2920 dump_private_headers = true;
2921 dump_symtab = true;
2922 dump_reloc_info = true;
252b5132 2923 dump_file_header = true;
1dada9c5
NC
2924 dump_ar_hdrs = true;
2925 dump_section_headers = true;
2926 seenflag = true;
252b5132
RH
2927 break;
2928 case 't':
1dada9c5
NC
2929 dump_symtab = true;
2930 seenflag = true;
252b5132
RH
2931 break;
2932 case 'T':
1dada9c5
NC
2933 dump_dynamic_symtab = true;
2934 seenflag = true;
252b5132
RH
2935 break;
2936 case 'd':
2937 disassemble = true;
1dada9c5
NC
2938 seenflag = true;
2939 break;
2940 case 'z':
2941 disassemble_zeroes = true;
252b5132
RH
2942 break;
2943 case 'D':
1dada9c5
NC
2944 disassemble = true;
2945 disassemble_all = true;
2946 seenflag = true;
252b5132
RH
2947 break;
2948 case 'S':
2949 disassemble = true;
2950 with_source_code = true;
1dada9c5
NC
2951 seenflag = true;
2952 break;
2953 case 'g':
2954 dump_debugging = 1;
2955 seenflag = true;
2956 break;
2957 case 'G':
2958 dump_stab_section_info = true;
2959 seenflag = true;
252b5132
RH
2960 break;
2961 case 's':
1dada9c5
NC
2962 dump_section_contents = true;
2963 seenflag = true;
252b5132
RH
2964 break;
2965 case 'r':
1dada9c5
NC
2966 dump_reloc_info = true;
2967 seenflag = true;
252b5132
RH
2968 break;
2969 case 'R':
1dada9c5
NC
2970 dump_dynamic_reloc_info = true;
2971 seenflag = true;
252b5132
RH
2972 break;
2973 case 'a':
1dada9c5
NC
2974 dump_ar_hdrs = true;
2975 seenflag = true;
252b5132
RH
2976 break;
2977 case 'h':
1dada9c5
NC
2978 dump_section_headers = true;
2979 seenflag = true;
252b5132
RH
2980 break;
2981 case 'H':
2982 usage (stdout, 0);
1dada9c5 2983 seenflag = true;
252b5132 2984 case 'V':
1dada9c5
NC
2985 show_version = true;
2986 seenflag = true;
252b5132 2987 break;
1dada9c5 2988
252b5132
RH
2989 default:
2990 usage (stderr, 1);
2991 }
2992 }
2993
2994 if (show_version)
2995 print_version ("objdump");
2996
2997 if (seenflag == false)
1dada9c5 2998 usage (stderr, 2);
252b5132
RH
2999
3000 if (formats_info)
1dada9c5 3001 display_info ();
252b5132
RH
3002 else
3003 {
3004 if (optind == argc)
3005 display_file ("a.out", target);
3006 else
3007 for (; optind < argc;)
3008 display_file (argv[optind++], target);
3009 }
3010
3011 END_PROGRESS (program_name);
3012
75cd796a 3013 return exit_status;
252b5132 3014}
This page took 0.216683 seconds and 4 git commands to generate.