1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@cygnus.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
56 #include "elf/alpha.h"
59 #include "elf/sparc.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
69 #include "elf/mcore.h"
76 #include "elf/x86-64.h"
82 char * program_name
= "readelf";
83 unsigned int dynamic_addr
;
84 bfd_size_type dynamic_size
;
85 unsigned int rela_addr
;
86 unsigned int rela_size
;
87 char * dynamic_strings
;
89 unsigned long string_table_length
;
90 unsigned long num_dynamic_syms
;
91 Elf_Internal_Sym
* dynamic_symbols
;
92 Elf_Internal_Syminfo
* dynamic_syminfo
;
93 unsigned long dynamic_syminfo_offset
;
94 unsigned int dynamic_syminfo_nent
;
95 char program_interpreter
[64];
96 int dynamic_info
[DT_JMPREL
+ 1];
99 Elf_Internal_Ehdr elf_header
;
100 Elf_Internal_Shdr
* section_headers
;
101 Elf_Internal_Dyn
* dynamic_segment
;
109 int do_using_dynamic
;
116 int do_debug_abbrevs
;
118 int do_debug_pubnames
;
119 int do_debug_aranges
;
121 int do_debug_frames_interp
;
126 /* A dynamic array of flags indicating which sections require dumping. */
127 char * dump_sects
= NULL
;
128 unsigned int num_dump_sects
= 0;
130 #define HEX_DUMP (1 << 0)
131 #define DISASS_DUMP (1 << 1)
132 #define DEBUG_DUMP (1 << 2)
134 /* How to rpint a vma value. */
135 typedef enum print_mode
147 /* Forward declarations for dumb compilers. */
148 static void print_vma
PARAMS ((bfd_vma
, print_mode
));
149 static bfd_vma (* byte_get
) PARAMS ((unsigned char *, int));
150 static bfd_vma byte_get_little_endian
PARAMS ((unsigned char *, int));
151 static bfd_vma byte_get_big_endian
PARAMS ((unsigned char *, int));
152 static const char * get_mips_dynamic_type
PARAMS ((unsigned long));
153 static const char * get_sparc64_dynamic_type
PARAMS ((unsigned long));
154 static const char * get_parisc_dynamic_type
PARAMS ((unsigned long));
155 static const char * get_dynamic_type
PARAMS ((unsigned long));
156 static int slurp_rela_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**, unsigned long *));
157 static int slurp_rel_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel
**, unsigned long *));
158 static int dump_relocations
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*, unsigned long, char *, int));
159 static char * get_file_type
PARAMS ((unsigned));
160 static char * get_machine_name
PARAMS ((unsigned));
161 static void decode_ARM_machine_flags
PARAMS ((unsigned, char []));
162 static char * get_machine_flags
PARAMS ((unsigned, unsigned));
163 static const char * get_mips_segment_type
PARAMS ((unsigned long));
164 static const char * get_parisc_segment_type
PARAMS ((unsigned long));
165 static const char * get_ia64_segment_type
PARAMS ((unsigned long));
166 static const char * get_segment_type
PARAMS ((unsigned long));
167 static const char * get_mips_section_type_name
PARAMS ((unsigned int));
168 static const char * get_parisc_section_type_name
PARAMS ((unsigned int));
169 static const char * get_ia64_section_type_name
PARAMS ((unsigned int));
170 static const char * get_section_type_name
PARAMS ((unsigned int));
171 static const char * get_symbol_binding
PARAMS ((unsigned int));
172 static const char * get_symbol_type
PARAMS ((unsigned int));
173 static const char * get_symbol_visibility
PARAMS ((unsigned int));
174 static const char * get_symbol_index_type
PARAMS ((unsigned int));
175 static const char * get_dynamic_flags
PARAMS ((bfd_vma
));
176 static void usage
PARAMS ((void));
177 static void parse_args
PARAMS ((int, char **));
178 static int process_file_header
PARAMS ((void));
179 static int process_program_headers
PARAMS ((FILE *));
180 static int process_section_headers
PARAMS ((FILE *));
181 static int process_unwind
PARAMS ((FILE *));
182 static void dynamic_segment_mips_val
PARAMS ((Elf_Internal_Dyn
*));
183 static void dynamic_segment_parisc_val
PARAMS ((Elf_Internal_Dyn
*));
184 static int process_dynamic_segment
PARAMS ((FILE *));
185 static int process_symbol_table
PARAMS ((FILE *));
186 static int process_section_contents
PARAMS ((FILE *));
187 static void process_file
PARAMS ((char *));
188 static int process_relocs
PARAMS ((FILE *));
189 static int process_version_sections
PARAMS ((FILE *));
190 static char * get_ver_flags
PARAMS ((unsigned int));
191 static int get_32bit_section_headers
PARAMS ((FILE *));
192 static int get_64bit_section_headers
PARAMS ((FILE *));
193 static int get_32bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
194 static int get_64bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
195 static int get_file_header
PARAMS ((FILE *));
196 static Elf_Internal_Sym
* get_32bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
197 static Elf_Internal_Sym
* get_64bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
198 static const char * get_elf_section_flags
PARAMS ((bfd_vma
));
199 static int * get_dynamic_data
PARAMS ((FILE *, unsigned int));
200 static int get_32bit_dynamic_segment
PARAMS ((FILE *));
201 static int get_64bit_dynamic_segment
PARAMS ((FILE *));
202 #ifdef SUPPORT_DISASSEMBLY
203 static int disassemble_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
205 static int dump_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
206 static int display_debug_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
207 static int display_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
208 static int display_debug_not_supported
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
209 static int display_debug_lines
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
210 static int display_debug_abbrev
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
211 static int display_debug_aranges
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
212 static int display_debug_frames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
213 static unsigned char * process_abbrev_section
PARAMS ((unsigned char *, unsigned char *));
214 static unsigned long read_leb128
PARAMS ((unsigned char *, int *, int));
215 static int process_extended_line_op
PARAMS ((unsigned char *, int, int));
216 static void reset_state_machine
PARAMS ((int));
217 static char * get_TAG_name
PARAMS ((unsigned long));
218 static char * get_AT_name
PARAMS ((unsigned long));
219 static char * get_FORM_name
PARAMS ((unsigned long));
220 static void free_abbrevs
PARAMS ((void));
221 static void add_abbrev
PARAMS ((unsigned long, unsigned long, int));
222 static void add_abbrev_attr
PARAMS ((unsigned long, unsigned long));
223 static unsigned char * read_and_display_attr
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
224 static unsigned char * display_block
PARAMS ((unsigned char *, unsigned long));
225 static void decode_location_expression
PARAMS ((unsigned char *, unsigned int, unsigned long));
226 static void request_dump
PARAMS ((unsigned int, char));
227 static const char * get_elf_class
PARAMS ((unsigned char));
228 static const char * get_data_encoding
PARAMS ((unsigned char));
229 static const char * get_osabi_name
PARAMS ((unsigned char));
230 static int guess_is_rela
PARAMS ((unsigned long));
231 static char * get_note_type
PARAMS ((unsigned int));
232 static int process_note
PARAMS ((Elf32_Internal_Note
*));
233 static int process_corefile_note_segment
PARAMS ((FILE *, bfd_vma
, bfd_vma
));
234 static int process_corefile_note_segments
PARAMS ((FILE *));
235 static int process_corefile_contents
PARAMS ((FILE *));
237 typedef int Elf32_Word
;
245 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
246 ((X)->sh_name >= string_table_length \
247 ? "<corrupt>" : string_table + (X)->sh_name))
249 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
251 #define BYTE_GET(field) byte_get (field, sizeof (field))
253 /* If we can support a 64 bit data type then BFD64 should be defined
254 and sizeof (bfd_vma) == 8. In this case when translating from an
255 external 8 byte field to an internal field, we can assume that the
256 internal field is also 8 bytes wide and so we can extract all the data.
257 If, however, BFD64 is not defined, then we must assume that the
258 internal data structure only has 4 byte wide fields that are the
259 equivalent of the 8 byte wide external counterparts, and so we must
260 truncate the data. */
262 #define BYTE_GET8(field) byte_get (field, -8)
264 #define BYTE_GET8(field) byte_get (field, 8)
267 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
269 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
270 if (fseek (file, offset, SEEK_SET)) \
272 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
276 var = (type) malloc (size); \
280 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
284 if (fread (var, size, 1, file) != 1) \
286 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
293 #define GET_DATA(offset, var, reason) \
294 if (fseek (file, offset, SEEK_SET)) \
296 error (_("Unable to seek to %x for %s\n"), offset, reason); \
299 else if (fread (& var, sizeof (var), 1, file) != 1) \
301 error (_("Unable to read data at %x for %s\n"), offset, reason); \
305 #define GET_ELF_SYMBOLS(file, offset, size) \
306 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
307 : get_64bit_elf_symbols (file, offset, size))
310 #ifdef ANSI_PROTOTYPES
312 error (const char * message
, ...)
316 fprintf (stderr
, _("%s: Error: "), program_name
);
317 va_start (args
, message
);
318 vfprintf (stderr
, message
, args
);
324 warn (const char * message
, ...)
328 fprintf (stderr
, _("%s: Warning: "), program_name
);
329 va_start (args
, message
);
330 vfprintf (stderr
, message
, args
);
342 fprintf (stderr
, _("%s: Error: "), program_name
);
344 message
= va_arg (args
, char *);
345 vfprintf (stderr
, message
, args
);
357 fprintf (stderr
, _("%s: Warning: "), program_name
);
359 message
= va_arg (args
, char *);
360 vfprintf (stderr
, message
, args
);
367 byte_get_little_endian (field
, size
)
368 unsigned char * field
;
377 return ((unsigned int) (field
[0]))
378 | (((unsigned int) (field
[1])) << 8);
382 /* We want to extract data from an 8 byte wide field and
383 place it into a 4 byte wide field. Since this is a little
384 endian source we can juts use the 4 byte extraction code. */
388 return ((unsigned long) (field
[0]))
389 | (((unsigned long) (field
[1])) << 8)
390 | (((unsigned long) (field
[2])) << 16)
391 | (((unsigned long) (field
[3])) << 24);
396 /* This is a special case, generated by the BYTE_GET8 macro.
397 It means that we are loading an 8 byte value from a field
398 in an external structure into an 8 byte value in a field
399 in an internal strcuture. */
400 return ((bfd_vma
) (field
[0]))
401 | (((bfd_vma
) (field
[1])) << 8)
402 | (((bfd_vma
) (field
[2])) << 16)
403 | (((bfd_vma
) (field
[3])) << 24)
404 | (((bfd_vma
) (field
[4])) << 32)
405 | (((bfd_vma
) (field
[5])) << 40)
406 | (((bfd_vma
) (field
[6])) << 48)
407 | (((bfd_vma
) (field
[7])) << 56);
410 error (_("Unhandled data length: %d\n"), size
);
415 /* Print a VMA value. */
417 print_vma (vma
, mode
)
427 case FULL_HEX
: printf ("0x"); /* drop through */
428 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
429 case PREFIX_HEX
: printf ("0x"); /* drop through */
430 case HEX
: printf ("%lx", (unsigned long) vma
); break;
431 case DEC
: printf ("%ld", (unsigned long) vma
); break;
432 case DEC_5
: printf ("%5ld", (long) vma
); break;
433 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
454 #if BFD_HOST_64BIT_LONG
457 if (_bfd_int64_high (vma
))
458 printf ("%lx%lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
460 printf ("%lx", _bfd_int64_low (vma
));
465 #if BFD_HOST_64BIT_LONG
468 if (_bfd_int64_high (vma
))
470 printf ("++%ld", _bfd_int64_low (vma
));
472 printf ("%ld", _bfd_int64_low (vma
));
477 #if BFD_HOST_64BIT_LONG
478 printf ("%5ld", vma
);
480 if (_bfd_int64_high (vma
))
482 printf ("++%ld", _bfd_int64_low (vma
));
484 printf ("%5ld", _bfd_int64_low (vma
));
489 #if BFD_HOST_64BIT_LONG
492 if (_bfd_int64_high (vma
))
494 printf ("++%lu", _bfd_int64_low (vma
));
496 printf ("%lu", _bfd_int64_low (vma
));
505 byte_get_big_endian (field
, size
)
506 unsigned char * field
;
515 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
518 return ((unsigned long) (field
[3]))
519 | (((unsigned long) (field
[2])) << 8)
520 | (((unsigned long) (field
[1])) << 16)
521 | (((unsigned long) (field
[0])) << 24);
525 /* Although we are extracing data from an 8 byte wide field, we
526 are returning only 4 bytes of data. */
527 return ((unsigned long) (field
[7]))
528 | (((unsigned long) (field
[6])) << 8)
529 | (((unsigned long) (field
[5])) << 16)
530 | (((unsigned long) (field
[4])) << 24);
534 /* This is a special case, generated by the BYTE_GET8 macro.
535 It means that we are loading an 8 byte value from a field
536 in an external structure into an 8 byte value in a field
537 in an internal strcuture. */
538 return ((bfd_vma
) (field
[7]))
539 | (((bfd_vma
) (field
[6])) << 8)
540 | (((bfd_vma
) (field
[5])) << 16)
541 | (((bfd_vma
) (field
[4])) << 24)
542 | (((bfd_vma
) (field
[3])) << 32)
543 | (((bfd_vma
) (field
[2])) << 40)
544 | (((bfd_vma
) (field
[1])) << 48)
545 | (((bfd_vma
) (field
[0])) << 56);
549 error (_("Unhandled data length: %d\n"), size
);
554 /* Guess the relocation size commonly used by the specific machines. */
557 guess_is_rela (e_machine
)
558 unsigned long e_machine
;
562 /* Targets that use REL relocations. */
573 /* Targets that use RELA relocations. */
581 case EM_CYGNUS_MN10200
:
582 case EM_CYGNUS_MN10300
:
615 warn (_("Don't know about relocations on this machine architecture\n"));
621 slurp_rela_relocs (file
, rel_offset
, rel_size
, relasp
, nrelasp
)
623 unsigned long rel_offset
;
624 unsigned long rel_size
;
625 Elf_Internal_Rela
**relasp
;
626 unsigned long *nrelasp
;
628 Elf_Internal_Rela
*relas
;
629 unsigned long nrelas
;
634 Elf32_External_Rela
* erelas
;
636 GET_DATA_ALLOC (rel_offset
, rel_size
, erelas
,
637 Elf32_External_Rela
*, "relocs");
639 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
641 relas
= (Elf_Internal_Rela
*)
642 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
646 error(_("out of memory parsing relocs"));
650 for (i
= 0; i
< nrelas
; i
++)
652 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
653 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
654 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
661 Elf64_External_Rela
* erelas
;
663 GET_DATA_ALLOC (rel_offset
, rel_size
, erelas
,
664 Elf64_External_Rela
*, "relocs");
666 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
668 relas
= (Elf_Internal_Rela
*)
669 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
673 error(_("out of memory parsing relocs"));
677 for (i
= 0; i
< nrelas
; i
++)
679 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
680 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
681 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
692 slurp_rel_relocs (file
, rel_offset
, rel_size
, relsp
, nrelsp
)
694 unsigned long rel_offset
;
695 unsigned long rel_size
;
696 Elf_Internal_Rel
**relsp
;
697 unsigned long *nrelsp
;
699 Elf_Internal_Rel
*rels
;
705 Elf32_External_Rel
* erels
;
707 GET_DATA_ALLOC (rel_offset
, rel_size
, erels
,
708 Elf32_External_Rel
*, "relocs");
710 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
712 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
716 error(_("out of memory parsing relocs"));
720 for (i
= 0; i
< nrels
; i
++)
722 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
723 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
730 Elf64_External_Rel
* erels
;
732 GET_DATA_ALLOC (rel_offset
, rel_size
, erels
,
733 Elf64_External_Rel
*, "relocs");
735 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
737 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
741 error(_("out of memory parsing relocs"));
745 for (i
= 0; i
< nrels
; i
++)
747 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
748 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
758 /* Display the contents of the relocation data found at the specified offset. */
760 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
762 unsigned long rel_offset
;
763 unsigned long rel_size
;
764 Elf_Internal_Sym
* symtab
;
770 Elf_Internal_Rel
* rels
;
771 Elf_Internal_Rela
* relas
;
774 if (is_rela
== UNKNOWN
)
775 is_rela
= guess_is_rela (elf_header
.e_machine
);
779 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &relas
, &rel_size
))
784 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
790 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
793 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
795 for (i
= 0; i
< rel_size
; i
++)
800 bfd_vma symtab_index
;
805 offset
= relas
[i
].r_offset
;
806 info
= relas
[i
].r_info
;
810 offset
= rels
[i
].r_offset
;
811 info
= rels
[i
].r_info
;
816 type
= ELF32_R_TYPE (info
);
817 symtab_index
= ELF32_R_SYM (info
);
821 if (elf_header
.e_machine
== EM_SPARCV9
)
822 type
= ELF64_R_TYPE_ID (info
);
824 type
= ELF64_R_TYPE (info
);
825 /* The #ifdef BFD64 below is to prevent a compile time warning.
826 We know that if we do not have a 64 bit data type that we
827 will never execute this code anyway. */
829 symtab_index
= ELF64_R_SYM (info
);
833 #ifdef _bfd_int64_low
834 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
836 printf (" %8.8lx %5.5lx ", offset
, info
);
839 switch (elf_header
.e_machine
)
846 rtype
= elf_m32r_reloc_type (type
);
851 rtype
= elf_i386_reloc_type (type
);
855 rtype
= elf_m68k_reloc_type (type
);
859 rtype
= elf_i960_reloc_type (type
);
863 rtype
= elf_avr_reloc_type (type
);
870 rtype
= elf_sparc_reloc_type (type
);
874 rtype
= v850_reloc_type (type
);
878 rtype
= elf_d10v_reloc_type (type
);
882 rtype
= elf_d30v_reloc_type (type
);
886 rtype
= elf_sh_reloc_type (type
);
889 case EM_CYGNUS_MN10300
:
890 rtype
= elf_mn10300_reloc_type (type
);
893 case EM_CYGNUS_MN10200
:
894 rtype
= elf_mn10200_reloc_type (type
);
898 rtype
= elf_fr30_reloc_type (type
);
902 rtype
= elf_mcore_reloc_type (type
);
906 rtype
= elf_ppc_reloc_type (type
);
911 rtype
= elf_mips_reloc_type (type
);
915 rtype
= elf_alpha_reloc_type (type
);
919 rtype
= elf_arm_reloc_type (type
);
924 rtype
= elf_arc_reloc_type (type
);
928 rtype
= elf_hppa_reloc_type (type
);
932 rtype
= elf_pj_reloc_type (type
);
935 rtype
= elf_ia64_reloc_type (type
);
939 rtype
= elf_cris_reloc_type (type
);
943 rtype
= elf_i860_reloc_type (type
);
947 rtype
= elf_x86_64_reloc_type (type
);
952 rtype
= elf_s390_reloc_type (type
);
957 #ifdef _bfd_int64_low
958 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type
));
960 printf (_("unrecognised: %-7lx"), type
);
963 printf ("%-21.21s", rtype
);
969 if (symtab_index
>= nsyms
)
970 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
973 Elf_Internal_Sym
* psym
;
975 psym
= symtab
+ symtab_index
;
978 print_vma (psym
->st_value
, LONG_HEX
);
981 if (psym
->st_name
== 0)
983 SECTION_NAME (section_headers
+ psym
->st_shndx
));
984 else if (strtab
== NULL
)
985 printf (_("<string table index %3ld>"), psym
->st_name
);
987 printf ("%-25.25s", strtab
+ psym
->st_name
);
990 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
996 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
997 print_vma (relas
[i
].r_addend
, LONG_HEX
);
1000 if (elf_header
.e_machine
== EM_SPARCV9
1001 && !strcmp (rtype
, "R_SPARC_OLO10"))
1002 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1016 get_mips_dynamic_type (type
)
1021 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1022 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1023 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1024 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1025 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1026 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1027 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1028 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1029 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1030 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1031 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1032 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1033 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1034 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1035 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1036 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1037 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1038 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1039 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1040 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1041 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1042 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1043 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1044 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1045 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1046 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1047 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1048 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1049 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1050 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1051 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1052 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1053 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1054 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1055 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1056 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1057 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1058 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1059 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1060 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1061 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1062 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1063 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1070 get_sparc64_dynamic_type (type
)
1075 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1082 get_parisc_dynamic_type (type
)
1087 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1088 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1089 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1090 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1091 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1092 case DT_HP_PREINIT
: return "HP_PREINIT";
1093 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1094 case DT_HP_NEEDED
: return "HP_NEEDED";
1095 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1096 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1097 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1098 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1099 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1106 get_dynamic_type (type
)
1109 static char buff
[32];
1113 case DT_NULL
: return "NULL";
1114 case DT_NEEDED
: return "NEEDED";
1115 case DT_PLTRELSZ
: return "PLTRELSZ";
1116 case DT_PLTGOT
: return "PLTGOT";
1117 case DT_HASH
: return "HASH";
1118 case DT_STRTAB
: return "STRTAB";
1119 case DT_SYMTAB
: return "SYMTAB";
1120 case DT_RELA
: return "RELA";
1121 case DT_RELASZ
: return "RELASZ";
1122 case DT_RELAENT
: return "RELAENT";
1123 case DT_STRSZ
: return "STRSZ";
1124 case DT_SYMENT
: return "SYMENT";
1125 case DT_INIT
: return "INIT";
1126 case DT_FINI
: return "FINI";
1127 case DT_SONAME
: return "SONAME";
1128 case DT_RPATH
: return "RPATH";
1129 case DT_SYMBOLIC
: return "SYMBOLIC";
1130 case DT_REL
: return "REL";
1131 case DT_RELSZ
: return "RELSZ";
1132 case DT_RELENT
: return "RELENT";
1133 case DT_PLTREL
: return "PLTREL";
1134 case DT_DEBUG
: return "DEBUG";
1135 case DT_TEXTREL
: return "TEXTREL";
1136 case DT_JMPREL
: return "JMPREL";
1137 case DT_BIND_NOW
: return "BIND_NOW";
1138 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1139 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1140 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1141 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1142 case DT_RUNPATH
: return "RUNPATH";
1143 case DT_FLAGS
: return "FLAGS";
1145 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1146 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1148 case DT_CHECKSUM
: return "CHECKSUM";
1149 case DT_PLTPADSZ
: return "PLTPADSZ";
1150 case DT_MOVEENT
: return "MOVEENT";
1151 case DT_MOVESZ
: return "MOVESZ";
1152 case DT_FEATURE
: return "FEATURE";
1153 case DT_POSFLAG_1
: return "POSFLAG_1";
1154 case DT_SYMINSZ
: return "SYMINSZ";
1155 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1157 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1158 case DT_CONFIG
: return "CONFIG";
1159 case DT_DEPAUDIT
: return "DEPAUDIT";
1160 case DT_AUDIT
: return "AUDIT";
1161 case DT_PLTPAD
: return "PLTPAD";
1162 case DT_MOVETAB
: return "MOVETAB";
1163 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1165 case DT_VERSYM
: return "VERSYM";
1167 case DT_RELACOUNT
: return "RELACOUNT";
1168 case DT_RELCOUNT
: return "RELCOUNT";
1169 case DT_FLAGS_1
: return "FLAGS_1";
1170 case DT_VERDEF
: return "VERDEF";
1171 case DT_VERDEFNUM
: return "VERDEFNUM";
1172 case DT_VERNEED
: return "VERNEED";
1173 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1175 case DT_AUXILIARY
: return "AUXILIARY";
1176 case DT_USED
: return "USED";
1177 case DT_FILTER
: return "FILTER";
1180 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1182 const char * result
;
1184 switch (elf_header
.e_machine
)
1187 case EM_MIPS_RS3_LE
:
1188 result
= get_mips_dynamic_type (type
);
1191 result
= get_sparc64_dynamic_type (type
);
1201 sprintf (buff
, _("Processor Specific: %lx"), type
);
1203 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1205 const char * result
;
1207 switch (elf_header
.e_machine
)
1210 result
= get_parisc_dynamic_type (type
);
1220 sprintf (buff
, _("Operating System specific: %lx"), type
);
1223 sprintf (buff
, _("<unknown>: %lx"), type
);
1230 get_file_type (e_type
)
1233 static char buff
[32];
1237 case ET_NONE
: return _("NONE (None)");
1238 case ET_REL
: return _("REL (Relocatable file)");
1239 case ET_EXEC
: return _("EXEC (Executable file)");
1240 case ET_DYN
: return _("DYN (Shared object file)");
1241 case ET_CORE
: return _("CORE (Core file)");
1244 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1245 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1246 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1247 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1249 sprintf (buff
, _("<unknown>: %x"), e_type
);
1255 get_machine_name (e_machine
)
1258 static char buff
[64]; /* XXX */
1262 case EM_NONE
: return _("None");
1263 case EM_M32
: return "WE32100";
1264 case EM_SPARC
: return "Sparc";
1265 case EM_386
: return "Intel 80386";
1266 case EM_68K
: return "MC68000";
1267 case EM_88K
: return "MC88000";
1268 case EM_486
: return "Intel 80486";
1269 case EM_860
: return "Intel 80860";
1270 case EM_MIPS
: return "MIPS R3000";
1271 case EM_S370
: return "IBM System/370";
1272 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1273 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1274 case EM_PARISC
: return "HPPA";
1275 case EM_PPC_OLD
: return "Power PC (old)";
1276 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1277 case EM_960
: return "Intel 90860";
1278 case EM_PPC
: return "PowerPC";
1279 case EM_V800
: return "NEC V800";
1280 case EM_FR20
: return "Fujitsu FR20";
1281 case EM_RH32
: return "TRW RH32";
1282 case EM_MCORE
: return "MCORE";
1283 case EM_ARM
: return "ARM";
1284 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1285 case EM_SH
: return "Hitachi SH";
1286 case EM_SPARCV9
: return "Sparc v9";
1287 case EM_TRICORE
: return "Siemens Tricore";
1288 case EM_ARC
: return "ARC";
1289 case EM_H8_300
: return "Hitachi H8/300";
1290 case EM_H8_300H
: return "Hitachi H8/300H";
1291 case EM_H8S
: return "Hitachi H8S";
1292 case EM_H8_500
: return "Hitachi H8/500";
1293 case EM_IA_64
: return "Intel IA-64";
1294 case EM_MIPS_X
: return "Stanford MIPS-X";
1295 case EM_COLDFIRE
: return "Motorola Coldfire";
1296 case EM_68HC12
: return "Motorola M68HC12";
1297 case EM_ALPHA
: return "Alpha";
1298 case EM_CYGNUS_D10V
: return "d10v";
1299 case EM_CYGNUS_D30V
: return "d30v";
1300 case EM_CYGNUS_ARC
: return "ARC";
1301 case EM_CYGNUS_M32R
: return "Mitsubishi M32r";
1302 case EM_CYGNUS_V850
: return "NEC v850";
1303 case EM_CYGNUS_MN10300
: return "mn10300";
1304 case EM_CYGNUS_MN10200
: return "mn10200";
1305 case EM_CYGNUS_FR30
: return "Fujitsu FR30";
1306 case EM_PJ
: return "picoJava";
1307 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1308 case EM_PCP
: return "Siemens PCP";
1309 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1310 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1311 case EM_STARCORE
: return "Motorola Star*Core processor";
1312 case EM_ME16
: return "Toyota ME16 processor";
1313 case EM_ST100
: return "STMicroelectronics ST100 processor";
1314 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1315 case EM_FX66
: return "Siemens FX66 microcontroller";
1316 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1317 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1318 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1319 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1320 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1321 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1322 case EM_SVX
: return "Silicon Graphics SVx";
1323 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1324 case EM_VAX
: return "Digital VAX";
1325 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1326 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1327 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1328 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1329 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1330 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1331 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1332 case EM_PRISM
: return "SiTera Prism";
1333 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1335 case EM_S390
: return "IBM S/390";
1337 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1343 decode_ARM_machine_flags (e_flags
, buf
)
1350 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1351 e_flags
&= ~ EF_ARM_EABIMASK
;
1353 /* Handle "generic" ARM flags. */
1354 if (e_flags
& EF_ARM_RELEXEC
)
1356 strcat (buf
, ", relocatable executable");
1357 e_flags
&= ~ EF_ARM_RELEXEC
;
1360 if (e_flags
& EF_ARM_HASENTRY
)
1362 strcat (buf
, ", has entry point");
1363 e_flags
&= ~ EF_ARM_HASENTRY
;
1366 /* Now handle EABI specific flags. */
1370 strcat (buf
, ", <unrecognised EABI>");
1375 case EF_ARM_EABI_VER1
:
1376 strcat (buf
, ", Version1 EABI");
1381 /* Process flags one bit at a time. */
1382 flag
= e_flags
& - e_flags
;
1387 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1388 strcat (buf
, ", sorted symbol tables");
1398 case EF_ARM_EABI_VER2
:
1399 strcat (buf
, ", Version2 EABI");
1404 /* Process flags one bit at a time. */
1405 flag
= e_flags
& - e_flags
;
1410 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1411 strcat (buf
, ", sorted symbol tables");
1414 case EF_ARM_DYNSYMSUSESEGIDX
:
1415 strcat (buf
, ", dynamic symbols use segment index");
1418 case EF_ARM_MAPSYMSFIRST
:
1419 strcat (buf
, ", mapping symbols precede others");
1429 case EF_ARM_EABI_UNKNOWN
:
1430 strcat (buf
, ", GNU EABI");
1435 /* Process flags one bit at a time. */
1436 flag
= e_flags
& - e_flags
;
1441 case EF_ARM_INTERWORK
:
1442 strcat (buf
, ", interworking enabled");
1445 case EF_ARM_APCS_26
:
1446 strcat (buf
, ", uses APCS/26");
1449 case EF_ARM_APCS_FLOAT
:
1450 strcat (buf
, ", uses APCS/float");
1454 strcat (buf
, ", position independent");
1458 strcat (buf
, ", 8 bit structure alignment");
1461 case EF_ARM_NEW_ABI
:
1462 strcat (buf
, ", uses new ABI");
1465 case EF_ARM_OLD_ABI
:
1466 strcat (buf
, ", uses old ABI");
1469 case EF_ARM_SOFT_FLOAT
:
1470 strcat (buf
, ", software FP");
1481 strcat (buf
,", <unknown>");
1485 get_machine_flags (e_flags
, e_machine
)
1489 static char buf
[1024];
1501 decode_ARM_machine_flags (e_flags
, buf
);
1505 if (e_flags
& EF_CPU32
)
1506 strcat (buf
, ", cpu32");
1510 if (e_flags
& EF_PPC_EMB
)
1511 strcat (buf
, ", emb");
1513 if (e_flags
& EF_PPC_RELOCATABLE
)
1514 strcat (buf
, ", relocatable");
1516 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1517 strcat (buf
, ", relocatable-lib");
1520 case EM_CYGNUS_V850
:
1521 switch (e_flags
& EF_V850_ARCH
)
1524 strcat (buf
, ", v850e");
1527 strcat (buf
, ", v850ea");
1530 strcat (buf
, ", v850");
1533 strcat (buf
, ", unknown v850 architecture variant");
1538 case EM_CYGNUS_M32R
:
1539 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1540 strcat (buf
, ", m32r");
1545 case EM_MIPS_RS3_LE
:
1546 if (e_flags
& EF_MIPS_NOREORDER
)
1547 strcat (buf
, ", noreorder");
1549 if (e_flags
& EF_MIPS_PIC
)
1550 strcat (buf
, ", pic");
1552 if (e_flags
& EF_MIPS_CPIC
)
1553 strcat (buf
, ", cpic");
1555 if (e_flags
& EF_MIPS_ABI2
)
1556 strcat (buf
, ", abi2");
1558 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_1
)
1559 strcat (buf
, ", mips1");
1561 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_2
)
1562 strcat (buf
, ", mips2");
1564 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_3
)
1565 strcat (buf
, ", mips3");
1567 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_4
)
1568 strcat (buf
, ", mips4");
1570 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_5
)
1571 strcat (buf
, ", mips5");
1573 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_32
)
1574 strcat (buf
, ", mips32");
1576 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_64
)
1577 strcat (buf
, ", mips64");
1579 switch ((e_flags
& EF_MIPS_MACH
))
1581 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1582 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1583 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1584 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1585 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1586 case E_MIPS_MACH_MIPS32_4K
: strcat (buf
, ", mips32-4k"); break;
1587 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1588 default: strcat (buf
, " UNKNOWN"); break;
1593 if (e_flags
& EF_SPARC_32PLUS
)
1594 strcat (buf
, ", v8+");
1596 if (e_flags
& EF_SPARC_SUN_US1
)
1597 strcat (buf
, ", ultrasparcI");
1599 if (e_flags
& EF_SPARC_SUN_US3
)
1600 strcat (buf
, ", ultrasparcIII");
1602 if (e_flags
& EF_SPARC_HAL_R1
)
1603 strcat (buf
, ", halr1");
1605 if (e_flags
& EF_SPARC_LEDATA
)
1606 strcat (buf
, ", ledata");
1608 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1609 strcat (buf
, ", tso");
1611 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1612 strcat (buf
, ", pso");
1614 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1615 strcat (buf
, ", rmo");
1619 switch (e_flags
& EF_PARISC_ARCH
)
1621 case EFA_PARISC_1_0
:
1622 strcpy (buf
, ", PA-RISC 1.0");
1624 case EFA_PARISC_1_1
:
1625 strcpy (buf
, ", PA-RISC 1.1");
1627 case EFA_PARISC_2_0
:
1628 strcpy (buf
, ", PA-RISC 2.0");
1633 if (e_flags
& EF_PARISC_TRAPNIL
)
1634 strcat (buf
, ", trapnil");
1635 if (e_flags
& EF_PARISC_EXT
)
1636 strcat (buf
, ", ext");
1637 if (e_flags
& EF_PARISC_LSB
)
1638 strcat (buf
, ", lsb");
1639 if (e_flags
& EF_PARISC_WIDE
)
1640 strcat (buf
, ", wide");
1641 if (e_flags
& EF_PARISC_NO_KABP
)
1642 strcat (buf
, ", no kabp");
1643 if (e_flags
& EF_PARISC_LAZYSWAP
)
1644 strcat (buf
, ", lazyswap");
1648 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1649 strcat (buf
, ", new calling convention");
1651 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1652 strcat (buf
, ", gnu calling convention");
1656 if ((e_flags
& EF_IA_64_ABI64
))
1657 strcat (buf
, ", 64-bit");
1659 strcat (buf
, ", 32-bit");
1660 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1661 strcat (buf
, ", reduced fp model");
1662 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1663 strcat (buf
, ", no function descriptors, constant gp");
1664 else if ((e_flags
& EF_IA_64_CONS_GP
))
1665 strcat (buf
, ", constant gp");
1666 if ((e_flags
& EF_IA_64_ABSOLUTE
))
1667 strcat (buf
, ", absolute");
1676 get_mips_segment_type (type
)
1681 case PT_MIPS_REGINFO
:
1683 case PT_MIPS_RTPROC
:
1685 case PT_MIPS_OPTIONS
:
1695 get_parisc_segment_type (type
)
1700 case PT_HP_TLS
: return "HP_TLS";
1701 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1702 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1703 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1704 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1705 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1706 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1707 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1708 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1709 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1710 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1711 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1712 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1713 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1722 get_ia64_segment_type (type
)
1727 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
1728 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
1737 get_segment_type (p_type
)
1738 unsigned long p_type
;
1740 static char buff
[32];
1744 case PT_NULL
: return "NULL";
1745 case PT_LOAD
: return "LOAD";
1746 case PT_DYNAMIC
: return "DYNAMIC";
1747 case PT_INTERP
: return "INTERP";
1748 case PT_NOTE
: return "NOTE";
1749 case PT_SHLIB
: return "SHLIB";
1750 case PT_PHDR
: return "PHDR";
1753 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1755 const char * result
;
1757 switch (elf_header
.e_machine
)
1760 case EM_MIPS_RS3_LE
:
1761 result
= get_mips_segment_type (p_type
);
1764 result
= get_parisc_segment_type (p_type
);
1767 result
= get_ia64_segment_type (p_type
);
1777 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1779 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1781 const char * result
;
1783 switch (elf_header
.e_machine
)
1786 result
= get_parisc_segment_type (p_type
);
1796 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1799 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1806 get_mips_section_type_name (sh_type
)
1807 unsigned int sh_type
;
1811 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1812 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1813 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1814 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1815 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1816 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1817 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1818 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1819 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1820 case SHT_MIPS_RELD
: return "MIPS_RELD";
1821 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
1822 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
1823 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1824 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
1825 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
1826 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
1827 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
1828 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
1829 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
1830 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
1831 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
1832 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
1833 case SHT_MIPS_LINE
: return "MIPS_LINE";
1834 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
1835 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
1836 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
1837 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
1838 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
1839 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
1840 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1841 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
1842 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
1843 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
1844 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
1845 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
1846 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
1847 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
1848 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
1849 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
1857 get_parisc_section_type_name (sh_type
)
1858 unsigned int sh_type
;
1862 case SHT_PARISC_EXT
: return "PARISC_EXT";
1863 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
1864 case SHT_PARISC_DOC
: return "PARISC_DOC";
1872 get_ia64_section_type_name (sh_type
)
1873 unsigned int sh_type
;
1877 case SHT_IA_64_EXT
: return "IA_64_EXT";
1878 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
1886 get_section_type_name (sh_type
)
1887 unsigned int sh_type
;
1889 static char buff
[32];
1893 case SHT_NULL
: return "NULL";
1894 case SHT_PROGBITS
: return "PROGBITS";
1895 case SHT_SYMTAB
: return "SYMTAB";
1896 case SHT_STRTAB
: return "STRTAB";
1897 case SHT_RELA
: return "RELA";
1898 case SHT_HASH
: return "HASH";
1899 case SHT_DYNAMIC
: return "DYNAMIC";
1900 case SHT_NOTE
: return "NOTE";
1901 case SHT_NOBITS
: return "NOBITS";
1902 case SHT_REL
: return "REL";
1903 case SHT_SHLIB
: return "SHLIB";
1904 case SHT_DYNSYM
: return "DYNSYM";
1905 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
1906 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
1907 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1908 case SHT_GROUP
: return "GROUP";
1909 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
1910 case SHT_GNU_verdef
: return "VERDEF";
1911 case SHT_GNU_verneed
: return "VERNEED";
1912 case SHT_GNU_versym
: return "VERSYM";
1913 case 0x6ffffff0: return "VERSYM";
1914 case 0x6ffffffc: return "VERDEF";
1915 case 0x7ffffffd: return "AUXILIARY";
1916 case 0x7fffffff: return "FILTER";
1919 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
1921 const char * result
;
1923 switch (elf_header
.e_machine
)
1926 case EM_MIPS_RS3_LE
:
1927 result
= get_mips_section_type_name (sh_type
);
1930 result
= get_parisc_section_type_name (sh_type
);
1933 result
= get_ia64_section_type_name (sh_type
);
1943 sprintf (buff
, "SHT_LOPROC+%x", sh_type
- SHT_LOPROC
);
1945 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
1946 sprintf (buff
, "SHT_LOOS+%x", sh_type
- SHT_LOOS
);
1947 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
1948 sprintf (buff
, "SHT_LOUSER+%x", sh_type
- SHT_LOUSER
);
1950 sprintf (buff
, _("<unknown>: %x"), sh_type
);
1956 struct option options
[] =
1958 {"all", no_argument
, 0, 'a'},
1959 {"file-header", no_argument
, 0, 'h'},
1960 {"program-headers", no_argument
, 0, 'l'},
1961 {"headers", no_argument
, 0, 'e'},
1962 {"histogram", no_argument
, 0, 'I'},
1963 {"segments", no_argument
, 0, 'l'},
1964 {"sections", no_argument
, 0, 'S'},
1965 {"section-headers", no_argument
, 0, 'S'},
1966 {"symbols", no_argument
, 0, 's'},
1967 {"syms", no_argument
, 0, 's'},
1968 {"relocs", no_argument
, 0, 'r'},
1969 {"notes", no_argument
, 0, 'n'},
1970 {"dynamic", no_argument
, 0, 'd'},
1971 {"arch-specific", no_argument
, 0, 'A'},
1972 {"version-info", no_argument
, 0, 'V'},
1973 {"use-dynamic", no_argument
, 0, 'D'},
1974 {"hex-dump", required_argument
, 0, 'x'},
1975 {"debug-dump", optional_argument
, 0, 'w'},
1976 {"unwind", no_argument
, 0, 'u'},
1977 #ifdef SUPPORT_DISASSEMBLY
1978 {"instruction-dump", required_argument
, 0, 'i'},
1981 {"version", no_argument
, 0, 'v'},
1982 {"help", no_argument
, 0, 'H'},
1983 {0, no_argument
, 0, 0}
1989 fprintf (stdout
, _("Usage: readelf {options} elf-file(s)\n"));
1990 fprintf (stdout
, _(" Options are:\n"));
1991 fprintf (stdout
, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1992 fprintf (stdout
, _(" -h or --file-header Display the ELF file header\n"));
1993 fprintf (stdout
, _(" -l or --program-headers or --segments\n"));
1994 fprintf (stdout
, _(" Display the program headers\n"));
1995 fprintf (stdout
, _(" -S or --section-headers or --sections\n"));
1996 fprintf (stdout
, _(" Display the sections' header\n"));
1997 fprintf (stdout
, _(" -e or --headers Equivalent to: -h -l -S\n"));
1998 fprintf (stdout
, _(" -s or --syms or --symbols Display the symbol table\n"));
1999 fprintf (stdout
, _(" -n or --notes Display the core notes (if present)\n"));
2000 fprintf (stdout
, _(" -r or --relocs Display the relocations (if present)\n"));
2001 fprintf (stdout
, _(" -u or --unwind Display the unwind info (if present)\n"));
2002 fprintf (stdout
, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2003 fprintf (stdout
, _(" -V or --version-info Display the version sections (if present)\n"));
2004 fprintf (stdout
, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2005 fprintf (stdout
, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2006 fprintf (stdout
, _(" -x <number> or --hex-dump=<number>\n"));
2007 fprintf (stdout
, _(" Dump the contents of section <number>\n"));
2008 fprintf (stdout
, _(" -w[liaprf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=frames]\n"));
2009 fprintf (stdout
, _(" Display the contents of DWARF2 debug sections\n"));
2010 #ifdef SUPPORT_DISASSEMBLY
2011 fprintf (stdout
, _(" -i <number> or --instruction-dump=<number>\n"));
2012 fprintf (stdout
, _(" Disassemble the contents of section <number>\n"));
2014 fprintf (stdout
, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2015 fprintf (stdout
, _(" -v or --version Display the version number of readelf\n"));
2016 fprintf (stdout
, _(" -H or --help Display this information\n"));
2017 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2023 request_dump (section
, type
)
2024 unsigned int section
;
2027 if (section
>= num_dump_sects
)
2029 char * new_dump_sects
;
2031 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2033 if (new_dump_sects
== NULL
)
2034 error (_("Out of memory allocating dump request table."));
2037 /* Copy current flag settings. */
2038 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2042 dump_sects
= new_dump_sects
;
2043 num_dump_sects
= section
+ 1;
2048 dump_sects
[section
] |= type
;
2054 parse_args (argc
, argv
)
2063 while ((c
= getopt_long
2064 (argc
, argv
, "ersuahnldSDAIw::x:i:vV", options
, NULL
)) != EOF
)
2100 do_using_dynamic
++;
2131 section
= strtoul (optarg
, & cp
, 0);
2132 if (! * cp
&& section
>= 0)
2134 request_dump (section
, HEX_DUMP
);
2154 do_debug_abbrevs
= 1;
2164 do_debug_pubnames
= 1;
2169 do_debug_aranges
= 1;
2173 do_debug_frames_interp
= 1;
2175 do_debug_frames
= 1;
2179 warn (_("Unrecognised debug option '%s'\n"), optarg
);
2184 #ifdef SUPPORT_DISASSEMBLY
2187 section
= strtoul (optarg
, & cp
, 0);
2188 if (! * cp
&& section
>= 0)
2190 request_dump (section
, DISASS_DUMP
);
2196 print_version (program_name
);
2203 /* xgettext:c-format */
2204 error (_("Invalid option '-%c'\n"), c
);
2211 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2212 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2213 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2217 warn (_("Nothing to do.\n"));
2223 get_elf_class (elf_class
)
2224 unsigned char elf_class
;
2226 static char buff
[32];
2230 case ELFCLASSNONE
: return _("none");
2231 case ELFCLASS32
: return _("ELF32");
2232 case ELFCLASS64
: return _("ELF64");
2234 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2240 get_data_encoding (encoding
)
2241 unsigned char encoding
;
2243 static char buff
[32];
2247 case ELFDATANONE
: return _("none");
2248 case ELFDATA2LSB
: return _("2's complement, little endian");
2249 case ELFDATA2MSB
: return _("2's complement, big endian");
2251 sprintf (buff
, _("<unknown: %x>"), encoding
);
2257 get_osabi_name (osabi
)
2258 unsigned char osabi
;
2260 static char buff
[32];
2264 case ELFOSABI_NONE
: return _("UNIX - System V");
2265 case ELFOSABI_HPUX
: return _("UNIX - HP-UX");
2266 case ELFOSABI_NETBSD
: return _("UNIX - NetBSD");
2267 case ELFOSABI_LINUX
: return _("UNIX - Linux");
2268 case ELFOSABI_HURD
: return _("GNU/Hurd");
2269 case ELFOSABI_SOLARIS
: return _("UNIX - Solaris");
2270 case ELFOSABI_AIX
: return _("UNIX - AIX");
2271 case ELFOSABI_IRIX
: return _("UNIX - IRIX");
2272 case ELFOSABI_FREEBSD
: return _("UNIX - FreeBSD");
2273 case ELFOSABI_TRU64
: return _("UNIX - TRU64");
2274 case ELFOSABI_MODESTO
: return _("Novell - Modesto");
2275 case ELFOSABI_OPENBSD
: return _("UNIX - OpenBSD");
2276 case ELFOSABI_STANDALONE
: return _("Standalone App");
2277 case ELFOSABI_ARM
: return _("ARM");
2279 sprintf (buff
, _("<unknown: %x>"), osabi
);
2284 /* Decode the data held in 'elf_header'. */
2286 process_file_header ()
2288 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2289 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2290 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2291 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2294 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2302 printf (_("ELF Header:\n"));
2303 printf (_(" Magic: "));
2304 for (i
= 0; i
< EI_NIDENT
; i
++)
2305 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2307 printf (_(" Class: %s\n"),
2308 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2309 printf (_(" Data: %s\n"),
2310 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2311 printf (_(" Version: %d %s\n"),
2312 elf_header
.e_ident
[EI_VERSION
],
2313 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2315 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2318 printf (_(" OS/ABI: %s\n"),
2319 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2320 printf (_(" ABI Version: %d\n"),
2321 elf_header
.e_ident
[EI_ABIVERSION
]);
2322 printf (_(" Type: %s\n"),
2323 get_file_type (elf_header
.e_type
));
2324 printf (_(" Machine: %s\n"),
2325 get_machine_name (elf_header
.e_machine
));
2326 printf (_(" Version: 0x%lx\n"),
2327 (unsigned long) elf_header
.e_version
);
2329 printf (_(" Entry point address: "));
2330 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2331 printf (_("\n Start of program headers: "));
2332 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2333 printf (_(" (bytes into file)\n Start of section headers: "));
2334 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2335 printf (_(" (bytes into file)\n"));
2337 printf (_(" Flags: 0x%lx%s\n"),
2338 (unsigned long) elf_header
.e_flags
,
2339 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2340 printf (_(" Size of this header: %ld (bytes)\n"),
2341 (long) elf_header
.e_ehsize
);
2342 printf (_(" Size of program headers: %ld (bytes)\n"),
2343 (long) elf_header
.e_phentsize
);
2344 printf (_(" Number of program headers: %ld\n"),
2345 (long) elf_header
.e_phnum
);
2346 printf (_(" Size of section headers: %ld (bytes)\n"),
2347 (long) elf_header
.e_shentsize
);
2348 printf (_(" Number of section headers: %ld\n"),
2349 (long) elf_header
.e_shnum
);
2350 printf (_(" Section header string table index: %ld\n"),
2351 (long) elf_header
.e_shstrndx
);
2359 get_32bit_program_headers (file
, program_headers
)
2361 Elf_Internal_Phdr
* program_headers
;
2363 Elf32_External_Phdr
* phdrs
;
2364 Elf32_External_Phdr
* external
;
2365 Elf32_Internal_Phdr
* internal
;
2368 GET_DATA_ALLOC (elf_header
.e_phoff
,
2369 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2370 phdrs
, Elf32_External_Phdr
*, "program headers");
2372 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2373 i
< elf_header
.e_phnum
;
2374 i
++, internal
++, external
++)
2376 internal
->p_type
= BYTE_GET (external
->p_type
);
2377 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2378 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2379 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2380 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2381 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2382 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2383 internal
->p_align
= BYTE_GET (external
->p_align
);
2392 get_64bit_program_headers (file
, program_headers
)
2394 Elf_Internal_Phdr
* program_headers
;
2396 Elf64_External_Phdr
* phdrs
;
2397 Elf64_External_Phdr
* external
;
2398 Elf64_Internal_Phdr
* internal
;
2401 GET_DATA_ALLOC (elf_header
.e_phoff
,
2402 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2403 phdrs
, Elf64_External_Phdr
*, "program headers");
2405 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2406 i
< elf_header
.e_phnum
;
2407 i
++, internal
++, external
++)
2409 internal
->p_type
= BYTE_GET (external
->p_type
);
2410 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2411 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2412 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2413 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2414 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2415 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2416 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2425 process_program_headers (file
)
2428 Elf_Internal_Phdr
* program_headers
;
2429 Elf_Internal_Phdr
* segment
;
2432 if (elf_header
.e_phnum
== 0)
2435 printf (_("\nThere are no program headers in this file.\n"));
2439 if (do_segments
&& !do_header
)
2441 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2442 printf (_("Entry point "));
2443 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2444 printf (_("\nThere are %d program headers, starting at offset "),
2445 elf_header
.e_phnum
);
2446 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2450 program_headers
= (Elf_Internal_Phdr
*) malloc
2451 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2453 if (program_headers
== NULL
)
2455 error (_("Out of memory\n"));
2460 i
= get_32bit_program_headers (file
, program_headers
);
2462 i
= get_64bit_program_headers (file
, program_headers
);
2466 free (program_headers
);
2473 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2477 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2481 (_(" Type Offset VirtAddr PhysAddr\n"));
2483 (_(" FileSiz MemSiz Flags Align\n"));
2491 for (i
= 0, segment
= program_headers
;
2492 i
< elf_header
.e_phnum
;
2497 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2501 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2502 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2503 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2504 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2505 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2507 (segment
->p_flags
& PF_R
? 'R' : ' '),
2508 (segment
->p_flags
& PF_W
? 'W' : ' '),
2509 (segment
->p_flags
& PF_X
? 'E' : ' '));
2510 printf ("%#lx", (unsigned long) segment
->p_align
);
2514 print_vma (segment
->p_offset
, FULL_HEX
);
2516 print_vma (segment
->p_vaddr
, FULL_HEX
);
2518 print_vma (segment
->p_paddr
, FULL_HEX
);
2520 print_vma (segment
->p_filesz
, FULL_HEX
);
2522 print_vma (segment
->p_memsz
, FULL_HEX
);
2524 (segment
->p_flags
& PF_R
? 'R' : ' '),
2525 (segment
->p_flags
& PF_W
? 'W' : ' '),
2526 (segment
->p_flags
& PF_X
? 'E' : ' '));
2527 print_vma (segment
->p_align
, HEX
);
2531 switch (segment
->p_type
)
2535 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2536 - (segment
->p_offset
& 0xfffff000);
2541 error (_("more than one dynamic segment\n"));
2543 dynamic_addr
= segment
->p_offset
;
2544 dynamic_size
= segment
->p_filesz
;
2548 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2549 error (_("Unable to find program interpreter name\n"));
2552 program_interpreter
[0] = 0;
2553 fscanf (file
, "%63s", program_interpreter
);
2556 printf (_("\n [Requesting program interpreter: %s]"),
2557 program_interpreter
);
2563 putc ('\n', stdout
);
2572 if (do_segments
&& section_headers
!= NULL
)
2574 printf (_("\n Section to Segment mapping:\n"));
2575 printf (_(" Segment Sections...\n"));
2577 assert (string_table
!= NULL
);
2579 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2582 Elf_Internal_Shdr
* section
;
2584 segment
= program_headers
+ i
;
2585 section
= section_headers
;
2587 printf (" %2.2d ", i
);
2589 for (j
= 0; j
< elf_header
.e_shnum
; j
++, section
++)
2591 if (section
->sh_size
> 0
2592 /* Compare allocated sections by VMA, unallocated
2593 sections by file offset. */
2594 && (section
->sh_flags
& SHF_ALLOC
2595 ? (section
->sh_addr
>= segment
->p_vaddr
2596 && section
->sh_addr
+ section
->sh_size
2597 <= segment
->p_vaddr
+ segment
->p_memsz
)
2598 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2599 && (section
->sh_offset
+ section
->sh_size
2600 <= segment
->p_offset
+ segment
->p_filesz
))))
2601 printf ("%s ", SECTION_NAME (section
));
2608 free (program_headers
);
2615 get_32bit_section_headers (file
)
2618 Elf32_External_Shdr
* shdrs
;
2619 Elf32_Internal_Shdr
* internal
;
2622 GET_DATA_ALLOC (elf_header
.e_shoff
,
2623 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2624 shdrs
, Elf32_External_Shdr
*, "section headers");
2626 section_headers
= (Elf_Internal_Shdr
*) malloc
2627 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2629 if (section_headers
== NULL
)
2631 error (_("Out of memory\n"));
2635 for (i
= 0, internal
= section_headers
;
2636 i
< elf_header
.e_shnum
;
2639 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2640 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2641 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2642 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2643 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2644 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2645 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2646 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2647 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2648 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2657 get_64bit_section_headers (file
)
2660 Elf64_External_Shdr
* shdrs
;
2661 Elf64_Internal_Shdr
* internal
;
2664 GET_DATA_ALLOC (elf_header
.e_shoff
,
2665 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2666 shdrs
, Elf64_External_Shdr
*, "section headers");
2668 section_headers
= (Elf_Internal_Shdr
*) malloc
2669 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2671 if (section_headers
== NULL
)
2673 error (_("Out of memory\n"));
2677 for (i
= 0, internal
= section_headers
;
2678 i
< elf_header
.e_shnum
;
2681 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2682 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2683 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2684 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2685 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2686 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2687 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2688 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2689 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2690 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2698 static Elf_Internal_Sym
*
2699 get_32bit_elf_symbols (file
, offset
, number
)
2701 unsigned long offset
;
2702 unsigned long number
;
2704 Elf32_External_Sym
* esyms
;
2705 Elf_Internal_Sym
* isyms
;
2706 Elf_Internal_Sym
* psym
;
2709 GET_DATA_ALLOC (offset
, number
* sizeof (Elf32_External_Sym
),
2710 esyms
, Elf32_External_Sym
*, "symbols");
2712 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2716 error (_("Out of memory\n"));
2722 for (j
= 0, psym
= isyms
;
2726 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2727 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
2728 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
2729 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2730 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2731 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2739 static Elf_Internal_Sym
*
2740 get_64bit_elf_symbols (file
, offset
, number
)
2742 unsigned long offset
;
2743 unsigned long number
;
2745 Elf64_External_Sym
* esyms
;
2746 Elf_Internal_Sym
* isyms
;
2747 Elf_Internal_Sym
* psym
;
2750 GET_DATA_ALLOC (offset
, number
* sizeof (Elf64_External_Sym
),
2751 esyms
, Elf64_External_Sym
*, "symbols");
2753 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2757 error (_("Out of memory\n"));
2763 for (j
= 0, psym
= isyms
;
2767 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2768 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2769 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2770 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2771 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
2772 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
2781 get_elf_section_flags (sh_flags
)
2784 static char buff
[32];
2792 flag
= sh_flags
& - sh_flags
;
2797 case SHF_WRITE
: strcat (buff
, "W"); break;
2798 case SHF_ALLOC
: strcat (buff
, "A"); break;
2799 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
2800 case SHF_MERGE
: strcat (buff
, "M"); break;
2801 case SHF_STRINGS
: strcat (buff
, "S"); break;
2802 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
2803 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
2804 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
2805 case SHF_GROUP
: strcat (buff
, "G"); break;
2808 if (flag
& SHF_MASKOS
)
2811 sh_flags
&= ~ SHF_MASKOS
;
2813 else if (flag
& SHF_MASKPROC
)
2816 sh_flags
&= ~ SHF_MASKPROC
;
2828 process_section_headers (file
)
2831 Elf_Internal_Shdr
* section
;
2834 section_headers
= NULL
;
2836 if (elf_header
.e_shnum
== 0)
2839 printf (_("\nThere are no sections in this file.\n"));
2844 if (do_sections
&& !do_header
)
2845 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2846 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
2850 if (! get_32bit_section_headers (file
))
2853 else if (! get_64bit_section_headers (file
))
2856 /* Read in the string table, so that we have names to display. */
2857 section
= section_headers
+ elf_header
.e_shstrndx
;
2859 if (section
->sh_size
!= 0)
2861 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2862 string_table
, char *, "string table");
2864 string_table_length
= section
->sh_size
;
2867 /* Scan the sections for the dynamic symbol table
2868 and dynamic string table and debug sections. */
2869 dynamic_symbols
= NULL
;
2870 dynamic_strings
= NULL
;
2871 dynamic_syminfo
= NULL
;
2873 for (i
= 0, section
= section_headers
;
2874 i
< elf_header
.e_shnum
;
2877 char * name
= SECTION_NAME (section
);
2879 if (section
->sh_type
== SHT_DYNSYM
)
2881 if (dynamic_symbols
!= NULL
)
2883 error (_("File contains multiple dynamic symbol tables\n"));
2887 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
2889 GET_ELF_SYMBOLS (file
, section
->sh_offset
, num_dynamic_syms
);
2891 else if (section
->sh_type
== SHT_STRTAB
2892 && strcmp (name
, ".dynstr") == 0)
2894 if (dynamic_strings
!= NULL
)
2896 error (_("File contains multiple dynamic string tables\n"));
2900 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2901 dynamic_strings
, char *, "dynamic strings");
2903 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
2904 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
2906 && strncmp (name
, ".debug_", 7) == 0)
2911 || (do_debug_info
&& (strcmp (name
, "info") == 0))
2912 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
2913 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
2914 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
2915 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
2916 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
2918 request_dump (i
, DEBUG_DUMP
);
2920 /* linkonce section to be combined with .debug_info at link time. */
2921 else if ((do_debugging
|| do_debug_info
)
2922 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
2923 request_dump (i
, DEBUG_DUMP
);
2924 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
2925 request_dump (i
, DEBUG_DUMP
);
2931 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
2935 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2938 printf (_(" [Nr] Name Type Address Offset\n"));
2939 printf (_(" Size EntSize Flags Link Info Align\n"));
2942 for (i
= 0, section
= section_headers
;
2943 i
< elf_header
.e_shnum
;
2946 printf (" [%2d] %-17.17s %-15.15s ",
2948 SECTION_NAME (section
),
2949 get_section_type_name (section
->sh_type
));
2953 print_vma (section
->sh_addr
, LONG_HEX
);
2955 printf ( " %6.6lx %6.6lx %2.2lx",
2956 (unsigned long) section
->sh_offset
,
2957 (unsigned long) section
->sh_size
,
2958 (unsigned long) section
->sh_entsize
);
2960 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
2962 printf ("%2ld %3lx %2ld\n",
2963 (unsigned long) section
->sh_link
,
2964 (unsigned long) section
->sh_info
,
2965 (unsigned long) section
->sh_addralign
);
2970 print_vma (section
->sh_addr
, LONG_HEX
);
2971 printf (" %8.8lx", section
->sh_offset
);
2973 print_vma (section
->sh_size
, LONG_HEX
);
2975 print_vma (section
->sh_entsize
, LONG_HEX
);
2977 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
2979 printf (" %2ld %3lx %ld\n",
2980 (unsigned long) section
->sh_link
,
2981 (unsigned long) section
->sh_info
,
2982 (unsigned long) section
->sh_addralign
);
2986 printf (_("Key to Flags:\n"));
2987 printf (_(" W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2988 printf (_(" I (info), L (link order), G (group), x (unknown)\n"));
2989 printf (_(" O (extra OS processing required) o (OS specific), p (processor specific)\n"));
2994 /* Process the reloc section. */
2996 process_relocs (file
)
2999 unsigned long rel_size
;
3000 unsigned long rel_offset
;
3006 if (do_using_dynamic
)
3008 int is_rela
= FALSE
;
3013 if (dynamic_info
[DT_REL
])
3015 rel_offset
= dynamic_info
[DT_REL
];
3016 rel_size
= dynamic_info
[DT_RELSZ
];
3019 else if (dynamic_info
[DT_RELA
])
3021 rel_offset
= dynamic_info
[DT_RELA
];
3022 rel_size
= dynamic_info
[DT_RELASZ
];
3025 else if (dynamic_info
[DT_JMPREL
])
3027 rel_offset
= dynamic_info
[DT_JMPREL
];
3028 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3030 switch (dynamic_info
[DT_PLTREL
])
3047 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3048 rel_offset
, rel_size
);
3050 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3051 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
3054 printf (_("\nThere are no dynamic relocations in this file.\n"));
3058 Elf32_Internal_Shdr
* section
;
3062 for (i
= 0, section
= section_headers
;
3063 i
< elf_header
.e_shnum
;
3066 if ( section
->sh_type
!= SHT_RELA
3067 && section
->sh_type
!= SHT_REL
)
3070 rel_offset
= section
->sh_offset
;
3071 rel_size
= section
->sh_size
;
3075 Elf32_Internal_Shdr
* strsec
;
3076 Elf32_Internal_Shdr
* symsec
;
3077 Elf_Internal_Sym
* symtab
;
3080 unsigned long nsyms
;
3082 printf (_("\nRelocation section "));
3084 if (string_table
== NULL
)
3085 printf ("%d", section
->sh_name
);
3087 printf ("'%s'", SECTION_NAME (section
));
3089 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3090 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3092 symsec
= section_headers
+ section
->sh_link
;
3094 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3095 symtab
= GET_ELF_SYMBOLS (file
, symsec
->sh_offset
, nsyms
);
3100 strsec
= section_headers
+ symsec
->sh_link
;
3102 GET_DATA_ALLOC (strsec
->sh_offset
, strsec
->sh_size
, strtab
,
3103 char *, "string table");
3105 is_rela
= section
->sh_type
== SHT_RELA
;
3107 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
);
3117 printf (_("\nThere are no relocations in this file.\n"));
3123 #include "unwind-ia64.h"
3125 /* An absolute address consists of a section and an offset. If the
3126 section is NULL, the offset itself is the address, otherwise, the
3127 address equals to LOAD_ADDRESS(section) + offset. */
3131 unsigned short section
;
3137 struct unw_table_entry
3139 struct absaddr start
;
3141 struct absaddr info
;
3143 *table
; /* Unwind table. */
3144 unsigned long table_len
; /* Length of unwind table. */
3145 unsigned char * info
; /* Unwind info. */
3146 unsigned long info_size
; /* Size of unwind info. */
3147 bfd_vma info_addr
; /* starting address of unwind info. */
3148 bfd_vma seg_base
; /* Starting address of segment. */
3149 Elf_Internal_Sym
* symtab
; /* The symbol table. */
3150 unsigned long nsyms
; /* Number of symbols. */
3151 char * strtab
; /* The string table. */
3152 unsigned long strtab_size
; /* Size of string table. */
3155 static void find_symbol_for_address
PARAMS ((struct unw_aux_info
*,
3156 struct absaddr
, const char **,
3158 static void dump_ia64_unwind
PARAMS ((struct unw_aux_info
*));
3159 static int slurp_ia64_unwind_table
PARAMS ((FILE *, struct unw_aux_info
*,
3160 Elf32_Internal_Shdr
*));
3163 find_symbol_for_address (aux
, addr
, symname
, offset
)
3164 struct unw_aux_info
*aux
;
3165 struct absaddr addr
;
3166 const char **symname
;
3169 bfd_vma dist
= (bfd_vma
) 0x100000;
3170 Elf_Internal_Sym
*sym
, *best
= NULL
;
3173 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3175 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3176 && sym
->st_name
!= 0
3177 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3178 && addr
.offset
>= sym
->st_value
3179 && addr
.offset
- sym
->st_value
< dist
)
3182 dist
= addr
.offset
- sym
->st_value
;
3189 *symname
= (best
->st_name
>= aux
->strtab_size
3190 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3195 *offset
= addr
.offset
;
3199 dump_ia64_unwind (aux
)
3200 struct unw_aux_info
*aux
;
3203 struct unw_table_entry
* tp
;
3206 addr_size
= is_32bit_elf
? 4 : 8;
3208 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3212 const unsigned char * dp
;
3213 const unsigned char * head
;
3214 const char * procname
;
3216 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3218 fputs ("\n<", stdout
);
3222 fputs (procname
, stdout
);
3225 printf ("+%lx", (unsigned long) offset
);
3228 fputs (">: [", stdout
);
3229 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3230 fputc ('-', stdout
);
3231 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3232 printf ("), info at +0x%lx\n",
3233 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3235 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3236 stamp
= BYTE_GET8 ((unsigned char *) head
);
3238 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3239 (unsigned) UNW_VER (stamp
),
3240 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3241 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3242 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3243 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3245 if (UNW_VER (stamp
) != 1)
3247 printf ("\tUnknown version.\n");
3252 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3253 dp
= unw_decode (dp
, in_body
, & in_body
);
3258 slurp_ia64_unwind_table (file
, aux
, sec
)
3260 struct unw_aux_info
*aux
;
3261 Elf32_Internal_Shdr
*sec
;
3263 unsigned long size
, addr_size
, nrelas
, i
;
3264 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
3265 struct unw_table_entry
*tep
;
3266 Elf32_Internal_Shdr
*relsec
;
3267 Elf_Internal_Rela
*rela
, *rp
;
3268 unsigned char *table
, *tp
;
3269 Elf_Internal_Sym
*sym
;
3270 const char *relname
;
3273 addr_size
= is_32bit_elf
? 4 : 8;
3275 /* First, find the starting address of the segment that includes
3278 if (elf_header
.e_phnum
)
3280 prog_hdrs
= (Elf_Internal_Phdr
*)
3281 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3284 result
= get_32bit_program_headers (file
, prog_hdrs
);
3286 result
= get_64bit_program_headers (file
, prog_hdrs
);
3294 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
3296 if (seg
->p_type
!= PT_LOAD
)
3299 if (sec
->sh_addr
>= seg
->p_vaddr
3300 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3302 aux
->seg_base
= seg
->p_vaddr
;
3310 /* Second, build the unwind table from the contents of the unwind section: */
3311 size
= sec
->sh_size
;
3312 GET_DATA_ALLOC (sec
->sh_offset
, size
, table
, char *, "unwind table");
3314 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3315 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++ tep
)
3317 tep
->start
.section
= SHN_UNDEF
;
3318 tep
->end
.section
= SHN_UNDEF
;
3319 tep
->info
.section
= SHN_UNDEF
;
3322 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3323 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3324 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3328 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3329 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3330 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3332 tep
->start
.offset
+= aux
->seg_base
;
3333 tep
->end
.offset
+= aux
->seg_base
;
3334 tep
->info
.offset
+= aux
->seg_base
;
3338 /* Third, apply any relocations to the unwind table: */
3340 for (relsec
= section_headers
;
3341 relsec
< section_headers
+ elf_header
.e_shnum
;
3344 if (relsec
->sh_type
!= SHT_RELA
3345 || section_headers
+ relsec
->sh_info
!= sec
)
3348 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
3352 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
3356 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
3357 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
3359 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3361 warn (_("Skipping unexpected symbol type %u"),
3362 ELF32_ST_TYPE (sym
->st_info
));
3368 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
3369 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
3371 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3373 warn (_("Skipping unexpected symbol type %u"),
3374 ELF64_ST_TYPE (sym
->st_info
));
3379 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
3381 warn (_("Skipping unexpected relocation type %s"), relname
);
3385 i
= rp
->r_offset
/ (3 * addr_size
);
3387 switch (rp
->r_offset
/addr_size
% 3)
3390 aux
->table
[i
].start
.section
= sym
->st_shndx
;
3391 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
3394 aux
->table
[i
].end
.section
= sym
->st_shndx
;
3395 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
3398 aux
->table
[i
].info
.section
= sym
->st_shndx
;
3399 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
3409 aux
->table_len
= size
/ (3 * addr_size
);
3414 process_unwind (file
)
3417 Elf32_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
3418 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
3419 struct unw_aux_info aux
;
3424 if (elf_header
.e_machine
!= EM_IA_64
)
3426 printf (_("\nThere are no unwind sections in this file.\n"));
3430 memset (& aux
, 0, sizeof (aux
));
3432 addr_size
= is_32bit_elf
? 4 : 8;
3434 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
3436 if (sec
->sh_type
== SHT_SYMTAB
)
3438 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
3439 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
->sh_offset
, aux
.nsyms
);
3441 strsec
= section_headers
+ sec
->sh_link
;
3442 aux
.strtab_size
= strsec
->sh_size
;
3443 GET_DATA_ALLOC (strsec
->sh_offset
, aux
.strtab_size
,
3444 aux
.strtab
, char *, "string table");
3446 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3451 printf (_("\nThere are no unwind sections in this file.\n"));
3453 while (unwcount
-- > 0)
3458 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
3459 i
< elf_header
.e_shnum
; ++i
, ++sec
)
3460 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3467 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
3469 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
3472 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3473 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
3474 suffix
= SECTION_NAME (unwsec
) + len
;
3475 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3477 if (strncmp (SECTION_NAME (sec
),
3478 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
3479 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3484 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3485 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3486 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
3487 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
3489 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
3491 suffix
= SECTION_NAME (unwsec
) + len
;
3492 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3494 if (strncmp (SECTION_NAME (sec
),
3495 ELF_STRING_ia64_unwind_info
, len2
) == 0
3496 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3500 if (i
== elf_header
.e_shnum
)
3502 printf (_("\nCould not find unwind info section for "));
3504 if (string_table
== NULL
)
3505 printf ("%d", unwsec
->sh_name
);
3507 printf ("'%s'", SECTION_NAME (unwsec
));
3511 aux
.info_size
= sec
->sh_size
;
3512 aux
.info_addr
= sec
->sh_addr
;
3513 GET_DATA_ALLOC (sec
->sh_offset
, aux
.info_size
, aux
.info
,
3514 char *, "unwind info");
3516 printf (_("\nUnwind section "));
3518 if (string_table
== NULL
)
3519 printf ("%d", unwsec
->sh_name
);
3521 printf ("'%s'", SECTION_NAME (unwsec
));
3523 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3525 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
3527 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
3529 if (aux
.table_len
> 0)
3530 dump_ia64_unwind (& aux
);
3533 free ((char *) aux
.table
);
3535 free ((char *) aux
.info
);
3544 free ((char *) aux
.strtab
);
3550 dynamic_segment_mips_val (entry
)
3551 Elf_Internal_Dyn
* entry
;
3553 switch (entry
->d_tag
)
3556 if (entry
->d_un
.d_val
== 0)
3560 static const char * opts
[] =
3562 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3563 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3564 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3565 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3570 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
3571 if (entry
->d_un
.d_val
& (1 << cnt
))
3573 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
3580 case DT_MIPS_IVERSION
:
3581 if (dynamic_strings
!= NULL
)
3582 printf ("Interface Version: %s\n",
3583 dynamic_strings
+ entry
->d_un
.d_val
);
3585 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3588 case DT_MIPS_TIME_STAMP
:
3593 time_t time
= entry
->d_un
.d_val
;
3594 tmp
= gmtime (&time
);
3595 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
3596 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
3597 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
3598 printf ("Time Stamp: %s\n", timebuf
);
3602 case DT_MIPS_RLD_VERSION
:
3603 case DT_MIPS_LOCAL_GOTNO
:
3604 case DT_MIPS_CONFLICTNO
:
3605 case DT_MIPS_LIBLISTNO
:
3606 case DT_MIPS_SYMTABNO
:
3607 case DT_MIPS_UNREFEXTNO
:
3608 case DT_MIPS_HIPAGENO
:
3609 case DT_MIPS_DELTA_CLASS_NO
:
3610 case DT_MIPS_DELTA_INSTANCE_NO
:
3611 case DT_MIPS_DELTA_RELOC_NO
:
3612 case DT_MIPS_DELTA_SYM_NO
:
3613 case DT_MIPS_DELTA_CLASSSYM_NO
:
3614 case DT_MIPS_COMPACT_SIZE
:
3615 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3619 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
3625 dynamic_segment_parisc_val (entry
)
3626 Elf_Internal_Dyn
* entry
;
3628 switch (entry
->d_tag
)
3630 case DT_HP_DLD_FLAGS
:
3639 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
3640 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
3641 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
3642 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
3643 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
3644 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
3645 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
3646 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
3647 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
3648 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
3649 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
3653 bfd_vma val
= entry
->d_un
.d_val
;
3655 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
3656 if (val
& flags
[cnt
].bit
)
3660 fputs (flags
[cnt
].str
, stdout
);
3662 val
^= flags
[cnt
].bit
;
3665 if (val
!= 0 || first
)
3669 print_vma (val
, HEX
);
3675 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
3681 get_32bit_dynamic_segment (file
)
3684 Elf32_External_Dyn
* edyn
;
3685 Elf_Internal_Dyn
* entry
;
3688 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
3689 edyn
, Elf32_External_Dyn
*, "dynamic segment");
3691 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3692 how large this .dynamic is now. We can do this even before the byte
3693 swapping since the DT_NULL tag is recognizable. */
3695 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3698 dynamic_segment
= (Elf_Internal_Dyn
*)
3699 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3701 if (dynamic_segment
== NULL
)
3703 error (_("Out of memory\n"));
3708 for (i
= 0, entry
= dynamic_segment
;
3712 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
3713 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
3722 get_64bit_dynamic_segment (file
)
3725 Elf64_External_Dyn
* edyn
;
3726 Elf_Internal_Dyn
* entry
;
3729 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
3730 edyn
, Elf64_External_Dyn
*, "dynamic segment");
3732 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3733 how large this .dynamic is now. We can do this even before the byte
3734 swapping since the DT_NULL tag is recognizable. */
3736 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3739 dynamic_segment
= (Elf_Internal_Dyn
*)
3740 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3742 if (dynamic_segment
== NULL
)
3744 error (_("Out of memory\n"));
3749 for (i
= 0, entry
= dynamic_segment
;
3753 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
3754 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
3763 get_dynamic_flags (flags
)
3766 static char buff
[64];
3771 flag
= flags
& - flags
;
3776 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
3777 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
3778 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
3779 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
3780 default: strcat (buff
, "unknown "); break;
3786 /* Parse and display the contents of the dynamic segment. */
3788 process_dynamic_segment (file
)
3791 Elf_Internal_Dyn
* entry
;
3794 if (dynamic_size
== 0)
3797 printf (_("\nThere is no dynamic segment in this file.\n"));
3804 if (! get_32bit_dynamic_segment (file
))
3807 else if (! get_64bit_dynamic_segment (file
))
3810 /* Find the appropriate symbol table. */
3811 if (dynamic_symbols
== NULL
)
3813 for (i
= 0, entry
= dynamic_segment
;
3817 unsigned long offset
;
3819 if (entry
->d_tag
!= DT_SYMTAB
)
3822 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
3824 /* Since we do not know how big the symbol table is,
3825 we default to reading in the entire file (!) and
3826 processing that. This is overkill, I know, but it
3828 offset
= entry
->d_un
.d_val
- loadaddr
;
3830 if (fseek (file
, 0, SEEK_END
))
3831 error (_("Unable to seek to end of file!"));
3834 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf32_External_Sym
);
3836 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf64_External_Sym
);
3838 if (num_dynamic_syms
< 1)
3840 error (_("Unable to determine the number of symbols to load\n"));
3844 dynamic_symbols
= GET_ELF_SYMBOLS (file
, offset
, num_dynamic_syms
);
3848 /* Similarly find a string table. */
3849 if (dynamic_strings
== NULL
)
3851 for (i
= 0, entry
= dynamic_segment
;
3855 unsigned long offset
;
3858 if (entry
->d_tag
!= DT_STRTAB
)
3861 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
3863 /* Since we do not know how big the string table is,
3864 we default to reading in the entire file (!) and
3865 processing that. This is overkill, I know, but it
3868 offset
= entry
->d_un
.d_val
- loadaddr
;
3869 if (fseek (file
, 0, SEEK_END
))
3870 error (_("Unable to seek to end of file\n"));
3871 str_tab_len
= ftell (file
) - offset
;
3873 if (str_tab_len
< 1)
3876 (_("Unable to determine the length of the dynamic string table\n"));
3880 GET_DATA_ALLOC (offset
, str_tab_len
, dynamic_strings
, char *,
3881 "dynamic string table");
3887 /* And find the syminfo section if available. */
3888 if (dynamic_syminfo
== NULL
)
3890 unsigned int syminsz
= 0;
3892 for (i
= 0, entry
= dynamic_segment
;
3896 if (entry
->d_tag
== DT_SYMINENT
)
3898 /* Note: these braces are necessary to avoid a syntax
3899 error from the SunOS4 C compiler. */
3900 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
3902 else if (entry
->d_tag
== DT_SYMINSZ
)
3903 syminsz
= entry
->d_un
.d_val
;
3904 else if (entry
->d_tag
== DT_SYMINFO
)
3905 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
3908 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
3910 Elf_External_Syminfo
* extsyminfo
;
3911 Elf_Internal_Syminfo
* syminfo
;
3913 /* There is a syminfo section. Read the data. */
3914 GET_DATA_ALLOC (dynamic_syminfo_offset
, syminsz
, extsyminfo
,
3915 Elf_External_Syminfo
*, "symbol information");
3917 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
3918 if (dynamic_syminfo
== NULL
)
3920 error (_("Out of memory\n"));
3924 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
3925 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
3928 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
3929 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
3936 if (do_dynamic
&& dynamic_addr
)
3937 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3938 dynamic_addr
, (long) dynamic_size
);
3940 printf (_(" Tag Type Name/Value\n"));
3942 for (i
= 0, entry
= dynamic_segment
;
3951 print_vma (entry
->d_tag
, FULL_HEX
);
3952 dtype
= get_dynamic_type (entry
->d_tag
);
3953 printf (" (%s)%*s", dtype
,
3954 ((is_32bit_elf
? 27 : 19)
3955 - (int) strlen (dtype
)),
3959 switch (entry
->d_tag
)
3963 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
3973 switch (entry
->d_tag
)
3976 printf (_("Auxiliary library"));
3980 printf (_("Filter library"));
3984 printf (_("Configuration file"));
3988 printf (_("Dependency audit library"));
3992 printf (_("Audit library"));
3996 if (dynamic_strings
)
3997 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4001 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4010 printf (_("Flags:"));
4011 if (entry
->d_un
.d_val
== 0)
4012 printf (_(" None\n"));
4015 unsigned long int val
= entry
->d_un
.d_val
;
4016 if (val
& DTF_1_PARINIT
)
4018 printf (" PARINIT");
4019 val
^= DTF_1_PARINIT
;
4021 if (val
& DTF_1_CONFEXP
)
4023 printf (" CONFEXP");
4024 val
^= DTF_1_CONFEXP
;
4027 printf (" %lx", val
);
4036 printf (_("Flags:"));
4037 if (entry
->d_un
.d_val
== 0)
4038 printf (_(" None\n"));
4041 unsigned long int val
= entry
->d_un
.d_val
;
4042 if (val
& DF_P1_LAZYLOAD
)
4044 printf (" LAZYLOAD");
4045 val
^= DF_P1_LAZYLOAD
;
4047 if (val
& DF_P1_GROUPPERM
)
4049 printf (" GROUPPERM");
4050 val
^= DF_P1_GROUPPERM
;
4053 printf (" %lx", val
);
4062 printf (_("Flags:"));
4063 if (entry
->d_un
.d_val
== 0)
4064 printf (_(" None\n"));
4067 unsigned long int val
= entry
->d_un
.d_val
;
4073 if (val
& DF_1_GLOBAL
)
4078 if (val
& DF_1_GROUP
)
4083 if (val
& DF_1_NODELETE
)
4085 printf (" NODELETE");
4086 val
^= DF_1_NODELETE
;
4088 if (val
& DF_1_LOADFLTR
)
4090 printf (" LOADFLTR");
4091 val
^= DF_1_LOADFLTR
;
4093 if (val
& DF_1_INITFIRST
)
4095 printf (" INITFIRST");
4096 val
^= DF_1_INITFIRST
;
4098 if (val
& DF_1_NOOPEN
)
4103 if (val
& DF_1_ORIGIN
)
4108 if (val
& DF_1_DIRECT
)
4113 if (val
& DF_1_TRANS
)
4118 if (val
& DF_1_INTERPOSE
)
4120 printf (" INTERPOSE");
4121 val
^= DF_1_INTERPOSE
;
4123 if (val
& DF_1_NODEFLIB
)
4125 printf (" NODEFLIB");
4126 val
^= DF_1_NODEFLIB
;
4128 if (val
& DF_1_NODUMP
)
4133 if (val
& DF_1_CONLFAT
)
4135 printf (" CONLFAT");
4136 val
^= DF_1_CONLFAT
;
4139 printf (" %lx", val
);
4147 puts (get_dynamic_type (entry
->d_un
.d_val
));
4167 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4173 if (dynamic_strings
== NULL
)
4176 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4180 switch (entry
->d_tag
)
4183 printf (_("Shared library: [%s]"), name
);
4185 if (strcmp (name
, program_interpreter
) == 0)
4186 printf (_(" program interpreter"));
4190 printf (_("Library soname: [%s]"), name
);
4194 printf (_("Library rpath: [%s]"), name
);
4198 printf (_("Library runpath: [%s]"), name
);
4202 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4207 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4223 case DT_INIT_ARRAYSZ
:
4224 case DT_FINI_ARRAYSZ
:
4227 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4228 printf (" (bytes)\n");
4238 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4251 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4255 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4259 printf (_("Not needed object: [%s]\n"), name
);
4264 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4270 /* The value of this entry is ignored. */
4274 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
4275 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
4280 switch (elf_header
.e_machine
)
4283 case EM_MIPS_RS3_LE
:
4284 dynamic_segment_mips_val (entry
);
4287 dynamic_segment_parisc_val (entry
);
4290 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4302 get_ver_flags (flags
)
4305 static char buff
[32];
4312 if (flags
& VER_FLG_BASE
)
4313 strcat (buff
, "BASE ");
4315 if (flags
& VER_FLG_WEAK
)
4317 if (flags
& VER_FLG_BASE
)
4318 strcat (buff
, "| ");
4320 strcat (buff
, "WEAK ");
4323 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
4324 strcat (buff
, "| <unknown>");
4329 /* Display the contents of the version sections. */
4331 process_version_sections (file
)
4334 Elf32_Internal_Shdr
* section
;
4341 for (i
= 0, section
= section_headers
;
4342 i
< elf_header
.e_shnum
;
4345 switch (section
->sh_type
)
4347 case SHT_GNU_verdef
:
4349 Elf_External_Verdef
* edefs
;
4356 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4357 SECTION_NAME (section
), section
->sh_info
);
4359 printf (_(" Addr: 0x"));
4360 printf_vma (section
->sh_addr
);
4361 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4362 (unsigned long) section
->sh_offset
, section
->sh_link
,
4363 SECTION_NAME (section_headers
+ section
->sh_link
));
4365 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
4366 edefs
, Elf_External_Verdef
*,
4367 "version definition section");
4369 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
4372 Elf_External_Verdef
* edef
;
4373 Elf_Internal_Verdef ent
;
4374 Elf_External_Verdaux
* eaux
;
4375 Elf_Internal_Verdaux aux
;
4379 vstart
= ((char *) edefs
) + idx
;
4381 edef
= (Elf_External_Verdef
*) vstart
;
4383 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
4384 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
4385 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
4386 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
4387 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
4388 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
4389 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
4391 printf (_(" %#06x: Rev: %d Flags: %s"),
4392 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
4394 printf (_(" Index: %d Cnt: %d "),
4395 ent
.vd_ndx
, ent
.vd_cnt
);
4397 vstart
+= ent
.vd_aux
;
4399 eaux
= (Elf_External_Verdaux
*) vstart
;
4401 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4402 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4404 if (dynamic_strings
)
4405 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
4407 printf (_("Name index: %ld\n"), aux
.vda_name
);
4409 isum
= idx
+ ent
.vd_aux
;
4411 for (j
= 1; j
< ent
.vd_cnt
; j
++)
4413 isum
+= aux
.vda_next
;
4414 vstart
+= aux
.vda_next
;
4416 eaux
= (Elf_External_Verdaux
*) vstart
;
4418 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4419 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4421 if (dynamic_strings
)
4422 printf (_(" %#06x: Parent %d: %s\n"),
4423 isum
, j
, dynamic_strings
+ aux
.vda_name
);
4425 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4426 isum
, j
, aux
.vda_name
);
4436 case SHT_GNU_verneed
:
4438 Elf_External_Verneed
* eneed
;
4444 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4445 SECTION_NAME (section
), section
->sh_info
);
4447 printf (_(" Addr: 0x"));
4448 printf_vma (section
->sh_addr
);
4449 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4450 (unsigned long) section
->sh_offset
, section
->sh_link
,
4451 SECTION_NAME (section_headers
+ section
->sh_link
));
4453 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
4454 eneed
, Elf_External_Verneed
*,
4455 "version need section");
4457 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
4459 Elf_External_Verneed
* entry
;
4460 Elf_Internal_Verneed ent
;
4465 vstart
= ((char *) eneed
) + idx
;
4467 entry
= (Elf_External_Verneed
*) vstart
;
4469 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
4470 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
4471 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
4472 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
4473 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
4475 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
4477 if (dynamic_strings
)
4478 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
4480 printf (_(" File: %lx"), ent
.vn_file
);
4482 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
4484 vstart
+= ent
.vn_aux
;
4486 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
4488 Elf_External_Vernaux
* eaux
;
4489 Elf_Internal_Vernaux aux
;
4491 eaux
= (Elf_External_Vernaux
*) vstart
;
4493 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
4494 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
4495 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
4496 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
4497 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
4499 if (dynamic_strings
)
4500 printf (_(" %#06x: Name: %s"),
4501 isum
, dynamic_strings
+ aux
.vna_name
);
4503 printf (_(" %#06x: Name index: %lx"),
4504 isum
, aux
.vna_name
);
4506 printf (_(" Flags: %s Version: %d\n"),
4507 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
4509 isum
+= aux
.vna_next
;
4510 vstart
+= aux
.vna_next
;
4520 case SHT_GNU_versym
:
4522 Elf32_Internal_Shdr
* link_section
;
4525 unsigned char * edata
;
4526 unsigned short * data
;
4528 Elf_Internal_Sym
* symbols
;
4529 Elf32_Internal_Shdr
* string_sec
;
4531 link_section
= section_headers
+ section
->sh_link
;
4532 total
= section
->sh_size
/ section
->sh_entsize
;
4536 symbols
= GET_ELF_SYMBOLS (file
, link_section
->sh_offset
,
4537 link_section
->sh_size
/ link_section
->sh_entsize
);
4539 string_sec
= section_headers
+ link_section
->sh_link
;
4541 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
4542 strtab
, char *, "version string table");
4544 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4545 SECTION_NAME (section
), total
);
4547 printf (_(" Addr: "));
4548 printf_vma (section
->sh_addr
);
4549 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4550 (unsigned long) section
->sh_offset
, section
->sh_link
,
4551 SECTION_NAME (link_section
));
4553 GET_DATA_ALLOC (version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
4555 total
* sizeof (short), edata
,
4556 unsigned char *, "version symbol data");
4558 data
= (unsigned short *) malloc (total
* sizeof (short));
4560 for (cnt
= total
; cnt
--;)
4561 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
4566 for (cnt
= 0; cnt
< total
; cnt
+= 4)
4569 int check_def
, check_need
;
4572 printf (" %03x:", cnt
);
4574 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
4575 switch (data
[cnt
+ j
])
4578 fputs (_(" 0 (*local*) "), stdout
);
4582 fputs (_(" 1 (*global*) "), stdout
);
4586 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
4587 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
4591 if (symbols
[cnt
+ j
].st_shndx
>= SHN_LORESERVE
4592 || section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
4595 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
4602 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
4604 Elf_Internal_Verneed ivn
;
4605 unsigned long offset
;
4607 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
4612 Elf_Internal_Vernaux ivna
;
4613 Elf_External_Verneed evn
;
4614 Elf_External_Vernaux evna
;
4615 unsigned long a_off
;
4617 GET_DATA (offset
, evn
, "version need");
4619 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4620 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4622 a_off
= offset
+ ivn
.vn_aux
;
4626 GET_DATA (a_off
, evna
,
4627 "version need aux (2)");
4629 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4630 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4632 a_off
+= ivna
.vna_next
;
4634 while (ivna
.vna_other
!= data
[cnt
+ j
]
4635 && ivna
.vna_next
!= 0);
4637 if (ivna
.vna_other
== data
[cnt
+ j
])
4639 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4641 name
= strtab
+ ivna
.vna_name
;
4642 nn
+= printf ("(%s%-*s",
4644 12 - (int) strlen (name
),
4650 offset
+= ivn
.vn_next
;
4652 while (ivn
.vn_next
);
4655 if (check_def
&& data
[cnt
+ j
] != 0x8001
4656 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
4658 Elf_Internal_Verdef ivd
;
4659 Elf_External_Verdef evd
;
4660 unsigned long offset
;
4662 offset
= version_info
4663 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
4667 GET_DATA (offset
, evd
, "version def");
4669 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
4670 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
4672 offset
+= ivd
.vd_next
;
4674 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
4675 && ivd
.vd_next
!= 0);
4677 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
4679 Elf_External_Verdaux evda
;
4680 Elf_Internal_Verdaux ivda
;
4682 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
4684 GET_DATA (offset
- ivd
.vd_next
+ ivd
.vd_aux
,
4685 evda
, "version def aux");
4687 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
4689 name
= strtab
+ ivda
.vda_name
;
4690 nn
+= printf ("(%s%-*s",
4692 12 - (int) strlen (name
),
4698 printf ("%*c", 18 - nn
, ' ');
4716 printf (_("\nNo version information found in this file.\n"));
4722 get_symbol_binding (binding
)
4723 unsigned int binding
;
4725 static char buff
[32];
4729 case STB_LOCAL
: return "LOCAL";
4730 case STB_GLOBAL
: return "GLOBAL";
4731 case STB_WEAK
: return "WEAK";
4733 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
4734 sprintf (buff
, _("<processor specific>: %d"), binding
);
4735 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
4736 sprintf (buff
, _("<OS specific>: %d"), binding
);
4738 sprintf (buff
, _("<unknown>: %d"), binding
);
4744 get_symbol_type (type
)
4747 static char buff
[32];
4751 case STT_NOTYPE
: return "NOTYPE";
4752 case STT_OBJECT
: return "OBJECT";
4753 case STT_FUNC
: return "FUNC";
4754 case STT_SECTION
: return "SECTION";
4755 case STT_FILE
: return "FILE";
4756 case STT_COMMON
: return "COMMON";
4758 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
4760 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
4761 return "THUMB_FUNC";
4763 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
4766 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
4767 return "PARISC_MILLI";
4769 sprintf (buff
, _("<processor specific>: %d"), type
);
4771 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
4773 if (elf_header
.e_machine
== EM_PARISC
)
4775 if (type
== STT_HP_OPAQUE
)
4777 if (type
== STT_HP_STUB
)
4781 sprintf (buff
, _("<OS specific>: %d"), type
);
4784 sprintf (buff
, _("<unknown>: %d"), type
);
4790 get_symbol_visibility (visibility
)
4791 unsigned int visibility
;
4795 case STV_DEFAULT
: return "DEFAULT";
4796 case STV_INTERNAL
: return "INTERNAL";
4797 case STV_HIDDEN
: return "HIDDEN";
4798 case STV_PROTECTED
: return "PROTECTED";
4804 get_symbol_index_type (type
)
4809 case SHN_UNDEF
: return "UND";
4810 case SHN_ABS
: return "ABS";
4811 case SHN_COMMON
: return "COM";
4813 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
4815 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
4817 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
4821 static char buff
[32];
4823 sprintf (buff
, "%3d", type
);
4830 get_dynamic_data (file
, number
)
4832 unsigned int number
;
4834 unsigned char * e_data
;
4837 e_data
= (unsigned char *) malloc (number
* 4);
4841 error (_("Out of memory\n"));
4845 if (fread (e_data
, 4, number
, file
) != number
)
4847 error (_("Unable to read in dynamic data\n"));
4851 i_data
= (int *) malloc (number
* sizeof (* i_data
));
4855 error (_("Out of memory\n"));
4861 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
4868 /* Dump the symbol table */
4870 process_symbol_table (file
)
4873 Elf32_Internal_Shdr
* section
;
4874 unsigned char nb
[4];
4875 unsigned char nc
[4];
4878 int * buckets
= NULL
;
4879 int * chains
= NULL
;
4881 if (! do_syms
&& !do_histogram
)
4884 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
4887 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
4889 error (_("Unable to seek to start of dynamic information"));
4893 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
4895 error (_("Failed to read in number of buckets\n"));
4899 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
4901 error (_("Failed to read in number of chains\n"));
4905 nbuckets
= byte_get (nb
, 4);
4906 nchains
= byte_get (nc
, 4);
4908 buckets
= get_dynamic_data (file
, nbuckets
);
4909 chains
= get_dynamic_data (file
, nchains
);
4911 if (buckets
== NULL
|| chains
== NULL
)
4916 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
4921 printf (_("\nSymbol table for image:\n"));
4923 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4925 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4927 for (hn
= 0; hn
< nbuckets
; hn
++)
4932 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
4934 Elf_Internal_Sym
* psym
;
4936 psym
= dynamic_symbols
+ si
;
4938 printf (" %3d %3d: ", si
, hn
);
4939 print_vma (psym
->st_value
, LONG_HEX
);
4941 print_vma (psym
->st_size
, DEC_5
);
4943 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
4944 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
4945 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
4946 printf (" %3.3s", get_symbol_index_type (psym
->st_shndx
));
4947 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
4951 else if (do_syms
&& !do_using_dynamic
)
4955 for (i
= 0, section
= section_headers
;
4956 i
< elf_header
.e_shnum
;
4961 Elf_Internal_Sym
* symtab
;
4962 Elf_Internal_Sym
* psym
;
4965 if ( section
->sh_type
!= SHT_SYMTAB
4966 && section
->sh_type
!= SHT_DYNSYM
)
4969 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4970 SECTION_NAME (section
),
4971 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
4973 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4975 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4977 symtab
= GET_ELF_SYMBOLS (file
, section
->sh_offset
,
4978 section
->sh_size
/ section
->sh_entsize
);
4982 if (section
->sh_link
== elf_header
.e_shstrndx
)
4983 strtab
= string_table
;
4986 Elf32_Internal_Shdr
* string_sec
;
4988 string_sec
= section_headers
+ section
->sh_link
;
4990 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
4991 strtab
, char *, "string table");
4994 for (si
= 0, psym
= symtab
;
4995 si
< section
->sh_size
/ section
->sh_entsize
;
4998 printf ("%6d: ", si
);
4999 print_vma (psym
->st_value
, LONG_HEX
);
5001 print_vma (psym
->st_size
, DEC_5
);
5002 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5003 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5004 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5005 printf (" %4s", get_symbol_index_type (psym
->st_shndx
));
5006 printf (" %s", strtab
+ psym
->st_name
);
5008 if (section
->sh_type
== SHT_DYNSYM
&&
5009 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5011 unsigned char data
[2];
5012 unsigned short vers_data
;
5013 unsigned long offset
;
5017 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5020 GET_DATA (offset
+ si
* sizeof (vers_data
), data
,
5023 vers_data
= byte_get (data
, 2);
5025 is_nobits
= psym
->st_shndx
< SHN_LORESERVE
?
5026 (section_headers
[psym
->st_shndx
].sh_type
== SHT_NOBITS
)
5029 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5031 if ((vers_data
& 0x8000) || vers_data
> 1)
5033 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5034 && (is_nobits
|| ! check_def
))
5036 Elf_External_Verneed evn
;
5037 Elf_Internal_Verneed ivn
;
5038 Elf_Internal_Vernaux ivna
;
5040 /* We must test both. */
5041 offset
= version_info
5042 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
5046 unsigned long vna_off
;
5048 GET_DATA (offset
, evn
, "version need");
5050 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5051 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5053 vna_off
= offset
+ ivn
.vn_aux
;
5057 Elf_External_Vernaux evna
;
5059 GET_DATA (vna_off
, evna
,
5060 "version need aux (3)");
5062 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5063 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5064 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5066 vna_off
+= ivna
.vna_next
;
5068 while (ivna
.vna_other
!= vers_data
5069 && ivna
.vna_next
!= 0);
5071 if (ivna
.vna_other
== vers_data
)
5074 offset
+= ivn
.vn_next
;
5076 while (ivn
.vn_next
!= 0);
5078 if (ivna
.vna_other
== vers_data
)
5081 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5084 else if (! is_nobits
)
5085 error (_("bad dynamic symbol"));
5092 if (vers_data
!= 0x8001
5093 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5095 Elf_Internal_Verdef ivd
;
5096 Elf_Internal_Verdaux ivda
;
5097 Elf_External_Verdaux evda
;
5098 unsigned long offset
;
5101 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5106 Elf_External_Verdef evd
;
5108 GET_DATA (offset
, evd
, "version def");
5110 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5111 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5112 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5114 offset
+= ivd
.vd_next
;
5116 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5117 && ivd
.vd_next
!= 0);
5119 offset
-= ivd
.vd_next
;
5120 offset
+= ivd
.vd_aux
;
5122 GET_DATA (offset
, evda
, "version def aux");
5124 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5126 if (psym
->st_name
!= ivda
.vda_name
)
5127 printf ((vers_data
& 0x8000)
5129 strtab
+ ivda
.vda_name
);
5139 if (strtab
!= string_table
)
5145 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5147 if (do_histogram
&& buckets
!= NULL
)
5154 int nzero_counts
= 0;
5157 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5159 printf (_(" Length Number %% of total Coverage\n"));
5161 lengths
= (int *) calloc (nbuckets
, sizeof (int));
5162 if (lengths
== NULL
)
5164 error (_("Out of memory"));
5167 for (hn
= 0; hn
< nbuckets
; ++hn
)
5172 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5175 if (maxlength
< ++lengths
[hn
])
5180 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
5183 error (_("Out of memory"));
5187 for (hn
= 0; hn
< nbuckets
; ++hn
)
5188 ++ counts
[lengths
[hn
]];
5192 printf (" 0 %-10d (%5.1f%%)\n",
5193 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5194 for (si
= 1; si
<= maxlength
; ++si
)
5196 nzero_counts
+= counts
[si
] * si
;
5197 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5198 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5199 (nzero_counts
* 100.0) / nsyms
);
5207 if (buckets
!= NULL
)
5217 process_syminfo (file
)
5218 FILE * file ATTRIBUTE_UNUSED
;
5222 if (dynamic_syminfo
== NULL
5224 /* No syminfo, this is ok. */
5227 /* There better should be a dynamic symbol section. */
5228 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5232 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5233 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5235 printf (_(" Num: Name BoundTo Flags\n"));
5236 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5238 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5240 printf ("%4d: %-30s ", i
,
5241 dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5243 switch (dynamic_syminfo
[i
].si_boundto
)
5245 case SYMINFO_BT_SELF
:
5246 fputs ("SELF ", stdout
);
5248 case SYMINFO_BT_PARENT
:
5249 fputs ("PARENT ", stdout
);
5252 if (dynamic_syminfo
[i
].si_boundto
> 0
5253 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
5256 + dynamic_segment
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
5258 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
5262 if (flags
& SYMINFO_FLG_DIRECT
)
5264 if (flags
& SYMINFO_FLG_PASSTHRU
)
5265 printf (" PASSTHRU");
5266 if (flags
& SYMINFO_FLG_COPY
)
5268 if (flags
& SYMINFO_FLG_LAZYLOAD
)
5269 printf (" LAZYLOAD");
5277 #ifdef SUPPORT_DISASSEMBLY
5279 disassemble_section (section
, file
)
5280 Elf32_Internal_Shdr
* section
;
5283 printf (_("\nAssembly dump of section %s\n"),
5284 SECTION_NAME (section
));
5286 /* XXX -- to be done --- XXX */
5293 dump_section (section
, file
)
5294 Elf32_Internal_Shdr
* section
;
5297 bfd_size_type bytes
;
5299 unsigned char * data
;
5300 unsigned char * start
;
5302 bytes
= section
->sh_size
;
5306 printf (_("\nSection '%s' has no data to dump.\n"),
5307 SECTION_NAME (section
));
5311 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
5313 addr
= section
->sh_addr
;
5315 GET_DATA_ALLOC (section
->sh_offset
, bytes
, start
, unsigned char *,
5326 lbytes
= (bytes
> 16 ? 16 : bytes
);
5328 printf (" 0x%8.8lx ", (unsigned long) addr
);
5330 switch (elf_header
.e_ident
[EI_DATA
])
5334 for (j
= 15; j
>= 0; j
--)
5337 printf ("%2.2x", data
[j
]);
5347 for (j
= 0; j
< 16; j
++)
5350 printf ("%2.2x", data
[j
]);
5360 for (j
= 0; j
< lbytes
; j
++)
5363 if (k
>= ' ' && k
< 0x80)
5382 static unsigned long int
5383 read_leb128 (data
, length_return
, sign
)
5384 unsigned char * data
;
5385 int * length_return
;
5388 unsigned long int result
= 0;
5389 unsigned int num_read
= 0;
5398 result
|= (byte
& 0x7f) << shift
;
5403 while (byte
& 0x80);
5405 if (length_return
!= NULL
)
5406 * length_return
= num_read
;
5408 if (sign
&& (shift
< 32) && (byte
& 0x40))
5409 result
|= -1 << shift
;
5414 typedef struct State_Machine_Registers
5416 unsigned long address
;
5419 unsigned int column
;
5423 /* This variable hold the number of the last entry seen
5424 in the File Table. */
5425 unsigned int last_file_entry
;
5428 static SMR state_machine_regs
;
5431 reset_state_machine (is_stmt
)
5434 state_machine_regs
.address
= 0;
5435 state_machine_regs
.file
= 1;
5436 state_machine_regs
.line
= 1;
5437 state_machine_regs
.column
= 0;
5438 state_machine_regs
.is_stmt
= is_stmt
;
5439 state_machine_regs
.basic_block
= 0;
5440 state_machine_regs
.end_sequence
= 0;
5441 state_machine_regs
.last_file_entry
= 0;
5444 /* Handled an extend line op. Returns true if this is the end
5447 process_extended_line_op (data
, is_stmt
, pointer_size
)
5448 unsigned char * data
;
5452 unsigned char op_code
;
5455 unsigned char * name
;
5458 len
= read_leb128 (data
, & bytes_read
, 0);
5463 warn (_("badly formed extended line op encountered!"));
5468 op_code
= * data
++;
5470 printf (_(" Extended opcode %d: "), op_code
);
5474 case DW_LNE_end_sequence
:
5475 printf (_("End of Sequence\n\n"));
5476 reset_state_machine (is_stmt
);
5479 case DW_LNE_set_address
:
5480 adr
= byte_get (data
, pointer_size
);
5481 printf (_("set Address to 0x%lx\n"), adr
);
5482 state_machine_regs
.address
= adr
;
5485 case DW_LNE_define_file
:
5486 printf (_(" define new File Table entry\n"));
5487 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5489 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5491 data
+= strlen ((char *) data
) + 1;
5492 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5494 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5496 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5497 printf (_("%s\n\n"), name
);
5501 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
5508 /* Size of pointers in the .debug_line section. This information is not
5509 really present in that section. It's obtained before dumping the debug
5510 sections by doing some pre-scan of the .debug_info section. */
5511 static int debug_line_pointer_size
= 4;
5514 display_debug_lines (section
, start
, file
)
5515 Elf32_Internal_Shdr
* section
;
5516 unsigned char * start
;
5517 FILE * file ATTRIBUTE_UNUSED
;
5519 DWARF2_External_LineInfo
* external
;
5520 DWARF2_Internal_LineInfo info
;
5521 unsigned char * standard_opcodes
;
5522 unsigned char * data
= start
;
5523 unsigned char * end
= start
+ section
->sh_size
;
5524 unsigned char * end_of_sequence
;
5527 printf (_("\nDump of debug contents of section %s:\n\n"),
5528 SECTION_NAME (section
));
5532 external
= (DWARF2_External_LineInfo
*) data
;
5534 /* Check the length of the block. */
5535 info
.li_length
= BYTE_GET (external
->li_length
);
5536 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
5539 (_("The line info appears to be corrupt - the section is too small\n"));
5543 /* Check its version number. */
5544 info
.li_version
= BYTE_GET (external
->li_version
);
5545 if (info
.li_version
!= 2)
5547 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5551 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
5552 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
5553 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
5554 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
5555 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
5556 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
5558 /* Sign extend the line base field. */
5559 info
.li_line_base
<<= 24;
5560 info
.li_line_base
>>= 24;
5562 printf (_(" Length: %ld\n"), info
.li_length
);
5563 printf (_(" DWARF Version: %d\n"), info
.li_version
);
5564 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
5565 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
5566 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
5567 printf (_(" Line Base: %d\n"), info
.li_line_base
);
5568 printf (_(" Line Range: %d\n"), info
.li_line_range
);
5569 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
5571 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
5573 reset_state_machine (info
.li_default_is_stmt
);
5575 /* Display the contents of the Opcodes table. */
5576 standard_opcodes
= data
+ sizeof (* external
);
5578 printf (_("\n Opcodes:\n"));
5580 for (i
= 1; i
< info
.li_opcode_base
; i
++)
5581 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
5583 /* Display the contents of the Directory table. */
5584 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
5587 printf (_("\n The Directory Table is empty.\n"));
5590 printf (_("\n The Directory Table:\n"));
5594 printf (_(" %s\n"), data
);
5596 data
+= strlen ((char *) data
) + 1;
5600 /* Skip the NUL at the end of the table. */
5603 /* Display the contents of the File Name table. */
5605 printf (_("\n The File Name Table is empty.\n"));
5608 printf (_("\n The File Name Table:\n"));
5609 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5613 unsigned char * name
;
5616 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5619 data
+= strlen ((char *) data
) + 1;
5621 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5623 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5625 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5627 printf (_("%s\n"), name
);
5631 /* Skip the NUL at the end of the table. */
5634 /* Now display the statements. */
5635 printf (_("\n Line Number Statements:\n"));
5638 while (data
< end_of_sequence
)
5640 unsigned char op_code
;
5644 op_code
= * data
++;
5648 case DW_LNS_extended_op
:
5649 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
5650 debug_line_pointer_size
);
5654 printf (_(" Copy\n"));
5657 case DW_LNS_advance_pc
:
5658 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
5660 state_machine_regs
.address
+= adv
;
5661 printf (_(" Advance PC by %d to %lx\n"), adv
,
5662 state_machine_regs
.address
);
5665 case DW_LNS_advance_line
:
5666 adv
= read_leb128 (data
, & bytes_read
, 1);
5668 state_machine_regs
.line
+= adv
;
5669 printf (_(" Advance Line by %d to %d\n"), adv
,
5670 state_machine_regs
.line
);
5673 case DW_LNS_set_file
:
5674 adv
= read_leb128 (data
, & bytes_read
, 0);
5676 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5678 state_machine_regs
.file
= adv
;
5681 case DW_LNS_set_column
:
5682 adv
= read_leb128 (data
, & bytes_read
, 0);
5684 printf (_(" Set column to %d\n"), adv
);
5685 state_machine_regs
.column
= adv
;
5688 case DW_LNS_negate_stmt
:
5689 adv
= state_machine_regs
.is_stmt
;
5691 printf (_(" Set is_stmt to %d\n"), adv
);
5692 state_machine_regs
.is_stmt
= adv
;
5695 case DW_LNS_set_basic_block
:
5696 printf (_(" Set basic block\n"));
5697 state_machine_regs
.basic_block
= 1;
5700 case DW_LNS_const_add_pc
:
5701 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
5702 * info
.li_min_insn_length
);
5703 state_machine_regs
.address
+= adv
;
5704 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
5705 state_machine_regs
.address
);
5708 case DW_LNS_fixed_advance_pc
:
5709 adv
= byte_get (data
, 2);
5711 state_machine_regs
.address
+= adv
;
5712 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5713 adv
, state_machine_regs
.address
);
5717 op_code
-= info
.li_opcode_base
;
5718 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
5719 state_machine_regs
.address
+= adv
;
5720 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5721 op_code
, adv
, state_machine_regs
.address
);
5722 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
5723 state_machine_regs
.line
+= adv
;
5724 printf (_(" and Line by %d to %d\n"),
5725 adv
, state_machine_regs
.line
);
5736 display_debug_pubnames (section
, start
, file
)
5737 Elf32_Internal_Shdr
* section
;
5738 unsigned char * start
;
5739 FILE * file ATTRIBUTE_UNUSED
;
5741 DWARF2_External_PubNames
* external
;
5742 DWARF2_Internal_PubNames pubnames
;
5743 unsigned char * end
;
5745 end
= start
+ section
->sh_size
;
5747 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
5751 unsigned char * data
;
5752 unsigned long offset
;
5754 external
= (DWARF2_External_PubNames
*) start
;
5756 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
5757 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
5758 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
5759 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
5761 data
= start
+ sizeof (* external
);
5762 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
5764 if (pubnames
.pn_version
!= 2)
5766 static int warned
= 0;
5770 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5777 printf (_(" Length: %ld\n"),
5778 pubnames
.pn_length
);
5779 printf (_(" Version: %d\n"),
5780 pubnames
.pn_version
);
5781 printf (_(" Offset into .debug_info section: %ld\n"),
5782 pubnames
.pn_offset
);
5783 printf (_(" Size of area in .debug_info section: %ld\n"),
5786 printf (_("\n Offset\tName\n"));
5790 offset
= byte_get (data
, 4);
5795 printf (" %ld\t\t%s\n", offset
, data
);
5796 data
+= strlen ((char *) data
) + 1;
5799 while (offset
!= 0);
5812 case DW_TAG_padding
: return "DW_TAG_padding";
5813 case DW_TAG_array_type
: return "DW_TAG_array_type";
5814 case DW_TAG_class_type
: return "DW_TAG_class_type";
5815 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
5816 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
5817 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
5818 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
5819 case DW_TAG_label
: return "DW_TAG_label";
5820 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
5821 case DW_TAG_member
: return "DW_TAG_member";
5822 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
5823 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
5824 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
5825 case DW_TAG_string_type
: return "DW_TAG_string_type";
5826 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
5827 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
5828 case DW_TAG_typedef
: return "DW_TAG_typedef";
5829 case DW_TAG_union_type
: return "DW_TAG_union_type";
5830 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
5831 case DW_TAG_variant
: return "DW_TAG_variant";
5832 case DW_TAG_common_block
: return "DW_TAG_common_block";
5833 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
5834 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
5835 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
5836 case DW_TAG_module
: return "DW_TAG_module";
5837 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
5838 case DW_TAG_set_type
: return "DW_TAG_set_type";
5839 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
5840 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
5841 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
5842 case DW_TAG_base_type
: return "DW_TAG_base_type";
5843 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
5844 case DW_TAG_const_type
: return "DW_TAG_const_type";
5845 case DW_TAG_constant
: return "DW_TAG_constant";
5846 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
5847 case DW_TAG_file_type
: return "DW_TAG_file_type";
5848 case DW_TAG_friend
: return "DW_TAG_friend";
5849 case DW_TAG_namelist
: return "DW_TAG_namelist";
5850 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
5851 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
5852 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
5853 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
5854 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
5855 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
5856 case DW_TAG_try_block
: return "DW_TAG_try_block";
5857 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
5858 case DW_TAG_variable
: return "DW_TAG_variable";
5859 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
5860 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
5861 case DW_TAG_format_label
: return "DW_TAG_format_label";
5862 case DW_TAG_function_template
: return "DW_TAG_function_template";
5863 case DW_TAG_class_template
: return "DW_TAG_class_template";
5866 static char buffer
[100];
5868 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
5875 get_AT_name (attribute
)
5876 unsigned long attribute
;
5880 case DW_AT_sibling
: return "DW_AT_sibling";
5881 case DW_AT_location
: return "DW_AT_location";
5882 case DW_AT_name
: return "DW_AT_name";
5883 case DW_AT_ordering
: return "DW_AT_ordering";
5884 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
5885 case DW_AT_byte_size
: return "DW_AT_byte_size";
5886 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
5887 case DW_AT_bit_size
: return "DW_AT_bit_size";
5888 case DW_AT_element_list
: return "DW_AT_element_list";
5889 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
5890 case DW_AT_low_pc
: return "DW_AT_low_pc";
5891 case DW_AT_high_pc
: return "DW_AT_high_pc";
5892 case DW_AT_language
: return "DW_AT_language";
5893 case DW_AT_member
: return "DW_AT_member";
5894 case DW_AT_discr
: return "DW_AT_discr";
5895 case DW_AT_discr_value
: return "DW_AT_discr_value";
5896 case DW_AT_visibility
: return "DW_AT_visibility";
5897 case DW_AT_import
: return "DW_AT_import";
5898 case DW_AT_string_length
: return "DW_AT_string_length";
5899 case DW_AT_common_reference
: return "DW_AT_common_reference";
5900 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
5901 case DW_AT_const_value
: return "DW_AT_const_value";
5902 case DW_AT_containing_type
: return "DW_AT_containing_type";
5903 case DW_AT_default_value
: return "DW_AT_default_value";
5904 case DW_AT_inline
: return "DW_AT_inline";
5905 case DW_AT_is_optional
: return "DW_AT_is_optional";
5906 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
5907 case DW_AT_producer
: return "DW_AT_producer";
5908 case DW_AT_prototyped
: return "DW_AT_prototyped";
5909 case DW_AT_return_addr
: return "DW_AT_return_addr";
5910 case DW_AT_start_scope
: return "DW_AT_start_scope";
5911 case DW_AT_stride_size
: return "DW_AT_stride_size";
5912 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
5913 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
5914 case DW_AT_accessibility
: return "DW_AT_accessibility";
5915 case DW_AT_address_class
: return "DW_AT_address_class";
5916 case DW_AT_artificial
: return "DW_AT_artificial";
5917 case DW_AT_base_types
: return "DW_AT_base_types";
5918 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
5919 case DW_AT_count
: return "DW_AT_count";
5920 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
5921 case DW_AT_decl_column
: return "DW_AT_decl_column";
5922 case DW_AT_decl_file
: return "DW_AT_decl_file";
5923 case DW_AT_decl_line
: return "DW_AT_decl_line";
5924 case DW_AT_declaration
: return "DW_AT_declaration";
5925 case DW_AT_discr_list
: return "DW_AT_discr_list";
5926 case DW_AT_encoding
: return "DW_AT_encoding";
5927 case DW_AT_external
: return "DW_AT_external";
5928 case DW_AT_frame_base
: return "DW_AT_frame_base";
5929 case DW_AT_friend
: return "DW_AT_friend";
5930 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
5931 case DW_AT_macro_info
: return "DW_AT_macro_info";
5932 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
5933 case DW_AT_priority
: return "DW_AT_priority";
5934 case DW_AT_segment
: return "DW_AT_segment";
5935 case DW_AT_specification
: return "DW_AT_specification";
5936 case DW_AT_static_link
: return "DW_AT_static_link";
5937 case DW_AT_type
: return "DW_AT_type";
5938 case DW_AT_use_location
: return "DW_AT_use_location";
5939 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
5940 case DW_AT_virtuality
: return "DW_AT_virtuality";
5941 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
5942 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
5943 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
5944 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
5945 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
5946 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
5947 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
5948 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
5949 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
5950 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
5951 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
5952 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
5953 case DW_AT_sf_names
: return "DW_AT_sf_names";
5954 case DW_AT_src_info
: return "DW_AT_src_info";
5955 case DW_AT_mac_info
: return "DW_AT_mac_info";
5956 case DW_AT_src_coords
: return "DW_AT_src_coords";
5957 case DW_AT_body_begin
: return "DW_AT_body_begin";
5958 case DW_AT_body_end
: return "DW_AT_body_end";
5961 static char buffer
[100];
5963 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
5970 get_FORM_name (form
)
5975 case DW_FORM_addr
: return "DW_FORM_addr";
5976 case DW_FORM_block2
: return "DW_FORM_block2";
5977 case DW_FORM_block4
: return "DW_FORM_block4";
5978 case DW_FORM_data2
: return "DW_FORM_data2";
5979 case DW_FORM_data4
: return "DW_FORM_data4";
5980 case DW_FORM_data8
: return "DW_FORM_data8";
5981 case DW_FORM_string
: return "DW_FORM_string";
5982 case DW_FORM_block
: return "DW_FORM_block";
5983 case DW_FORM_block1
: return "DW_FORM_block1";
5984 case DW_FORM_data1
: return "DW_FORM_data1";
5985 case DW_FORM_flag
: return "DW_FORM_flag";
5986 case DW_FORM_sdata
: return "DW_FORM_sdata";
5987 case DW_FORM_strp
: return "DW_FORM_strp";
5988 case DW_FORM_udata
: return "DW_FORM_udata";
5989 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
5990 case DW_FORM_ref1
: return "DW_FORM_ref1";
5991 case DW_FORM_ref2
: return "DW_FORM_ref2";
5992 case DW_FORM_ref4
: return "DW_FORM_ref4";
5993 case DW_FORM_ref8
: return "DW_FORM_ref8";
5994 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
5995 case DW_FORM_indirect
: return "DW_FORM_indirect";
5998 static char buffer
[100];
6000 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6006 /* FIXME: There are better and more effiecint ways to handle
6007 these structures. For now though, I just want something that
6008 is simple to implement. */
6009 typedef struct abbrev_attr
6011 unsigned long attribute
;
6013 struct abbrev_attr
* next
;
6017 typedef struct abbrev_entry
6019 unsigned long entry
;
6022 struct abbrev_attr
* first_attr
;
6023 struct abbrev_attr
* last_attr
;
6024 struct abbrev_entry
* next
;
6028 static abbrev_entry
* first_abbrev
= NULL
;
6029 static abbrev_entry
* last_abbrev
= NULL
;
6032 free_abbrevs
PARAMS ((void))
6034 abbrev_entry
* abbrev
;
6036 for (abbrev
= first_abbrev
; abbrev
;)
6038 abbrev_entry
* next
= abbrev
->next
;
6041 for (attr
= abbrev
->first_attr
; attr
;)
6043 abbrev_attr
* next
= attr
->next
;
6053 last_abbrev
= first_abbrev
= NULL
;
6057 add_abbrev (number
, tag
, children
)
6058 unsigned long number
;
6062 abbrev_entry
* entry
;
6064 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
6070 entry
->entry
= number
;
6072 entry
->children
= children
;
6073 entry
->first_attr
= NULL
;
6074 entry
->last_attr
= NULL
;
6077 if (first_abbrev
== NULL
)
6078 first_abbrev
= entry
;
6080 last_abbrev
->next
= entry
;
6082 last_abbrev
= entry
;
6086 add_abbrev_attr (attribute
, form
)
6087 unsigned long attribute
;
6092 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
6098 attr
->attribute
= attribute
;
6102 if (last_abbrev
->first_attr
== NULL
)
6103 last_abbrev
->first_attr
= attr
;
6105 last_abbrev
->last_attr
->next
= attr
;
6107 last_abbrev
->last_attr
= attr
;
6110 /* Processes the (partial) contents of a .debug_abbrev section.
6111 Returns NULL if the end of the section was encountered.
6112 Returns the address after the last byte read if the end of
6113 an abbreviation set was found. */
6115 static unsigned char *
6116 process_abbrev_section (start
, end
)
6117 unsigned char * start
;
6118 unsigned char * end
;
6120 if (first_abbrev
!= NULL
)
6126 unsigned long entry
;
6128 unsigned long attribute
;
6131 entry
= read_leb128 (start
, & bytes_read
, 0);
6132 start
+= bytes_read
;
6134 /* A single zero is supposed to end the section according
6135 to the standard. If there's more, then signal that to
6138 return start
== end
? NULL
: start
;
6140 tag
= read_leb128 (start
, & bytes_read
, 0);
6141 start
+= bytes_read
;
6143 children
= * start
++;
6145 add_abbrev (entry
, tag
, children
);
6151 attribute
= read_leb128 (start
, & bytes_read
, 0);
6152 start
+= bytes_read
;
6154 form
= read_leb128 (start
, & bytes_read
, 0);
6155 start
+= bytes_read
;
6158 add_abbrev_attr (attribute
, form
);
6160 while (attribute
!= 0);
6168 display_debug_abbrev (section
, start
, file
)
6169 Elf32_Internal_Shdr
* section
;
6170 unsigned char * start
;
6171 FILE * file ATTRIBUTE_UNUSED
;
6173 abbrev_entry
* entry
;
6174 unsigned char * end
= start
+ section
->sh_size
;
6176 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6180 start
= process_abbrev_section (start
, end
);
6182 printf (_(" Number TAG\n"));
6184 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
6188 printf (_(" %ld %s [%s]\n"),
6190 get_TAG_name (entry
->tag
),
6191 entry
->children
? _("has children") : _("no children"));
6193 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6195 printf (_(" %-18s %s\n"),
6196 get_AT_name (attr
->attribute
),
6197 get_FORM_name (attr
->form
));
6209 static unsigned char *
6210 display_block (data
, length
)
6211 unsigned char * data
;
6212 unsigned long length
;
6214 printf (_(" %lu byte block: "), length
);
6217 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
6223 decode_location_expression (data
, pointer_size
, length
)
6224 unsigned char * data
;
6225 unsigned int pointer_size
;
6226 unsigned long length
;
6230 unsigned long uvalue
;
6231 unsigned char * end
= data
+ length
;
6240 printf ("DW_OP_addr: %lx",
6241 (unsigned long) byte_get (data
, pointer_size
));
6242 data
+= pointer_size
;
6245 printf ("DW_OP_deref");
6248 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
6251 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
6254 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
6258 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
6262 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
6266 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
6270 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
6271 (unsigned long) byte_get (data
+ 4, 4));
6275 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
6276 (long) byte_get (data
+ 4, 4));
6280 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
6284 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
6288 printf ("DW_OP_dup");
6291 printf ("DW_OP_drop");
6294 printf ("DW_OP_over");
6297 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
6300 printf ("DW_OP_swap");
6303 printf ("DW_OP_rot");
6306 printf ("DW_OP_xderef");
6309 printf ("DW_OP_abs");
6312 printf ("DW_OP_and");
6315 printf ("DW_OP_div");
6318 printf ("DW_OP_minus");
6321 printf ("DW_OP_mod");
6324 printf ("DW_OP_mul");
6327 printf ("DW_OP_neg");
6330 printf ("DW_OP_not");
6333 printf ("DW_OP_or");
6336 printf ("DW_OP_plus");
6338 case DW_OP_plus_uconst
:
6339 printf ("DW_OP_plus_uconst: %lu",
6340 read_leb128 (data
, &bytes_read
, 0));
6344 printf ("DW_OP_shl");
6347 printf ("DW_OP_shr");
6350 printf ("DW_OP_shra");
6353 printf ("DW_OP_xor");
6356 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
6360 printf ("DW_OP_eq");
6363 printf ("DW_OP_ge");
6366 printf ("DW_OP_gt");
6369 printf ("DW_OP_le");
6372 printf ("DW_OP_lt");
6375 printf ("DW_OP_ne");
6378 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
6414 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
6449 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
6484 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
6485 read_leb128 (data
, &bytes_read
, 1));
6490 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
6494 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
6498 uvalue
= read_leb128 (data
, &bytes_read
, 0);
6500 printf ("DW_OP_bregx: %lu %ld", uvalue
,
6501 read_leb128 (data
, &bytes_read
, 1));
6505 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
6508 case DW_OP_deref_size
:
6509 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
6511 case DW_OP_xderef_size
:
6512 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
6515 printf ("DW_OP_nop");
6519 if (op
>= DW_OP_lo_user
6520 && op
<= DW_OP_hi_user
)
6521 printf (_("(User defined location op)"));
6523 printf (_("(Unknown location op)"));
6524 /* No way to tell where the next op is, so just bail. */
6531 static unsigned char *
6532 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
6533 unsigned long attribute
;
6535 unsigned char * data
;
6536 unsigned long cu_offset
;
6537 unsigned long pointer_size
;
6539 unsigned long uvalue
= 0;
6540 unsigned char * block_start
= NULL
;
6543 printf (" %-18s:", get_AT_name (attribute
));
6550 case DW_FORM_ref_addr
:
6552 uvalue
= byte_get (data
, pointer_size
);
6553 data
+= pointer_size
;
6559 uvalue
= byte_get (data
++, 1);
6564 uvalue
= byte_get (data
, 2);
6570 uvalue
= byte_get (data
, 4);
6575 uvalue
= read_leb128 (data
, & bytes_read
, 1);
6579 case DW_FORM_ref_udata
:
6581 uvalue
= read_leb128 (data
, & bytes_read
, 0);
6588 case DW_FORM_ref_addr
:
6589 printf (" <#%lx>", uvalue
);
6595 case DW_FORM_ref_udata
:
6596 printf (" <%lx>", uvalue
+ cu_offset
);
6600 printf (" %#lx", uvalue
);
6608 printf (" %ld", uvalue
);
6613 uvalue
= byte_get (data
, 4);
6614 printf (" %lx", uvalue
);
6615 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
6619 case DW_FORM_string
:
6620 printf (" %s", data
);
6621 data
+= strlen ((char *) data
) + 1;
6625 uvalue
= read_leb128 (data
, & bytes_read
, 0);
6626 block_start
= data
+ bytes_read
;
6627 data
= display_block (block_start
, uvalue
);
6630 case DW_FORM_block1
:
6631 uvalue
= byte_get (data
, 1);
6632 block_start
= data
+ 1;
6633 data
= display_block (block_start
, uvalue
);
6636 case DW_FORM_block2
:
6637 uvalue
= byte_get (data
, 2);
6638 block_start
= data
+ 2;
6639 data
= display_block (block_start
, uvalue
);
6642 case DW_FORM_block4
:
6643 uvalue
= byte_get (data
, 4);
6644 block_start
= data
+ 4;
6645 data
= display_block (block_start
, uvalue
);
6649 case DW_FORM_indirect
:
6650 warn (_("Unable to handle FORM: %d"), form
);
6654 warn (_("Unrecognised form: %d"), form
);
6658 /* For some attributes we can display futher information. */
6667 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
6668 case DW_INL_inlined
: printf (_("(inlined)")); break;
6669 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
6670 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
6671 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
6675 case DW_AT_language
:
6678 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
6679 case DW_LANG_C89
: printf ("(ANSI C)"); break;
6680 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
6681 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
6682 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
6683 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
6684 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
6685 case DW_LANG_Ada83
: printf ("(Ada)"); break;
6686 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
6687 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
6688 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
6689 default: printf ("(Unknown: %lx)", uvalue
); break;
6693 case DW_AT_encoding
:
6696 case DW_ATE_void
: printf ("(void)"); break;
6697 case DW_ATE_address
: printf ("(machine address)"); break;
6698 case DW_ATE_boolean
: printf ("(boolean)"); break;
6699 case DW_ATE_complex_float
: printf ("(complex float)"); break;
6700 case DW_ATE_float
: printf ("(float)"); break;
6701 case DW_ATE_signed
: printf ("(signed)"); break;
6702 case DW_ATE_signed_char
: printf ("(signed char)"); break;
6703 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
6704 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
6706 if (uvalue
>= DW_ATE_lo_user
6707 && uvalue
<= DW_ATE_hi_user
)
6708 printf ("(user defined type)");
6710 printf ("(unknown type)");
6715 case DW_AT_accessibility
:
6718 case DW_ACCESS_public
: printf ("(public)"); break;
6719 case DW_ACCESS_protected
: printf ("(protected)"); break;
6720 case DW_ACCESS_private
: printf ("(private)"); break;
6721 default: printf ("(unknown accessibility)"); break;
6725 case DW_AT_visibility
:
6728 case DW_VIS_local
: printf ("(local)"); break;
6729 case DW_VIS_exported
: printf ("(exported)"); break;
6730 case DW_VIS_qualified
: printf ("(qualified)"); break;
6731 default: printf ("(unknown visibility)"); break;
6735 case DW_AT_virtuality
:
6738 case DW_VIRTUALITY_none
: printf ("(none)"); break;
6739 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
6740 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
6741 default: printf ("(unknown virtuality)"); break;
6745 case DW_AT_identifier_case
:
6748 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
6749 case DW_ID_up_case
: printf ("(up_case)"); break;
6750 case DW_ID_down_case
: printf ("(down_case)"); break;
6751 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
6752 default: printf ("(unknown case)"); break;
6756 case DW_AT_calling_convention
:
6759 case DW_CC_normal
: printf ("(normal)"); break;
6760 case DW_CC_program
: printf ("(program)"); break;
6761 case DW_CC_nocall
: printf ("(nocall)"); break;
6763 if (uvalue
>= DW_CC_lo_user
6764 && uvalue
<= DW_CC_hi_user
)
6765 printf ("(user defined)");
6767 printf ("(unknown convention)");
6771 case DW_AT_frame_base
:
6772 case DW_AT_location
:
6773 case DW_AT_data_member_location
:
6774 case DW_AT_vtable_elem_location
:
6778 decode_location_expression (block_start
, pointer_size
, uvalue
);
6792 display_debug_info (section
, start
, file
)
6793 Elf32_Internal_Shdr
* section
;
6794 unsigned char * start
;
6797 unsigned char * end
= start
+ section
->sh_size
;
6798 unsigned char * section_begin
= start
;
6800 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6804 DWARF2_External_CompUnit
* external
;
6805 DWARF2_Internal_CompUnit compunit
;
6806 unsigned char * tags
;
6809 unsigned long cu_offset
;
6811 external
= (DWARF2_External_CompUnit
*) start
;
6813 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
6814 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
6815 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
6816 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
6818 tags
= start
+ sizeof (* external
);
6819 cu_offset
= start
- section_begin
;
6820 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
6822 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
6823 printf (_(" Length: %ld\n"), compunit
.cu_length
);
6824 printf (_(" Version: %d\n"), compunit
.cu_version
);
6825 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
6826 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
6828 if (compunit
.cu_version
!= 2)
6830 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6834 if (first_abbrev
!= NULL
)
6837 /* Read in the abbrevs used by this compilation unit. */
6840 Elf32_Internal_Shdr
* sec
;
6841 unsigned char * begin
;
6843 /* Locate the .debug_abbrev section and process it. */
6844 for (i
= 0, sec
= section_headers
;
6845 i
< elf_header
.e_shnum
;
6847 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
6850 if (i
== -1 || sec
->sh_size
== 0)
6852 warn (_("Unable to locate .debug_abbrev section!\n"));
6856 GET_DATA_ALLOC (sec
->sh_offset
, sec
->sh_size
, begin
, unsigned char *,
6857 "debug_abbrev section data");
6859 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
6860 begin
+ sec
->sh_size
);
6866 while (tags
< start
)
6869 unsigned long abbrev_number
;
6870 abbrev_entry
* entry
;
6873 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
6876 /* A null DIE marks the end of a list of children. */
6877 if (abbrev_number
== 0)
6883 /* Scan through the abbreviation list until we reach the
6885 for (entry
= first_abbrev
;
6886 entry
&& entry
->entry
!= abbrev_number
;
6887 entry
= entry
->next
)
6892 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6897 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6898 level
, tags
- section_begin
- bytes_read
,
6900 get_TAG_name (entry
->tag
));
6902 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6903 tags
= read_and_display_attr (attr
->attribute
,
6906 compunit
.cu_pointer_size
);
6908 if (entry
->children
)
6919 display_debug_aranges (section
, start
, file
)
6920 Elf32_Internal_Shdr
* section
;
6921 unsigned char * start
;
6922 FILE * file ATTRIBUTE_UNUSED
;
6924 unsigned char * end
= start
+ section
->sh_size
;
6926 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6930 DWARF2_External_ARange
* external
;
6931 DWARF2_Internal_ARange arange
;
6932 unsigned char * ranges
;
6933 unsigned long length
;
6934 unsigned long address
;
6937 external
= (DWARF2_External_ARange
*) start
;
6939 arange
.ar_length
= BYTE_GET (external
->ar_length
);
6940 arange
.ar_version
= BYTE_GET (external
->ar_version
);
6941 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
6942 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
6943 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
6945 if (arange
.ar_version
!= 2)
6947 warn (_("Only DWARF 2 aranges are currently supported.\n"));
6951 printf (_(" Length: %ld\n"), arange
.ar_length
);
6952 printf (_(" Version: %d\n"), arange
.ar_version
);
6953 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
6954 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
6955 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
6957 printf (_("\n Address Length\n"));
6959 ranges
= start
+ sizeof (* external
);
6961 /* Must pad to an alignment boundary that is twice the pointer size. */
6962 excess
= sizeof (* external
) % (2 * arange
.ar_pointer_size
);
6964 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
6968 address
= byte_get (ranges
, arange
.ar_pointer_size
);
6970 ranges
+= arange
.ar_pointer_size
;
6972 length
= byte_get (ranges
, arange
.ar_pointer_size
);
6974 ranges
+= arange
.ar_pointer_size
;
6976 /* A pair of zeros marks the end of the list. */
6977 if (address
== 0 && length
== 0)
6980 printf (" %8.8lx %lu\n", address
, length
);
6983 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
6991 typedef struct Frame_Chunk
6993 struct Frame_Chunk
* next
;
6994 unsigned char * chunk_start
;
6996 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
6997 short int * col_type
;
6999 char * augmentation
;
7000 unsigned int code_factor
;
7002 unsigned long pc_begin
;
7003 unsigned long pc_range
;
7007 unsigned char fde_encoding
;
7011 /* A marker for a col_type that means this column was never referenced
7012 in the frame info. */
7013 #define DW_CFA_unreferenced (-1)
7016 frame_need_space (fc
, reg
)
7020 int prev
= fc
->ncols
;
7022 if (reg
< fc
->ncols
)
7025 fc
->ncols
= reg
+ 1;
7026 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
7027 fc
->ncols
* sizeof (short int));
7028 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
7029 fc
->ncols
* sizeof (int));
7031 while (prev
< fc
->ncols
)
7033 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
7034 fc
->col_offset
[prev
] = 0;
7040 frame_display_row (fc
, need_col_headers
, max_regs
)
7042 int * need_col_headers
;
7048 if (* max_regs
< fc
->ncols
)
7049 * max_regs
= fc
->ncols
;
7051 if (* need_col_headers
)
7053 * need_col_headers
= 0;
7055 printf (" LOC CFA ");
7057 for (r
= 0; r
< * max_regs
; r
++)
7058 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7063 printf ("r%-4d", r
);
7069 printf ("%08lx ", fc
->pc_begin
);
7070 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
7071 printf ("%-8s ", tmp
);
7073 for (r
= 0; r
< fc
->ncols
; r
++)
7075 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7077 switch (fc
->col_type
[r
])
7079 case DW_CFA_undefined
:
7082 case DW_CFA_same_value
:
7086 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
7088 case DW_CFA_register
:
7089 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
7092 strcpy (tmp
, "n/a");
7095 printf ("%-5s", tmp
);
7102 size_of_encoded_value (encoding
)
7105 switch (encoding
& 0x7)
7108 case 0: return is_32bit_elf
? 4 : 8;
7115 #define GET(N) byte_get (start, N); start += N
7116 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7117 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7120 display_debug_frames (section
, start
, file
)
7121 Elf32_Internal_Shdr
* section
;
7122 unsigned char * start
;
7123 FILE * file ATTRIBUTE_UNUSED
;
7125 unsigned char * end
= start
+ section
->sh_size
;
7126 unsigned char * section_start
= start
;
7127 Frame_Chunk
* chunks
= 0;
7128 Frame_Chunk
* remembered_state
= 0;
7130 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
7133 int addr_size
= is_32bit_elf
? 4 : 8;
7135 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
7139 unsigned char * saved_start
;
7140 unsigned char * block_end
;
7141 unsigned long length
;
7142 unsigned long cie_id
;
7145 int need_col_headers
= 1;
7146 unsigned char * augmentation_data
= NULL
;
7147 unsigned long augmentation_data_len
= 0;
7148 int encoded_ptr_size
= addr_size
;
7150 saved_start
= start
;
7151 length
= byte_get (start
, 4); start
+= 4;
7156 block_end
= saved_start
+ length
+ 4;
7157 cie_id
= byte_get (start
, 4); start
+= 4;
7159 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
7163 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
7164 memset (fc
, 0, sizeof (Frame_Chunk
));
7168 fc
->chunk_start
= saved_start
;
7170 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7171 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7172 frame_need_space (fc
, max_regs
-1);
7176 fc
->augmentation
= start
;
7177 start
= strchr (start
, '\0') + 1;
7179 if (fc
->augmentation
[0] == 'z')
7181 fc
->code_factor
= LEB ();
7182 fc
->data_factor
= SLEB ();
7183 fc
->ra
= byte_get (start
, 1); start
+= 1;
7184 augmentation_data_len
= LEB ();
7185 augmentation_data
= start
;
7186 start
+= augmentation_data_len
;
7188 else if (strcmp (fc
->augmentation
, "eh") == 0)
7191 fc
->code_factor
= LEB ();
7192 fc
->data_factor
= SLEB ();
7193 fc
->ra
= byte_get (start
, 1); start
+= 1;
7197 fc
->code_factor
= LEB ();
7198 fc
->data_factor
= SLEB ();
7199 fc
->ra
= byte_get (start
, 1); start
+= 1;
7203 if (do_debug_frames_interp
)
7204 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7205 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
7206 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
7210 printf ("\n%08lx %08lx %08lx CIE\n",
7211 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
7212 printf (" Version: %d\n", version
);
7213 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
7214 printf (" Code alignment factor: %u\n", fc
->code_factor
);
7215 printf (" Data alignment factor: %d\n", fc
->data_factor
);
7216 printf (" Return address column: %d\n", fc
->ra
);
7218 if (augmentation_data_len
)
7221 printf (" Augmentation data: ");
7222 for (i
= 0; i
< augmentation_data_len
; ++i
)
7223 printf (" %02x", augmentation_data
[i
]);
7229 if (augmentation_data_len
)
7231 unsigned char *p
, *q
;
7232 p
= fc
->augmentation
+ 1;
7233 q
= augmentation_data
;
7240 q
+= 1 + size_of_encoded_value (*q
);
7242 fc
->fde_encoding
= *q
++;
7248 if (fc
->fde_encoding
)
7249 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
7252 frame_need_space (fc
, fc
->ra
);
7256 unsigned char * look_for
;
7257 static Frame_Chunk fde_fc
;
7260 memset (fc
, 0, sizeof (Frame_Chunk
));
7262 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
7264 for (cie
=chunks
; cie
; cie
= cie
->next
)
7265 if (cie
->chunk_start
== look_for
)
7270 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7271 cie_id
, saved_start
);
7274 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7275 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7276 frame_need_space (fc
, max_regs
- 1);
7278 fc
->augmentation
= "";
7279 fc
->fde_encoding
= 0;
7283 fc
->ncols
= cie
->ncols
;
7284 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
7285 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
7286 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
7287 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
7288 fc
->augmentation
= cie
->augmentation
;
7289 fc
->code_factor
= cie
->code_factor
;
7290 fc
->data_factor
= cie
->data_factor
;
7291 fc
->cfa_reg
= cie
->cfa_reg
;
7292 fc
->cfa_offset
= cie
->cfa_offset
;
7294 frame_need_space (fc
, max_regs
-1);
7295 fc
->fde_encoding
= cie
->fde_encoding
;
7298 if (fc
->fde_encoding
)
7299 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
7301 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
7302 start
+= encoded_ptr_size
;
7303 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
7304 start
+= encoded_ptr_size
;
7306 if (cie
->augmentation
[0] == 'z')
7308 augmentation_data_len
= LEB ();
7309 augmentation_data
= start
;
7310 start
+= augmentation_data_len
;
7313 printf ("\n%08lx %08lx %08lx FDE cie=%08x pc=%08lx..%08lx\n",
7314 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
7315 cie
->chunk_start
- section_start
, fc
->pc_begin
,
7316 fc
->pc_begin
+ fc
->pc_range
);
7317 if (! do_debug_frames_interp
&& augmentation_data_len
)
7320 printf (" Augmentation data: ");
7321 for (i
= 0; i
< augmentation_data_len
; ++i
)
7322 printf (" %02x", augmentation_data
[i
]);
7328 /* At this point, fc is the current chunk, cie (if any) is set, and we're
7329 about to interpret instructions for the chunk. */
7331 if (do_debug_frames_interp
)
7333 /* Start by making a pass over the chunk, allocating storage
7334 and taking note of what registers are used. */
7335 unsigned char * tmp
= start
;
7337 while (start
< block_end
)
7347 /* Warning: if you add any more cases to this switch, be
7348 sure to add them to the corresponding switch below. */
7351 case DW_CFA_advance_loc
:
7355 frame_need_space (fc
, opa
);
7356 fc
->col_type
[opa
] = DW_CFA_undefined
;
7358 case DW_CFA_restore
:
7359 frame_need_space (fc
, opa
);
7360 fc
->col_type
[opa
] = DW_CFA_undefined
;
7362 case DW_CFA_set_loc
:
7363 start
+= encoded_ptr_size
;
7365 case DW_CFA_advance_loc1
:
7368 case DW_CFA_advance_loc2
:
7371 case DW_CFA_advance_loc4
:
7374 case DW_CFA_offset_extended
:
7375 reg
= LEB (); LEB ();
7376 frame_need_space (fc
, reg
);
7377 fc
->col_type
[reg
] = DW_CFA_undefined
;
7379 case DW_CFA_restore_extended
:
7381 frame_need_space (fc
, reg
);
7382 fc
->col_type
[reg
] = DW_CFA_undefined
;
7384 case DW_CFA_undefined
:
7386 frame_need_space (fc
, reg
);
7387 fc
->col_type
[reg
] = DW_CFA_undefined
;
7389 case DW_CFA_same_value
:
7391 frame_need_space (fc
, reg
);
7392 fc
->col_type
[reg
] = DW_CFA_undefined
;
7394 case DW_CFA_register
:
7395 reg
= LEB (); LEB ();
7396 frame_need_space (fc
, reg
);
7397 fc
->col_type
[reg
] = DW_CFA_undefined
;
7399 case DW_CFA_def_cfa
:
7402 case DW_CFA_def_cfa_register
:
7405 case DW_CFA_def_cfa_offset
:
7408 #ifndef DW_CFA_GNU_args_size
7409 #define DW_CFA_GNU_args_size 0x2e
7411 case DW_CFA_GNU_args_size
:
7414 #ifndef DW_CFA_GNU_negative_offset_extended
7415 #define DW_CFA_GNU_negative_offset_extended 0x2f
7417 case DW_CFA_GNU_negative_offset_extended
:
7418 reg
= LEB (); LEB ();
7419 frame_need_space (fc
, reg
);
7420 fc
->col_type
[reg
] = DW_CFA_undefined
;
7429 /* Now we know what registers are used, make a second pass over
7430 the chunk, this time actually printing out the info. */
7432 while (start
< block_end
)
7435 unsigned long ul
, reg
, roffs
;
7444 /* Warning: if you add any more cases to this switch, be
7445 sure to add them to the corresponding switch above. */
7448 case DW_CFA_advance_loc
:
7449 if (do_debug_frames_interp
)
7450 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7452 printf (" DW_CFA_advance_loc: %d to %08lx\n",
7453 opa
* fc
->code_factor
,
7454 fc
->pc_begin
+ opa
* fc
->code_factor
);
7455 fc
->pc_begin
+= opa
* fc
->code_factor
;
7460 if (! do_debug_frames_interp
)
7461 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
7462 opa
, roffs
* fc
->data_factor
);
7463 fc
->col_type
[opa
] = DW_CFA_offset
;
7464 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
7467 case DW_CFA_restore
:
7468 if (! do_debug_frames_interp
)
7469 printf (" DW_CFA_restore: r%d\n", opa
);
7470 fc
->col_type
[opa
] = cie
->col_type
[opa
];
7471 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
7474 case DW_CFA_set_loc
:
7475 vma
= byte_get (start
, encoded_ptr_size
);
7476 start
+= encoded_ptr_size
;
7477 if (do_debug_frames_interp
)
7478 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7480 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
7484 case DW_CFA_advance_loc1
:
7485 ofs
= byte_get (start
, 1); start
+= 1;
7486 if (do_debug_frames_interp
)
7487 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7489 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
7490 ofs
* fc
->code_factor
,
7491 fc
->pc_begin
+ ofs
* fc
->code_factor
);
7492 fc
->pc_begin
+= ofs
* fc
->code_factor
;
7495 case DW_CFA_advance_loc2
:
7496 ofs
= byte_get (start
, 2); start
+= 2;
7497 if (do_debug_frames_interp
)
7498 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7500 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
7501 ofs
* fc
->code_factor
,
7502 fc
->pc_begin
+ ofs
* fc
->code_factor
);
7503 fc
->pc_begin
+= ofs
* fc
->code_factor
;
7506 case DW_CFA_advance_loc4
:
7507 ofs
= byte_get (start
, 4); start
+= 4;
7508 if (do_debug_frames_interp
)
7509 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7511 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
7512 ofs
* fc
->code_factor
,
7513 fc
->pc_begin
+ ofs
* fc
->code_factor
);
7514 fc
->pc_begin
+= ofs
* fc
->code_factor
;
7517 case DW_CFA_offset_extended
:
7520 if (! do_debug_frames_interp
)
7521 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
7522 reg
, roffs
* fc
->data_factor
);
7523 fc
->col_type
[reg
] = DW_CFA_offset
;
7524 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
7527 case DW_CFA_restore_extended
:
7529 if (! do_debug_frames_interp
)
7530 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
7531 fc
->col_type
[reg
] = cie
->col_type
[reg
];
7532 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
7535 case DW_CFA_undefined
:
7537 if (! do_debug_frames_interp
)
7538 printf (" DW_CFA_undefined: r%ld\n", reg
);
7539 fc
->col_type
[reg
] = DW_CFA_undefined
;
7540 fc
->col_offset
[reg
] = 0;
7543 case DW_CFA_same_value
:
7545 if (! do_debug_frames_interp
)
7546 printf (" DW_CFA_same_value: r%ld\n", reg
);
7547 fc
->col_type
[reg
] = DW_CFA_same_value
;
7548 fc
->col_offset
[reg
] = 0;
7551 case DW_CFA_register
:
7554 if (! do_debug_frames_interp
)
7555 printf (" DW_CFA_register: r%ld\n", reg
);
7556 fc
->col_type
[reg
] = DW_CFA_register
;
7557 fc
->col_offset
[reg
] = roffs
;
7560 case DW_CFA_remember_state
:
7561 if (! do_debug_frames_interp
)
7562 printf (" DW_CFA_remember_state\n");
7563 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
7564 rs
->ncols
= fc
->ncols
;
7565 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
7566 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
7567 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
7568 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
7569 rs
->next
= remembered_state
;
7570 remembered_state
= rs
;
7573 case DW_CFA_restore_state
:
7574 if (! do_debug_frames_interp
)
7575 printf (" DW_CFA_restore_state\n");
7576 rs
= remembered_state
;
7577 remembered_state
= rs
->next
;
7578 frame_need_space (fc
, rs
->ncols
-1);
7579 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
7580 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
7581 free (rs
->col_type
);
7582 free (rs
->col_offset
);
7586 case DW_CFA_def_cfa
:
7587 fc
->cfa_reg
= LEB ();
7588 fc
->cfa_offset
= LEB ();
7589 if (! do_debug_frames_interp
)
7590 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
7591 fc
->cfa_reg
, fc
->cfa_offset
);
7594 case DW_CFA_def_cfa_register
:
7595 fc
->cfa_reg
= LEB ();
7596 if (! do_debug_frames_interp
)
7597 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
7600 case DW_CFA_def_cfa_offset
:
7601 fc
->cfa_offset
= LEB ();
7602 if (! do_debug_frames_interp
)
7603 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
7607 if (! do_debug_frames_interp
)
7608 printf (" DW_CFA_nop\n");
7611 #ifndef DW_CFA_GNU_window_save
7612 #define DW_CFA_GNU_window_save 0x2d
7614 case DW_CFA_GNU_window_save
:
7615 if (! do_debug_frames_interp
)
7616 printf (" DW_CFA_GNU_window_save\n");
7619 case DW_CFA_GNU_args_size
:
7621 if (! do_debug_frames_interp
)
7622 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
7625 case DW_CFA_GNU_negative_offset_extended
:
7628 frame_need_space (fc
, reg
);
7629 if (! do_debug_frames_interp
)
7630 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
7631 reg
, l
* fc
->data_factor
);
7632 fc
->col_type
[reg
] = DW_CFA_offset
;
7633 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
7637 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
7642 if (do_debug_frames_interp
)
7643 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7658 display_debug_not_supported (section
, start
, file
)
7659 Elf32_Internal_Shdr
* section
;
7660 unsigned char * start ATTRIBUTE_UNUSED
;
7661 FILE * file ATTRIBUTE_UNUSED
;
7663 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7664 SECTION_NAME (section
));
7669 /* Pre-scan the .debug_info section to record the size of address.
7670 When dumping the .debug_line, we use that size information, assuming
7671 that all compilation units have the same address size. */
7673 prescan_debug_info (section
, start
, file
)
7674 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
7675 unsigned char * start
;
7676 FILE * file ATTRIBUTE_UNUSED
;
7678 DWARF2_External_CompUnit
* external
;
7680 external
= (DWARF2_External_CompUnit
*) start
;
7682 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
7686 /* A structure containing the name of a debug section and a pointer
7687 to a function that can decode it. The third field is a prescan
7688 function to be run over the section before displaying any of the
7693 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
7694 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
7698 { ".debug_info", display_debug_info
, prescan_debug_info
},
7699 { ".debug_abbrev", display_debug_abbrev
, NULL
},
7700 { ".debug_line", display_debug_lines
, NULL
},
7701 { ".debug_aranges", display_debug_aranges
, NULL
},
7702 { ".debug_pubnames", display_debug_pubnames
, NULL
},
7703 { ".debug_frame", display_debug_frames
, NULL
},
7704 { ".eh_frame", display_debug_frames
, NULL
},
7705 { ".debug_macinfo", display_debug_not_supported
, NULL
},
7706 { ".debug_str", display_debug_not_supported
, NULL
},
7707 { ".debug_static_func", display_debug_not_supported
, NULL
},
7708 { ".debug_static_vars", display_debug_not_supported
, NULL
},
7709 { ".debug_types", display_debug_not_supported
, NULL
},
7710 { ".debug_weaknames", display_debug_not_supported
, NULL
}
7714 display_debug_section (section
, file
)
7715 Elf32_Internal_Shdr
* section
;
7718 char * name
= SECTION_NAME (section
);
7719 bfd_size_type length
;
7720 unsigned char * start
;
7723 length
= section
->sh_size
;
7726 printf (_("\nSection '%s' has no debugging data.\n"), name
);
7730 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
7731 "debug section data");
7733 /* See if we know how to display the contents of this section. */
7734 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
7735 name
= ".debug_info";
7737 for (i
= NUM_ELEM (debug_displays
); i
--;)
7738 if (strcmp (debug_displays
[i
].name
, name
) == 0)
7740 debug_displays
[i
].display (section
, start
, file
);
7745 printf (_("Unrecognised debug section: %s\n"), name
);
7749 /* If we loaded in the abbrev section at some point,
7750 we must release it here. */
7751 if (first_abbrev
!= NULL
)
7758 process_section_contents (file
)
7761 Elf32_Internal_Shdr
* section
;
7767 /* Pre-scan the debug sections to find some debug information not
7768 present in some of them. For the .debug_line, we must find out the
7769 size of address (specified in .debug_info and .debug_aranges). */
7770 for (i
= 0, section
= section_headers
;
7771 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
7774 char * name
= SECTION_NAME (section
);
7777 if (section
->sh_size
== 0)
7780 /* See if there is some pre-scan operation for this section. */
7781 for (j
= NUM_ELEM (debug_displays
); j
--;)
7782 if (strcmp (debug_displays
[j
].name
, name
) == 0)
7784 if (debug_displays
[j
].prescan
!= NULL
)
7786 bfd_size_type length
;
7787 unsigned char * start
;
7789 length
= section
->sh_size
;
7790 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
7791 "debug section data");
7793 debug_displays
[j
].prescan (section
, start
, file
);
7801 for (i
= 0, section
= section_headers
;
7802 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
7805 #ifdef SUPPORT_DISASSEMBLY
7806 if (dump_sects
[i
] & DISASS_DUMP
)
7807 disassemble_section (section
, file
);
7809 if (dump_sects
[i
] & HEX_DUMP
)
7810 dump_section (section
, file
);
7812 if (dump_sects
[i
] & DEBUG_DUMP
)
7813 display_debug_section (section
, file
);
7816 if (i
< num_dump_sects
)
7817 warn (_("Some sections were not dumped because they do not exist!\n"));
7823 process_mips_fpe_exception (mask
)
7829 if (mask
& OEX_FPU_INEX
)
7830 fputs ("INEX", stdout
), first
= 0;
7831 if (mask
& OEX_FPU_UFLO
)
7832 printf ("%sUFLO", first
? "" : "|"), first
= 0;
7833 if (mask
& OEX_FPU_OFLO
)
7834 printf ("%sOFLO", first
? "" : "|"), first
= 0;
7835 if (mask
& OEX_FPU_DIV0
)
7836 printf ("%sDIV0", first
? "" : "|"), first
= 0;
7837 if (mask
& OEX_FPU_INVAL
)
7838 printf ("%sINVAL", first
? "" : "|");
7841 fputs ("0", stdout
);
7845 process_mips_specific (file
)
7848 Elf_Internal_Dyn
* entry
;
7849 size_t liblist_offset
= 0;
7850 size_t liblistno
= 0;
7851 size_t conflictsno
= 0;
7852 size_t options_offset
= 0;
7853 size_t conflicts_offset
= 0;
7855 /* We have a lot of special sections. Thanks SGI! */
7856 if (dynamic_segment
== NULL
)
7857 /* No information available. */
7860 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
7861 switch (entry
->d_tag
)
7863 case DT_MIPS_LIBLIST
:
7864 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
7866 case DT_MIPS_LIBLISTNO
:
7867 liblistno
= entry
->d_un
.d_val
;
7869 case DT_MIPS_OPTIONS
:
7870 options_offset
= entry
->d_un
.d_val
- loadaddr
;
7872 case DT_MIPS_CONFLICT
:
7873 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
7875 case DT_MIPS_CONFLICTNO
:
7876 conflictsno
= entry
->d_un
.d_val
;
7882 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
7884 Elf32_External_Lib
* elib
;
7887 GET_DATA_ALLOC (liblist_offset
, liblistno
* sizeof (Elf32_External_Lib
),
7888 elib
, Elf32_External_Lib
*, "liblist");
7890 printf ("\nSection '.liblist' contains %lu entries:\n",
7891 (unsigned long) liblistno
);
7892 fputs (" Library Time Stamp Checksum Version Flags\n",
7895 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
7902 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
7903 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
7904 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
7905 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
7906 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
7908 tmp
= gmtime (&time
);
7909 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
7910 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
7911 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
7913 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt
,
7914 dynamic_strings
+ liblist
.l_name
, timebuf
,
7915 liblist
.l_checksum
, liblist
.l_version
);
7917 if (liblist
.l_flags
== 0)
7928 { " EXACT_MATCH", LL_EXACT_MATCH
},
7929 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
7930 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
7931 { " EXPORTS", LL_EXPORTS
},
7932 { " DELAY_LOAD", LL_DELAY_LOAD
},
7933 { " DELTA", LL_DELTA
}
7935 int flags
= liblist
.l_flags
;
7939 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
7941 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
7943 fputs (l_flags_vals
[fcnt
].name
, stdout
);
7944 flags
^= l_flags_vals
[fcnt
].bit
;
7947 printf (" %#x", (unsigned int) flags
);
7956 if (options_offset
!= 0)
7958 Elf_External_Options
* eopt
;
7959 Elf_Internal_Shdr
* sect
= section_headers
;
7960 Elf_Internal_Options
* iopt
;
7961 Elf_Internal_Options
* option
;
7965 /* Find the section header so that we get the size. */
7966 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
7969 GET_DATA_ALLOC (options_offset
, sect
->sh_size
, eopt
,
7970 Elf_External_Options
*, "options");
7972 iopt
= (Elf_Internal_Options
*) malloc ((sect
->sh_size
/ sizeof (eopt
))
7976 error (_("Out of memory"));
7983 while (offset
< sect
->sh_size
)
7985 Elf_External_Options
* eoption
;
7987 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
7989 option
->kind
= BYTE_GET (eoption
->kind
);
7990 option
->size
= BYTE_GET (eoption
->size
);
7991 option
->section
= BYTE_GET (eoption
->section
);
7992 option
->info
= BYTE_GET (eoption
->info
);
7994 offset
+= option
->size
;
8000 printf (_("\nSection '%s' contains %d entries:\n"),
8001 SECTION_NAME (sect
), cnt
);
8009 switch (option
->kind
)
8012 /* This shouldn't happen. */
8013 printf (" NULL %d %lx", option
->section
, option
->info
);
8016 printf (" REGINFO ");
8017 if (elf_header
.e_machine
== EM_MIPS
)
8020 Elf32_External_RegInfo
* ereg
;
8021 Elf32_RegInfo reginfo
;
8023 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8024 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8025 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8026 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8027 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8028 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8029 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8031 printf ("GPR %08lx GP 0x%lx\n",
8033 (unsigned long) reginfo
.ri_gp_value
);
8034 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8035 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8036 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8041 Elf64_External_RegInfo
* ereg
;
8042 Elf64_Internal_RegInfo reginfo
;
8044 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8045 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8046 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8047 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8048 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8049 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8050 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
8052 printf ("GPR %08lx GP 0x",
8053 reginfo
.ri_gprmask
);
8054 printf_vma (reginfo
.ri_gp_value
);
8057 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8058 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8059 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8063 case ODK_EXCEPTIONS
:
8064 fputs (" EXCEPTIONS fpe_min(", stdout
);
8065 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8066 fputs (") fpe_max(", stdout
);
8067 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8068 fputs (")", stdout
);
8070 if (option
->info
& OEX_PAGE0
)
8071 fputs (" PAGE0", stdout
);
8072 if (option
->info
& OEX_SMM
)
8073 fputs (" SMM", stdout
);
8074 if (option
->info
& OEX_FPDBUG
)
8075 fputs (" FPDBUG", stdout
);
8076 if (option
->info
& OEX_DISMISS
)
8077 fputs (" DISMISS", stdout
);
8080 fputs (" PAD ", stdout
);
8081 if (option
->info
& OPAD_PREFIX
)
8082 fputs (" PREFIX", stdout
);
8083 if (option
->info
& OPAD_POSTFIX
)
8084 fputs (" POSTFIX", stdout
);
8085 if (option
->info
& OPAD_SYMBOL
)
8086 fputs (" SYMBOL", stdout
);
8089 fputs (" HWPATCH ", stdout
);
8090 if (option
->info
& OHW_R4KEOP
)
8091 fputs (" R4KEOP", stdout
);
8092 if (option
->info
& OHW_R8KPFETCH
)
8093 fputs (" R8KPFETCH", stdout
);
8094 if (option
->info
& OHW_R5KEOP
)
8095 fputs (" R5KEOP", stdout
);
8096 if (option
->info
& OHW_R5KCVTL
)
8097 fputs (" R5KCVTL", stdout
);
8100 fputs (" FILL ", stdout
);
8101 /* XXX Print content of info word? */
8104 fputs (" TAGS ", stdout
);
8105 /* XXX Print content of info word? */
8108 fputs (" HWAND ", stdout
);
8109 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8110 fputs (" R4KEOP_CHECKED", stdout
);
8111 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8112 fputs (" R4KEOP_CLEAN", stdout
);
8115 fputs (" HWOR ", stdout
);
8116 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8117 fputs (" R4KEOP_CHECKED", stdout
);
8118 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8119 fputs (" R4KEOP_CLEAN", stdout
);
8122 printf (" GP_GROUP %#06lx self-contained %#06lx",
8123 option
->info
& OGP_GROUP
,
8124 (option
->info
& OGP_SELF
) >> 16);
8127 printf (" IDENT %#06lx self-contained %#06lx",
8128 option
->info
& OGP_GROUP
,
8129 (option
->info
& OGP_SELF
) >> 16);
8132 /* This shouldn't happen. */
8133 printf (" %3d ??? %d %lx",
8134 option
->kind
, option
->section
, option
->info
);
8138 len
= sizeof (* eopt
);
8139 while (len
< option
->size
)
8140 if (((char *) option
)[len
] >= ' '
8141 && ((char *) option
)[len
] < 0x7f)
8142 printf ("%c", ((char *) option
)[len
++]);
8144 printf ("\\%03o", ((char *) option
)[len
++]);
8146 fputs ("\n", stdout
);
8153 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8155 Elf32_External_Conflict
* econf32
;
8156 Elf64_External_Conflict
* econf64
;
8157 Elf32_Conflict
* iconf
;
8160 if (dynamic_symbols
== NULL
)
8162 error (_("conflict list with without table"));
8166 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (* iconf
));
8169 error (_("Out of memory"));
8175 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (* econf32
),
8176 econf32
, Elf32_External_Conflict
*, "conflict");
8178 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8179 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8183 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (* econf64
),
8184 econf64
, Elf64_External_Conflict
*, "conflict");
8186 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8187 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8190 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno
);
8191 puts (_(" Num: Index Value Name"));
8193 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8195 Elf_Internal_Sym
* psym
= &dynamic_symbols
[iconf
[cnt
]];
8197 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8198 print_vma (psym
->st_value
, FULL_HEX
);
8199 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
8209 get_note_type (e_type
)
8212 static char buff
[64];
8216 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
8217 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
8218 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
8219 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
8220 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
8221 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
8222 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
8223 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
8224 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8225 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8226 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8228 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
8233 /* Note that by the ELF standard, the name field is already null byte
8234 terminated, and namesz includes the terminating null byte.
8235 I.E. the value of namesz for the name "FSF" is 4.
8237 If the value of namesz is zero, there is no name present. */
8239 process_note (pnote
)
8240 Elf32_Internal_Note
* pnote
;
8242 printf (" %s\t\t0x%08lx\t%s\n",
8243 pnote
->namesz
? pnote
->namedata
: "(NONE)",
8244 pnote
->descsz
, get_note_type (pnote
->type
));
8250 process_corefile_note_segment (file
, offset
, length
)
8255 Elf_External_Note
* pnotes
;
8256 Elf_External_Note
* external
;
8262 GET_DATA_ALLOC (offset
, length
, pnotes
, Elf_External_Note
*, "notes");
8266 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8267 (unsigned long) offset
, (unsigned long) length
);
8268 printf (_(" Owner\t\tData size\tDescription\n"));
8270 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
8272 Elf32_Internal_Note inote
;
8275 inote
.type
= BYTE_GET (external
->type
);
8276 inote
.namesz
= BYTE_GET (external
->namesz
);
8277 inote
.namedata
= external
->name
;
8278 inote
.descsz
= BYTE_GET (external
->descsz
);
8279 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
8280 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
8282 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
8284 /* Verify that name is null terminated. It appears that at least
8285 one version of Linux (RedHat 6.0) generates corefiles that don't
8286 comply with the ELF spec by failing to include the null byte in
8288 if (inote
.namedata
[inote
.namesz
] != '\0')
8290 temp
= malloc (inote
.namesz
+ 1);
8294 error (_("Out of memory\n"));
8299 strncpy (temp
, inote
.namedata
, inote
.namesz
);
8300 temp
[inote
.namesz
] = 0;
8302 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8303 inote
.namedata
= temp
;
8306 res
&= process_note (& inote
);
8321 process_corefile_note_segments (file
)
8324 Elf_Internal_Phdr
* program_headers
;
8325 Elf_Internal_Phdr
* segment
;
8329 program_headers
= (Elf_Internal_Phdr
*) malloc
8330 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
8332 if (program_headers
== NULL
)
8334 error (_("Out of memory\n"));
8339 i
= get_32bit_program_headers (file
, program_headers
);
8341 i
= get_64bit_program_headers (file
, program_headers
);
8345 free (program_headers
);
8349 for (i
= 0, segment
= program_headers
;
8350 i
< elf_header
.e_phnum
;
8353 if (segment
->p_type
== PT_NOTE
)
8354 res
&= process_corefile_note_segment (file
,
8355 (bfd_vma
) segment
->p_offset
,
8356 (bfd_vma
) segment
->p_filesz
);
8359 free (program_headers
);
8365 process_corefile_contents (file
)
8368 /* If we have not been asked to display the notes then do nothing. */
8372 /* If file is not a core file then exit. */
8373 if (elf_header
.e_type
!= ET_CORE
)
8376 /* No program headers means no NOTE segment. */
8377 if (elf_header
.e_phnum
== 0)
8379 printf (_("No note segments present in the core file.\n"));
8383 return process_corefile_note_segments (file
);
8387 process_arch_specific (file
)
8393 switch (elf_header
.e_machine
)
8396 case EM_MIPS_RS3_LE
:
8397 return process_mips_specific (file
);
8406 get_file_header (file
)
8409 /* Read in the identity array. */
8410 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
8413 /* Determine how to read the rest of the header. */
8414 switch (elf_header
.e_ident
[EI_DATA
])
8416 default: /* fall through */
8417 case ELFDATANONE
: /* fall through */
8418 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
8419 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
8422 /* For now we only support 32 bit and 64 bit ELF files. */
8423 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
8425 /* Read in the rest of the header. */
8428 Elf32_External_Ehdr ehdr32
;
8430 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
8433 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
8434 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
8435 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
8436 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
8437 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
8438 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
8439 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
8440 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
8441 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
8442 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
8443 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
8444 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
8445 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
8449 Elf64_External_Ehdr ehdr64
;
8451 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8452 we will not be able to cope with the 64bit data found in
8453 64 ELF files. Detect this now and abort before we start
8454 overwritting things. */
8455 if (sizeof (bfd_vma
) < 8)
8457 error (_("This instance of readelf has been built without support for a\n"));
8458 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
8462 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
8465 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
8466 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
8467 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
8468 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
8469 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
8470 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
8471 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
8472 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
8473 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
8474 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
8475 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
8476 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
8477 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
8484 process_file (file_name
)
8488 struct stat statbuf
;
8491 if (stat (file_name
, & statbuf
) < 0)
8493 error (_("Cannot stat input file %s.\n"), file_name
);
8497 file
= fopen (file_name
, "rb");
8500 error (_("Input file %s not found.\n"), file_name
);
8504 if (! get_file_header (file
))
8506 error (_("%s: Failed to read file header\n"), file_name
);
8511 /* Initialise per file variables. */
8512 for (i
= NUM_ELEM (version_info
); i
--;)
8513 version_info
[i
] = 0;
8515 for (i
= NUM_ELEM (dynamic_info
); i
--;)
8516 dynamic_info
[i
] = 0;
8518 /* Process the file. */
8520 printf (_("\nFile: %s\n"), file_name
);
8522 if (! process_file_header ())
8528 process_section_headers (file
);
8530 process_program_headers (file
);
8532 process_dynamic_segment (file
);
8534 process_relocs (file
);
8536 process_unwind (file
);
8538 process_symbol_table (file
);
8540 process_syminfo (file
);
8542 process_version_sections (file
);
8544 process_section_contents (file
);
8546 process_corefile_contents (file
);
8548 process_arch_specific (file
);
8552 if (section_headers
)
8554 free (section_headers
);
8555 section_headers
= NULL
;
8560 free (string_table
);
8561 string_table
= NULL
;
8562 string_table_length
= 0;
8565 if (dynamic_strings
)
8567 free (dynamic_strings
);
8568 dynamic_strings
= NULL
;
8571 if (dynamic_symbols
)
8573 free (dynamic_symbols
);
8574 dynamic_symbols
= NULL
;
8575 num_dynamic_syms
= 0;
8578 if (dynamic_syminfo
)
8580 free (dynamic_syminfo
);
8581 dynamic_syminfo
= NULL
;
8585 #ifdef SUPPORT_DISASSEMBLY
8586 /* Needed by the i386 disassembler. For extra credit, someone could
8587 fix this so that we insert symbolic addresses here, esp for GOT/PLT
8591 print_address (unsigned int addr
, FILE * outfile
)
8593 fprintf (outfile
,"0x%8.8x", addr
);
8596 /* Needed by the i386 disassembler. */
8598 db_task_printsym (unsigned int addr
)
8600 print_address (addr
, stderr
);
8609 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
8610 setlocale (LC_MESSAGES
, "");
8612 bindtextdomain (PACKAGE
, LOCALEDIR
);
8613 textdomain (PACKAGE
);
8615 parse_args (argc
, argv
);
8617 if (optind
< (argc
- 1))
8620 while (optind
< argc
)
8621 process_file (argv
[optind
++]);
8623 if (dump_sects
!= NULL
)