1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
28 /* Internal headers for the ELF .stab-dump code - sorry. */
29 #define BYTES_IN_WORD 32
30 #include "aout/aout64.h"
31 #include "elf/internal.h"
32 extern Elf_Internal_Shdr
*bfd_elf_find_section();
34 #ifndef FPRINTF_ALREADY_DECLARED
35 extern int fprintf
PARAMS ((FILE *, CONST
char *, ...));
38 char *default_target
= NULL
; /* default at runtime */
40 extern char *program_version
;
42 int show_version
= 0; /* show the version number */
43 int dump_section_contents
; /* -s */
44 int dump_section_headers
; /* -h */
45 boolean dump_file_header
; /* -f */
46 int dump_symtab
; /* -t */
47 int dump_reloc_info
; /* -r */
48 int dump_ar_hdrs
; /* -a */
49 int with_line_numbers
; /* -l */
50 int dump_stab_section_info
; /* --stabs */
51 boolean disassemble
; /* -d */
52 boolean formats_info
; /* -i */
53 char *only
; /* -j secname */
55 struct objdump_disasm_info
{
60 char *machine
= (char *) NULL
;
65 unsigned int symcount
= 0;
67 /* Forward declarations. */
70 display_file
PARAMS ((char *filename
, char *target
));
73 dump_data
PARAMS ((bfd
*abfd
));
76 dump_relocs
PARAMS ((bfd
*abfd
));
79 dump_symbols
PARAMS ((bfd
*abfd
));
82 display_bfd
PARAMS ((bfd
*abfd
));
85 usage (stream
, status
)
90 Usage: %s [-ahifdrtxsl] [-b bfdname] [-m machine] [-j section-name]\n\
91 [--archive-headers] [--target=bfdname] [--disassemble] [--file-headers]\n\
92 [--section-headers] [--headers] [--info] [--section=section-name]\n\
93 [--line-numbers] [--architecture=machine] [--reloc] [--full-contents]\n\
94 [--stabs] [--syms] [--all-headers] [--version] [--help] objfile...\n\
95 at least one option besides -l (--line-numbers) must be given\n",
100 static struct option long_options
[]=
102 {"all-headers", no_argument
, NULL
, 'x'},
103 {"architecture", required_argument
, NULL
, 'm'},
104 {"archive-headers", no_argument
, NULL
, 'a'},
105 {"disassemble", no_argument
, NULL
, 'd'},
106 {"file-headers", no_argument
, NULL
, 'f'},
107 {"full-contents", no_argument
, NULL
, 's'},
108 {"headers", no_argument
, NULL
, 'h'},
109 {"help", no_argument
, NULL
, 'H'},
110 {"info", no_argument
, NULL
, 'i'},
111 {"line-numbers", no_argument
, NULL
, 'l'},
112 {"reloc", no_argument
, NULL
, 'r'},
113 {"section", required_argument
, NULL
, 'j'},
114 {"section-headers", no_argument
, NULL
, 'h'},
115 {"stabs", no_argument
, &dump_stab_section_info
, 1},
116 {"syms", no_argument
, NULL
, 't'},
117 {"target", required_argument
, NULL
, 'b'},
118 {"version", no_argument
, &show_version
, 1},
119 {0, no_argument
, 0, 0}
129 for (section
= abfd
->sections
;
130 section
!= (asection
*) NULL
;
131 section
= section
->next
)
136 if (section->flags & x) { printf("%s%s",comma,y); comma = ", "; }
139 printf ("SECTION %d [%s]\t: size %08x",
142 (unsigned) bfd_get_section_size_before_reloc (section
));
144 printf_vma (section
->vma
);
145 printf (" align 2**%u\n ",
146 section
->alignment_power
);
147 PF (SEC_ALLOC
, "ALLOC");
148 PF (SEC_CONSTRUCTOR
, "CONSTRUCTOR");
149 PF (SEC_CONSTRUCTOR_TEXT
, "CONSTRUCTOR TEXT");
150 PF (SEC_CONSTRUCTOR_DATA
, "CONSTRUCTOR DATA");
151 PF (SEC_CONSTRUCTOR_BSS
, "CONSTRUCTOR BSS");
152 PF (SEC_LOAD
, "LOAD");
153 PF (SEC_RELOC
, "RELOC");
155 PF (SEC_BALIGN
, "BALIGN");
157 PF (SEC_READONLY
, "READONLY");
158 PF (SEC_CODE
, "CODE");
159 PF (SEC_DATA
, "DATA");
161 PF (SEC_DEBUGGING
, "DEBUGGING");
168 DEFUN (slurp_symtab
, (abfd
),
171 asymbol
**sy
= (asymbol
**) NULL
;
173 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
175 (void) printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd
));
179 storage
= get_symtab_upper_bound (abfd
);
182 sy
= (asymbol
**) xmalloc (storage
);
184 symcount
= bfd_canonicalize_symtab (abfd
, sy
);
187 fprintf (stderr
, "%s: Bad symbol table in \"%s\".\n",
188 program_name
, bfd_get_filename (abfd
));
194 /* Filter out (in place) symbols that are useless for dis-assemble.
195 Return count of useful symbols. */
197 int remove_useless_symbols (syms
, count
)
201 register asymbol
**in_ptr
= syms
;
202 register asymbol
**out_ptr
= syms
;
204 while ( --count
>= 0 )
206 asymbol
*sym
= *in_ptr
++;
208 if (sym
->name
== NULL
|| sym
->name
[0] == '\0')
210 if (sym
->flags
& (BSF_DEBUGGING
))
212 if (sym
->section
== &bfd_und_section
213 || bfd_is_com_section (sym
->section
))
218 return out_ptr
- syms
;
222 /* Sort symbols into value order */
228 asymbol
*a
= *(asymbol
**)ap
;
229 asymbol
*b
= *(asymbol
**)bp
;
231 if (a
->value
> b
->value
)
233 else if (a
->value
< b
->value
)
236 if (a
->section
> b
->section
)
238 else if (a
->section
< b
->section
)
243 /* Print the supplied address symbolically if possible */
245 objdump_print_address (vma
, info
)
247 struct disassemble_info
*info
;
249 /* Perform a binary search looking for the closest symbol to
250 the required value. */
251 /* @@ For relocateable files, should filter out symbols belonging to
252 the wrong section. Unfortunately, not enough information is supplied
253 to this routine to determine the correct section in all cases. */
254 /* @@ Would it speed things up to cache the last two symbols returned,
255 and maybe their address ranges? For many processors, only one memory
256 operand can be present at a time, so the 2-entry cache wouldn't be
257 constantly churned by code doing heavy memory accesses. */
259 unsigned int min
= 0;
260 unsigned int max
= symcount
;
262 unsigned int thisplace
= 1;
263 unsigned int oldthisplace
;
267 fprintf_vma (info
->stream
, vma
);
273 asymbol
*sym
; asection
*sym_sec
;
274 oldthisplace
= thisplace
;
275 thisplace
= (max
+ min
) / 2;
276 if (thisplace
== oldthisplace
)
278 sym
= syms
[thisplace
];
279 vardiff
= sym
->value
- vma
;
280 sym_sec
= sym
->section
;
284 else if (vardiff
< 0)
289 /* We've run out of places to look, print the symbol before this one
290 see if this or the symbol before describes this location the best */
294 if (syms
[thisplace
- 1]->value
- vma
>
295 syms
[thisplace
]->value
- vma
)
297 /* Previous symbol is in correct section and is closer */
304 bfd_vma val
= syms
[thisplace
]->value
;
306 if (syms
[thisplace
]->flags
& (BSF_LOCAL
|BSF_DEBUGGING
))
307 for (i
= thisplace
- 1; i
>= 0; i
--)
309 if (syms
[i
]->value
== val
310 && (!(syms
[i
]->flags
& (BSF_LOCAL
|BSF_DEBUGGING
))
311 || ((syms
[thisplace
]->flags
& BSF_DEBUGGING
)
312 && !(syms
[i
]->flags
& BSF_DEBUGGING
))))
318 if (syms
[thisplace
]->flags
& (BSF_LOCAL
|BSF_DEBUGGING
))
319 for (i
= thisplace
+ 1; i
< symcount
; i
++)
321 if (syms
[i
]->value
== val
322 && (!(syms
[i
]->flags
& (BSF_LOCAL
|BSF_DEBUGGING
))
323 || ((syms
[thisplace
]->flags
& BSF_DEBUGGING
)
324 && !(syms
[i
]->flags
& BSF_DEBUGGING
))))
332 /* If the file is relocateable, and the symbol could be from this
333 section, prefer a symbol from this section over symbols from
334 others, even if the other symbol's value might be closer.
336 Note that this may be wrong for some symbol references if the
337 sections have overlapping memory ranges, but in that case there's
338 no way to tell what's desired without looking at the relocation
340 struct objdump_disasm_info
*aux
;
343 aux
= (struct objdump_disasm_info
*) info
->application_data
;
344 if (aux
->abfd
->flags
& HAS_RELOC
345 && vma
>= bfd_get_section_vma (aux
->abfd
, aux
->sec
)
346 && vma
< (bfd_get_section_vma (aux
->abfd
, aux
->sec
)
347 + bfd_get_section_size_before_reloc (aux
->sec
))
348 && syms
[thisplace
]->section
!= aux
->sec
)
350 for (i
= thisplace
+ 1; i
< symcount
; i
++)
351 if (syms
[i
]->value
!= syms
[thisplace
]->value
)
354 if (syms
[i
]->section
== aux
->sec
)
361 fprintf (info
->stream
, " <%s", syms
[thisplace
]->name
);
362 if (syms
[thisplace
]->value
> vma
)
364 char buf
[30], *p
= buf
;
365 sprintf_vma (buf
, syms
[thisplace
]->value
- vma
);
368 fprintf (info
->stream
, "-%s", p
);
370 else if (vma
> syms
[thisplace
]->value
)
372 char buf
[30], *p
= buf
;
373 sprintf_vma (buf
, vma
- syms
[thisplace
]->value
);
376 fprintf (info
->stream
, "+%s", p
);
378 fprintf (info
->stream
, ">");
399 disassemble_data (abfd
)
402 bfd_byte
*data
= NULL
;
403 bfd_arch_info_type
*info
;
404 bfd_size_type datasize
= 0;
406 unsigned int (*print
) ()= 0; /* Old style */
407 disassembler_ftype disassemble
= 0; /* New style */
408 enum bfd_architecture a
;
409 struct disassemble_info disasm_info
;
410 struct objdump_disasm_info aux
;
413 CONST
char *prev_function
= "";
417 /* Replace symbol section relative values with abs values */
418 boolean done_dot
= false;
420 INIT_DISASSEMBLE_INFO(disasm_info
, stdout
);
421 disasm_info
.application_data
= (PTR
) &aux
;
423 disasm_info
.print_address_func
= objdump_print_address
;
425 for (i
= 0; i
< symcount
; i
++)
427 syms
[i
]->value
+= syms
[i
]->section
->vma
;
430 symcount
= remove_useless_symbols (syms
, symcount
);
432 /* Sort the symbols into section and symbol order */
433 (void) qsort (syms
, symcount
, sizeof (asymbol
*), comp
);
435 if (machine
!= (char *) NULL
)
437 info
= bfd_scan_arch (machine
);
440 fprintf (stderr
, "%s: Can't use supplied machine %s\n",
445 abfd
->arch_info
= info
;
448 /* See if we can disassemble using bfd */
450 if (abfd
->arch_info
->disassemble
)
452 print
= abfd
->arch_info
->disassemble
;
456 a
= bfd_get_arch (abfd
);
459 /* If you add a case to this table, also add it to the
460 ARCH_all definition right above this function. */
463 /* As far as I know we only handle big-endian 29k objects. */
464 disassemble
= print_insn_big_a29k
;
469 disassemble
= print_insn_alpha
;
474 if (bfd_get_mach(abfd
) == bfd_mach_h8300h
)
475 disassemble
= print_insn_h8300h
;
477 disassemble
= print_insn_h8300
;
482 disassemble
= print_insn_h8500
;
487 disassemble
= print_insn_hppa
;
492 disassemble
= print_insn_i386
;
497 disassemble
= print_insn_i960
;
502 disassemble
= print_insn_m68k
;
507 disassemble
= print_insn_m88k
;
512 if (abfd
->xvec
->byteorder_big_p
)
513 disassemble
= print_insn_big_mips
;
515 disassemble
= print_insn_little_mips
;
520 disassemble
= print_insn_sh
;
525 disassemble
= print_insn_sparc
;
530 if (bfd_get_mach(abfd
) == bfd_mach_z8001
)
531 disassemble
= print_insn_z8001
;
533 disassemble
= print_insn_z8002
;
537 fprintf (stderr
, "%s: Can't disassemble for architecture %s\n",
539 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0));
545 for (section
= abfd
->sections
;
546 section
!= (asection
*) NULL
;
547 section
= section
->next
)
551 if ((section
->flags
& SEC_LOAD
)
552 && (only
== (char *) NULL
|| strcmp (only
, section
->name
) == 0))
554 printf ("Disassembly of section %s:\n", section
->name
);
556 if (bfd_get_section_size_before_reloc (section
) == 0)
559 data
= (bfd_byte
*) xmalloc ((size_t) bfd_get_section_size_before_reloc (section
));
561 datasize
= bfd_get_section_size_before_reloc (section
);
563 bfd_get_section_contents (abfd
, section
, data
, 0, bfd_get_section_size_before_reloc (section
));
565 disasm_info
.buffer
= data
;
566 disasm_info
.buffer_vma
= section
->vma
;
567 disasm_info
.buffer_length
=
568 bfd_get_section_size_before_reloc (section
);
570 while (i
< disasm_info
.buffer_length
)
572 if (data
[i
] == 0 && data
[i
+ 1] == 0 && data
[i
+ 2] == 0 &&
575 if (done_dot
== false)
585 if (with_line_numbers
)
587 CONST
char *filename
;
588 CONST
char *functionname
;
591 if (bfd_find_nearest_line (abfd
,
599 if (functionname
&& *functionname
600 && strcmp(functionname
, prev_function
))
602 printf ("%s():\n", functionname
);
603 prev_function
= functionname
;
607 if (line
&& line
!= prevline
)
609 printf ("%s:%u\n", filename
, line
);
614 objdump_print_address (section
->vma
+ i
, &disasm_info
);
617 if (disassemble
) /* New style */
619 int bytes
= (*disassemble
)(section
->vma
+ i
,
626 i
+= print (section
->vma
+ i
,
638 /* Define a table of stab values and print-strings. We wish the initializer
639 could be a direct-mapped table, but instead we build one the first
649 struct stab_print stab_print
[] = {
650 #define __define_stab(NAME, CODE, STRING) {CODE, STRING},
651 #include "aout/stab.def"
656 void dump_stabs_1 ();
658 /* This dumps the stabs section from object files that have a section that
659 uses Sun stabs encoding. It has to use some hooks into BFD because
660 string table sections are not normally visible to BFD callers. */
668 /* Allocate and initialize stab name array if first time. */
669 if (stab_name
== NULL
)
671 stab_name
= (char **) xmalloc (256 * sizeof(char *));
672 /* Clear the array. */
673 for (i
= 0; i
< 256; i
++)
675 /* Fill in the defined stabs. */
676 for (i
= 0; *stab_print
[i
].string
; i
++)
677 stab_name
[stab_print
[i
].value
] = stab_print
[i
].string
;
680 dump_stabs_1 (abfd
, ".stab", ".stabstr");
681 dump_stabs_1 (abfd
, ".stab.excl", ".stab.exclstr");
682 dump_stabs_1 (abfd
, ".stab.index", ".stab.indexstr");
683 dump_stabs_1 (abfd
, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
687 dump_stabs_1 (abfd
, name1
, name2
)
689 char *name1
; /* Section name of .stab */
690 char *name2
; /* Section name of its string section */
692 Elf_Internal_Shdr
*stab_hdr
, *stabstr_hdr
;
693 asection
*stabsect
, *stabstrsect
;
695 struct internal_nlist
*stabs
, *stabs_end
;
697 int stab_size
, stabstr_size
;
698 unsigned file_string_table_offset
, next_file_string_table_offset
;
699 int is_elf
= (0 == strncmp ("elf", abfd
->xvec
->name
, 3));
703 stab_hdr
= bfd_elf_find_section (abfd
, name1
);
707 stabsect
= bfd_get_section_by_name (abfd
, name1
);
710 if (is_elf
? (0 == stab_hdr
) : (0 == stabsect
))
712 printf ("No %s section present.\n\n", name1
);
718 stabstr_hdr
= bfd_elf_find_section (abfd
, name2
);
722 stabstrsect
= bfd_get_section_by_name (abfd
, name2
);
725 if (is_elf
? (0 == stabstr_hdr
) : (0 == stabstrsect
))
727 fprintf (stderr
, "%s: %s has no %s section.\n", program_name
,
728 abfd
->filename
, name2
);
732 stab_size
= (is_elf
? stab_hdr
->sh_size
: bfd_section_size (abfd
, stabsect
));
733 stabstr_size
= (is_elf
? stabstr_hdr
->sh_size
: bfd_section_size (abfd
, stabstrsect
));
735 stabs
= (struct internal_nlist
*) xmalloc (stab_size
);
736 strtab
= (char *) xmalloc (stabstr_size
);
737 stabs_end
= (struct internal_nlist
*) (stab_size
+ (char *) stabs
);
741 if (bfd_seek (abfd
, stab_hdr
->sh_offset
, SEEK_SET
) < 0 ||
742 stab_size
!= bfd_read ((PTR
) stabs
, stab_size
, 1, abfd
))
744 fprintf (stderr
, "%s: reading %s section of %s failed.\n",
752 bfd_get_section_contents (abfd
, stabsect
, (PTR
) stabs
, 0, stab_size
);
757 if (bfd_seek (abfd
, stabstr_hdr
->sh_offset
, SEEK_SET
) < 0 ||
758 stabstr_size
!= bfd_read ((PTR
) strtab
, stabstr_size
, 1, abfd
))
760 fprintf (stderr
, "%s: reading %s section of %s failed.\n",
768 bfd_get_section_contents (abfd
, stabstrsect
, (PTR
) strtab
, 0, stabstr_size
);
771 #define SWAP_SYMBOL(symp, abfd) \
773 (symp)->n_strx = bfd_h_get_32(abfd, \
774 (unsigned char *)&(symp)->n_strx); \
775 (symp)->n_desc = bfd_h_get_16 (abfd, \
776 (unsigned char *)&(symp)->n_desc); \
777 (symp)->n_value = bfd_h_get_32 (abfd, \
778 (unsigned char *)&(symp)->n_value); \
781 printf ("Contents of %s section:\n\n", name1
);
782 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
784 file_string_table_offset
= 0;
785 next_file_string_table_offset
= 0;
787 /* Loop through all symbols and print them.
789 We start the index at -1 because there is a dummy symbol on
790 the front of stabs-in-{coff,elf} sections that supplies sizes. */
792 for (i
= -1; stabs
< stabs_end
; stabs
++, i
++)
794 SWAP_SYMBOL (stabs
, abfd
);
795 printf ("\n%-6d ", i
);
796 /* Print either the stab name, or, if unnamed, print its number
797 again (makes consistent formatting for tools like awk). */
798 if (stab_name
[stabs
->n_type
])
799 printf ("%-6s", stab_name
[stabs
->n_type
]);
802 printf (" %-6d %-6d ", stabs
->n_other
, stabs
->n_desc
);
803 printf_vma (stabs
->n_value
);
804 printf (" %-6lu", stabs
->n_strx
);
806 /* Symbols with type == 0 (N_UNDF) specify the length of the
807 string table associated with this file. We use that info
808 to know how to relocate the *next* file's string table indices. */
810 if (stabs
->n_type
== N_UNDF
)
812 file_string_table_offset
= next_file_string_table_offset
;
813 next_file_string_table_offset
+= stabs
->n_value
;
817 /* Now, using the possibly updated string table offset, print the
818 string (if any) associated with this symbol. */
820 if ((stabs
->n_strx
+ file_string_table_offset
) < stabstr_size
)
821 printf (" %s", &strtab
[stabs
->n_strx
+ file_string_table_offset
]);
834 if (!bfd_check_format (abfd
, bfd_object
))
836 fprintf (stderr
, "%s:%s: %s\n", program_name
, abfd
->filename
,
837 bfd_errmsg (bfd_error
));
840 printf ("\n%s: file format %s\n", abfd
->filename
, abfd
->xvec
->name
);
842 print_arelt_descr (stdout
, abfd
, true);
844 if (dump_file_header
)
848 printf ("architecture: %s, ",
849 bfd_printable_arch_mach (bfd_get_arch (abfd
),
850 bfd_get_mach (abfd
)));
851 printf ("flags 0x%08x:\n", abfd
->flags
);
853 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
854 PF (HAS_RELOC
, "HAS_RELOC");
855 PF (EXEC_P
, "EXEC_P");
856 PF (HAS_LINENO
, "HAS_LINENO");
857 PF (HAS_DEBUG
, "HAS_DEBUG");
858 PF (HAS_SYMS
, "HAS_SYMS");
859 PF (HAS_LOCALS
, "HAS_LOCALS");
860 PF (DYNAMIC
, "DYNAMIC");
861 PF (WP_TEXT
, "WP_TEXT");
862 PF (D_PAGED
, "D_PAGED");
863 PF (BFD_IS_RELAXABLE
, "BFD_IS_RELAXABLE");
864 printf ("\nstart address 0x");
865 printf_vma (abfd
->start_address
);
869 if (dump_section_headers
)
871 if (dump_symtab
|| dump_reloc_info
|| disassemble
)
873 syms
= slurp_symtab (abfd
);
877 if (dump_stab_section_info
)
881 if (dump_section_contents
)
883 /* Note that disassemble_data re-orders the syms table, but that is
884 safe - as long as it is done last! */
886 disassemble_data (abfd
);
890 display_file (filename
, target
)
894 bfd
*file
, *arfile
= (bfd
*) NULL
;
896 file
= bfd_openr (filename
, target
);
899 fprintf (stderr
, "%s: ", program_name
);
900 bfd_perror (filename
);
904 if (bfd_check_format (file
, bfd_archive
) == true)
906 printf ("In archive %s:\n", bfd_get_filename (file
));
909 bfd_error
= no_error
;
911 arfile
= bfd_openr_next_archived_file (file
, arfile
);
914 if (bfd_error
!= no_more_archived_files
)
916 fprintf (stderr
, "%s: ", program_name
);
917 bfd_perror (bfd_get_filename (file
));
922 display_bfd (arfile
);
923 /* Don't close the archive elements; we need them for next_archive */
932 /* Actually display the various requested regions */
940 bfd_size_type datasize
= 0;
943 for (section
= abfd
->sections
; section
!= NULL
; section
=
948 if (only
== (char *) NULL
||
949 strcmp (only
, section
->name
) == 0)
951 if (section
->flags
& SEC_HAS_CONTENTS
)
953 printf ("Contents of section %s:\n", section
->name
);
955 if (bfd_section_size (abfd
, section
) == 0)
957 data
= (bfd_byte
*) xmalloc ((size_t) bfd_section_size (abfd
, section
));
958 datasize
= bfd_section_size (abfd
, section
);
961 bfd_get_section_contents (abfd
, section
, (PTR
) data
, 0, bfd_section_size (abfd
, section
));
963 for (i
= 0; i
< bfd_section_size (abfd
, section
); i
+= onaline
)
967 printf (" %04lx ", (unsigned long int) (i
+ section
->vma
));
968 for (j
= i
; j
< i
+ onaline
; j
++)
970 if (j
< bfd_section_size (abfd
, section
))
971 printf ("%02x", (unsigned) (data
[j
]));
979 for (j
= i
; j
< i
+ onaline
; j
++)
981 if (j
>= bfd_section_size (abfd
, section
))
984 printf ("%c", isprint (data
[j
]) ? data
[j
] : '.');
994 /* Should perhaps share code and display with nm? */
1001 asymbol
**current
= syms
;
1003 printf ("SYMBOL TABLE:\n");
1005 for (count
= 0; count
< symcount
; count
++)
1010 bfd
*cur_bfd
= bfd_asymbol_bfd(*current
);
1013 bfd_print_symbol (cur_bfd
,
1015 *current
, bfd_print_symbol_all
);
1031 unsigned int relcount
;
1034 for (a
= abfd
->sections
; a
!= (asection
*) NULL
; a
= a
->next
)
1036 if (a
== &bfd_abs_section
)
1038 if (a
== &bfd_und_section
)
1040 if (bfd_is_com_section (a
))
1045 if (strcmp (only
, a
->name
))
1048 else if ((a
->flags
& SEC_RELOC
) == 0)
1051 printf ("RELOCATION RECORDS FOR [%s]:", a
->name
);
1053 if (bfd_get_reloc_upper_bound (abfd
, a
) == 0)
1055 printf (" (none)\n\n");
1061 relpp
= (arelent
**) xmalloc (bfd_get_reloc_upper_bound (abfd
, a
));
1062 /* Note that this must be done *before* we sort the syms table. */
1063 relcount
= bfd_canonicalize_reloc (abfd
, a
, relpp
, syms
);
1066 printf (" (none)\n\n");
1071 /* Get column headers lined up reasonably. */
1077 sprintf_vma (buf
, (bfd_vma
) -1);
1078 width
= strlen (buf
) - 7;
1080 printf ("OFFSET %*s TYPE %*s VALUE \n", width
, "", 12, "");
1083 for (p
= relpp
; relcount
&& *p
!= (arelent
*) NULL
; p
++,
1087 CONST
char *sym_name
;
1088 CONST
char *section_name
;
1090 if (q
->sym_ptr_ptr
&& *q
->sym_ptr_ptr
)
1092 sym_name
= (*(q
->sym_ptr_ptr
))->name
;
1093 section_name
= (*(q
->sym_ptr_ptr
))->section
->name
;
1098 section_name
= NULL
;
1102 printf_vma (q
->address
);
1103 printf (" %-16s %s",
1109 if (section_name
== (CONST
char *) NULL
)
1110 section_name
= "*unknown*";
1111 printf_vma (q
->address
);
1112 printf (" %-16s [%s]",
1119 printf_vma (q
->addend
);
1132 #define _DUMMY_NAME_ "/dev/null"
1134 #define _DUMMY_NAME_ "##dummy"
1137 DEFUN (display_info_table
, (first
, last
),
1138 int first AND
int last
)
1141 extern bfd_target
*target_vector
[];
1143 printf ("\n%12s", " ");
1144 for (i
= first
; i
++ < last
&& target_vector
[i
];)
1145 printf ("%s ", target_vector
[i
]->name
);
1148 for (j
= (int) bfd_arch_obscure
+ 1; (int) j
< (int) bfd_arch_last
; j
++)
1149 if (strcmp (bfd_printable_arch_mach (j
, 0), "UNKNOWN!") != 0)
1151 printf ("%11s ", bfd_printable_arch_mach (j
, 0));
1152 for (i
= first
; i
++ < last
&& target_vector
[i
];)
1154 bfd_target
*p
= target_vector
[i
];
1155 bfd
*abfd
= bfd_openw (_DUMMY_NAME_
, p
->name
);
1156 int l
= strlen (p
->name
);
1158 bfd_set_format (abfd
, bfd_object
);
1159 ok
= bfd_set_arch_mach (abfd
, j
, 0);
1162 printf ("%s ", p
->name
);
1166 printf ("%c", ok
? '*' : '-');
1175 DEFUN_VOID (display_info
)
1178 unsigned int i
, j
, columns
;
1179 extern bfd_target
*target_vector
[];
1180 extern char *getenv ();
1182 printf ("BFD header file version %s\n", BFD_VERSION
);
1183 for (i
= 0; target_vector
[i
]; i
++)
1185 bfd_target
*p
= target_vector
[i
];
1186 bfd
*abfd
= bfd_openw (_DUMMY_NAME_
, p
->name
);
1187 bfd_set_format (abfd
, bfd_object
);
1188 printf ("%s\n (header %s, data %s)\n", p
->name
,
1189 p
->header_byteorder_big_p
? "big endian" : "little endian",
1190 p
->byteorder_big_p
? "big endian" : "little endian");
1191 for (j
= (int) bfd_arch_obscure
+ 1; j
< (int) bfd_arch_last
; j
++)
1192 if (bfd_set_arch_mach (abfd
, (enum bfd_architecture
) j
, 0))
1194 bfd_printable_arch_mach ((enum bfd_architecture
) j
, 0));
1197 if ((colum
= getenv ("COLUMNS")) != (char *) NULL
)
1198 columns
= atoi (colum
);
1201 for (i
= 0; target_vector
[i
];)
1205 for (j
= 12; target_vector
[i
] && j
< columns
; i
++)
1206 j
+= strlen (target_vector
[i
]->name
) + 1;
1210 display_info_table (old
, i
);
1214 /** main and like trivia */
1222 extern char *optarg
;
1223 char *target
= default_target
;
1224 boolean seenflag
= false;
1227 program_name
= *argv
;
1229 while ((c
= getopt_long (argc
, argv
, "ib:m:Vdlfahrtxsj:", long_options
,
1237 break; /* we've been given a long option */
1245 with_line_numbers
= 1;
1251 dump_file_header
= true;
1254 formats_info
= true;
1258 dump_reloc_info
= 1;
1259 dump_file_header
= true;
1261 dump_section_headers
= 1;
1270 dump_section_contents
= 1;
1273 dump_reloc_info
= 1;
1279 dump_section_headers
= 1;
1293 printf ("GNU %s version %s\n", program_name
, program_version
);
1297 if (seenflag
== false)
1307 display_file ("a.out", target
);
1309 for (; optind
< argc
;)
1310 display_file (argv
[optind
++], target
);