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