* "objcopy -O binary" warning tweak, suggested by dmoseley
[binutils-gdb.git] / binutils / objdump.c
blob21dcd09e1be8a4f00265f104ed1f0ab17859b6d0
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 1998
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 {
1093 char *buffer;
1094 char *current;
1095 } SFILE;
1097 /* sprintf to a "stream" */
1099 #ifdef ANSI_PROTOTYPES
1100 static int
1101 objdump_sprintf (SFILE *f, const char *format, ...)
1103 int n;
1104 va_list args;
1106 va_start (args, format);
1107 vsprintf (f->current, format, args);
1108 f->current += n = strlen (f->current);
1109 va_end (args);
1110 return n;
1112 #else
1113 static int
1114 objdump_sprintf (va_alist)
1115 va_dcl
1117 int n;
1118 SFILE *f;
1119 const char *format;
1120 va_list args;
1122 va_start (args);
1123 f = va_arg (args, SFILE *);
1124 format = va_arg (args, const char *);
1125 vsprintf (f->current, format, args);
1126 f->current += n = strlen (f->current);
1127 va_end (args);
1128 return n;
1130 #endif
1132 /* The number of zeroes we want to see before we start skipping them.
1133 The number is arbitrarily chosen. */
1135 #define SKIP_ZEROES (8)
1137 /* The number of zeroes to skip at the end of a section. If the
1138 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1139 SKIP_ZEROES, they will be disassembled. If there are fewer than
1140 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1141 attempt to avoid disassembling zeroes inserted by section
1142 alignment. */
1144 #define SKIP_ZEROES_AT_END (3)
1146 /* Disassemble some data in memory between given values. */
1148 static void
1149 disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp,
1150 relppend)
1151 struct disassemble_info *info;
1152 disassembler_ftype disassemble_fn;
1153 boolean insns;
1154 bfd_byte *data;
1155 bfd_vma start;
1156 bfd_vma stop;
1157 arelent ***relppp;
1158 arelent **relppend;
1160 struct objdump_disasm_info *aux;
1161 asection *section;
1162 int bytes_per_line;
1163 boolean done_dot;
1164 int skip_addr_chars;
1165 bfd_vma i;
1167 aux = (struct objdump_disasm_info *) info->application_data;
1168 section = aux->sec;
1170 if (insns)
1171 bytes_per_line = 4;
1172 else
1173 bytes_per_line = 16;
1175 /* Figure out how many characters to skip at the start of an
1176 address, to make the disassembly look nicer. We discard leading
1177 zeroes in chunks of 4, ensuring that there is always a leading
1178 zero remaining. */
1179 skip_addr_chars = 0;
1180 if (! prefix_addresses)
1182 char buf[30];
1183 char *s;
1185 sprintf_vma (buf,
1186 section->vma + bfd_section_size (section->owner, section));
1187 s = buf;
1188 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1189 && s[4] == '0')
1191 skip_addr_chars += 4;
1192 s += 4;
1196 info->insn_info_valid = 0;
1198 done_dot = false;
1199 i = start;
1200 while (i < stop)
1202 bfd_vma z;
1203 int bytes;
1204 boolean need_nl = false;
1206 /* If we see more than SKIP_ZEROES bytes of zeroes, we just
1207 print `...'. */
1208 for (z = i; z < stop; z++)
1209 if (data[z] != 0)
1210 break;
1211 if (! disassemble_zeroes
1212 && (info->insn_info_valid == 0
1213 || info->branch_delay_insns == 0)
1214 && (z - i >= SKIP_ZEROES
1215 || (z == stop && z - i < SKIP_ZEROES_AT_END)))
1217 printf ("\t...\n");
1219 /* If there are more nonzero bytes to follow, we only skip
1220 zeroes in multiples of 4, to try to avoid running over
1221 the start of an instruction which happens to start with
1222 zero. */
1223 if (z != stop)
1224 z = i + ((z - i) &~ 3);
1226 bytes = z - i;
1228 else
1230 char buf[1000];
1231 SFILE sfile;
1232 int bpc = 0;
1233 int pb = 0;
1235 done_dot = false;
1237 if (with_line_numbers || with_source_code)
1238 show_line (aux->abfd, section, i);
1240 if (! prefix_addresses)
1242 char *s;
1244 sprintf_vma (buf, section->vma + i);
1245 for (s = buf + skip_addr_chars; *s == '0'; s++)
1246 *s = ' ';
1247 if (*s == '\0')
1248 *--s = '0';
1249 printf ("%s:\t", buf + skip_addr_chars);
1251 else
1253 aux->require_sec = true;
1254 objdump_print_address (section->vma + i, info);
1255 aux->require_sec = false;
1256 putchar (' ');
1259 if (insns)
1261 sfile.buffer = sfile.current = buf;
1262 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1263 info->stream = (FILE *) &sfile;
1264 info->bytes_per_line = 0;
1265 info->bytes_per_chunk = 0;
1266 if ((*relppp < relppend) && ((**relppp)->address >= (bfd_vma) i &&
1267 (**relppp)->address < (bfd_vma) i + bytes))
1268 info->flags = INSN_HAS_RELOC;
1269 else
1270 info->flags = 0;
1271 bytes = (*disassemble_fn) (section->vma + i, info);
1272 info->fprintf_func = (fprintf_ftype) fprintf;
1273 info->stream = stdout;
1274 if (info->bytes_per_line != 0)
1275 bytes_per_line = info->bytes_per_line;
1276 if (bytes < 0)
1277 break;
1279 else
1281 long j;
1283 bytes = bytes_per_line;
1284 if (i + bytes > stop)
1285 bytes = stop - i;
1287 for (j = i; j < i + bytes; ++j)
1289 if (isprint (data[j]))
1290 buf[j - i] = data[j];
1291 else
1292 buf[j - i] = '.';
1294 buf[j - i] = '\0';
1297 if (prefix_addresses
1298 ? show_raw_insn > 0
1299 : show_raw_insn >= 0)
1301 long j;
1303 /* If ! prefix_addresses and ! wide_output, we print
1304 bytes_per_line bytes per line. */
1305 pb = bytes;
1306 if (pb > bytes_per_line && ! prefix_addresses && ! wide_output)
1307 pb = bytes_per_line;
1309 if (info->bytes_per_chunk)
1310 bpc = info->bytes_per_chunk;
1311 else
1312 bpc = 1;
1314 for (j = i; j < i + pb; j += bpc)
1316 int k;
1317 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1319 for (k = bpc - 1; k >= 0; k--)
1320 printf ("%02x", (unsigned) data[j + k]);
1321 putchar (' ');
1323 else
1325 for (k = 0; k < bpc; k++)
1326 printf ("%02x", (unsigned) data[j + k]);
1327 putchar (' ');
1331 for (; pb < bytes_per_line; pb += bpc)
1333 int k;
1335 for (k = 0; k < bpc; k++)
1336 printf (" ");
1337 putchar (' ');
1340 /* Separate raw data from instruction by extra space. */
1341 if (insns)
1342 putchar ('\t');
1343 else
1344 printf (" ");
1347 printf ("%s", buf);
1349 if (prefix_addresses
1350 ? show_raw_insn > 0
1351 : show_raw_insn >= 0)
1353 while (pb < bytes)
1355 long j;
1356 char *s;
1358 putchar ('\n');
1359 j = i + pb;
1361 sprintf_vma (buf, section->vma + j);
1362 for (s = buf + skip_addr_chars; *s == '0'; s++)
1363 *s = ' ';
1364 if (*s == '\0')
1365 *--s = '0';
1366 printf ("%s:\t", buf + skip_addr_chars);
1368 pb += bytes_per_line;
1369 if (pb > bytes)
1370 pb = bytes;
1371 for (; j < i + pb; j += bpc)
1373 int k;
1375 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1377 for (k = bpc - 1; k >= 0; k--)
1378 printf ("%02x", (unsigned) data[j + k]);
1379 putchar (' ');
1381 else
1383 for (k = 0; k < bpc; k++)
1384 printf ("%02x", (unsigned) data[j + k]);
1385 putchar (' ');
1391 if (!wide_output)
1392 putchar ('\n');
1393 else
1394 need_nl = true;
1397 if (dump_reloc_info
1398 && (section->flags & SEC_RELOC) != 0)
1400 while ((*relppp) < relppend
1401 && ((**relppp)->address >= (bfd_vma) i
1402 && (**relppp)->address < (bfd_vma) i + bytes))
1404 arelent *q;
1406 q = **relppp;
1408 if (wide_output)
1409 putchar ('\t');
1410 else
1411 printf ("\t\t\t");
1413 objdump_print_value (section->vma + q->address, info, true);
1415 printf (": %s\t", q->howto->name);
1417 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1418 printf ("*unknown*");
1419 else
1421 const char *sym_name;
1423 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1424 if (sym_name != NULL && *sym_name != '\0')
1425 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1426 else
1428 asection *sym_sec;
1430 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1431 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1432 if (sym_name == NULL || *sym_name == '\0')
1433 sym_name = "*unknown*";
1434 printf ("%s", sym_name);
1438 if (q->addend)
1440 printf ("+0x");
1441 objdump_print_value (q->addend, info, true);
1444 printf ("\n");
1445 need_nl = false;
1446 ++(*relppp);
1450 if (need_nl)
1451 printf ("\n");
1453 i += bytes;
1457 /* Disassemble the contents of an object file. */
1459 static void
1460 disassemble_data (abfd)
1461 bfd *abfd;
1463 long i;
1464 disassembler_ftype disassemble_fn;
1465 struct disassemble_info disasm_info;
1466 struct objdump_disasm_info aux;
1467 asection *section;
1469 print_files = NULL;
1470 prev_functionname = NULL;
1471 prev_line = -1;
1473 /* We make a copy of syms to sort. We don't want to sort syms
1474 because that will screw up the relocs. */
1475 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1476 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1478 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1480 /* Sort the symbols into section and symbol order */
1481 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1483 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1484 disasm_info.application_data = (PTR) &aux;
1485 aux.abfd = abfd;
1486 aux.require_sec = false;
1487 disasm_info.print_address_func = objdump_print_address;
1488 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1490 if (machine != (char *) NULL)
1492 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1493 if (info == NULL)
1495 fprintf (stderr, _("%s: Can't use supplied machine %s\n"),
1496 program_name,
1497 machine);
1498 exit (1);
1500 abfd->arch_info = info;
1503 if (endian != BFD_ENDIAN_UNKNOWN)
1505 struct bfd_target *xvec;
1507 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1508 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1509 xvec->byteorder = endian;
1510 abfd->xvec = xvec;
1513 disassemble_fn = disassembler (abfd);
1514 if (!disassemble_fn)
1516 fprintf (stderr, _("%s: Can't disassemble for architecture %s\n"),
1517 program_name,
1518 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1519 return;
1522 disasm_info.flavour = bfd_get_flavour (abfd);
1523 disasm_info.arch = bfd_get_arch (abfd);
1524 disasm_info.mach = bfd_get_mach (abfd);
1525 if (bfd_big_endian (abfd))
1526 disasm_info.endian = BFD_ENDIAN_BIG;
1527 else if (bfd_little_endian (abfd))
1528 disasm_info.endian = BFD_ENDIAN_LITTLE;
1529 else
1530 /* ??? Aborting here seems too drastic. We could default to big or little
1531 instead. */
1532 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1534 for (section = abfd->sections;
1535 section != (asection *) NULL;
1536 section = section->next)
1538 bfd_byte *data = NULL;
1539 bfd_size_type datasize = 0;
1540 arelent **relbuf = NULL;
1541 arelent **relpp = NULL;
1542 arelent **relppend = NULL;
1543 long stop;
1544 asymbol *sym = NULL;
1545 long place = 0;
1547 if ((section->flags & SEC_LOAD) == 0
1548 || (! disassemble_all
1549 && only == NULL
1550 && (section->flags & SEC_CODE) == 0))
1551 continue;
1552 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1553 continue;
1555 if (dump_reloc_info
1556 && (section->flags & SEC_RELOC) != 0)
1558 long relsize;
1560 relsize = bfd_get_reloc_upper_bound (abfd, section);
1561 if (relsize < 0)
1562 bfd_fatal (bfd_get_filename (abfd));
1564 if (relsize > 0)
1566 long relcount;
1568 relbuf = (arelent **) xmalloc (relsize);
1569 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1570 if (relcount < 0)
1571 bfd_fatal (bfd_get_filename (abfd));
1573 /* Sort the relocs by address. */
1574 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1576 relpp = relbuf;
1577 relppend = relpp + relcount;
1581 printf (_("Disassembly of section %s:\n"), section->name);
1583 datasize = bfd_get_section_size_before_reloc (section);
1584 if (datasize == 0)
1585 continue;
1587 data = (bfd_byte *) xmalloc ((size_t) datasize);
1589 bfd_get_section_contents (abfd, section, data, 0, datasize);
1591 aux.sec = section;
1592 disasm_info.buffer = data;
1593 disasm_info.buffer_vma = section->vma;
1594 disasm_info.buffer_length = datasize;
1595 if (start_address == (bfd_vma) -1
1596 || start_address < disasm_info.buffer_vma)
1597 i = 0;
1598 else
1599 i = start_address - disasm_info.buffer_vma;
1600 if (stop_address == (bfd_vma) -1)
1601 stop = datasize;
1602 else
1604 if (stop_address < disasm_info.buffer_vma)
1605 stop = 0;
1606 else
1607 stop = stop_address - disasm_info.buffer_vma;
1608 if (stop > disasm_info.buffer_length)
1609 stop = disasm_info.buffer_length;
1612 sym = find_symbol_for_address (abfd, section, section->vma + i,
1613 true, &place);
1615 while (i < stop)
1617 asymbol *nextsym;
1618 long nextstop;
1619 boolean insns;
1621 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + i)
1623 int x;
1625 for (x = place;
1626 (x < sorted_symcount
1627 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + i);
1628 ++x)
1629 continue;
1630 disasm_info.symbols = & sorted_syms[place];
1631 disasm_info.num_symbols = x - place;
1633 else
1634 disasm_info.symbols = NULL;
1636 if (! prefix_addresses)
1638 printf ("\n");
1639 objdump_print_addr_with_sym (abfd, section, sym,
1640 section->vma + i,
1641 &disasm_info,
1642 false);
1643 printf (":\n");
1646 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1647 nextsym = sym;
1648 else if (sym == NULL)
1649 nextsym = NULL;
1650 else
1652 while (place < sorted_symcount
1653 /* ??? Why the test for != section? */
1654 && (sorted_syms[place]->section != section
1655 || (bfd_asymbol_value (sorted_syms[place])
1656 <= bfd_asymbol_value (sym))))
1657 ++place;
1658 if (place >= sorted_symcount)
1659 nextsym = NULL;
1660 else
1661 nextsym = sorted_syms[place];
1664 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1666 nextstop = bfd_asymbol_value (sym) - section->vma;
1667 if (nextstop > stop)
1668 nextstop = stop;
1670 else if (nextsym == NULL)
1671 nextstop = stop;
1672 else
1674 nextstop = bfd_asymbol_value (nextsym) - section->vma;
1675 if (nextstop > stop)
1676 nextstop = stop;
1679 /* If a symbol is explicitly marked as being an object
1680 rather than a function, just dump the bytes without
1681 disassembling them. */
1682 if (disassemble_all
1683 || sym == NULL
1684 || bfd_asymbol_value (sym) > section->vma + i
1685 || ((sym->flags & BSF_OBJECT) == 0
1686 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1687 == NULL)
1688 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1689 == NULL))
1690 || (sym->flags & BSF_FUNCTION) != 0)
1691 insns = true;
1692 else
1693 insns = false;
1695 disassemble_bytes (&disasm_info, disassemble_fn, insns, data, i,
1696 nextstop, &relpp, relppend);
1698 i = nextstop;
1699 sym = nextsym;
1702 free (data);
1703 if (relbuf != NULL)
1704 free (relbuf);
1706 free (sorted_syms);
1710 /* Define a table of stab values and print-strings. We wish the initializer
1711 could be a direct-mapped table, but instead we build one the first
1712 time we need it. */
1714 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1715 char *strsect_name));
1717 /* Dump the stabs sections from an object file that has a section that
1718 uses Sun stabs encoding. */
1720 static void
1721 dump_stabs (abfd)
1722 bfd *abfd;
1724 dump_section_stabs (abfd, ".stab", ".stabstr");
1725 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1726 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1727 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1730 static bfd_byte *stabs;
1731 static bfd_size_type stab_size;
1733 static char *strtab;
1734 static bfd_size_type stabstr_size;
1736 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1737 and string table section STRSECT_NAME into `strtab'.
1738 If the section exists and was read, allocate the space and return true.
1739 Otherwise return false. */
1741 static boolean
1742 read_section_stabs (abfd, stabsect_name, strsect_name)
1743 bfd *abfd;
1744 const char *stabsect_name;
1745 const char *strsect_name;
1747 asection *stabsect, *stabstrsect;
1749 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1750 if (0 == stabsect)
1752 printf (_("No %s section present\n\n"), stabsect_name);
1753 return false;
1756 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1757 if (0 == stabstrsect)
1759 fprintf (stderr, _("%s: %s has no %s section\n"), program_name,
1760 bfd_get_filename (abfd), strsect_name);
1761 return false;
1764 stab_size = bfd_section_size (abfd, stabsect);
1765 stabstr_size = bfd_section_size (abfd, stabstrsect);
1767 stabs = (bfd_byte *) xmalloc (stab_size);
1768 strtab = (char *) xmalloc (stabstr_size);
1770 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1772 fprintf (stderr, _("%s: Reading %s section of %s failed: %s\n"),
1773 program_name, stabsect_name, bfd_get_filename (abfd),
1774 bfd_errmsg (bfd_get_error ()));
1775 free (stabs);
1776 free (strtab);
1777 return false;
1780 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1781 stabstr_size))
1783 fprintf (stderr, _("%s: Reading %s section of %s failed: %s\n"),
1784 program_name, strsect_name, bfd_get_filename (abfd),
1785 bfd_errmsg (bfd_get_error ()));
1786 free (stabs);
1787 free (strtab);
1788 return false;
1791 return true;
1794 /* Stabs entries use a 12 byte format:
1795 4 byte string table index
1796 1 byte stab type
1797 1 byte stab other field
1798 2 byte stab desc field
1799 4 byte stab value
1800 FIXME: This will have to change for a 64 bit object format. */
1802 #define STRDXOFF (0)
1803 #define TYPEOFF (4)
1804 #define OTHEROFF (5)
1805 #define DESCOFF (6)
1806 #define VALOFF (8)
1807 #define STABSIZE (12)
1809 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1810 using string table section STRSECT_NAME (in `strtab'). */
1812 static void
1813 print_section_stabs (abfd, stabsect_name, strsect_name)
1814 bfd *abfd;
1815 const char *stabsect_name;
1816 const char *strsect_name;
1818 int i;
1819 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1820 bfd_byte *stabp, *stabs_end;
1822 stabp = stabs;
1823 stabs_end = stabp + stab_size;
1825 printf (_("Contents of %s section:\n\n"), stabsect_name);
1826 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1828 /* Loop through all symbols and print them.
1830 We start the index at -1 because there is a dummy symbol on
1831 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1833 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1835 const char *name;
1836 unsigned long strx;
1837 unsigned char type, other;
1838 unsigned short desc;
1839 bfd_vma value;
1841 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1842 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1843 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1844 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1845 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1847 printf ("\n%-6d ", i);
1848 /* Either print the stab name, or, if unnamed, print its number
1849 again (makes consistent formatting for tools like awk). */
1850 name = bfd_get_stab_name (type);
1851 if (name != NULL)
1852 printf ("%-6s", name);
1853 else if (type == N_UNDF)
1854 printf ("HdrSym");
1855 else
1856 printf ("%-6d", type);
1857 printf (" %-6d %-6d ", other, desc);
1858 printf_vma (value);
1859 printf (" %-6lu", strx);
1861 /* Symbols with type == 0 (N_UNDF) specify the length of the
1862 string table associated with this file. We use that info
1863 to know how to relocate the *next* file's string table indices. */
1865 if (type == N_UNDF)
1867 file_string_table_offset = next_file_string_table_offset;
1868 next_file_string_table_offset += value;
1870 else
1872 /* Using the (possibly updated) string table offset, print the
1873 string (if any) associated with this symbol. */
1875 if ((strx + file_string_table_offset) < stabstr_size)
1876 printf (" %s", &strtab[strx + file_string_table_offset]);
1877 else
1878 printf (" *");
1881 printf ("\n\n");
1884 static void
1885 dump_section_stabs (abfd, stabsect_name, strsect_name)
1886 bfd *abfd;
1887 char *stabsect_name;
1888 char *strsect_name;
1890 asection *s;
1892 /* Check for section names for which stabsect_name is a prefix, to
1893 handle .stab0, etc. */
1894 for (s = abfd->sections;
1895 s != NULL;
1896 s = s->next)
1898 int len;
1900 len = strlen (stabsect_name);
1902 /* If the prefix matches, and the files section name ends with a
1903 nul or a digit, then we match. I.e., we want either an exact
1904 match or a section followed by a number. */
1905 if (strncmp (stabsect_name, s->name, len) == 0
1906 && (s->name[len] == '\000'
1907 || isdigit ((unsigned char) s->name[len])))
1909 if (read_section_stabs (abfd, s->name, strsect_name))
1911 print_section_stabs (abfd, s->name, strsect_name);
1912 free (stabs);
1913 free (strtab);
1919 static void
1920 dump_bfd_header (abfd)
1921 bfd *abfd;
1923 char *comma = "";
1925 printf (_("architecture: %s, "),
1926 bfd_printable_arch_mach (bfd_get_arch (abfd),
1927 bfd_get_mach (abfd)));
1928 printf (_("flags 0x%08x:\n"), abfd->flags);
1930 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
1931 PF (HAS_RELOC, "HAS_RELOC");
1932 PF (EXEC_P, "EXEC_P");
1933 PF (HAS_LINENO, "HAS_LINENO");
1934 PF (HAS_DEBUG, "HAS_DEBUG");
1935 PF (HAS_SYMS, "HAS_SYMS");
1936 PF (HAS_LOCALS, "HAS_LOCALS");
1937 PF (DYNAMIC, "DYNAMIC");
1938 PF (WP_TEXT, "WP_TEXT");
1939 PF (D_PAGED, "D_PAGED");
1940 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
1941 printf (_("\nstart address 0x"));
1942 printf_vma (abfd->start_address);
1943 printf ("\n");
1946 static void
1947 dump_bfd_private_header (abfd)
1948 bfd *abfd;
1950 bfd_print_private_bfd_data (abfd, stdout);
1953 static void
1954 display_bfd (abfd)
1955 bfd *abfd;
1957 char **matching;
1959 if (!bfd_check_format_matches (abfd, bfd_object, &matching))
1961 bfd_nonfatal (bfd_get_filename (abfd));
1962 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1964 list_matching_formats (matching);
1965 free (matching);
1967 return;
1970 /* If we are adjusting section VMA's, change them all now. Changing
1971 the BFD information is a hack. However, we must do it, or
1972 bfd_find_nearest_line will not do the right thing. */
1973 if (adjust_section_vma != 0)
1975 asection *s;
1977 for (s = abfd->sections; s != NULL; s = s->next)
1979 s->vma += adjust_section_vma;
1980 s->lma += adjust_section_vma;
1984 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
1985 abfd->xvec->name);
1986 if (dump_ar_hdrs)
1987 print_arelt_descr (stdout, abfd, true);
1988 if (dump_file_header)
1989 dump_bfd_header (abfd);
1990 if (dump_private_headers)
1991 dump_bfd_private_header (abfd);
1992 putchar ('\n');
1993 if (dump_section_headers)
1994 dump_headers (abfd);
1995 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
1997 syms = slurp_symtab (abfd);
1999 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2001 dynsyms = slurp_dynamic_symtab (abfd);
2003 if (dump_symtab)
2004 dump_symbols (abfd, false);
2005 if (dump_dynamic_symtab)
2006 dump_symbols (abfd, true);
2007 if (dump_stab_section_info)
2008 dump_stabs (abfd);
2009 if (dump_reloc_info && ! disassemble)
2010 dump_relocs (abfd);
2011 if (dump_dynamic_reloc_info)
2012 dump_dynamic_relocs (abfd);
2013 if (dump_section_contents)
2014 dump_data (abfd);
2015 if (disassemble)
2016 disassemble_data (abfd);
2017 if (dump_debugging)
2019 PTR dhandle;
2021 dhandle = read_debugging_info (abfd, syms, symcount);
2022 if (dhandle != NULL)
2024 if (! print_debugging_info (stdout, dhandle))
2025 fprintf (stderr, _("%s: printing debugging information failed\n"),
2026 bfd_get_filename (abfd));
2029 if (syms)
2031 free (syms);
2032 syms = NULL;
2034 if (dynsyms)
2036 free (dynsyms);
2037 dynsyms = NULL;
2041 static void
2042 display_file (filename, target)
2043 char *filename;
2044 char *target;
2046 bfd *file, *arfile = (bfd *) NULL;
2048 file = bfd_openr (filename, target);
2049 if (file == NULL)
2051 bfd_nonfatal (filename);
2052 return;
2055 if (bfd_check_format (file, bfd_archive) == true)
2057 bfd *last_arfile = NULL;
2059 printf (_("In archive %s:\n"), bfd_get_filename (file));
2060 for (;;)
2062 bfd_set_error (bfd_error_no_error);
2064 arfile = bfd_openr_next_archived_file (file, arfile);
2065 if (arfile == NULL)
2067 if (bfd_get_error () != bfd_error_no_more_archived_files)
2069 bfd_nonfatal (bfd_get_filename (file));
2071 break;
2074 display_bfd (arfile);
2076 if (last_arfile != NULL)
2077 bfd_close (last_arfile);
2078 last_arfile = arfile;
2081 if (last_arfile != NULL)
2082 bfd_close (last_arfile);
2084 else
2085 display_bfd (file);
2087 bfd_close (file);
2090 /* Actually display the various requested regions */
2092 static void
2093 dump_data (abfd)
2094 bfd *abfd;
2096 asection *section;
2097 bfd_byte *data = 0;
2098 bfd_size_type datasize = 0;
2099 bfd_size_type i;
2100 bfd_size_type start, stop;
2102 for (section = abfd->sections; section != NULL; section =
2103 section->next)
2105 int onaline = 16;
2107 if (only == (char *) NULL ||
2108 strcmp (only, section->name) == 0)
2110 if (section->flags & SEC_HAS_CONTENTS)
2112 printf (_("Contents of section %s:\n"), section->name);
2114 if (bfd_section_size (abfd, section) == 0)
2115 continue;
2116 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2117 datasize = bfd_section_size (abfd, section);
2120 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2122 if (start_address == (bfd_vma) -1
2123 || start_address < section->vma)
2124 start = 0;
2125 else
2126 start = start_address - section->vma;
2127 if (stop_address == (bfd_vma) -1)
2128 stop = bfd_section_size (abfd, section);
2129 else
2131 if (stop_address < section->vma)
2132 stop = 0;
2133 else
2134 stop = stop_address - section->vma;
2135 if (stop > bfd_section_size (abfd, section))
2136 stop = bfd_section_size (abfd, section);
2138 for (i = start; i < stop; i += onaline)
2140 bfd_size_type j;
2142 printf (" %04lx ", (unsigned long int) (i + section->vma));
2143 for (j = i; j < i + onaline; j++)
2145 if (j < stop)
2146 printf ("%02x", (unsigned) (data[j]));
2147 else
2148 printf (" ");
2149 if ((j & 3) == 3)
2150 printf (" ");
2153 printf (" ");
2154 for (j = i; j < i + onaline; j++)
2156 if (j >= stop)
2157 printf (" ");
2158 else
2159 printf ("%c", isprint (data[j]) ? data[j] : '.');
2161 putchar ('\n');
2163 free (data);
2169 /* Should perhaps share code and display with nm? */
2170 static void
2171 dump_symbols (abfd, dynamic)
2172 bfd *abfd;
2173 boolean dynamic;
2175 asymbol **current;
2176 long max;
2177 long count;
2179 if (dynamic)
2181 current = dynsyms;
2182 max = dynsymcount;
2183 if (max == 0)
2184 return;
2185 printf ("DYNAMIC SYMBOL TABLE:\n");
2187 else
2189 current = syms;
2190 max = symcount;
2191 if (max == 0)
2192 return;
2193 printf ("SYMBOL TABLE:\n");
2196 for (count = 0; count < max; count++)
2198 if (*current)
2200 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2202 if (cur_bfd != NULL)
2204 const char *name;
2205 char *alloc;
2207 name = bfd_asymbol_name (*current);
2208 alloc = NULL;
2209 if (do_demangle && name != NULL && *name != '\0')
2211 const char *n;
2213 /* If we want to demangle the name, we demangle it
2214 here, and temporarily clobber it while calling
2215 bfd_print_symbol. FIXME: This is a gross hack. */
2217 n = name;
2218 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2219 ++n;
2220 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2221 if (alloc != NULL)
2222 (*current)->name = alloc;
2223 else
2224 (*current)->name = n;
2227 bfd_print_symbol (cur_bfd, stdout, *current,
2228 bfd_print_symbol_all);
2230 (*current)->name = name;
2231 if (alloc != NULL)
2232 free (alloc);
2234 printf ("\n");
2237 current++;
2239 printf ("\n");
2240 printf ("\n");
2243 static void
2244 dump_relocs (abfd)
2245 bfd *abfd;
2247 arelent **relpp;
2248 long relcount;
2249 asection *a;
2251 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2253 long relsize;
2255 if (bfd_is_abs_section (a))
2256 continue;
2257 if (bfd_is_und_section (a))
2258 continue;
2259 if (bfd_is_com_section (a))
2260 continue;
2262 if (only)
2264 if (strcmp (only, a->name))
2265 continue;
2267 else if ((a->flags & SEC_RELOC) == 0)
2268 continue;
2270 relsize = bfd_get_reloc_upper_bound (abfd, a);
2271 if (relsize < 0)
2272 bfd_fatal (bfd_get_filename (abfd));
2274 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2276 if (relsize == 0)
2278 printf (" (none)\n\n");
2280 else
2282 relpp = (arelent **) xmalloc (relsize);
2283 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2284 if (relcount < 0)
2285 bfd_fatal (bfd_get_filename (abfd));
2286 else if (relcount == 0)
2288 printf (" (none)\n\n");
2290 else
2292 printf ("\n");
2293 dump_reloc_set (abfd, a, relpp, relcount);
2294 printf ("\n\n");
2296 free (relpp);
2301 static void
2302 dump_dynamic_relocs (abfd)
2303 bfd *abfd;
2305 long relsize;
2306 arelent **relpp;
2307 long relcount;
2309 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2310 if (relsize < 0)
2311 bfd_fatal (bfd_get_filename (abfd));
2313 printf ("DYNAMIC RELOCATION RECORDS");
2315 if (relsize == 0)
2317 printf (" (none)\n\n");
2319 else
2321 relpp = (arelent **) xmalloc (relsize);
2322 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2323 if (relcount < 0)
2324 bfd_fatal (bfd_get_filename (abfd));
2325 else if (relcount == 0)
2327 printf (" (none)\n\n");
2329 else
2331 printf ("\n");
2332 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2333 printf ("\n\n");
2335 free (relpp);
2339 static void
2340 dump_reloc_set (abfd, sec, relpp, relcount)
2341 bfd *abfd;
2342 asection *sec;
2343 arelent **relpp;
2344 long relcount;
2346 arelent **p;
2347 char *last_filename, *last_functionname;
2348 unsigned int last_line;
2350 /* Get column headers lined up reasonably. */
2352 static int width;
2353 if (width == 0)
2355 char buf[30];
2356 sprintf_vma (buf, (bfd_vma) -1);
2357 width = strlen (buf) - 7;
2359 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2362 last_filename = NULL;
2363 last_functionname = NULL;
2364 last_line = 0;
2366 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2368 arelent *q = *p;
2369 const char *filename, *functionname;
2370 unsigned int line;
2371 const char *sym_name;
2372 const char *section_name;
2374 if (start_address != (bfd_vma) -1
2375 && q->address < start_address)
2376 continue;
2377 if (stop_address != (bfd_vma) -1
2378 && q->address > stop_address)
2379 continue;
2381 if (with_line_numbers
2382 && sec != NULL
2383 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2384 &filename, &functionname, &line))
2386 if (functionname != NULL
2387 && (last_functionname == NULL
2388 || strcmp (functionname, last_functionname) != 0))
2390 printf ("%s():\n", functionname);
2391 if (last_functionname != NULL)
2392 free (last_functionname);
2393 last_functionname = xstrdup (functionname);
2395 if (line > 0
2396 && (line != last_line
2397 || (filename != NULL
2398 && last_filename != NULL
2399 && strcmp (filename, last_filename) != 0)))
2401 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2402 last_line = line;
2403 if (last_filename != NULL)
2404 free (last_filename);
2405 if (filename == NULL)
2406 last_filename = NULL;
2407 else
2408 last_filename = xstrdup (filename);
2412 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2414 sym_name = (*(q->sym_ptr_ptr))->name;
2415 section_name = (*(q->sym_ptr_ptr))->section->name;
2417 else
2419 sym_name = NULL;
2420 section_name = NULL;
2422 if (sym_name)
2424 printf_vma (q->address);
2425 printf (" %-16s ", q->howto->name);
2426 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2427 *q->sym_ptr_ptr);
2429 else
2431 if (section_name == (CONST char *) NULL)
2432 section_name = "*unknown*";
2433 printf_vma (q->address);
2434 printf (" %-16s [%s]",
2435 q->howto->name,
2436 section_name);
2438 if (q->addend)
2440 printf ("+0x");
2441 printf_vma (q->addend);
2443 printf ("\n");
2447 /* The length of the longest architecture name + 1. */
2448 #define LONGEST_ARCH sizeof("rs6000:6000")
2450 static const char *
2451 endian_string (endian)
2452 enum bfd_endian endian;
2454 if (endian == BFD_ENDIAN_BIG)
2455 return "big endian";
2456 else if (endian == BFD_ENDIAN_LITTLE)
2457 return "little endian";
2458 else
2459 return "endianness unknown";
2462 /* List the targets that BFD is configured to support, each followed
2463 by its endianness and the architectures it supports. */
2465 static void
2466 display_target_list ()
2468 extern bfd_target *bfd_target_vector[];
2469 char *dummy_name;
2470 int t;
2472 dummy_name = choose_temp_base ();
2473 for (t = 0; bfd_target_vector[t]; t++)
2475 bfd_target *p = bfd_target_vector[t];
2476 bfd *abfd = bfd_openw (dummy_name, p->name);
2477 int a;
2479 printf ("%s\n (header %s, data %s)\n", p->name,
2480 endian_string (p->header_byteorder),
2481 endian_string (p->byteorder));
2483 if (abfd == NULL)
2485 bfd_nonfatal (dummy_name);
2486 continue;
2489 if (! bfd_set_format (abfd, bfd_object))
2491 if (bfd_get_error () != bfd_error_invalid_operation)
2492 bfd_nonfatal (p->name);
2493 continue;
2496 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2497 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2498 printf (" %s\n",
2499 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2501 unlink (dummy_name);
2502 free (dummy_name);
2505 /* Print a table showing which architectures are supported for entries
2506 FIRST through LAST-1 of bfd_target_vector (targets across,
2507 architectures down). */
2509 static void
2510 display_info_table (first, last)
2511 int first;
2512 int last;
2514 extern bfd_target *bfd_target_vector[];
2515 int t, a;
2516 char *dummy_name;
2518 /* Print heading of target names. */
2519 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2520 for (t = first; t < last && bfd_target_vector[t]; t++)
2521 printf ("%s ", bfd_target_vector[t]->name);
2522 putchar ('\n');
2524 dummy_name = choose_temp_base ();
2525 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2526 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2528 printf ("%*s ", (int) LONGEST_ARCH - 1,
2529 bfd_printable_arch_mach (a, 0));
2530 for (t = first; t < last && bfd_target_vector[t]; t++)
2532 bfd_target *p = bfd_target_vector[t];
2533 boolean ok = true;
2534 bfd *abfd = bfd_openw (dummy_name, p->name);
2536 if (abfd == NULL)
2538 bfd_nonfatal (p->name);
2539 ok = false;
2542 if (ok)
2544 if (! bfd_set_format (abfd, bfd_object))
2546 if (bfd_get_error () != bfd_error_invalid_operation)
2547 bfd_nonfatal (p->name);
2548 ok = false;
2552 if (ok)
2554 if (! bfd_set_arch_mach (abfd, a, 0))
2555 ok = false;
2558 if (ok)
2559 printf ("%s ", p->name);
2560 else
2562 int l = strlen (p->name);
2563 while (l--)
2564 putchar ('-');
2565 putchar (' ');
2568 putchar ('\n');
2570 unlink (dummy_name);
2571 free (dummy_name);
2574 /* Print tables of all the target-architecture combinations that
2575 BFD has been configured to support. */
2577 static void
2578 display_target_tables ()
2580 int t, columns;
2581 extern bfd_target *bfd_target_vector[];
2582 char *colum;
2584 columns = 0;
2585 colum = getenv ("COLUMNS");
2586 if (colum != NULL)
2587 columns = atoi (colum);
2588 if (columns == 0)
2589 columns = 80;
2591 t = 0;
2592 while (bfd_target_vector[t] != NULL)
2594 int oldt = t, wid;
2596 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2597 ++t;
2598 while (wid < columns && bfd_target_vector[t] != NULL)
2600 int newwid;
2602 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2603 if (newwid >= columns)
2604 break;
2605 wid = newwid;
2606 ++t;
2608 display_info_table (oldt, t);
2612 static void
2613 display_info ()
2615 printf (_("BFD header file version %s\n"), BFD_VERSION);
2616 display_target_list ();
2617 display_target_tables ();
2621 main (argc, argv)
2622 int argc;
2623 char **argv;
2625 int c;
2626 char *target = default_target;
2627 boolean seenflag = false;
2629 #ifdef HAVE_SETLOCALE
2630 setlocale (LC_MESSAGES, "");
2631 #endif
2632 bindtextdomain (PACKAGE, LOCALEDIR);
2633 textdomain (PACKAGE);
2635 program_name = *argv;
2636 xmalloc_set_program_name (program_name);
2638 START_PROGRESS (program_name, 0);
2640 bfd_init ();
2641 set_default_bfd_target ();
2643 while ((c = getopt_long (argc, argv, "pib:m:VCdDlfahrRtTxsSj:wE:",
2644 long_options, (int *) 0))
2645 != EOF)
2647 if (c != 'l' && c != OPTION_START_ADDRESS && c != OPTION_STOP_ADDRESS)
2648 seenflag = true;
2649 switch (c)
2651 case 0:
2652 break; /* we've been given a long option */
2653 case 'm':
2654 machine = optarg;
2655 break;
2656 case 'j':
2657 only = optarg;
2658 break;
2659 case 'l':
2660 with_line_numbers = 1;
2661 break;
2662 case 'b':
2663 target = optarg;
2664 break;
2665 case 'f':
2666 dump_file_header = true;
2667 break;
2668 case 'i':
2669 formats_info = true;
2670 break;
2671 case 'p':
2672 dump_private_headers = 1;
2673 break;
2674 case 'x':
2675 dump_private_headers = 1;
2676 dump_symtab = 1;
2677 dump_reloc_info = 1;
2678 dump_file_header = true;
2679 dump_ar_hdrs = 1;
2680 dump_section_headers = 1;
2681 break;
2682 case 't':
2683 dump_symtab = 1;
2684 break;
2685 case 'T':
2686 dump_dynamic_symtab = 1;
2687 break;
2688 case 'C':
2689 do_demangle = 1;
2690 break;
2691 case 'd':
2692 disassemble = true;
2693 break;
2694 case 'D':
2695 disassemble = disassemble_all = true;
2696 break;
2697 case 'S':
2698 disassemble = true;
2699 with_source_code = true;
2700 break;
2701 case 's':
2702 dump_section_contents = 1;
2703 break;
2704 case 'r':
2705 dump_reloc_info = 1;
2706 break;
2707 case 'R':
2708 dump_dynamic_reloc_info = 1;
2709 break;
2710 case 'a':
2711 dump_ar_hdrs = 1;
2712 break;
2713 case 'h':
2714 dump_section_headers = 1;
2715 break;
2716 case 'H':
2717 usage (stdout, 0);
2718 case 'V':
2719 show_version = 1;
2720 break;
2721 case 'w':
2722 wide_output = 1;
2723 break;
2724 case OPTION_ADJUST_VMA:
2725 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2726 break;
2727 case OPTION_START_ADDRESS:
2728 start_address = parse_vma (optarg, "--start-address");
2729 break;
2730 case OPTION_STOP_ADDRESS:
2731 stop_address = parse_vma (optarg, "--stop-address");
2732 break;
2733 case 'E':
2734 if (strcmp (optarg, "B") == 0)
2735 endian = BFD_ENDIAN_BIG;
2736 else if (strcmp (optarg, "L") == 0)
2737 endian = BFD_ENDIAN_LITTLE;
2738 else
2740 fprintf (stderr, _("%s: unrecognized -E option\n"), program_name);
2741 usage (stderr, 1);
2743 break;
2744 case OPTION_ENDIAN:
2745 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2746 endian = BFD_ENDIAN_BIG;
2747 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2748 endian = BFD_ENDIAN_LITTLE;
2749 else
2751 fprintf (stderr, _("%s: unrecognized --endian type `%s'\n"),
2752 program_name, optarg);
2753 usage (stderr, 1);
2755 break;
2756 default:
2757 usage (stderr, 1);
2761 if (show_version)
2762 print_version ("objdump");
2764 if (seenflag == false)
2765 usage (stderr, 1);
2767 if (formats_info)
2769 display_info ();
2771 else
2773 if (optind == argc)
2774 display_file ("a.out", target);
2775 else
2776 for (; optind < argc;)
2777 display_file (argv[optind++], target);
2780 END_PROGRESS (program_name);
2782 return 0;