Initial revision
[binutils.git] / binutils / objdump.c
blob3f9e8c4c3f6f22b82a6dbc0f148b4da456e6956e
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 #include "bfd.h"
22 #include "getopt.h"
23 #include "progress.h"
24 #include "bucomm.h"
25 #include <ctype.h>
26 #include "dis-asm.h"
27 #include "libiberty.h"
28 #include "demangle.h"
29 #include "debug.h"
30 #include "budbg.h"
32 #ifdef ANSI_PROTOTYPES
33 #include <stdarg.h>
34 #else
35 #include <varargs.h>
36 #endif
38 /* Internal headers for the ELF .stab-dump code - sorry. */
39 #define BYTES_IN_WORD 32
40 #include "aout/aout64.h"
42 #ifdef NEED_DECLARATION_FPRINTF
43 /* This is needed by INIT_DISASSEMBLE_INFO. */
44 extern int fprintf PARAMS ((FILE *, const char *, ...));
45 #endif
47 static char *default_target = NULL; /* default at runtime */
49 static int show_version = 0; /* show the version number */
50 static int dump_section_contents; /* -s */
51 static int dump_section_headers; /* -h */
52 static boolean dump_file_header; /* -f */
53 static int dump_symtab; /* -t */
54 static int dump_dynamic_symtab; /* -T */
55 static int dump_reloc_info; /* -r */
56 static int dump_dynamic_reloc_info; /* -R */
57 static int dump_ar_hdrs; /* -a */
58 static int dump_private_headers; /* -p */
59 static int prefix_addresses; /* --prefix-addresses */
60 static int with_line_numbers; /* -l */
61 static boolean with_source_code; /* -S */
62 static int show_raw_insn; /* --show-raw-insn */
63 static int dump_stab_section_info; /* --stabs */
64 static int do_demangle; /* -C, --demangle */
65 static boolean disassemble; /* -d */
66 static boolean disassemble_all; /* -D */
67 static int disassemble_zeroes; /* --disassemble-zeroes */
68 static boolean formats_info; /* -i */
69 static char *only; /* -j secname */
70 static int wide_output; /* -w */
71 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
72 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
73 static int dump_debugging; /* --debugging */
74 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
76 /* Extra info to pass to the disassembler address printing function. */
77 struct objdump_disasm_info {
78 bfd *abfd;
79 asection *sec;
80 boolean require_sec;
83 /* Architecture to disassemble for, or default if NULL. */
84 static char *machine = (char *) NULL;
86 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
87 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
89 /* The symbol table. */
90 static asymbol **syms;
92 /* Number of symbols in `syms'. */
93 static long symcount = 0;
95 /* The sorted symbol table. */
96 static asymbol **sorted_syms;
98 /* Number of symbols in `sorted_syms'. */
99 static long sorted_symcount = 0;
101 /* The dynamic symbol table. */
102 static asymbol **dynsyms;
104 /* Number of symbols in `dynsyms'. */
105 static long dynsymcount = 0;
107 /* Static declarations. */
109 static void
110 usage PARAMS ((FILE *, int));
112 static void
113 display_file PARAMS ((char *filename, char *target));
115 static void
116 dump_section_header PARAMS ((bfd *, asection *, PTR));
118 static void
119 dump_headers PARAMS ((bfd *));
121 static void
122 dump_data PARAMS ((bfd *abfd));
124 static void
125 dump_relocs PARAMS ((bfd *abfd));
127 static void
128 dump_dynamic_relocs PARAMS ((bfd * abfd));
130 static void
131 dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
133 static void
134 dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
136 static void
137 dump_bfd_header PARAMS ((bfd *));
139 static void
140 dump_bfd_private_header PARAMS ((bfd *));
142 static void
143 display_bfd PARAMS ((bfd *abfd));
145 static void
146 display_target_list PARAMS ((void));
148 static void
149 display_info_table PARAMS ((int, int));
151 static void
152 display_target_tables PARAMS ((void));
154 static void
155 display_info PARAMS ((void));
157 static void
158 objdump_print_value PARAMS ((bfd_vma, struct disassemble_info *, boolean));
160 static void
161 objdump_print_symname PARAMS ((bfd *, struct disassemble_info *, asymbol *));
163 static asymbol *
164 find_symbol_for_address PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
166 static void
167 objdump_print_addr_with_sym PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
168 struct disassemble_info *, boolean));
170 static void
171 objdump_print_addr PARAMS ((bfd_vma, struct disassemble_info *, boolean));
173 static void
174 objdump_print_address PARAMS ((bfd_vma, struct disassemble_info *));
176 static void
177 show_line PARAMS ((bfd *, asection *, bfd_vma));
179 static void
180 disassemble_bytes PARAMS ((struct disassemble_info *, disassembler_ftype,
181 boolean, bfd_byte *, bfd_vma, bfd_vma,
182 arelent ***, arelent **));
184 static void
185 disassemble_data PARAMS ((bfd *));
187 static const char *
188 endian_string PARAMS ((enum bfd_endian));
190 static asymbol **
191 slurp_symtab PARAMS ((bfd *));
193 static asymbol **
194 slurp_dynamic_symtab PARAMS ((bfd *));
196 static long
197 remove_useless_symbols PARAMS ((asymbol **, long));
199 static int
200 compare_symbols PARAMS ((const PTR, const PTR));
202 static int
203 compare_relocs PARAMS ((const PTR, const PTR));
205 static void
206 dump_stabs PARAMS ((bfd *));
208 static boolean
209 read_section_stabs PARAMS ((bfd *, const char *, const char *));
211 static void
212 print_section_stabs PARAMS ((bfd *, const char *, const char *));
214 static void
215 usage (stream, status)
216 FILE *stream;
217 int status;
219 fprintf (stream, _("\
220 Usage: %s [-ahifCdDprRtTxsSlw] [-b bfdname] [-m machine] [-j section-name]\n\
221 [--archive-headers] [--target=bfdname] [--debugging] [--disassemble]\n\
222 [--disassemble-all] [--disassemble-zeroes] [--file-headers]\n\
223 [--section-headers] [--headers]\n\
224 [--info] [--section=section-name] [--line-numbers] [--source]\n"),
225 program_name);
226 fprintf (stream, _("\
227 [--architecture=machine] [--reloc] [--full-contents] [--stabs]\n\
228 [--syms] [--all-headers] [--dynamic-syms] [--dynamic-reloc]\n\
229 [--wide] [--version] [--help] [--private-headers]\n\
230 [--start-address=addr] [--stop-address=addr]\n\
231 [--prefix-addresses] [--[no-]show-raw-insn] [--demangle]\n\
232 [--adjust-vma=offset] [-EB|-EL] [--endian={big|little}] objfile...\n\
233 at least one option besides -l (--line-numbers) must be given\n"));
234 list_supported_targets (program_name, stream);
235 if (status == 0)
236 fprintf (stream, _("Report bugs to bug-gnu-utils@gnu.org\n"));
237 exit (status);
240 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
242 #define OPTION_ENDIAN (150)
243 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
244 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
245 #define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
247 static struct option long_options[]=
249 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
250 {"all-headers", no_argument, NULL, 'x'},
251 {"private-headers", no_argument, NULL, 'p'},
252 {"architecture", required_argument, NULL, 'm'},
253 {"archive-headers", no_argument, NULL, 'a'},
254 {"debugging", no_argument, &dump_debugging, 1},
255 {"demangle", no_argument, &do_demangle, 1},
256 {"disassemble", no_argument, NULL, 'd'},
257 {"disassemble-all", no_argument, NULL, 'D'},
258 {"disassemble-zeroes", no_argument, &disassemble_zeroes, 1},
259 {"dynamic-reloc", no_argument, NULL, 'R'},
260 {"dynamic-syms", no_argument, NULL, 'T'},
261 {"endian", required_argument, NULL, OPTION_ENDIAN},
262 {"file-headers", no_argument, NULL, 'f'},
263 {"full-contents", no_argument, NULL, 's'},
264 {"headers", no_argument, NULL, 'h'},
265 {"help", no_argument, NULL, 'H'},
266 {"info", no_argument, NULL, 'i'},
267 {"line-numbers", no_argument, NULL, 'l'},
268 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
269 {"prefix-addresses", no_argument, &prefix_addresses, 1},
270 {"reloc", no_argument, NULL, 'r'},
271 {"section", required_argument, NULL, 'j'},
272 {"section-headers", no_argument, NULL, 'h'},
273 {"show-raw-insn", no_argument, &show_raw_insn, 1},
274 {"source", no_argument, NULL, 'S'},
275 {"stabs", no_argument, &dump_stab_section_info, 1},
276 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
277 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
278 {"syms", no_argument, NULL, 't'},
279 {"target", required_argument, NULL, 'b'},
280 {"version", no_argument, &show_version, 1},
281 {"wide", no_argument, &wide_output, 'w'},
282 {0, no_argument, 0, 0}
285 static void
286 dump_section_header (abfd, section, ignored)
287 bfd *abfd;
288 asection *section;
289 PTR ignored;
291 char *comma = "";
293 printf ("%3d %-13s %08lx ", section->index,
294 bfd_get_section_name (abfd, section),
295 (unsigned long) bfd_section_size (abfd, section));
296 printf_vma (bfd_get_section_vma (abfd, section));
297 printf (" ");
298 printf_vma (section->lma);
299 printf (" %08lx 2**%u", section->filepos,
300 bfd_get_section_alignment (abfd, section));
301 if (! wide_output)
302 printf ("\n ");
303 printf (" ");
305 #define PF(x, y) \
306 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
308 PF (SEC_HAS_CONTENTS, "CONTENTS");
309 PF (SEC_ALLOC, "ALLOC");
310 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
311 PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT");
312 PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA");
313 PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS");
314 PF (SEC_LOAD, "LOAD");
315 PF (SEC_RELOC, "RELOC");
316 #ifdef SEC_BALIGN
317 PF (SEC_BALIGN, "BALIGN");
318 #endif
319 PF (SEC_READONLY, "READONLY");
320 PF (SEC_CODE, "CODE");
321 PF (SEC_DATA, "DATA");
322 PF (SEC_ROM, "ROM");
323 PF (SEC_DEBUGGING, "DEBUGGING");
324 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
325 PF (SEC_EXCLUDE, "EXCLUDE");
326 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
328 if ((section->flags & SEC_LINK_ONCE) != 0)
330 const char *ls;
332 switch (section->flags & SEC_LINK_DUPLICATES)
334 default:
335 abort ();
336 case SEC_LINK_DUPLICATES_DISCARD:
337 ls = "LINK_ONCE_DISCARD";
338 break;
339 case SEC_LINK_DUPLICATES_ONE_ONLY:
340 ls = "LINK_ONCE_ONE_ONLY";
341 break;
342 case SEC_LINK_DUPLICATES_SAME_SIZE:
343 ls = "LINK_ONCE_SAME_SIZE";
344 break;
345 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
346 ls = "LINK_ONCE_SAME_CONTENTS";
347 break;
349 printf ("%s%s", comma, ls);
350 comma = ", ";
353 printf ("\n");
354 #undef PF
357 static void
358 dump_headers (abfd)
359 bfd *abfd;
361 printf (_("Sections:\n"));
362 #ifndef BFD64
363 printf (_("Idx Name Size VMA LMA File off Algn\n"));
364 #else
365 printf (_("Idx Name Size VMA LMA File off Algn\n"));
366 #endif
367 bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
370 static asymbol **
371 slurp_symtab (abfd)
372 bfd *abfd;
374 asymbol **sy = (asymbol **) NULL;
375 long storage;
377 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
379 fprintf (stderr, _("%s: no symbols\n"), bfd_get_filename (abfd));
380 symcount = 0;
381 return NULL;
384 storage = bfd_get_symtab_upper_bound (abfd);
385 if (storage < 0)
386 bfd_fatal (bfd_get_filename (abfd));
388 if (storage)
390 sy = (asymbol **) xmalloc (storage);
392 symcount = bfd_canonicalize_symtab (abfd, sy);
393 if (symcount < 0)
394 bfd_fatal (bfd_get_filename (abfd));
395 if (symcount == 0)
396 fprintf (stderr, _("%s: no symbols\n"), bfd_get_filename (abfd));
397 return sy;
400 /* Read in the dynamic symbols. */
402 static asymbol **
403 slurp_dynamic_symtab (abfd)
404 bfd *abfd;
406 asymbol **sy = (asymbol **) NULL;
407 long storage;
409 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
410 if (storage < 0)
412 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
414 fprintf (stderr, _("%s: %s: not a dynamic object\n"),
415 program_name, bfd_get_filename (abfd));
416 dynsymcount = 0;
417 return NULL;
420 bfd_fatal (bfd_get_filename (abfd));
423 if (storage)
425 sy = (asymbol **) xmalloc (storage);
427 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
428 if (dynsymcount < 0)
429 bfd_fatal (bfd_get_filename (abfd));
430 if (dynsymcount == 0)
431 fprintf (stderr, _("%s: %s: No dynamic symbols\n"),
432 program_name, bfd_get_filename (abfd));
433 return sy;
436 /* Filter out (in place) symbols that are useless for disassembly.
437 COUNT is the number of elements in SYMBOLS.
438 Return the number of useful symbols. */
440 static long
441 remove_useless_symbols (symbols, count)
442 asymbol **symbols;
443 long count;
445 register asymbol **in_ptr = symbols, **out_ptr = symbols;
447 while (--count >= 0)
449 asymbol *sym = *in_ptr++;
451 if (sym->name == NULL || sym->name[0] == '\0')
452 continue;
453 if (sym->flags & (BSF_DEBUGGING))
454 continue;
455 if (bfd_is_und_section (sym->section)
456 || bfd_is_com_section (sym->section))
457 continue;
459 *out_ptr++ = sym;
461 return out_ptr - symbols;
464 /* Sort symbols into value order. */
466 static int
467 compare_symbols (ap, bp)
468 const PTR ap;
469 const PTR bp;
471 const asymbol *a = *(const asymbol **)ap;
472 const asymbol *b = *(const asymbol **)bp;
473 const char *an, *bn;
474 size_t anl, bnl;
475 boolean af, bf;
476 flagword aflags, bflags;
478 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
479 return 1;
480 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
481 return -1;
483 if (a->section > b->section)
484 return 1;
485 else if (a->section < b->section)
486 return -1;
488 an = bfd_asymbol_name (a);
489 bn = bfd_asymbol_name (b);
490 anl = strlen (an);
491 bnl = strlen (bn);
493 /* The symbols gnu_compiled and gcc2_compiled convey no real
494 information, so put them after other symbols with the same value. */
496 af = (strstr (an, "gnu_compiled") != NULL
497 || strstr (an, "gcc2_compiled") != NULL);
498 bf = (strstr (bn, "gnu_compiled") != NULL
499 || strstr (bn, "gcc2_compiled") != NULL);
501 if (af && ! bf)
502 return 1;
503 if (! af && bf)
504 return -1;
506 /* We use a heuristic for the file name, to try to sort it after
507 more useful symbols. It may not work on non Unix systems, but it
508 doesn't really matter; the only difference is precisely which
509 symbol names get printed. */
511 #define file_symbol(s, sn, snl) \
512 (((s)->flags & BSF_FILE) != 0 \
513 || ((sn)[(snl) - 2] == '.' \
514 && ((sn)[(snl) - 1] == 'o' \
515 || (sn)[(snl) - 1] == 'a')))
517 af = file_symbol (a, an, anl);
518 bf = file_symbol (b, bn, bnl);
520 if (af && ! bf)
521 return 1;
522 if (! af && bf)
523 return -1;
525 /* Try to sort global symbols before local symbols before function
526 symbols before debugging symbols. */
528 aflags = a->flags;
529 bflags = b->flags;
531 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
533 if ((aflags & BSF_DEBUGGING) != 0)
534 return 1;
535 else
536 return -1;
538 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
540 if ((aflags & BSF_FUNCTION) != 0)
541 return -1;
542 else
543 return 1;
545 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
547 if ((aflags & BSF_LOCAL) != 0)
548 return 1;
549 else
550 return -1;
552 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
554 if ((aflags & BSF_GLOBAL) != 0)
555 return -1;
556 else
557 return 1;
560 /* Symbols that start with '.' might be section names, so sort them
561 after symbols that don't start with '.'. */
562 if (an[0] == '.' && bn[0] != '.')
563 return 1;
564 if (an[0] != '.' && bn[0] == '.')
565 return -1;
567 /* Finally, if we can't distinguish them in any other way, try to
568 get consistent results by sorting the symbols by name. */
569 return strcmp (an, bn);
572 /* Sort relocs into address order. */
574 static int
575 compare_relocs (ap, bp)
576 const PTR ap;
577 const PTR bp;
579 const arelent *a = *(const arelent **)ap;
580 const arelent *b = *(const arelent **)bp;
582 if (a->address > b->address)
583 return 1;
584 else if (a->address < b->address)
585 return -1;
587 /* So that associated relocations tied to the same address show up
588 in the correct order, we don't do any further sorting. */
589 if (a > b)
590 return 1;
591 else if (a < b)
592 return -1;
593 else
594 return 0;
597 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
599 static void
600 objdump_print_value (vma, info, skip_zeroes)
601 bfd_vma vma;
602 struct disassemble_info *info;
603 boolean skip_zeroes;
605 char buf[30];
606 char *p;
608 sprintf_vma (buf, vma);
609 if (! skip_zeroes)
610 p = buf;
611 else
613 for (p = buf; *p == '0'; ++p)
615 if (*p == '\0')
616 --p;
618 (*info->fprintf_func) (info->stream, "%s", p);
621 /* Print the name of a symbol. */
623 static void
624 objdump_print_symname (abfd, info, sym)
625 bfd *abfd;
626 struct disassemble_info *info;
627 asymbol *sym;
629 char *alloc;
630 const char *name;
631 const char *print;
633 alloc = NULL;
634 name = bfd_asymbol_name (sym);
635 if (! do_demangle || name[0] == '\0')
636 print = name;
637 else
639 /* Demangle the name. */
640 if (bfd_get_symbol_leading_char (abfd) == name[0])
641 ++name;
643 alloc = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
644 if (alloc == NULL)
645 print = name;
646 else
647 print = alloc;
650 if (info != NULL)
651 (*info->fprintf_func) (info->stream, "%s", print);
652 else
653 printf ("%s", print);
655 if (alloc != NULL)
656 free (alloc);
659 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
660 is true, then always require the symbol to be in the section. This
661 returns NULL if there is no suitable symbol. If PLACE is not NULL,
662 then *PLACE is set to the index of the symbol in sorted_syms. */
664 static asymbol *
665 find_symbol_for_address (abfd, sec, vma, require_sec, place)
666 bfd *abfd;
667 asection *sec;
668 bfd_vma vma;
669 boolean require_sec;
670 long *place;
672 /* @@ Would it speed things up to cache the last two symbols returned,
673 and maybe their address ranges? For many processors, only one memory
674 operand can be present at a time, so the 2-entry cache wouldn't be
675 constantly churned by code doing heavy memory accesses. */
677 /* Indices in `sorted_syms'. */
678 long min = 0;
679 long max = sorted_symcount;
680 long thisplace;
682 if (sorted_symcount < 1)
683 return NULL;
685 /* Perform a binary search looking for the closest symbol to the
686 required value. We are searching the range (min, max]. */
687 while (min + 1 < max)
689 asymbol *sym;
691 thisplace = (max + min) / 2;
692 sym = sorted_syms[thisplace];
694 if (bfd_asymbol_value (sym) > vma)
695 max = thisplace;
696 else if (bfd_asymbol_value (sym) < vma)
697 min = thisplace;
698 else
700 min = thisplace;
701 break;
705 /* The symbol we want is now in min, the low end of the range we
706 were searching. If there are several symbols with the same
707 value, we want the first one. */
708 thisplace = min;
709 while (thisplace > 0
710 && (bfd_asymbol_value (sorted_syms[thisplace])
711 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
712 --thisplace;
714 /* If the file is relocateable, and the symbol could be from this
715 section, prefer a symbol from this section over symbols from
716 others, even if the other symbol's value might be closer.
718 Note that this may be wrong for some symbol references if the
719 sections have overlapping memory ranges, but in that case there's
720 no way to tell what's desired without looking at the relocation
721 table. */
723 if (sorted_syms[thisplace]->section != sec
724 && (require_sec
725 || ((abfd->flags & HAS_RELOC) != 0
726 && vma >= bfd_get_section_vma (abfd, sec)
727 && vma < (bfd_get_section_vma (abfd, sec)
728 + bfd_section_size (abfd, sec)))))
730 long i;
732 for (i = thisplace + 1; i < sorted_symcount; i++)
734 if (bfd_asymbol_value (sorted_syms[i])
735 != bfd_asymbol_value (sorted_syms[thisplace]))
736 break;
738 --i;
739 for (; i >= 0; i--)
741 if (sorted_syms[i]->section == sec
742 && (i == 0
743 || sorted_syms[i - 1]->section != sec
744 || (bfd_asymbol_value (sorted_syms[i])
745 != bfd_asymbol_value (sorted_syms[i - 1]))))
747 thisplace = i;
748 break;
752 if (sorted_syms[thisplace]->section != sec)
754 /* We didn't find a good symbol with a smaller value.
755 Look for one with a larger value. */
756 for (i = thisplace + 1; i < sorted_symcount; i++)
758 if (sorted_syms[i]->section == sec)
760 thisplace = i;
761 break;
766 if (sorted_syms[thisplace]->section != sec
767 && (require_sec
768 || ((abfd->flags & HAS_RELOC) != 0
769 && vma >= bfd_get_section_vma (abfd, sec)
770 && vma < (bfd_get_section_vma (abfd, sec)
771 + bfd_section_size (abfd, sec)))))
773 /* There is no suitable symbol. */
774 return NULL;
778 if (place != NULL)
779 *place = thisplace;
781 return sorted_syms[thisplace];
784 /* Print an address to INFO symbolically. */
786 static void
787 objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
788 bfd *abfd;
789 asection *sec;
790 asymbol *sym;
791 bfd_vma vma;
792 struct disassemble_info *info;
793 boolean skip_zeroes;
795 objdump_print_value (vma, info, skip_zeroes);
797 if (sym == NULL)
799 bfd_vma secaddr;
801 (*info->fprintf_func) (info->stream, " <%s",
802 bfd_get_section_name (abfd, sec));
803 secaddr = bfd_get_section_vma (abfd, sec);
804 if (vma < secaddr)
806 (*info->fprintf_func) (info->stream, "-0x");
807 objdump_print_value (secaddr - vma, info, true);
809 else if (vma > secaddr)
811 (*info->fprintf_func) (info->stream, "+0x");
812 objdump_print_value (vma - secaddr, info, true);
814 (*info->fprintf_func) (info->stream, ">");
816 else
818 (*info->fprintf_func) (info->stream, " <");
819 objdump_print_symname (abfd, info, sym);
820 if (bfd_asymbol_value (sym) > vma)
822 (*info->fprintf_func) (info->stream, "-0x");
823 objdump_print_value (bfd_asymbol_value (sym) - vma, info, true);
825 else if (vma > bfd_asymbol_value (sym))
827 (*info->fprintf_func) (info->stream, "+0x");
828 objdump_print_value (vma - bfd_asymbol_value (sym), info, true);
830 (*info->fprintf_func) (info->stream, ">");
834 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
835 true, don't output leading zeroes. */
837 static void
838 objdump_print_addr (vma, info, skip_zeroes)
839 bfd_vma vma;
840 struct disassemble_info *info;
841 boolean skip_zeroes;
843 struct objdump_disasm_info *aux;
844 asymbol *sym;
846 if (sorted_symcount < 1)
848 (*info->fprintf_func) (info->stream, "0x");
849 objdump_print_value (vma, info, skip_zeroes);
850 return;
853 aux = (struct objdump_disasm_info *) info->application_data;
854 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
855 (long *) NULL);
856 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
857 skip_zeroes);
860 /* Print VMA to INFO. This function is passed to the disassembler
861 routine. */
863 static void
864 objdump_print_address (vma, info)
865 bfd_vma vma;
866 struct disassemble_info *info;
868 objdump_print_addr (vma, info, ! prefix_addresses);
871 /* Determine of the given address has a symbol associated with it. */
873 static int
874 objdump_symbol_at_address (vma, info)
875 bfd_vma vma;
876 struct disassemble_info * info;
878 struct objdump_disasm_info * aux;
879 asymbol * sym;
881 /* No symbols - do not bother checking. */
882 if (sorted_symcount < 1)
883 return 0;
885 aux = (struct objdump_disasm_info *) info->application_data;
886 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
887 (long *) NULL);
889 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
892 /* Hold the last function name and the last line number we displayed
893 in a disassembly. */
895 static char *prev_functionname;
896 static unsigned int prev_line;
898 /* We keep a list of all files that we have seen when doing a
899 dissassembly with source, so that we know how much of the file to
900 display. This can be important for inlined functions. */
902 struct print_file_list
904 struct print_file_list *next;
905 char *filename;
906 unsigned int line;
907 FILE *f;
910 static struct print_file_list *print_files;
912 /* The number of preceding context lines to show when we start
913 displaying a file for the first time. */
915 #define SHOW_PRECEDING_CONTEXT_LINES (5)
917 /* Skip ahead to a given line in a file, optionally printing each
918 line. */
920 static void
921 skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
923 static void
924 skip_to_line (p, line, show)
925 struct print_file_list *p;
926 unsigned int line;
927 boolean show;
929 while (p->line < line)
931 char buf[100];
933 if (fgets (buf, sizeof buf, p->f) == NULL)
935 fclose (p->f);
936 p->f = NULL;
937 break;
940 if (show)
941 printf ("%s", buf);
943 if (strchr (buf, '\n') != NULL)
944 ++p->line;
948 /* Show the line number, or the source line, in a dissassembly
949 listing. */
951 static void
952 show_line (abfd, section, off)
953 bfd *abfd;
954 asection *section;
955 bfd_vma off;
957 CONST char *filename;
958 CONST char *functionname;
959 unsigned int line;
961 if (! with_line_numbers && ! with_source_code)
962 return;
964 if (! bfd_find_nearest_line (abfd, section, syms, off, &filename,
965 &functionname, &line))
966 return;
968 if (filename != NULL && *filename == '\0')
969 filename = NULL;
970 if (functionname != NULL && *functionname == '\0')
971 functionname = NULL;
973 if (with_line_numbers)
975 if (functionname != NULL
976 && (prev_functionname == NULL
977 || strcmp (functionname, prev_functionname) != 0))
978 printf ("%s():\n", functionname);
979 if (line > 0 && line != prev_line)
980 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
983 if (with_source_code
984 && filename != NULL
985 && line > 0)
987 struct print_file_list **pp, *p;
989 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
990 if (strcmp ((*pp)->filename, filename) == 0)
991 break;
992 p = *pp;
994 if (p != NULL)
996 if (p != print_files)
998 int l;
1000 /* We have reencountered a file name which we saw
1001 earlier. This implies that either we are dumping out
1002 code from an included file, or the same file was
1003 linked in more than once. There are two common cases
1004 of an included file: inline functions in a header
1005 file, and a bison or flex skeleton file. In the
1006 former case we want to just start printing (but we
1007 back up a few lines to give context); in the latter
1008 case we want to continue from where we left off. I
1009 can't think of a good way to distinguish the cases,
1010 so I used a heuristic based on the file name. */
1011 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1012 l = p->line;
1013 else
1015 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1016 if (l <= 0)
1017 l = 1;
1020 if (p->f == NULL)
1022 p->f = fopen (p->filename, "r");
1023 p->line = 0;
1025 if (p->f != NULL)
1026 skip_to_line (p, l, false);
1028 if (print_files->f != NULL)
1030 fclose (print_files->f);
1031 print_files->f = NULL;
1035 if (p->f != NULL)
1037 skip_to_line (p, line, true);
1038 *pp = p->next;
1039 p->next = print_files;
1040 print_files = p;
1043 else
1045 FILE *f;
1047 f = fopen (filename, "r");
1048 if (f != NULL)
1050 int l;
1052 p = ((struct print_file_list *)
1053 xmalloc (sizeof (struct print_file_list)));
1054 p->filename = xmalloc (strlen (filename) + 1);
1055 strcpy (p->filename, filename);
1056 p->line = 0;
1057 p->f = f;
1059 if (print_files != NULL && print_files->f != NULL)
1061 fclose (print_files->f);
1062 print_files->f = NULL;
1064 p->next = print_files;
1065 print_files = p;
1067 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1068 if (l <= 0)
1069 l = 1;
1070 skip_to_line (p, l, false);
1071 if (p->f != NULL)
1072 skip_to_line (p, line, true);
1077 if (functionname != NULL
1078 && (prev_functionname == NULL
1079 || strcmp (functionname, prev_functionname) != 0))
1081 if (prev_functionname != NULL)
1082 free (prev_functionname);
1083 prev_functionname = xmalloc (strlen (functionname) + 1);
1084 strcpy (prev_functionname, functionname);
1087 if (line > 0 && line != prev_line)
1088 prev_line = line;
1091 /* Pseudo FILE object for strings. */
1092 typedef struct
1094 char *buffer;
1095 size_t size;
1096 char *current;
1097 } SFILE;
1099 /* sprintf to a "stream" */
1101 static int
1102 #ifdef ANSI_PROTOTYPES
1103 objdump_sprintf (SFILE *f, const char *format, ...)
1104 #else
1105 objdump_sprintf (va_alist)
1106 va_dcl
1107 #endif
1109 #ifndef ANSI_PROTOTYPES
1110 SFILE *f;
1111 const char *format;
1112 #endif
1113 char *buf;
1114 va_list args;
1115 size_t n;
1117 #ifdef ANSI_PROTOTYPES
1118 va_start (args, format);
1119 #else
1120 va_start (args);
1121 f = va_arg (args, SFILE *);
1122 format = va_arg (args, const char *);
1123 #endif
1125 vasprintf (&buf, format, args);
1127 va_end (args);
1129 if (buf == NULL)
1131 fprintf (stderr, _("Out of virtual memory\n"));
1132 exit (1);
1135 n = strlen (buf);
1137 while ((f->buffer + f->size) - f->current < n + 1)
1139 size_t curroff;
1141 curroff = f->current - f->buffer;
1142 f->size *= 2;
1143 f->buffer = xrealloc (f->buffer, f->size);
1144 f->current = f->buffer + curroff;
1147 memcpy (f->current, buf, n);
1148 f->current += n;
1149 f->current[0] = '\0';
1151 free (buf);
1153 return n;
1156 /* The number of zeroes we want to see before we start skipping them.
1157 The number is arbitrarily chosen. */
1159 #define SKIP_ZEROES (8)
1161 /* The number of zeroes to skip at the end of a section. If the
1162 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1163 SKIP_ZEROES, they will be disassembled. If there are fewer than
1164 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1165 attempt to avoid disassembling zeroes inserted by section
1166 alignment. */
1168 #define SKIP_ZEROES_AT_END (3)
1170 /* Disassemble some data in memory between given values. */
1172 static void
1173 disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp,
1174 relppend)
1175 struct disassemble_info *info;
1176 disassembler_ftype disassemble_fn;
1177 boolean insns;
1178 bfd_byte *data;
1179 bfd_vma start;
1180 bfd_vma stop;
1181 arelent ***relppp;
1182 arelent **relppend;
1184 struct objdump_disasm_info *aux;
1185 asection *section;
1186 int bytes_per_line;
1187 boolean done_dot;
1188 int skip_addr_chars;
1189 bfd_vma i;
1191 aux = (struct objdump_disasm_info *) info->application_data;
1192 section = aux->sec;
1194 if (insns)
1195 bytes_per_line = 4;
1196 else
1197 bytes_per_line = 16;
1199 /* Figure out how many characters to skip at the start of an
1200 address, to make the disassembly look nicer. We discard leading
1201 zeroes in chunks of 4, ensuring that there is always a leading
1202 zero remaining. */
1203 skip_addr_chars = 0;
1204 if (! prefix_addresses)
1206 char buf[30];
1207 char *s;
1209 sprintf_vma (buf,
1210 section->vma + bfd_section_size (section->owner, section));
1211 s = buf;
1212 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1213 && s[4] == '0')
1215 skip_addr_chars += 4;
1216 s += 4;
1220 info->insn_info_valid = 0;
1222 done_dot = false;
1223 i = start;
1224 while (i < stop)
1226 bfd_vma z;
1227 int bytes = 0;
1228 boolean need_nl = false;
1230 /* If we see more than SKIP_ZEROES bytes of zeroes, we just
1231 print `...'. */
1232 for (z = i; z < stop; z++)
1233 if (data[z] != 0)
1234 break;
1235 if (! disassemble_zeroes
1236 && (info->insn_info_valid == 0
1237 || info->branch_delay_insns == 0)
1238 && (z - i >= SKIP_ZEROES
1239 || (z == stop && z - i < SKIP_ZEROES_AT_END)))
1241 printf ("\t...\n");
1243 /* If there are more nonzero bytes to follow, we only skip
1244 zeroes in multiples of 4, to try to avoid running over
1245 the start of an instruction which happens to start with
1246 zero. */
1247 if (z != stop)
1248 z = i + ((z - i) &~ 3);
1250 bytes = z - i;
1252 else
1254 char buf[50];
1255 SFILE sfile;
1256 int bpc = 0;
1257 int pb = 0;
1259 done_dot = false;
1261 if (with_line_numbers || with_source_code)
1262 show_line (aux->abfd, section, i);
1264 if (! prefix_addresses)
1266 char *s;
1268 sprintf_vma (buf, section->vma + i);
1269 for (s = buf + skip_addr_chars; *s == '0'; s++)
1270 *s = ' ';
1271 if (*s == '\0')
1272 *--s = '0';
1273 printf ("%s:\t", buf + skip_addr_chars);
1275 else
1277 aux->require_sec = true;
1278 objdump_print_address (section->vma + i, info);
1279 aux->require_sec = false;
1280 putchar (' ');
1283 if (insns)
1285 sfile.size = 120;
1286 sfile.buffer = xmalloc (sfile.size);
1287 sfile.current = sfile.buffer;
1288 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1289 info->stream = (FILE *) &sfile;
1290 info->bytes_per_line = 0;
1291 info->bytes_per_chunk = 0;
1293 /* FIXME: This is wrong. It tests the number of bytes
1294 in the last instruction, not the current one. */
1295 if (*relppp < relppend
1296 && (**relppp)->address >= i
1297 && (**relppp)->address < i + bytes)
1298 info->flags = INSN_HAS_RELOC;
1299 else
1300 info->flags = 0;
1302 bytes = (*disassemble_fn) (section->vma + i, info);
1303 info->fprintf_func = (fprintf_ftype) fprintf;
1304 info->stream = stdout;
1305 if (info->bytes_per_line != 0)
1306 bytes_per_line = info->bytes_per_line;
1307 if (bytes < 0)
1308 break;
1310 else
1312 long j;
1314 bytes = bytes_per_line;
1315 if (i + bytes > stop)
1316 bytes = stop - i;
1318 for (j = i; j < i + bytes; ++j)
1320 if (isprint (data[j]))
1321 buf[j - i] = data[j];
1322 else
1323 buf[j - i] = '.';
1325 buf[j - i] = '\0';
1328 if (prefix_addresses
1329 ? show_raw_insn > 0
1330 : show_raw_insn >= 0)
1332 long j;
1334 /* If ! prefix_addresses and ! wide_output, we print
1335 bytes_per_line bytes per line. */
1336 pb = bytes;
1337 if (pb > bytes_per_line && ! prefix_addresses && ! wide_output)
1338 pb = bytes_per_line;
1340 if (info->bytes_per_chunk)
1341 bpc = info->bytes_per_chunk;
1342 else
1343 bpc = 1;
1345 for (j = i; j < i + pb; j += bpc)
1347 int k;
1348 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1350 for (k = bpc - 1; k >= 0; k--)
1351 printf ("%02x", (unsigned) data[j + k]);
1352 putchar (' ');
1354 else
1356 for (k = 0; k < bpc; k++)
1357 printf ("%02x", (unsigned) data[j + k]);
1358 putchar (' ');
1362 for (; pb < bytes_per_line; pb += bpc)
1364 int k;
1366 for (k = 0; k < bpc; k++)
1367 printf (" ");
1368 putchar (' ');
1371 /* Separate raw data from instruction by extra space. */
1372 if (insns)
1373 putchar ('\t');
1374 else
1375 printf (" ");
1378 if (! insns)
1379 printf ("%s", buf);
1380 else
1382 printf ("%s", sfile.buffer);
1383 free (sfile.buffer);
1386 if (prefix_addresses
1387 ? show_raw_insn > 0
1388 : show_raw_insn >= 0)
1390 while (pb < bytes)
1392 long j;
1393 char *s;
1395 putchar ('\n');
1396 j = i + pb;
1398 sprintf_vma (buf, section->vma + j);
1399 for (s = buf + skip_addr_chars; *s == '0'; s++)
1400 *s = ' ';
1401 if (*s == '\0')
1402 *--s = '0';
1403 printf ("%s:\t", buf + skip_addr_chars);
1405 pb += bytes_per_line;
1406 if (pb > bytes)
1407 pb = bytes;
1408 for (; j < i + pb; j += bpc)
1410 int k;
1412 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1414 for (k = bpc - 1; k >= 0; k--)
1415 printf ("%02x", (unsigned) data[j + k]);
1416 putchar (' ');
1418 else
1420 for (k = 0; k < bpc; k++)
1421 printf ("%02x", (unsigned) data[j + k]);
1422 putchar (' ');
1428 if (!wide_output)
1429 putchar ('\n');
1430 else
1431 need_nl = true;
1434 if (dump_reloc_info
1435 && (section->flags & SEC_RELOC) != 0)
1437 while ((*relppp) < relppend
1438 && ((**relppp)->address >= (bfd_vma) i
1439 && (**relppp)->address < (bfd_vma) i + bytes))
1441 arelent *q;
1443 q = **relppp;
1445 if (wide_output)
1446 putchar ('\t');
1447 else
1448 printf ("\t\t\t");
1450 objdump_print_value (section->vma + q->address, info, true);
1452 printf (": %s\t", q->howto->name);
1454 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1455 printf ("*unknown*");
1456 else
1458 const char *sym_name;
1460 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1461 if (sym_name != NULL && *sym_name != '\0')
1462 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1463 else
1465 asection *sym_sec;
1467 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1468 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1469 if (sym_name == NULL || *sym_name == '\0')
1470 sym_name = "*unknown*";
1471 printf ("%s", sym_name);
1475 if (q->addend)
1477 printf ("+0x");
1478 objdump_print_value (q->addend, info, true);
1481 printf ("\n");
1482 need_nl = false;
1483 ++(*relppp);
1487 if (need_nl)
1488 printf ("\n");
1490 i += bytes;
1494 /* Disassemble the contents of an object file. */
1496 static void
1497 disassemble_data (abfd)
1498 bfd *abfd;
1500 long i;
1501 disassembler_ftype disassemble_fn;
1502 struct disassemble_info disasm_info;
1503 struct objdump_disasm_info aux;
1504 asection *section;
1506 print_files = NULL;
1507 prev_functionname = NULL;
1508 prev_line = -1;
1510 /* We make a copy of syms to sort. We don't want to sort syms
1511 because that will screw up the relocs. */
1512 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1513 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1515 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1517 /* Sort the symbols into section and symbol order */
1518 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1520 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1521 disasm_info.application_data = (PTR) &aux;
1522 aux.abfd = abfd;
1523 aux.require_sec = false;
1524 disasm_info.print_address_func = objdump_print_address;
1525 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1527 if (machine != (char *) NULL)
1529 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1530 if (info == NULL)
1532 fprintf (stderr, _("%s: Can't use supplied machine %s\n"),
1533 program_name,
1534 machine);
1535 exit (1);
1537 abfd->arch_info = info;
1540 if (endian != BFD_ENDIAN_UNKNOWN)
1542 struct bfd_target *xvec;
1544 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1545 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1546 xvec->byteorder = endian;
1547 abfd->xvec = xvec;
1550 disassemble_fn = disassembler (abfd);
1551 if (!disassemble_fn)
1553 fprintf (stderr, _("%s: Can't disassemble for architecture %s\n"),
1554 program_name,
1555 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1556 return;
1559 disasm_info.flavour = bfd_get_flavour (abfd);
1560 disasm_info.arch = bfd_get_arch (abfd);
1561 disasm_info.mach = bfd_get_mach (abfd);
1562 if (bfd_big_endian (abfd))
1563 disasm_info.endian = BFD_ENDIAN_BIG;
1564 else if (bfd_little_endian (abfd))
1565 disasm_info.endian = BFD_ENDIAN_LITTLE;
1566 else
1567 /* ??? Aborting here seems too drastic. We could default to big or little
1568 instead. */
1569 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1571 for (section = abfd->sections;
1572 section != (asection *) NULL;
1573 section = section->next)
1575 bfd_byte *data = NULL;
1576 bfd_size_type datasize = 0;
1577 arelent **relbuf = NULL;
1578 arelent **relpp = NULL;
1579 arelent **relppend = NULL;
1580 long stop;
1581 asymbol *sym = NULL;
1582 long place = 0;
1584 if ((section->flags & SEC_LOAD) == 0
1585 || (! disassemble_all
1586 && only == NULL
1587 && (section->flags & SEC_CODE) == 0))
1588 continue;
1589 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1590 continue;
1592 if (dump_reloc_info
1593 && (section->flags & SEC_RELOC) != 0)
1595 long relsize;
1597 relsize = bfd_get_reloc_upper_bound (abfd, section);
1598 if (relsize < 0)
1599 bfd_fatal (bfd_get_filename (abfd));
1601 if (relsize > 0)
1603 long relcount;
1605 relbuf = (arelent **) xmalloc (relsize);
1606 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1607 if (relcount < 0)
1608 bfd_fatal (bfd_get_filename (abfd));
1610 /* Sort the relocs by address. */
1611 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1613 relpp = relbuf;
1614 relppend = relpp + relcount;
1616 /* Skip over the relocs belonging to addresses below the
1617 start address. */
1618 if (start_address != (bfd_vma) -1)
1620 while (relpp < relppend
1621 && (*relpp)->address < start_address)
1622 ++relpp;
1627 printf (_("Disassembly of section %s:\n"), section->name);
1629 datasize = bfd_get_section_size_before_reloc (section);
1630 if (datasize == 0)
1631 continue;
1633 data = (bfd_byte *) xmalloc ((size_t) datasize);
1635 bfd_get_section_contents (abfd, section, data, 0, datasize);
1637 aux.sec = section;
1638 disasm_info.buffer = data;
1639 disasm_info.buffer_vma = section->vma;
1640 disasm_info.buffer_length = datasize;
1641 if (start_address == (bfd_vma) -1
1642 || start_address < disasm_info.buffer_vma)
1643 i = 0;
1644 else
1645 i = start_address - disasm_info.buffer_vma;
1646 if (stop_address == (bfd_vma) -1)
1647 stop = datasize;
1648 else
1650 if (stop_address < disasm_info.buffer_vma)
1651 stop = 0;
1652 else
1653 stop = stop_address - disasm_info.buffer_vma;
1654 if (stop > disasm_info.buffer_length)
1655 stop = disasm_info.buffer_length;
1658 sym = find_symbol_for_address (abfd, section, section->vma + i,
1659 true, &place);
1661 while (i < stop)
1663 asymbol *nextsym;
1664 long nextstop;
1665 boolean insns;
1667 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + i)
1669 int x;
1671 for (x = place;
1672 (x < sorted_symcount
1673 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + i);
1674 ++x)
1675 continue;
1676 disasm_info.symbols = & sorted_syms[place];
1677 disasm_info.num_symbols = x - place;
1679 else
1680 disasm_info.symbols = NULL;
1682 if (! prefix_addresses)
1684 printf ("\n");
1685 objdump_print_addr_with_sym (abfd, section, sym,
1686 section->vma + i,
1687 &disasm_info,
1688 false);
1689 printf (":\n");
1692 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1693 nextsym = sym;
1694 else if (sym == NULL)
1695 nextsym = NULL;
1696 else
1698 while (place < sorted_symcount
1699 /* ??? Why the test for != section? */
1700 && (sorted_syms[place]->section != section
1701 || (bfd_asymbol_value (sorted_syms[place])
1702 <= bfd_asymbol_value (sym))))
1703 ++place;
1704 if (place >= sorted_symcount)
1705 nextsym = NULL;
1706 else
1707 nextsym = sorted_syms[place];
1710 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1712 nextstop = bfd_asymbol_value (sym) - section->vma;
1713 if (nextstop > stop)
1714 nextstop = stop;
1716 else if (nextsym == NULL)
1717 nextstop = stop;
1718 else
1720 nextstop = bfd_asymbol_value (nextsym) - section->vma;
1721 if (nextstop > stop)
1722 nextstop = stop;
1725 /* If a symbol is explicitly marked as being an object
1726 rather than a function, just dump the bytes without
1727 disassembling them. */
1728 if (disassemble_all
1729 || sym == NULL
1730 || bfd_asymbol_value (sym) > section->vma + i
1731 || ((sym->flags & BSF_OBJECT) == 0
1732 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1733 == NULL)
1734 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1735 == NULL))
1736 || (sym->flags & BSF_FUNCTION) != 0)
1737 insns = true;
1738 else
1739 insns = false;
1741 disassemble_bytes (&disasm_info, disassemble_fn, insns, data, i,
1742 nextstop, &relpp, relppend);
1744 i = nextstop;
1745 sym = nextsym;
1748 free (data);
1749 if (relbuf != NULL)
1750 free (relbuf);
1752 free (sorted_syms);
1756 /* Define a table of stab values and print-strings. We wish the initializer
1757 could be a direct-mapped table, but instead we build one the first
1758 time we need it. */
1760 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1761 char *strsect_name));
1763 /* Dump the stabs sections from an object file that has a section that
1764 uses Sun stabs encoding. */
1766 static void
1767 dump_stabs (abfd)
1768 bfd *abfd;
1770 dump_section_stabs (abfd, ".stab", ".stabstr");
1771 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1772 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1773 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1776 static bfd_byte *stabs;
1777 static bfd_size_type stab_size;
1779 static char *strtab;
1780 static bfd_size_type stabstr_size;
1782 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1783 and string table section STRSECT_NAME into `strtab'.
1784 If the section exists and was read, allocate the space and return true.
1785 Otherwise return false. */
1787 static boolean
1788 read_section_stabs (abfd, stabsect_name, strsect_name)
1789 bfd *abfd;
1790 const char *stabsect_name;
1791 const char *strsect_name;
1793 asection *stabsect, *stabstrsect;
1795 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1796 if (0 == stabsect)
1798 printf (_("No %s section present\n\n"), stabsect_name);
1799 return false;
1802 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1803 if (0 == stabstrsect)
1805 fprintf (stderr, _("%s: %s has no %s section\n"), program_name,
1806 bfd_get_filename (abfd), strsect_name);
1807 return false;
1810 stab_size = bfd_section_size (abfd, stabsect);
1811 stabstr_size = bfd_section_size (abfd, stabstrsect);
1813 stabs = (bfd_byte *) xmalloc (stab_size);
1814 strtab = (char *) xmalloc (stabstr_size);
1816 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1818 fprintf (stderr, _("%s: Reading %s section of %s failed: %s\n"),
1819 program_name, stabsect_name, bfd_get_filename (abfd),
1820 bfd_errmsg (bfd_get_error ()));
1821 free (stabs);
1822 free (strtab);
1823 return false;
1826 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1827 stabstr_size))
1829 fprintf (stderr, _("%s: Reading %s section of %s failed: %s\n"),
1830 program_name, strsect_name, bfd_get_filename (abfd),
1831 bfd_errmsg (bfd_get_error ()));
1832 free (stabs);
1833 free (strtab);
1834 return false;
1837 return true;
1840 /* Stabs entries use a 12 byte format:
1841 4 byte string table index
1842 1 byte stab type
1843 1 byte stab other field
1844 2 byte stab desc field
1845 4 byte stab value
1846 FIXME: This will have to change for a 64 bit object format. */
1848 #define STRDXOFF (0)
1849 #define TYPEOFF (4)
1850 #define OTHEROFF (5)
1851 #define DESCOFF (6)
1852 #define VALOFF (8)
1853 #define STABSIZE (12)
1855 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1856 using string table section STRSECT_NAME (in `strtab'). */
1858 static void
1859 print_section_stabs (abfd, stabsect_name, strsect_name)
1860 bfd *abfd;
1861 const char *stabsect_name;
1862 const char *strsect_name;
1864 int i;
1865 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1866 bfd_byte *stabp, *stabs_end;
1868 stabp = stabs;
1869 stabs_end = stabp + stab_size;
1871 printf (_("Contents of %s section:\n\n"), stabsect_name);
1872 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1874 /* Loop through all symbols and print them.
1876 We start the index at -1 because there is a dummy symbol on
1877 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1879 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1881 const char *name;
1882 unsigned long strx;
1883 unsigned char type, other;
1884 unsigned short desc;
1885 bfd_vma value;
1887 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1888 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1889 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1890 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1891 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1893 printf ("\n%-6d ", i);
1894 /* Either print the stab name, or, if unnamed, print its number
1895 again (makes consistent formatting for tools like awk). */
1896 name = bfd_get_stab_name (type);
1897 if (name != NULL)
1898 printf ("%-6s", name);
1899 else if (type == N_UNDF)
1900 printf ("HdrSym");
1901 else
1902 printf ("%-6d", type);
1903 printf (" %-6d %-6d ", other, desc);
1904 printf_vma (value);
1905 printf (" %-6lu", strx);
1907 /* Symbols with type == 0 (N_UNDF) specify the length of the
1908 string table associated with this file. We use that info
1909 to know how to relocate the *next* file's string table indices. */
1911 if (type == N_UNDF)
1913 file_string_table_offset = next_file_string_table_offset;
1914 next_file_string_table_offset += value;
1916 else
1918 /* Using the (possibly updated) string table offset, print the
1919 string (if any) associated with this symbol. */
1921 if ((strx + file_string_table_offset) < stabstr_size)
1922 printf (" %s", &strtab[strx + file_string_table_offset]);
1923 else
1924 printf (" *");
1927 printf ("\n\n");
1930 static void
1931 dump_section_stabs (abfd, stabsect_name, strsect_name)
1932 bfd *abfd;
1933 char *stabsect_name;
1934 char *strsect_name;
1936 asection *s;
1938 /* Check for section names for which stabsect_name is a prefix, to
1939 handle .stab0, etc. */
1940 for (s = abfd->sections;
1941 s != NULL;
1942 s = s->next)
1944 int len;
1946 len = strlen (stabsect_name);
1948 /* If the prefix matches, and the files section name ends with a
1949 nul or a digit, then we match. I.e., we want either an exact
1950 match or a section followed by a number. */
1951 if (strncmp (stabsect_name, s->name, len) == 0
1952 && (s->name[len] == '\000'
1953 || isdigit ((unsigned char) s->name[len])))
1955 if (read_section_stabs (abfd, s->name, strsect_name))
1957 print_section_stabs (abfd, s->name, strsect_name);
1958 free (stabs);
1959 free (strtab);
1965 static void
1966 dump_bfd_header (abfd)
1967 bfd *abfd;
1969 char *comma = "";
1971 printf (_("architecture: %s, "),
1972 bfd_printable_arch_mach (bfd_get_arch (abfd),
1973 bfd_get_mach (abfd)));
1974 printf (_("flags 0x%08x:\n"), abfd->flags);
1976 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
1977 PF (HAS_RELOC, "HAS_RELOC");
1978 PF (EXEC_P, "EXEC_P");
1979 PF (HAS_LINENO, "HAS_LINENO");
1980 PF (HAS_DEBUG, "HAS_DEBUG");
1981 PF (HAS_SYMS, "HAS_SYMS");
1982 PF (HAS_LOCALS, "HAS_LOCALS");
1983 PF (DYNAMIC, "DYNAMIC");
1984 PF (WP_TEXT, "WP_TEXT");
1985 PF (D_PAGED, "D_PAGED");
1986 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
1987 printf (_("\nstart address 0x"));
1988 printf_vma (abfd->start_address);
1989 printf ("\n");
1992 static void
1993 dump_bfd_private_header (abfd)
1994 bfd *abfd;
1996 bfd_print_private_bfd_data (abfd, stdout);
1999 static void
2000 display_bfd (abfd)
2001 bfd *abfd;
2003 char **matching;
2005 if (!bfd_check_format_matches (abfd, bfd_object, &matching))
2007 bfd_nonfatal (bfd_get_filename (abfd));
2008 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2010 list_matching_formats (matching);
2011 free (matching);
2013 return;
2016 /* If we are adjusting section VMA's, change them all now. Changing
2017 the BFD information is a hack. However, we must do it, or
2018 bfd_find_nearest_line will not do the right thing. */
2019 if (adjust_section_vma != 0)
2021 asection *s;
2023 for (s = abfd->sections; s != NULL; s = s->next)
2025 s->vma += adjust_section_vma;
2026 s->lma += adjust_section_vma;
2030 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2031 abfd->xvec->name);
2032 if (dump_ar_hdrs)
2033 print_arelt_descr (stdout, abfd, true);
2034 if (dump_file_header)
2035 dump_bfd_header (abfd);
2036 if (dump_private_headers)
2037 dump_bfd_private_header (abfd);
2038 putchar ('\n');
2039 if (dump_section_headers)
2040 dump_headers (abfd);
2041 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2043 syms = slurp_symtab (abfd);
2045 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2047 dynsyms = slurp_dynamic_symtab (abfd);
2049 if (dump_symtab)
2050 dump_symbols (abfd, false);
2051 if (dump_dynamic_symtab)
2052 dump_symbols (abfd, true);
2053 if (dump_stab_section_info)
2054 dump_stabs (abfd);
2055 if (dump_reloc_info && ! disassemble)
2056 dump_relocs (abfd);
2057 if (dump_dynamic_reloc_info)
2058 dump_dynamic_relocs (abfd);
2059 if (dump_section_contents)
2060 dump_data (abfd);
2061 if (disassemble)
2062 disassemble_data (abfd);
2063 if (dump_debugging)
2065 PTR dhandle;
2067 dhandle = read_debugging_info (abfd, syms, symcount);
2068 if (dhandle != NULL)
2070 if (! print_debugging_info (stdout, dhandle))
2071 fprintf (stderr, _("%s: printing debugging information failed\n"),
2072 bfd_get_filename (abfd));
2075 if (syms)
2077 free (syms);
2078 syms = NULL;
2080 if (dynsyms)
2082 free (dynsyms);
2083 dynsyms = NULL;
2087 static void
2088 display_file (filename, target)
2089 char *filename;
2090 char *target;
2092 bfd *file, *arfile = (bfd *) NULL;
2094 file = bfd_openr (filename, target);
2095 if (file == NULL)
2097 bfd_nonfatal (filename);
2098 return;
2101 if (bfd_check_format (file, bfd_archive) == true)
2103 bfd *last_arfile = NULL;
2105 printf (_("In archive %s:\n"), bfd_get_filename (file));
2106 for (;;)
2108 bfd_set_error (bfd_error_no_error);
2110 arfile = bfd_openr_next_archived_file (file, arfile);
2111 if (arfile == NULL)
2113 if (bfd_get_error () != bfd_error_no_more_archived_files)
2115 bfd_nonfatal (bfd_get_filename (file));
2117 break;
2120 display_bfd (arfile);
2122 if (last_arfile != NULL)
2123 bfd_close (last_arfile);
2124 last_arfile = arfile;
2127 if (last_arfile != NULL)
2128 bfd_close (last_arfile);
2130 else
2131 display_bfd (file);
2133 bfd_close (file);
2136 /* Actually display the various requested regions */
2138 static void
2139 dump_data (abfd)
2140 bfd *abfd;
2142 asection *section;
2143 bfd_byte *data = 0;
2144 bfd_size_type datasize = 0;
2145 bfd_size_type i;
2146 bfd_size_type start, stop;
2148 for (section = abfd->sections; section != NULL; section =
2149 section->next)
2151 int onaline = 16;
2153 if (only == (char *) NULL ||
2154 strcmp (only, section->name) == 0)
2156 if (section->flags & SEC_HAS_CONTENTS)
2158 printf (_("Contents of section %s:\n"), section->name);
2160 if (bfd_section_size (abfd, section) == 0)
2161 continue;
2162 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2163 datasize = bfd_section_size (abfd, section);
2166 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2168 if (start_address == (bfd_vma) -1
2169 || start_address < section->vma)
2170 start = 0;
2171 else
2172 start = start_address - section->vma;
2173 if (stop_address == (bfd_vma) -1)
2174 stop = bfd_section_size (abfd, section);
2175 else
2177 if (stop_address < section->vma)
2178 stop = 0;
2179 else
2180 stop = stop_address - section->vma;
2181 if (stop > bfd_section_size (abfd, section))
2182 stop = bfd_section_size (abfd, section);
2184 for (i = start; i < stop; i += onaline)
2186 bfd_size_type j;
2188 printf (" %04lx ", (unsigned long int) (i + section->vma));
2189 for (j = i; j < i + onaline; j++)
2191 if (j < stop)
2192 printf ("%02x", (unsigned) (data[j]));
2193 else
2194 printf (" ");
2195 if ((j & 3) == 3)
2196 printf (" ");
2199 printf (" ");
2200 for (j = i; j < i + onaline; j++)
2202 if (j >= stop)
2203 printf (" ");
2204 else
2205 printf ("%c", isprint (data[j]) ? data[j] : '.');
2207 putchar ('\n');
2209 free (data);
2215 /* Should perhaps share code and display with nm? */
2216 static void
2217 dump_symbols (abfd, dynamic)
2218 bfd *abfd;
2219 boolean dynamic;
2221 asymbol **current;
2222 long max;
2223 long count;
2225 if (dynamic)
2227 current = dynsyms;
2228 max = dynsymcount;
2229 if (max == 0)
2230 return;
2231 printf ("DYNAMIC SYMBOL TABLE:\n");
2233 else
2235 current = syms;
2236 max = symcount;
2237 if (max == 0)
2238 return;
2239 printf ("SYMBOL TABLE:\n");
2242 for (count = 0; count < max; count++)
2244 if (*current)
2246 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2248 if (cur_bfd != NULL)
2250 const char *name;
2251 char *alloc;
2253 name = bfd_asymbol_name (*current);
2254 alloc = NULL;
2255 if (do_demangle && name != NULL && *name != '\0')
2257 const char *n;
2259 /* If we want to demangle the name, we demangle it
2260 here, and temporarily clobber it while calling
2261 bfd_print_symbol. FIXME: This is a gross hack. */
2263 n = name;
2264 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2265 ++n;
2266 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2267 if (alloc != NULL)
2268 (*current)->name = alloc;
2269 else
2270 (*current)->name = n;
2273 bfd_print_symbol (cur_bfd, stdout, *current,
2274 bfd_print_symbol_all);
2276 (*current)->name = name;
2277 if (alloc != NULL)
2278 free (alloc);
2280 printf ("\n");
2283 current++;
2285 printf ("\n");
2286 printf ("\n");
2289 static void
2290 dump_relocs (abfd)
2291 bfd *abfd;
2293 arelent **relpp;
2294 long relcount;
2295 asection *a;
2297 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2299 long relsize;
2301 if (bfd_is_abs_section (a))
2302 continue;
2303 if (bfd_is_und_section (a))
2304 continue;
2305 if (bfd_is_com_section (a))
2306 continue;
2308 if (only)
2310 if (strcmp (only, a->name))
2311 continue;
2313 else if ((a->flags & SEC_RELOC) == 0)
2314 continue;
2316 relsize = bfd_get_reloc_upper_bound (abfd, a);
2317 if (relsize < 0)
2318 bfd_fatal (bfd_get_filename (abfd));
2320 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2322 if (relsize == 0)
2324 printf (" (none)\n\n");
2326 else
2328 relpp = (arelent **) xmalloc (relsize);
2329 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2330 if (relcount < 0)
2331 bfd_fatal (bfd_get_filename (abfd));
2332 else if (relcount == 0)
2334 printf (" (none)\n\n");
2336 else
2338 printf ("\n");
2339 dump_reloc_set (abfd, a, relpp, relcount);
2340 printf ("\n\n");
2342 free (relpp);
2347 static void
2348 dump_dynamic_relocs (abfd)
2349 bfd *abfd;
2351 long relsize;
2352 arelent **relpp;
2353 long relcount;
2355 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2356 if (relsize < 0)
2357 bfd_fatal (bfd_get_filename (abfd));
2359 printf ("DYNAMIC RELOCATION RECORDS");
2361 if (relsize == 0)
2363 printf (" (none)\n\n");
2365 else
2367 relpp = (arelent **) xmalloc (relsize);
2368 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2369 if (relcount < 0)
2370 bfd_fatal (bfd_get_filename (abfd));
2371 else if (relcount == 0)
2373 printf (" (none)\n\n");
2375 else
2377 printf ("\n");
2378 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2379 printf ("\n\n");
2381 free (relpp);
2385 static void
2386 dump_reloc_set (abfd, sec, relpp, relcount)
2387 bfd *abfd;
2388 asection *sec;
2389 arelent **relpp;
2390 long relcount;
2392 arelent **p;
2393 char *last_filename, *last_functionname;
2394 unsigned int last_line;
2396 /* Get column headers lined up reasonably. */
2398 static int width;
2399 if (width == 0)
2401 char buf[30];
2402 sprintf_vma (buf, (bfd_vma) -1);
2403 width = strlen (buf) - 7;
2405 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2408 last_filename = NULL;
2409 last_functionname = NULL;
2410 last_line = 0;
2412 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2414 arelent *q = *p;
2415 const char *filename, *functionname;
2416 unsigned int line;
2417 const char *sym_name;
2418 const char *section_name;
2420 if (start_address != (bfd_vma) -1
2421 && q->address < start_address)
2422 continue;
2423 if (stop_address != (bfd_vma) -1
2424 && q->address > stop_address)
2425 continue;
2427 if (with_line_numbers
2428 && sec != NULL
2429 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2430 &filename, &functionname, &line))
2432 if (functionname != NULL
2433 && (last_functionname == NULL
2434 || strcmp (functionname, last_functionname) != 0))
2436 printf ("%s():\n", functionname);
2437 if (last_functionname != NULL)
2438 free (last_functionname);
2439 last_functionname = xstrdup (functionname);
2441 if (line > 0
2442 && (line != last_line
2443 || (filename != NULL
2444 && last_filename != NULL
2445 && strcmp (filename, last_filename) != 0)))
2447 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2448 last_line = line;
2449 if (last_filename != NULL)
2450 free (last_filename);
2451 if (filename == NULL)
2452 last_filename = NULL;
2453 else
2454 last_filename = xstrdup (filename);
2458 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2460 sym_name = (*(q->sym_ptr_ptr))->name;
2461 section_name = (*(q->sym_ptr_ptr))->section->name;
2463 else
2465 sym_name = NULL;
2466 section_name = NULL;
2468 if (sym_name)
2470 printf_vma (q->address);
2471 printf (" %-16s ", q->howto->name);
2472 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2473 *q->sym_ptr_ptr);
2475 else
2477 if (section_name == (CONST char *) NULL)
2478 section_name = "*unknown*";
2479 printf_vma (q->address);
2480 printf (" %-16s [%s]",
2481 q->howto->name,
2482 section_name);
2484 if (q->addend)
2486 printf ("+0x");
2487 printf_vma (q->addend);
2489 printf ("\n");
2493 /* The length of the longest architecture name + 1. */
2494 #define LONGEST_ARCH sizeof("rs6000:6000")
2496 static const char *
2497 endian_string (endian)
2498 enum bfd_endian endian;
2500 if (endian == BFD_ENDIAN_BIG)
2501 return "big endian";
2502 else if (endian == BFD_ENDIAN_LITTLE)
2503 return "little endian";
2504 else
2505 return "endianness unknown";
2508 /* List the targets that BFD is configured to support, each followed
2509 by its endianness and the architectures it supports. */
2511 static void
2512 display_target_list ()
2514 extern bfd_target *bfd_target_vector[];
2515 char *dummy_name;
2516 int t;
2518 dummy_name = choose_temp_base ();
2519 for (t = 0; bfd_target_vector[t]; t++)
2521 bfd_target *p = bfd_target_vector[t];
2522 bfd *abfd = bfd_openw (dummy_name, p->name);
2523 int a;
2525 printf ("%s\n (header %s, data %s)\n", p->name,
2526 endian_string (p->header_byteorder),
2527 endian_string (p->byteorder));
2529 if (abfd == NULL)
2531 bfd_nonfatal (dummy_name);
2532 continue;
2535 if (! bfd_set_format (abfd, bfd_object))
2537 if (bfd_get_error () != bfd_error_invalid_operation)
2538 bfd_nonfatal (p->name);
2539 continue;
2542 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2543 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2544 printf (" %s\n",
2545 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2547 unlink (dummy_name);
2548 free (dummy_name);
2551 /* Print a table showing which architectures are supported for entries
2552 FIRST through LAST-1 of bfd_target_vector (targets across,
2553 architectures down). */
2555 static void
2556 display_info_table (first, last)
2557 int first;
2558 int last;
2560 extern bfd_target *bfd_target_vector[];
2561 int t, a;
2562 char *dummy_name;
2564 /* Print heading of target names. */
2565 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2566 for (t = first; t < last && bfd_target_vector[t]; t++)
2567 printf ("%s ", bfd_target_vector[t]->name);
2568 putchar ('\n');
2570 dummy_name = choose_temp_base ();
2571 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2572 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2574 printf ("%*s ", (int) LONGEST_ARCH - 1,
2575 bfd_printable_arch_mach (a, 0));
2576 for (t = first; t < last && bfd_target_vector[t]; t++)
2578 bfd_target *p = bfd_target_vector[t];
2579 boolean ok = true;
2580 bfd *abfd = bfd_openw (dummy_name, p->name);
2582 if (abfd == NULL)
2584 bfd_nonfatal (p->name);
2585 ok = false;
2588 if (ok)
2590 if (! bfd_set_format (abfd, bfd_object))
2592 if (bfd_get_error () != bfd_error_invalid_operation)
2593 bfd_nonfatal (p->name);
2594 ok = false;
2598 if (ok)
2600 if (! bfd_set_arch_mach (abfd, a, 0))
2601 ok = false;
2604 if (ok)
2605 printf ("%s ", p->name);
2606 else
2608 int l = strlen (p->name);
2609 while (l--)
2610 putchar ('-');
2611 putchar (' ');
2614 putchar ('\n');
2616 unlink (dummy_name);
2617 free (dummy_name);
2620 /* Print tables of all the target-architecture combinations that
2621 BFD has been configured to support. */
2623 static void
2624 display_target_tables ()
2626 int t, columns;
2627 extern bfd_target *bfd_target_vector[];
2628 char *colum;
2630 columns = 0;
2631 colum = getenv ("COLUMNS");
2632 if (colum != NULL)
2633 columns = atoi (colum);
2634 if (columns == 0)
2635 columns = 80;
2637 t = 0;
2638 while (bfd_target_vector[t] != NULL)
2640 int oldt = t, wid;
2642 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2643 ++t;
2644 while (wid < columns && bfd_target_vector[t] != NULL)
2646 int newwid;
2648 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2649 if (newwid >= columns)
2650 break;
2651 wid = newwid;
2652 ++t;
2654 display_info_table (oldt, t);
2658 static void
2659 display_info ()
2661 printf (_("BFD header file version %s\n"), BFD_VERSION);
2662 display_target_list ();
2663 display_target_tables ();
2667 main (argc, argv)
2668 int argc;
2669 char **argv;
2671 int c;
2672 char *target = default_target;
2673 boolean seenflag = false;
2675 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2676 setlocale (LC_MESSAGES, "");
2677 #endif
2678 bindtextdomain (PACKAGE, LOCALEDIR);
2679 textdomain (PACKAGE);
2681 program_name = *argv;
2682 xmalloc_set_program_name (program_name);
2684 START_PROGRESS (program_name, 0);
2686 bfd_init ();
2687 set_default_bfd_target ();
2689 while ((c = getopt_long (argc, argv, "pib:m:VCdDlfahrRtTxsSj:wE:",
2690 long_options, (int *) 0))
2691 != EOF)
2693 if (c != 'l' && c != OPTION_START_ADDRESS && c != OPTION_STOP_ADDRESS)
2694 seenflag = true;
2695 switch (c)
2697 case 0:
2698 break; /* we've been given a long option */
2699 case 'm':
2700 machine = optarg;
2701 break;
2702 case 'j':
2703 only = optarg;
2704 break;
2705 case 'l':
2706 with_line_numbers = 1;
2707 break;
2708 case 'b':
2709 target = optarg;
2710 break;
2711 case 'f':
2712 dump_file_header = true;
2713 break;
2714 case 'i':
2715 formats_info = true;
2716 break;
2717 case 'p':
2718 dump_private_headers = 1;
2719 break;
2720 case 'x':
2721 dump_private_headers = 1;
2722 dump_symtab = 1;
2723 dump_reloc_info = 1;
2724 dump_file_header = true;
2725 dump_ar_hdrs = 1;
2726 dump_section_headers = 1;
2727 break;
2728 case 't':
2729 dump_symtab = 1;
2730 break;
2731 case 'T':
2732 dump_dynamic_symtab = 1;
2733 break;
2734 case 'C':
2735 do_demangle = 1;
2736 break;
2737 case 'd':
2738 disassemble = true;
2739 break;
2740 case 'D':
2741 disassemble = disassemble_all = true;
2742 break;
2743 case 'S':
2744 disassemble = true;
2745 with_source_code = true;
2746 break;
2747 case 's':
2748 dump_section_contents = 1;
2749 break;
2750 case 'r':
2751 dump_reloc_info = 1;
2752 break;
2753 case 'R':
2754 dump_dynamic_reloc_info = 1;
2755 break;
2756 case 'a':
2757 dump_ar_hdrs = 1;
2758 break;
2759 case 'h':
2760 dump_section_headers = 1;
2761 break;
2762 case 'H':
2763 usage (stdout, 0);
2764 case 'V':
2765 show_version = 1;
2766 break;
2767 case 'w':
2768 wide_output = 1;
2769 break;
2770 case OPTION_ADJUST_VMA:
2771 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2772 break;
2773 case OPTION_START_ADDRESS:
2774 start_address = parse_vma (optarg, "--start-address");
2775 break;
2776 case OPTION_STOP_ADDRESS:
2777 stop_address = parse_vma (optarg, "--stop-address");
2778 break;
2779 case 'E':
2780 if (strcmp (optarg, "B") == 0)
2781 endian = BFD_ENDIAN_BIG;
2782 else if (strcmp (optarg, "L") == 0)
2783 endian = BFD_ENDIAN_LITTLE;
2784 else
2786 fprintf (stderr, _("%s: unrecognized -E option\n"), program_name);
2787 usage (stderr, 1);
2789 break;
2790 case OPTION_ENDIAN:
2791 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2792 endian = BFD_ENDIAN_BIG;
2793 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2794 endian = BFD_ENDIAN_LITTLE;
2795 else
2797 fprintf (stderr, _("%s: unrecognized --endian type `%s'\n"),
2798 program_name, optarg);
2799 usage (stderr, 1);
2801 break;
2802 default:
2803 usage (stderr, 1);
2807 if (show_version)
2808 print_version ("objdump");
2810 if (seenflag == false)
2811 usage (stderr, 1);
2813 if (formats_info)
2815 display_info ();
2817 else
2819 if (optind == argc)
2820 display_file ("a.out", target);
2821 else
2822 for (; optind < argc;)
2823 display_file (argv[optind++], target);
2826 END_PROGRESS (program_name);
2828 return 0;