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
);
967 if (symtab
== NULL
|| symtab_index
>= nsyms
)
968 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
971 Elf_Internal_Sym
* psym
;
973 psym
= symtab
+ symtab_index
;
976 print_vma (psym
->st_value
, LONG_HEX
);
979 if (psym
->st_name
== 0)
981 SECTION_NAME (section_headers
+ psym
->st_shndx
));
982 else if (strtab
== NULL
)
983 printf (_("<string table index %3ld>"), psym
->st_name
);
985 printf ("%-25.25s", strtab
+ psym
->st_name
);
988 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
993 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
994 print_vma (relas
[i
].r_addend
, LONG_HEX
);
997 if (elf_header
.e_machine
== EM_SPARCV9
998 && !strcmp (rtype
, "R_SPARC_OLO10"))
999 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1013 get_mips_dynamic_type (type
)
1018 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1019 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1020 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1021 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1022 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1023 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1024 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1025 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1026 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1027 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1028 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1029 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1030 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1031 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1032 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1033 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1034 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1035 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1036 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1037 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1038 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1039 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1040 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1041 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1042 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1043 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1044 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1045 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1046 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1047 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1048 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1049 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1050 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1051 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1052 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1053 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1054 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1055 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1056 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1057 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1058 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1059 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1060 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1067 get_sparc64_dynamic_type (type
)
1072 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1079 get_parisc_dynamic_type (type
)
1084 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1085 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1086 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1087 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1088 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1089 case DT_HP_PREINIT
: return "HP_PREINIT";
1090 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1091 case DT_HP_NEEDED
: return "HP_NEEDED";
1092 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1093 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1094 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1095 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1096 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1103 get_dynamic_type (type
)
1106 static char buff
[32];
1110 case DT_NULL
: return "NULL";
1111 case DT_NEEDED
: return "NEEDED";
1112 case DT_PLTRELSZ
: return "PLTRELSZ";
1113 case DT_PLTGOT
: return "PLTGOT";
1114 case DT_HASH
: return "HASH";
1115 case DT_STRTAB
: return "STRTAB";
1116 case DT_SYMTAB
: return "SYMTAB";
1117 case DT_RELA
: return "RELA";
1118 case DT_RELASZ
: return "RELASZ";
1119 case DT_RELAENT
: return "RELAENT";
1120 case DT_STRSZ
: return "STRSZ";
1121 case DT_SYMENT
: return "SYMENT";
1122 case DT_INIT
: return "INIT";
1123 case DT_FINI
: return "FINI";
1124 case DT_SONAME
: return "SONAME";
1125 case DT_RPATH
: return "RPATH";
1126 case DT_SYMBOLIC
: return "SYMBOLIC";
1127 case DT_REL
: return "REL";
1128 case DT_RELSZ
: return "RELSZ";
1129 case DT_RELENT
: return "RELENT";
1130 case DT_PLTREL
: return "PLTREL";
1131 case DT_DEBUG
: return "DEBUG";
1132 case DT_TEXTREL
: return "TEXTREL";
1133 case DT_JMPREL
: return "JMPREL";
1134 case DT_BIND_NOW
: return "BIND_NOW";
1135 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1136 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1137 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1138 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1139 case DT_RUNPATH
: return "RUNPATH";
1140 case DT_FLAGS
: return "FLAGS";
1142 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1143 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1145 case DT_CHECKSUM
: return "CHECKSUM";
1146 case DT_PLTPADSZ
: return "PLTPADSZ";
1147 case DT_MOVEENT
: return "MOVEENT";
1148 case DT_MOVESZ
: return "MOVESZ";
1149 case DT_FEATURE
: return "FEATURE";
1150 case DT_POSFLAG_1
: return "POSFLAG_1";
1151 case DT_SYMINSZ
: return "SYMINSZ";
1152 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1154 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1155 case DT_CONFIG
: return "CONFIG";
1156 case DT_DEPAUDIT
: return "DEPAUDIT";
1157 case DT_AUDIT
: return "AUDIT";
1158 case DT_PLTPAD
: return "PLTPAD";
1159 case DT_MOVETAB
: return "MOVETAB";
1160 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1162 case DT_VERSYM
: return "VERSYM";
1164 case DT_RELACOUNT
: return "RELACOUNT";
1165 case DT_RELCOUNT
: return "RELCOUNT";
1166 case DT_FLAGS_1
: return "FLAGS_1";
1167 case DT_VERDEF
: return "VERDEF";
1168 case DT_VERDEFNUM
: return "VERDEFNUM";
1169 case DT_VERNEED
: return "VERNEED";
1170 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1172 case DT_AUXILIARY
: return "AUXILIARY";
1173 case DT_USED
: return "USED";
1174 case DT_FILTER
: return "FILTER";
1177 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1179 const char * result
;
1181 switch (elf_header
.e_machine
)
1184 case EM_MIPS_RS3_LE
:
1185 result
= get_mips_dynamic_type (type
);
1188 result
= get_sparc64_dynamic_type (type
);
1198 sprintf (buff
, _("Processor Specific: %lx"), type
);
1200 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1202 const char * result
;
1204 switch (elf_header
.e_machine
)
1207 result
= get_parisc_dynamic_type (type
);
1217 sprintf (buff
, _("Operating System specific: %lx"), type
);
1220 sprintf (buff
, _("<unknown>: %lx"), type
);
1227 get_file_type (e_type
)
1230 static char buff
[32];
1234 case ET_NONE
: return _("NONE (None)");
1235 case ET_REL
: return _("REL (Relocatable file)");
1236 case ET_EXEC
: return _("EXEC (Executable file)");
1237 case ET_DYN
: return _("DYN (Shared object file)");
1238 case ET_CORE
: return _("CORE (Core file)");
1241 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1242 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1243 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1244 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1246 sprintf (buff
, _("<unknown>: %x"), e_type
);
1252 get_machine_name (e_machine
)
1255 static char buff
[64]; /* XXX */
1259 case EM_NONE
: return _("None");
1260 case EM_M32
: return "WE32100";
1261 case EM_SPARC
: return "Sparc";
1262 case EM_386
: return "Intel 80386";
1263 case EM_68K
: return "MC68000";
1264 case EM_88K
: return "MC88000";
1265 case EM_486
: return "Intel 80486";
1266 case EM_860
: return "Intel 80860";
1267 case EM_MIPS
: return "MIPS R3000";
1268 case EM_S370
: return "IBM System/370";
1269 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1270 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1271 case EM_PARISC
: return "HPPA";
1272 case EM_PPC_OLD
: return "Power PC (old)";
1273 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1274 case EM_960
: return "Intel 90860";
1275 case EM_PPC
: return "PowerPC";
1276 case EM_V800
: return "NEC V800";
1277 case EM_FR20
: return "Fujitsu FR20";
1278 case EM_RH32
: return "TRW RH32";
1279 case EM_MCORE
: return "MCORE";
1280 case EM_ARM
: return "ARM";
1281 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1282 case EM_SH
: return "Hitachi SH";
1283 case EM_SPARCV9
: return "Sparc v9";
1284 case EM_TRICORE
: return "Siemens Tricore";
1285 case EM_ARC
: return "ARC";
1286 case EM_H8_300
: return "Hitachi H8/300";
1287 case EM_H8_300H
: return "Hitachi H8/300H";
1288 case EM_H8S
: return "Hitachi H8S";
1289 case EM_H8_500
: return "Hitachi H8/500";
1290 case EM_IA_64
: return "Intel IA-64";
1291 case EM_MIPS_X
: return "Stanford MIPS-X";
1292 case EM_COLDFIRE
: return "Motorola Coldfire";
1293 case EM_68HC12
: return "Motorola M68HC12";
1294 case EM_ALPHA
: return "Alpha";
1295 case EM_CYGNUS_D10V
: return "d10v";
1296 case EM_CYGNUS_D30V
: return "d30v";
1297 case EM_CYGNUS_ARC
: return "ARC";
1298 case EM_CYGNUS_M32R
: return "Mitsubishi M32r";
1299 case EM_CYGNUS_V850
: return "NEC v850";
1300 case EM_CYGNUS_MN10300
: return "mn10300";
1301 case EM_CYGNUS_MN10200
: return "mn10200";
1302 case EM_CYGNUS_FR30
: return "Fujitsu FR30";
1303 case EM_PJ
: return "picoJava";
1304 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1305 case EM_PCP
: return "Siemens PCP";
1306 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1307 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1308 case EM_STARCORE
: return "Motorola Star*Core processor";
1309 case EM_ME16
: return "Toyota ME16 processor";
1310 case EM_ST100
: return "STMicroelectronics ST100 processor";
1311 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1312 case EM_FX66
: return "Siemens FX66 microcontroller";
1313 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1314 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1315 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1316 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1317 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1318 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1319 case EM_SVX
: return "Silicon Graphics SVx";
1320 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1321 case EM_VAX
: return "Digital VAX";
1322 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1323 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1324 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1325 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1326 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1327 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1328 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1329 case EM_PRISM
: return "SiTera Prism";
1330 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1332 case EM_S390
: return "IBM S/390";
1334 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1340 decode_ARM_machine_flags (e_flags
, buf
)
1347 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1348 e_flags
&= ~ EF_ARM_EABIMASK
;
1350 /* Handle "generic" ARM flags. */
1351 if (e_flags
& EF_ARM_RELEXEC
)
1353 strcat (buf
, ", relocatable executable");
1354 e_flags
&= ~ EF_ARM_RELEXEC
;
1357 if (e_flags
& EF_ARM_HASENTRY
)
1359 strcat (buf
, ", has entry point");
1360 e_flags
&= ~ EF_ARM_HASENTRY
;
1363 /* Now handle EABI specific flags. */
1367 strcat (buf
, ", <unrecognised EABI>");
1372 case EF_ARM_EABI_VER1
:
1373 strcat (buf
, ", Version1 EABI");
1378 /* Process flags one bit at a time. */
1379 flag
= e_flags
& - e_flags
;
1384 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1385 strcat (buf
, ", sorted symbol tables");
1395 case EF_ARM_EABI_VER2
:
1396 strcat (buf
, ", Version2 EABI");
1401 /* Process flags one bit at a time. */
1402 flag
= e_flags
& - e_flags
;
1407 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1408 strcat (buf
, ", sorted symbol tables");
1411 case EF_ARM_DYNSYMSUSESEGIDX
:
1412 strcat (buf
, ", dynamic symbols use segment index");
1415 case EF_ARM_MAPSYMSFIRST
:
1416 strcat (buf
, ", mapping symbols precede others");
1426 case EF_ARM_EABI_UNKNOWN
:
1427 strcat (buf
, ", GNU EABI");
1432 /* Process flags one bit at a time. */
1433 flag
= e_flags
& - e_flags
;
1438 case EF_ARM_INTERWORK
:
1439 strcat (buf
, ", interworking enabled");
1442 case EF_ARM_APCS_26
:
1443 strcat (buf
, ", uses APCS/26");
1446 case EF_ARM_APCS_FLOAT
:
1447 strcat (buf
, ", uses APCS/float");
1451 strcat (buf
, ", position independent");
1455 strcat (buf
, ", 8 bit structure alignment");
1458 case EF_ARM_NEW_ABI
:
1459 strcat (buf
, ", uses new ABI");
1462 case EF_ARM_OLD_ABI
:
1463 strcat (buf
, ", uses old ABI");
1466 case EF_ARM_SOFT_FLOAT
:
1467 strcat (buf
, ", software FP");
1478 strcat (buf
,", <unknown>");
1482 get_machine_flags (e_flags
, e_machine
)
1486 static char buf
[1024];
1498 decode_ARM_machine_flags (e_flags
, buf
);
1502 if (e_flags
& EF_CPU32
)
1503 strcat (buf
, ", cpu32");
1507 if (e_flags
& EF_PPC_EMB
)
1508 strcat (buf
, ", emb");
1510 if (e_flags
& EF_PPC_RELOCATABLE
)
1511 strcat (buf
, ", relocatable");
1513 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1514 strcat (buf
, ", relocatable-lib");
1517 case EM_CYGNUS_V850
:
1518 switch (e_flags
& EF_V850_ARCH
)
1521 strcat (buf
, ", v850e");
1524 strcat (buf
, ", v850ea");
1527 strcat (buf
, ", v850");
1530 strcat (buf
, ", unknown v850 architecture variant");
1535 case EM_CYGNUS_M32R
:
1536 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1537 strcat (buf
, ", m32r");
1542 case EM_MIPS_RS3_LE
:
1543 if (e_flags
& EF_MIPS_NOREORDER
)
1544 strcat (buf
, ", noreorder");
1546 if (e_flags
& EF_MIPS_PIC
)
1547 strcat (buf
, ", pic");
1549 if (e_flags
& EF_MIPS_CPIC
)
1550 strcat (buf
, ", cpic");
1552 if (e_flags
& EF_MIPS_ABI2
)
1553 strcat (buf
, ", abi2");
1555 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_1
)
1556 strcat (buf
, ", mips1");
1558 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_2
)
1559 strcat (buf
, ", mips2");
1561 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_3
)
1562 strcat (buf
, ", mips3");
1564 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_4
)
1565 strcat (buf
, ", mips4");
1567 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_5
)
1568 strcat (buf
, ", mips5");
1570 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_32
)
1571 strcat (buf
, ", mips32");
1573 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_64
)
1574 strcat (buf
, ", mips64");
1576 switch ((e_flags
& EF_MIPS_MACH
))
1578 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1579 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1580 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1581 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1582 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1583 case E_MIPS_MACH_MIPS32_4K
: strcat (buf
, ", mips32-4k"); break;
1584 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1585 default: strcat (buf
, " UNKNOWN"); break;
1590 if (e_flags
& EF_SPARC_32PLUS
)
1591 strcat (buf
, ", v8+");
1593 if (e_flags
& EF_SPARC_SUN_US1
)
1594 strcat (buf
, ", ultrasparcI");
1596 if (e_flags
& EF_SPARC_SUN_US3
)
1597 strcat (buf
, ", ultrasparcIII");
1599 if (e_flags
& EF_SPARC_HAL_R1
)
1600 strcat (buf
, ", halr1");
1602 if (e_flags
& EF_SPARC_LEDATA
)
1603 strcat (buf
, ", ledata");
1605 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1606 strcat (buf
, ", tso");
1608 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1609 strcat (buf
, ", pso");
1611 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1612 strcat (buf
, ", rmo");
1616 switch (e_flags
& EF_PARISC_ARCH
)
1618 case EFA_PARISC_1_0
:
1619 strcpy (buf
, ", PA-RISC 1.0");
1621 case EFA_PARISC_1_1
:
1622 strcpy (buf
, ", PA-RISC 1.1");
1624 case EFA_PARISC_2_0
:
1625 strcpy (buf
, ", PA-RISC 2.0");
1630 if (e_flags
& EF_PARISC_TRAPNIL
)
1631 strcat (buf
, ", trapnil");
1632 if (e_flags
& EF_PARISC_EXT
)
1633 strcat (buf
, ", ext");
1634 if (e_flags
& EF_PARISC_LSB
)
1635 strcat (buf
, ", lsb");
1636 if (e_flags
& EF_PARISC_WIDE
)
1637 strcat (buf
, ", wide");
1638 if (e_flags
& EF_PARISC_NO_KABP
)
1639 strcat (buf
, ", no kabp");
1640 if (e_flags
& EF_PARISC_LAZYSWAP
)
1641 strcat (buf
, ", lazyswap");
1645 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1646 strcat (buf
, ", new calling convention");
1648 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1649 strcat (buf
, ", gnu calling convention");
1653 if ((e_flags
& EF_IA_64_ABI64
))
1654 strcat (buf
, ", 64-bit");
1656 strcat (buf
, ", 32-bit");
1657 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1658 strcat (buf
, ", reduced fp model");
1659 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1660 strcat (buf
, ", no function descriptors, constant gp");
1661 else if ((e_flags
& EF_IA_64_CONS_GP
))
1662 strcat (buf
, ", constant gp");
1663 if ((e_flags
& EF_IA_64_ABSOLUTE
))
1664 strcat (buf
, ", absolute");
1673 get_mips_segment_type (type
)
1678 case PT_MIPS_REGINFO
:
1680 case PT_MIPS_RTPROC
:
1682 case PT_MIPS_OPTIONS
:
1692 get_parisc_segment_type (type
)
1697 case PT_HP_TLS
: return "HP_TLS";
1698 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1699 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1700 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1701 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1702 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1703 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1704 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1705 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1706 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1707 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1708 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1709 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1710 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1719 get_ia64_segment_type (type
)
1724 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
1725 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
1734 get_segment_type (p_type
)
1735 unsigned long p_type
;
1737 static char buff
[32];
1741 case PT_NULL
: return "NULL";
1742 case PT_LOAD
: return "LOAD";
1743 case PT_DYNAMIC
: return "DYNAMIC";
1744 case PT_INTERP
: return "INTERP";
1745 case PT_NOTE
: return "NOTE";
1746 case PT_SHLIB
: return "SHLIB";
1747 case PT_PHDR
: return "PHDR";
1750 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1752 const char * result
;
1754 switch (elf_header
.e_machine
)
1757 case EM_MIPS_RS3_LE
:
1758 result
= get_mips_segment_type (p_type
);
1761 result
= get_parisc_segment_type (p_type
);
1764 result
= get_ia64_segment_type (p_type
);
1774 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1776 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1778 const char * result
;
1780 switch (elf_header
.e_machine
)
1783 result
= get_parisc_segment_type (p_type
);
1793 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1796 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1803 get_mips_section_type_name (sh_type
)
1804 unsigned int sh_type
;
1808 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1809 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1810 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1811 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1812 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1813 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1814 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1815 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1816 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1817 case SHT_MIPS_RELD
: return "MIPS_RELD";
1818 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
1819 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
1820 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1821 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
1822 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
1823 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
1824 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
1825 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
1826 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
1827 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
1828 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
1829 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
1830 case SHT_MIPS_LINE
: return "MIPS_LINE";
1831 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
1832 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
1833 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
1834 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
1835 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
1836 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
1837 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1838 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
1839 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
1840 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
1841 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
1842 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
1843 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
1844 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
1845 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
1846 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
1854 get_parisc_section_type_name (sh_type
)
1855 unsigned int sh_type
;
1859 case SHT_PARISC_EXT
: return "PARISC_EXT";
1860 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
1861 case SHT_PARISC_DOC
: return "PARISC_DOC";
1869 get_ia64_section_type_name (sh_type
)
1870 unsigned int sh_type
;
1874 case SHT_IA_64_EXT
: return "IA_64_EXT";
1875 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
1883 get_section_type_name (sh_type
)
1884 unsigned int sh_type
;
1886 static char buff
[32];
1890 case SHT_NULL
: return "NULL";
1891 case SHT_PROGBITS
: return "PROGBITS";
1892 case SHT_SYMTAB
: return "SYMTAB";
1893 case SHT_STRTAB
: return "STRTAB";
1894 case SHT_RELA
: return "RELA";
1895 case SHT_HASH
: return "HASH";
1896 case SHT_DYNAMIC
: return "DYNAMIC";
1897 case SHT_NOTE
: return "NOTE";
1898 case SHT_NOBITS
: return "NOBITS";
1899 case SHT_REL
: return "REL";
1900 case SHT_SHLIB
: return "SHLIB";
1901 case SHT_DYNSYM
: return "DYNSYM";
1902 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
1903 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
1904 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1905 case SHT_GROUP
: return "GROUP";
1906 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
1907 case SHT_GNU_verdef
: return "VERDEF";
1908 case SHT_GNU_verneed
: return "VERNEED";
1909 case SHT_GNU_versym
: return "VERSYM";
1910 case 0x6ffffff0: return "VERSYM";
1911 case 0x6ffffffc: return "VERDEF";
1912 case 0x7ffffffd: return "AUXILIARY";
1913 case 0x7fffffff: return "FILTER";
1916 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
1918 const char * result
;
1920 switch (elf_header
.e_machine
)
1923 case EM_MIPS_RS3_LE
:
1924 result
= get_mips_section_type_name (sh_type
);
1927 result
= get_parisc_section_type_name (sh_type
);
1930 result
= get_ia64_section_type_name (sh_type
);
1940 sprintf (buff
, "SHT_LOPROC+%x", sh_type
- SHT_LOPROC
);
1942 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
1943 sprintf (buff
, "SHT_LOOS+%x", sh_type
- SHT_LOOS
);
1944 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
1945 sprintf (buff
, "SHT_LOUSER+%x", sh_type
- SHT_LOUSER
);
1947 sprintf (buff
, _("<unknown>: %x"), sh_type
);
1953 struct option options
[] =
1955 {"all", no_argument
, 0, 'a'},
1956 {"file-header", no_argument
, 0, 'h'},
1957 {"program-headers", no_argument
, 0, 'l'},
1958 {"headers", no_argument
, 0, 'e'},
1959 {"histogram", no_argument
, 0, 'I'},
1960 {"segments", no_argument
, 0, 'l'},
1961 {"sections", no_argument
, 0, 'S'},
1962 {"section-headers", no_argument
, 0, 'S'},
1963 {"symbols", no_argument
, 0, 's'},
1964 {"syms", no_argument
, 0, 's'},
1965 {"relocs", no_argument
, 0, 'r'},
1966 {"notes", no_argument
, 0, 'n'},
1967 {"dynamic", no_argument
, 0, 'd'},
1968 {"arch-specific", no_argument
, 0, 'A'},
1969 {"version-info", no_argument
, 0, 'V'},
1970 {"use-dynamic", no_argument
, 0, 'D'},
1971 {"hex-dump", required_argument
, 0, 'x'},
1972 {"debug-dump", optional_argument
, 0, 'w'},
1973 {"unwind", no_argument
, 0, 'u'},
1974 #ifdef SUPPORT_DISASSEMBLY
1975 {"instruction-dump", required_argument
, 0, 'i'},
1978 {"version", no_argument
, 0, 'v'},
1979 {"help", no_argument
, 0, 'H'},
1980 {0, no_argument
, 0, 0}
1986 fprintf (stdout
, _("Usage: readelf {options} elf-file(s)\n"));
1987 fprintf (stdout
, _(" Options are:\n"));
1988 fprintf (stdout
, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1989 fprintf (stdout
, _(" -h or --file-header Display the ELF file header\n"));
1990 fprintf (stdout
, _(" -l or --program-headers or --segments\n"));
1991 fprintf (stdout
, _(" Display the program headers\n"));
1992 fprintf (stdout
, _(" -S or --section-headers or --sections\n"));
1993 fprintf (stdout
, _(" Display the sections' header\n"));
1994 fprintf (stdout
, _(" -e or --headers Equivalent to: -h -l -S\n"));
1995 fprintf (stdout
, _(" -s or --syms or --symbols Display the symbol table\n"));
1996 fprintf (stdout
, _(" -n or --notes Display the core notes (if present)\n"));
1997 fprintf (stdout
, _(" -r or --relocs Display the relocations (if present)\n"));
1998 fprintf (stdout
, _(" -u or --unwind Display the unwind info (if present)\n"));
1999 fprintf (stdout
, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2000 fprintf (stdout
, _(" -V or --version-info Display the version sections (if present)\n"));
2001 fprintf (stdout
, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2002 fprintf (stdout
, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2003 fprintf (stdout
, _(" -x <number> or --hex-dump=<number>\n"));
2004 fprintf (stdout
, _(" Dump the contents of section <number>\n"));
2005 fprintf (stdout
, _(" -w[liaprf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=frames]\n"));
2006 fprintf (stdout
, _(" Display the contents of DWARF2 debug sections\n"));
2007 #ifdef SUPPORT_DISASSEMBLY
2008 fprintf (stdout
, _(" -i <number> or --instruction-dump=<number>\n"));
2009 fprintf (stdout
, _(" Disassemble the contents of section <number>\n"));
2011 fprintf (stdout
, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2012 fprintf (stdout
, _(" -v or --version Display the version number of readelf\n"));
2013 fprintf (stdout
, _(" -H or --help Display this information\n"));
2014 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2020 request_dump (section
, type
)
2021 unsigned int section
;
2024 if (section
>= num_dump_sects
)
2026 char * new_dump_sects
;
2028 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2030 if (new_dump_sects
== NULL
)
2031 error (_("Out of memory allocating dump request table."));
2034 /* Copy current flag settings. */
2035 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2039 dump_sects
= new_dump_sects
;
2040 num_dump_sects
= section
+ 1;
2045 dump_sects
[section
] |= type
;
2051 parse_args (argc
, argv
)
2060 while ((c
= getopt_long
2061 (argc
, argv
, "ersuahnldSDAIw::x:i:vV", options
, NULL
)) != EOF
)
2097 do_using_dynamic
++;
2128 section
= strtoul (optarg
, & cp
, 0);
2129 if (! * cp
&& section
>= 0)
2131 request_dump (section
, HEX_DUMP
);
2151 do_debug_abbrevs
= 1;
2161 do_debug_pubnames
= 1;
2166 do_debug_aranges
= 1;
2170 do_debug_frames_interp
= 1;
2172 do_debug_frames
= 1;
2176 warn (_("Unrecognised debug option '%s'\n"), optarg
);
2181 #ifdef SUPPORT_DISASSEMBLY
2184 section
= strtoul (optarg
, & cp
, 0);
2185 if (! * cp
&& section
>= 0)
2187 request_dump (section
, DISASS_DUMP
);
2193 print_version (program_name
);
2200 /* xgettext:c-format */
2201 error (_("Invalid option '-%c'\n"), c
);
2208 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2209 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2210 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2214 warn (_("Nothing to do.\n"));
2220 get_elf_class (elf_class
)
2221 unsigned char elf_class
;
2223 static char buff
[32];
2227 case ELFCLASSNONE
: return _("none");
2228 case ELFCLASS32
: return _("ELF32");
2229 case ELFCLASS64
: return _("ELF64");
2231 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2237 get_data_encoding (encoding
)
2238 unsigned char encoding
;
2240 static char buff
[32];
2244 case ELFDATANONE
: return _("none");
2245 case ELFDATA2LSB
: return _("2's complement, little endian");
2246 case ELFDATA2MSB
: return _("2's complement, big endian");
2248 sprintf (buff
, _("<unknown: %x>"), encoding
);
2254 get_osabi_name (osabi
)
2255 unsigned char osabi
;
2257 static char buff
[32];
2261 case ELFOSABI_NONE
: return _("UNIX - System V");
2262 case ELFOSABI_HPUX
: return _("UNIX - HP-UX");
2263 case ELFOSABI_NETBSD
: return _("UNIX - NetBSD");
2264 case ELFOSABI_LINUX
: return _("UNIX - Linux");
2265 case ELFOSABI_HURD
: return _("GNU/Hurd");
2266 case ELFOSABI_SOLARIS
: return _("UNIX - Solaris");
2267 case ELFOSABI_AIX
: return _("UNIX - AIX");
2268 case ELFOSABI_IRIX
: return _("UNIX - IRIX");
2269 case ELFOSABI_FREEBSD
: return _("UNIX - FreeBSD");
2270 case ELFOSABI_TRU64
: return _("UNIX - TRU64");
2271 case ELFOSABI_MODESTO
: return _("Novell - Modesto");
2272 case ELFOSABI_OPENBSD
: return _("UNIX - OpenBSD");
2273 case ELFOSABI_STANDALONE
: return _("Standalone App");
2274 case ELFOSABI_ARM
: return _("ARM");
2276 sprintf (buff
, _("<unknown: %x>"), osabi
);
2281 /* Decode the data held in 'elf_header'. */
2283 process_file_header ()
2285 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2286 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2287 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2288 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2291 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2299 printf (_("ELF Header:\n"));
2300 printf (_(" Magic: "));
2301 for (i
= 0; i
< EI_NIDENT
; i
++)
2302 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2304 printf (_(" Class: %s\n"),
2305 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2306 printf (_(" Data: %s\n"),
2307 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2308 printf (_(" Version: %d %s\n"),
2309 elf_header
.e_ident
[EI_VERSION
],
2310 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2312 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2315 printf (_(" OS/ABI: %s\n"),
2316 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2317 printf (_(" ABI Version: %d\n"),
2318 elf_header
.e_ident
[EI_ABIVERSION
]);
2319 printf (_(" Type: %s\n"),
2320 get_file_type (elf_header
.e_type
));
2321 printf (_(" Machine: %s\n"),
2322 get_machine_name (elf_header
.e_machine
));
2323 printf (_(" Version: 0x%lx\n"),
2324 (unsigned long) elf_header
.e_version
);
2326 printf (_(" Entry point address: "));
2327 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2328 printf (_("\n Start of program headers: "));
2329 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2330 printf (_(" (bytes into file)\n Start of section headers: "));
2331 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2332 printf (_(" (bytes into file)\n"));
2334 printf (_(" Flags: 0x%lx%s\n"),
2335 (unsigned long) elf_header
.e_flags
,
2336 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2337 printf (_(" Size of this header: %ld (bytes)\n"),
2338 (long) elf_header
.e_ehsize
);
2339 printf (_(" Size of program headers: %ld (bytes)\n"),
2340 (long) elf_header
.e_phentsize
);
2341 printf (_(" Number of program headers: %ld\n"),
2342 (long) elf_header
.e_phnum
);
2343 printf (_(" Size of section headers: %ld (bytes)\n"),
2344 (long) elf_header
.e_shentsize
);
2345 printf (_(" Number of section headers: %ld\n"),
2346 (long) elf_header
.e_shnum
);
2347 printf (_(" Section header string table index: %ld\n"),
2348 (long) elf_header
.e_shstrndx
);
2356 get_32bit_program_headers (file
, program_headers
)
2358 Elf_Internal_Phdr
* program_headers
;
2360 Elf32_External_Phdr
* phdrs
;
2361 Elf32_External_Phdr
* external
;
2362 Elf32_Internal_Phdr
* internal
;
2365 GET_DATA_ALLOC (elf_header
.e_phoff
,
2366 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2367 phdrs
, Elf32_External_Phdr
*, "program headers");
2369 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2370 i
< elf_header
.e_phnum
;
2371 i
++, internal
++, external
++)
2373 internal
->p_type
= BYTE_GET (external
->p_type
);
2374 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2375 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2376 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2377 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2378 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2379 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2380 internal
->p_align
= BYTE_GET (external
->p_align
);
2389 get_64bit_program_headers (file
, program_headers
)
2391 Elf_Internal_Phdr
* program_headers
;
2393 Elf64_External_Phdr
* phdrs
;
2394 Elf64_External_Phdr
* external
;
2395 Elf64_Internal_Phdr
* internal
;
2398 GET_DATA_ALLOC (elf_header
.e_phoff
,
2399 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2400 phdrs
, Elf64_External_Phdr
*, "program headers");
2402 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2403 i
< elf_header
.e_phnum
;
2404 i
++, internal
++, external
++)
2406 internal
->p_type
= BYTE_GET (external
->p_type
);
2407 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2408 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2409 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2410 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2411 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2412 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2413 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2422 process_program_headers (file
)
2425 Elf_Internal_Phdr
* program_headers
;
2426 Elf_Internal_Phdr
* segment
;
2429 if (elf_header
.e_phnum
== 0)
2432 printf (_("\nThere are no program headers in this file.\n"));
2436 if (do_segments
&& !do_header
)
2438 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2439 printf (_("Entry point "));
2440 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2441 printf (_("\nThere are %d program headers, starting at offset "),
2442 elf_header
.e_phnum
);
2443 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2447 program_headers
= (Elf_Internal_Phdr
*) malloc
2448 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2450 if (program_headers
== NULL
)
2452 error (_("Out of memory\n"));
2457 i
= get_32bit_program_headers (file
, program_headers
);
2459 i
= get_64bit_program_headers (file
, program_headers
);
2463 free (program_headers
);
2470 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2474 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2478 (_(" Type Offset VirtAddr PhysAddr\n"));
2480 (_(" FileSiz MemSiz Flags Align\n"));
2488 for (i
= 0, segment
= program_headers
;
2489 i
< elf_header
.e_phnum
;
2494 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2498 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2499 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2500 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2501 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2502 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2504 (segment
->p_flags
& PF_R
? 'R' : ' '),
2505 (segment
->p_flags
& PF_W
? 'W' : ' '),
2506 (segment
->p_flags
& PF_X
? 'E' : ' '));
2507 printf ("%#lx", (unsigned long) segment
->p_align
);
2511 print_vma (segment
->p_offset
, FULL_HEX
);
2513 print_vma (segment
->p_vaddr
, FULL_HEX
);
2515 print_vma (segment
->p_paddr
, FULL_HEX
);
2517 print_vma (segment
->p_filesz
, FULL_HEX
);
2519 print_vma (segment
->p_memsz
, FULL_HEX
);
2521 (segment
->p_flags
& PF_R
? 'R' : ' '),
2522 (segment
->p_flags
& PF_W
? 'W' : ' '),
2523 (segment
->p_flags
& PF_X
? 'E' : ' '));
2524 print_vma (segment
->p_align
, HEX
);
2528 switch (segment
->p_type
)
2532 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2533 - (segment
->p_offset
& 0xfffff000);
2538 error (_("more than one dynamic segment\n"));
2540 dynamic_addr
= segment
->p_offset
;
2541 dynamic_size
= segment
->p_filesz
;
2545 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2546 error (_("Unable to find program interpreter name\n"));
2549 program_interpreter
[0] = 0;
2550 fscanf (file
, "%63s", program_interpreter
);
2553 printf (_("\n [Requesting program interpreter: %s]"),
2554 program_interpreter
);
2560 putc ('\n', stdout
);
2569 if (do_segments
&& section_headers
!= NULL
)
2571 printf (_("\n Section to Segment mapping:\n"));
2572 printf (_(" Segment Sections...\n"));
2574 assert (string_table
!= NULL
);
2576 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2579 Elf_Internal_Shdr
* section
;
2581 segment
= program_headers
+ i
;
2582 section
= section_headers
;
2584 printf (" %2.2d ", i
);
2586 for (j
= 0; j
< elf_header
.e_shnum
; j
++, section
++)
2588 if (section
->sh_size
> 0
2589 /* Compare allocated sections by VMA, unallocated
2590 sections by file offset. */
2591 && (section
->sh_flags
& SHF_ALLOC
2592 ? (section
->sh_addr
>= segment
->p_vaddr
2593 && section
->sh_addr
+ section
->sh_size
2594 <= segment
->p_vaddr
+ segment
->p_memsz
)
2595 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2596 && (section
->sh_offset
+ section
->sh_size
2597 <= segment
->p_offset
+ segment
->p_filesz
))))
2598 printf ("%s ", SECTION_NAME (section
));
2605 free (program_headers
);
2612 get_32bit_section_headers (file
)
2615 Elf32_External_Shdr
* shdrs
;
2616 Elf32_Internal_Shdr
* internal
;
2619 GET_DATA_ALLOC (elf_header
.e_shoff
,
2620 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2621 shdrs
, Elf32_External_Shdr
*, "section headers");
2623 section_headers
= (Elf_Internal_Shdr
*) malloc
2624 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2626 if (section_headers
== NULL
)
2628 error (_("Out of memory\n"));
2632 for (i
= 0, internal
= section_headers
;
2633 i
< elf_header
.e_shnum
;
2636 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2637 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2638 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2639 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2640 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2641 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2642 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2643 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2644 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2645 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2654 get_64bit_section_headers (file
)
2657 Elf64_External_Shdr
* shdrs
;
2658 Elf64_Internal_Shdr
* internal
;
2661 GET_DATA_ALLOC (elf_header
.e_shoff
,
2662 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2663 shdrs
, Elf64_External_Shdr
*, "section headers");
2665 section_headers
= (Elf_Internal_Shdr
*) malloc
2666 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2668 if (section_headers
== NULL
)
2670 error (_("Out of memory\n"));
2674 for (i
= 0, internal
= section_headers
;
2675 i
< elf_header
.e_shnum
;
2678 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2679 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2680 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2681 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2682 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2683 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2684 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2685 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2686 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2687 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2695 static Elf_Internal_Sym
*
2696 get_32bit_elf_symbols (file
, offset
, number
)
2698 unsigned long offset
;
2699 unsigned long number
;
2701 Elf32_External_Sym
* esyms
;
2702 Elf_Internal_Sym
* isyms
;
2703 Elf_Internal_Sym
* psym
;
2706 GET_DATA_ALLOC (offset
, number
* sizeof (Elf32_External_Sym
),
2707 esyms
, Elf32_External_Sym
*, "symbols");
2709 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2713 error (_("Out of memory\n"));
2719 for (j
= 0, psym
= isyms
;
2723 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2724 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
2725 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
2726 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2727 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2728 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2736 static Elf_Internal_Sym
*
2737 get_64bit_elf_symbols (file
, offset
, number
)
2739 unsigned long offset
;
2740 unsigned long number
;
2742 Elf64_External_Sym
* esyms
;
2743 Elf_Internal_Sym
* isyms
;
2744 Elf_Internal_Sym
* psym
;
2747 GET_DATA_ALLOC (offset
, number
* sizeof (Elf64_External_Sym
),
2748 esyms
, Elf64_External_Sym
*, "symbols");
2750 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2754 error (_("Out of memory\n"));
2760 for (j
= 0, psym
= isyms
;
2764 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2765 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2766 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2767 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2768 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
2769 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
2778 get_elf_section_flags (sh_flags
)
2781 static char buff
[32];
2789 flag
= sh_flags
& - sh_flags
;
2794 case SHF_WRITE
: strcat (buff
, "W"); break;
2795 case SHF_ALLOC
: strcat (buff
, "A"); break;
2796 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
2797 case SHF_MERGE
: strcat (buff
, "M"); break;
2798 case SHF_STRINGS
: strcat (buff
, "S"); break;
2799 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
2800 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
2801 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
2802 case SHF_GROUP
: strcat (buff
, "G"); break;
2805 if (flag
& SHF_MASKOS
)
2808 sh_flags
&= ~ SHF_MASKOS
;
2810 else if (flag
& SHF_MASKPROC
)
2813 sh_flags
&= ~ SHF_MASKPROC
;
2825 process_section_headers (file
)
2828 Elf_Internal_Shdr
* section
;
2831 section_headers
= NULL
;
2833 if (elf_header
.e_shnum
== 0)
2836 printf (_("\nThere are no sections in this file.\n"));
2841 if (do_sections
&& !do_header
)
2842 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2843 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
2847 if (! get_32bit_section_headers (file
))
2850 else if (! get_64bit_section_headers (file
))
2853 /* Read in the string table, so that we have names to display. */
2854 section
= section_headers
+ elf_header
.e_shstrndx
;
2856 if (section
->sh_size
!= 0)
2858 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2859 string_table
, char *, "string table");
2861 string_table_length
= section
->sh_size
;
2864 /* Scan the sections for the dynamic symbol table
2865 and dynamic string table and debug sections. */
2866 dynamic_symbols
= NULL
;
2867 dynamic_strings
= NULL
;
2868 dynamic_syminfo
= NULL
;
2870 for (i
= 0, section
= section_headers
;
2871 i
< elf_header
.e_shnum
;
2874 char * name
= SECTION_NAME (section
);
2876 if (section
->sh_type
== SHT_DYNSYM
)
2878 if (dynamic_symbols
!= NULL
)
2880 error (_("File contains multiple dynamic symbol tables\n"));
2884 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
2886 GET_ELF_SYMBOLS (file
, section
->sh_offset
, num_dynamic_syms
);
2888 else if (section
->sh_type
== SHT_STRTAB
2889 && strcmp (name
, ".dynstr") == 0)
2891 if (dynamic_strings
!= NULL
)
2893 error (_("File contains multiple dynamic string tables\n"));
2897 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2898 dynamic_strings
, char *, "dynamic strings");
2900 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
2901 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
2903 && strncmp (name
, ".debug_", 7) == 0)
2908 || (do_debug_info
&& (strcmp (name
, "info") == 0))
2909 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
2910 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
2911 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
2912 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
2913 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
2915 request_dump (i
, DEBUG_DUMP
);
2917 /* linkonce section to be combined with .debug_info at link time. */
2918 else if ((do_debugging
|| do_debug_info
)
2919 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
2920 request_dump (i
, DEBUG_DUMP
);
2921 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
2922 request_dump (i
, DEBUG_DUMP
);
2928 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
2932 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2935 printf (_(" [Nr] Name Type Address Offset\n"));
2936 printf (_(" Size EntSize Flags Link Info Align\n"));
2939 for (i
= 0, section
= section_headers
;
2940 i
< elf_header
.e_shnum
;
2943 printf (" [%2d] %-17.17s %-15.15s ",
2945 SECTION_NAME (section
),
2946 get_section_type_name (section
->sh_type
));
2950 print_vma (section
->sh_addr
, LONG_HEX
);
2952 printf ( " %6.6lx %6.6lx %2.2lx",
2953 (unsigned long) section
->sh_offset
,
2954 (unsigned long) section
->sh_size
,
2955 (unsigned long) section
->sh_entsize
);
2957 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
2959 printf ("%2ld %3lx %2ld\n",
2960 (unsigned long) section
->sh_link
,
2961 (unsigned long) section
->sh_info
,
2962 (unsigned long) section
->sh_addralign
);
2967 print_vma (section
->sh_addr
, LONG_HEX
);
2968 printf (" %8.8lx", section
->sh_offset
);
2970 print_vma (section
->sh_size
, LONG_HEX
);
2972 print_vma (section
->sh_entsize
, LONG_HEX
);
2974 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
2976 printf (" %2ld %3lx %ld\n",
2977 (unsigned long) section
->sh_link
,
2978 (unsigned long) section
->sh_info
,
2979 (unsigned long) section
->sh_addralign
);
2983 printf (_("Key to Flags:\n"));
2984 printf (_(" W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2985 printf (_(" I (info), L (link order), G (group), x (unknown)\n"));
2986 printf (_(" O (extra OS processing required) o (OS specific), p (processor specific)\n"));
2991 /* Process the reloc section. */
2993 process_relocs (file
)
2996 unsigned long rel_size
;
2997 unsigned long rel_offset
;
3003 if (do_using_dynamic
)
3005 int is_rela
= FALSE
;
3010 if (dynamic_info
[DT_REL
])
3012 rel_offset
= dynamic_info
[DT_REL
];
3013 rel_size
= dynamic_info
[DT_RELSZ
];
3016 else if (dynamic_info
[DT_RELA
])
3018 rel_offset
= dynamic_info
[DT_RELA
];
3019 rel_size
= dynamic_info
[DT_RELASZ
];
3022 else if (dynamic_info
[DT_JMPREL
])
3024 rel_offset
= dynamic_info
[DT_JMPREL
];
3025 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3027 switch (dynamic_info
[DT_PLTREL
])
3044 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3045 rel_offset
, rel_size
);
3047 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3048 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
3051 printf (_("\nThere are no dynamic relocations in this file.\n"));
3055 Elf32_Internal_Shdr
* section
;
3059 for (i
= 0, section
= section_headers
;
3060 i
< elf_header
.e_shnum
;
3063 if ( section
->sh_type
!= SHT_RELA
3064 && section
->sh_type
!= SHT_REL
)
3067 rel_offset
= section
->sh_offset
;
3068 rel_size
= section
->sh_size
;
3072 Elf32_Internal_Shdr
* strsec
;
3073 Elf_Internal_Sym
* symtab
;
3076 unsigned long nsyms
;
3078 printf (_("\nRelocation section "));
3080 if (string_table
== NULL
)
3081 printf ("%d", section
->sh_name
);
3083 printf ("'%s'", SECTION_NAME (section
));
3085 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3086 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3091 if (section
->sh_link
)
3093 Elf32_Internal_Shdr
* symsec
;
3095 symsec
= section_headers
+ section
->sh_link
;
3096 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3097 symtab
= GET_ELF_SYMBOLS (file
, symsec
->sh_offset
, nsyms
);
3102 strsec
= section_headers
+ symsec
->sh_link
;
3104 GET_DATA_ALLOC (strsec
->sh_offset
, strsec
->sh_size
, strtab
,
3105 char *, "string table");
3107 is_rela
= section
->sh_type
== SHT_RELA
;
3109 dump_relocations (file
, rel_offset
, rel_size
,
3110 symtab
, nsyms
, strtab
, is_rela
);
3122 printf (_("\nThere are no relocations in this file.\n"));
3128 #include "unwind-ia64.h"
3130 /* An absolute address consists of a section and an offset. If the
3131 section is NULL, the offset itself is the address, otherwise, the
3132 address equals to LOAD_ADDRESS(section) + offset. */
3136 unsigned short section
;
3142 struct unw_table_entry
3144 struct absaddr start
;
3146 struct absaddr info
;
3148 *table
; /* Unwind table. */
3149 unsigned long table_len
; /* Length of unwind table. */
3150 unsigned char * info
; /* Unwind info. */
3151 unsigned long info_size
; /* Size of unwind info. */
3152 bfd_vma info_addr
; /* starting address of unwind info. */
3153 bfd_vma seg_base
; /* Starting address of segment. */
3154 Elf_Internal_Sym
* symtab
; /* The symbol table. */
3155 unsigned long nsyms
; /* Number of symbols. */
3156 char * strtab
; /* The string table. */
3157 unsigned long strtab_size
; /* Size of string table. */
3160 static void find_symbol_for_address
PARAMS ((struct unw_aux_info
*,
3161 struct absaddr
, const char **,
3163 static void dump_ia64_unwind
PARAMS ((struct unw_aux_info
*));
3164 static int slurp_ia64_unwind_table
PARAMS ((FILE *, struct unw_aux_info
*,
3165 Elf32_Internal_Shdr
*));
3168 find_symbol_for_address (aux
, addr
, symname
, offset
)
3169 struct unw_aux_info
*aux
;
3170 struct absaddr addr
;
3171 const char **symname
;
3174 bfd_vma dist
= (bfd_vma
) 0x100000;
3175 Elf_Internal_Sym
*sym
, *best
= NULL
;
3178 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3180 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3181 && sym
->st_name
!= 0
3182 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3183 && addr
.offset
>= sym
->st_value
3184 && addr
.offset
- sym
->st_value
< dist
)
3187 dist
= addr
.offset
- sym
->st_value
;
3194 *symname
= (best
->st_name
>= aux
->strtab_size
3195 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3200 *offset
= addr
.offset
;
3204 dump_ia64_unwind (aux
)
3205 struct unw_aux_info
*aux
;
3208 struct unw_table_entry
* tp
;
3211 addr_size
= is_32bit_elf
? 4 : 8;
3213 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3217 const unsigned char * dp
;
3218 const unsigned char * head
;
3219 const char * procname
;
3221 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3223 fputs ("\n<", stdout
);
3227 fputs (procname
, stdout
);
3230 printf ("+%lx", (unsigned long) offset
);
3233 fputs (">: [", stdout
);
3234 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3235 fputc ('-', stdout
);
3236 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3237 printf ("), info at +0x%lx\n",
3238 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3240 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3241 stamp
= BYTE_GET8 ((unsigned char *) head
);
3243 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3244 (unsigned) UNW_VER (stamp
),
3245 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3246 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3247 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3248 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3250 if (UNW_VER (stamp
) != 1)
3252 printf ("\tUnknown version.\n");
3257 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3258 dp
= unw_decode (dp
, in_body
, & in_body
);
3263 slurp_ia64_unwind_table (file
, aux
, sec
)
3265 struct unw_aux_info
*aux
;
3266 Elf32_Internal_Shdr
*sec
;
3268 unsigned long size
, addr_size
, nrelas
, i
;
3269 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
3270 struct unw_table_entry
*tep
;
3271 Elf32_Internal_Shdr
*relsec
;
3272 Elf_Internal_Rela
*rela
, *rp
;
3273 unsigned char *table
, *tp
;
3274 Elf_Internal_Sym
*sym
;
3275 const char *relname
;
3278 addr_size
= is_32bit_elf
? 4 : 8;
3280 /* First, find the starting address of the segment that includes
3283 if (elf_header
.e_phnum
)
3285 prog_hdrs
= (Elf_Internal_Phdr
*)
3286 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3289 result
= get_32bit_program_headers (file
, prog_hdrs
);
3291 result
= get_64bit_program_headers (file
, prog_hdrs
);
3299 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
3301 if (seg
->p_type
!= PT_LOAD
)
3304 if (sec
->sh_addr
>= seg
->p_vaddr
3305 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3307 aux
->seg_base
= seg
->p_vaddr
;
3315 /* Second, build the unwind table from the contents of the unwind section: */
3316 size
= sec
->sh_size
;
3317 GET_DATA_ALLOC (sec
->sh_offset
, size
, table
, char *, "unwind table");
3319 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3320 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++ tep
)
3322 tep
->start
.section
= SHN_UNDEF
;
3323 tep
->end
.section
= SHN_UNDEF
;
3324 tep
->info
.section
= SHN_UNDEF
;
3327 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3328 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3329 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3333 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3334 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3335 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3337 tep
->start
.offset
+= aux
->seg_base
;
3338 tep
->end
.offset
+= aux
->seg_base
;
3339 tep
->info
.offset
+= aux
->seg_base
;
3343 /* Third, apply any relocations to the unwind table: */
3345 for (relsec
= section_headers
;
3346 relsec
< section_headers
+ elf_header
.e_shnum
;
3349 if (relsec
->sh_type
!= SHT_RELA
3350 || section_headers
+ relsec
->sh_info
!= sec
)
3353 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
3357 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
3361 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
3362 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
3364 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3366 warn (_("Skipping unexpected symbol type %u"),
3367 ELF32_ST_TYPE (sym
->st_info
));
3373 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
3374 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
3376 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3378 warn (_("Skipping unexpected symbol type %u"),
3379 ELF64_ST_TYPE (sym
->st_info
));
3384 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
3386 warn (_("Skipping unexpected relocation type %s"), relname
);
3390 i
= rp
->r_offset
/ (3 * addr_size
);
3392 switch (rp
->r_offset
/addr_size
% 3)
3395 aux
->table
[i
].start
.section
= sym
->st_shndx
;
3396 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
3399 aux
->table
[i
].end
.section
= sym
->st_shndx
;
3400 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
3403 aux
->table
[i
].info
.section
= sym
->st_shndx
;
3404 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
3414 aux
->table_len
= size
/ (3 * addr_size
);
3419 process_unwind (file
)
3422 Elf32_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
3423 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
3424 struct unw_aux_info aux
;
3429 if (elf_header
.e_machine
!= EM_IA_64
)
3431 printf (_("\nThere are no unwind sections in this file.\n"));
3435 memset (& aux
, 0, sizeof (aux
));
3437 addr_size
= is_32bit_elf
? 4 : 8;
3439 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
3441 if (sec
->sh_type
== SHT_SYMTAB
)
3443 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
3444 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
->sh_offset
, aux
.nsyms
);
3446 strsec
= section_headers
+ sec
->sh_link
;
3447 aux
.strtab_size
= strsec
->sh_size
;
3448 GET_DATA_ALLOC (strsec
->sh_offset
, aux
.strtab_size
,
3449 aux
.strtab
, char *, "string table");
3451 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3456 printf (_("\nThere are no unwind sections in this file.\n"));
3458 while (unwcount
-- > 0)
3463 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
3464 i
< elf_header
.e_shnum
; ++i
, ++sec
)
3465 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3472 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
3474 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
3477 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3478 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
3479 suffix
= SECTION_NAME (unwsec
) + len
;
3480 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3482 if (strncmp (SECTION_NAME (sec
),
3483 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
3484 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3489 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3490 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3491 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
3492 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
3494 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
3496 suffix
= SECTION_NAME (unwsec
) + len
;
3497 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3499 if (strncmp (SECTION_NAME (sec
),
3500 ELF_STRING_ia64_unwind_info
, len2
) == 0
3501 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3505 if (i
== elf_header
.e_shnum
)
3507 printf (_("\nCould not find unwind info section for "));
3509 if (string_table
== NULL
)
3510 printf ("%d", unwsec
->sh_name
);
3512 printf ("'%s'", SECTION_NAME (unwsec
));
3516 aux
.info_size
= sec
->sh_size
;
3517 aux
.info_addr
= sec
->sh_addr
;
3518 GET_DATA_ALLOC (sec
->sh_offset
, aux
.info_size
, aux
.info
,
3519 char *, "unwind info");
3521 printf (_("\nUnwind section "));
3523 if (string_table
== NULL
)
3524 printf ("%d", unwsec
->sh_name
);
3526 printf ("'%s'", SECTION_NAME (unwsec
));
3528 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3530 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
3532 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
3534 if (aux
.table_len
> 0)
3535 dump_ia64_unwind (& aux
);
3538 free ((char *) aux
.table
);
3540 free ((char *) aux
.info
);
3549 free ((char *) aux
.strtab
);
3555 dynamic_segment_mips_val (entry
)
3556 Elf_Internal_Dyn
* entry
;
3558 switch (entry
->d_tag
)
3561 if (entry
->d_un
.d_val
== 0)
3565 static const char * opts
[] =
3567 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3568 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3569 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3570 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3575 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
3576 if (entry
->d_un
.d_val
& (1 << cnt
))
3578 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
3585 case DT_MIPS_IVERSION
:
3586 if (dynamic_strings
!= NULL
)
3587 printf ("Interface Version: %s\n",
3588 dynamic_strings
+ entry
->d_un
.d_val
);
3590 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3593 case DT_MIPS_TIME_STAMP
:
3598 time_t time
= entry
->d_un
.d_val
;
3599 tmp
= gmtime (&time
);
3600 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
3601 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
3602 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
3603 printf ("Time Stamp: %s\n", timebuf
);
3607 case DT_MIPS_RLD_VERSION
:
3608 case DT_MIPS_LOCAL_GOTNO
:
3609 case DT_MIPS_CONFLICTNO
:
3610 case DT_MIPS_LIBLISTNO
:
3611 case DT_MIPS_SYMTABNO
:
3612 case DT_MIPS_UNREFEXTNO
:
3613 case DT_MIPS_HIPAGENO
:
3614 case DT_MIPS_DELTA_CLASS_NO
:
3615 case DT_MIPS_DELTA_INSTANCE_NO
:
3616 case DT_MIPS_DELTA_RELOC_NO
:
3617 case DT_MIPS_DELTA_SYM_NO
:
3618 case DT_MIPS_DELTA_CLASSSYM_NO
:
3619 case DT_MIPS_COMPACT_SIZE
:
3620 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3624 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
3630 dynamic_segment_parisc_val (entry
)
3631 Elf_Internal_Dyn
* entry
;
3633 switch (entry
->d_tag
)
3635 case DT_HP_DLD_FLAGS
:
3644 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
3645 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
3646 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
3647 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
3648 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
3649 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
3650 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
3651 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
3652 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
3653 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
3654 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
3658 bfd_vma val
= entry
->d_un
.d_val
;
3660 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
3661 if (val
& flags
[cnt
].bit
)
3665 fputs (flags
[cnt
].str
, stdout
);
3667 val
^= flags
[cnt
].bit
;
3670 if (val
!= 0 || first
)
3674 print_vma (val
, HEX
);
3680 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
3686 get_32bit_dynamic_segment (file
)
3689 Elf32_External_Dyn
* edyn
;
3690 Elf_Internal_Dyn
* entry
;
3693 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
3694 edyn
, Elf32_External_Dyn
*, "dynamic segment");
3696 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3697 how large this .dynamic is now. We can do this even before the byte
3698 swapping since the DT_NULL tag is recognizable. */
3700 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3703 dynamic_segment
= (Elf_Internal_Dyn
*)
3704 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3706 if (dynamic_segment
== NULL
)
3708 error (_("Out of memory\n"));
3713 for (i
= 0, entry
= dynamic_segment
;
3717 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
3718 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
3727 get_64bit_dynamic_segment (file
)
3730 Elf64_External_Dyn
* edyn
;
3731 Elf_Internal_Dyn
* entry
;
3734 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
3735 edyn
, Elf64_External_Dyn
*, "dynamic segment");
3737 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3738 how large this .dynamic is now. We can do this even before the byte
3739 swapping since the DT_NULL tag is recognizable. */
3741 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3744 dynamic_segment
= (Elf_Internal_Dyn
*)
3745 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3747 if (dynamic_segment
== NULL
)
3749 error (_("Out of memory\n"));
3754 for (i
= 0, entry
= dynamic_segment
;
3758 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
3759 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
3768 get_dynamic_flags (flags
)
3771 static char buff
[64];
3776 flag
= flags
& - flags
;
3781 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
3782 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
3783 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
3784 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
3785 default: strcat (buff
, "unknown "); break;
3791 /* Parse and display the contents of the dynamic segment. */
3793 process_dynamic_segment (file
)
3796 Elf_Internal_Dyn
* entry
;
3799 if (dynamic_size
== 0)
3802 printf (_("\nThere is no dynamic segment in this file.\n"));
3809 if (! get_32bit_dynamic_segment (file
))
3812 else if (! get_64bit_dynamic_segment (file
))
3815 /* Find the appropriate symbol table. */
3816 if (dynamic_symbols
== NULL
)
3818 for (i
= 0, entry
= dynamic_segment
;
3822 unsigned long offset
;
3824 if (entry
->d_tag
!= DT_SYMTAB
)
3827 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
3829 /* Since we do not know how big the symbol table is,
3830 we default to reading in the entire file (!) and
3831 processing that. This is overkill, I know, but it
3833 offset
= entry
->d_un
.d_val
- loadaddr
;
3835 if (fseek (file
, 0, SEEK_END
))
3836 error (_("Unable to seek to end of file!"));
3839 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf32_External_Sym
);
3841 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf64_External_Sym
);
3843 if (num_dynamic_syms
< 1)
3845 error (_("Unable to determine the number of symbols to load\n"));
3849 dynamic_symbols
= GET_ELF_SYMBOLS (file
, offset
, num_dynamic_syms
);
3853 /* Similarly find a string table. */
3854 if (dynamic_strings
== NULL
)
3856 for (i
= 0, entry
= dynamic_segment
;
3860 unsigned long offset
;
3863 if (entry
->d_tag
!= DT_STRTAB
)
3866 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
3868 /* Since we do not know how big the string table is,
3869 we default to reading in the entire file (!) and
3870 processing that. This is overkill, I know, but it
3873 offset
= entry
->d_un
.d_val
- loadaddr
;
3874 if (fseek (file
, 0, SEEK_END
))
3875 error (_("Unable to seek to end of file\n"));
3876 str_tab_len
= ftell (file
) - offset
;
3878 if (str_tab_len
< 1)
3881 (_("Unable to determine the length of the dynamic string table\n"));
3885 GET_DATA_ALLOC (offset
, str_tab_len
, dynamic_strings
, char *,
3886 "dynamic string table");
3892 /* And find the syminfo section if available. */
3893 if (dynamic_syminfo
== NULL
)
3895 unsigned int syminsz
= 0;
3897 for (i
= 0, entry
= dynamic_segment
;
3901 if (entry
->d_tag
== DT_SYMINENT
)
3903 /* Note: these braces are necessary to avoid a syntax
3904 error from the SunOS4 C compiler. */
3905 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
3907 else if (entry
->d_tag
== DT_SYMINSZ
)
3908 syminsz
= entry
->d_un
.d_val
;
3909 else if (entry
->d_tag
== DT_SYMINFO
)
3910 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
3913 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
3915 Elf_External_Syminfo
* extsyminfo
;
3916 Elf_Internal_Syminfo
* syminfo
;
3918 /* There is a syminfo section. Read the data. */
3919 GET_DATA_ALLOC (dynamic_syminfo_offset
, syminsz
, extsyminfo
,
3920 Elf_External_Syminfo
*, "symbol information");
3922 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
3923 if (dynamic_syminfo
== NULL
)
3925 error (_("Out of memory\n"));
3929 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
3930 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
3933 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
3934 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
3941 if (do_dynamic
&& dynamic_addr
)
3942 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3943 dynamic_addr
, (long) dynamic_size
);
3945 printf (_(" Tag Type Name/Value\n"));
3947 for (i
= 0, entry
= dynamic_segment
;
3956 print_vma (entry
->d_tag
, FULL_HEX
);
3957 dtype
= get_dynamic_type (entry
->d_tag
);
3958 printf (" (%s)%*s", dtype
,
3959 ((is_32bit_elf
? 27 : 19)
3960 - (int) strlen (dtype
)),
3964 switch (entry
->d_tag
)
3968 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
3978 switch (entry
->d_tag
)
3981 printf (_("Auxiliary library"));
3985 printf (_("Filter library"));
3989 printf (_("Configuration file"));
3993 printf (_("Dependency audit library"));
3997 printf (_("Audit library"));
4001 if (dynamic_strings
)
4002 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4006 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4015 printf (_("Flags:"));
4016 if (entry
->d_un
.d_val
== 0)
4017 printf (_(" None\n"));
4020 unsigned long int val
= entry
->d_un
.d_val
;
4021 if (val
& DTF_1_PARINIT
)
4023 printf (" PARINIT");
4024 val
^= DTF_1_PARINIT
;
4026 if (val
& DTF_1_CONFEXP
)
4028 printf (" CONFEXP");
4029 val
^= DTF_1_CONFEXP
;
4032 printf (" %lx", val
);
4041 printf (_("Flags:"));
4042 if (entry
->d_un
.d_val
== 0)
4043 printf (_(" None\n"));
4046 unsigned long int val
= entry
->d_un
.d_val
;
4047 if (val
& DF_P1_LAZYLOAD
)
4049 printf (" LAZYLOAD");
4050 val
^= DF_P1_LAZYLOAD
;
4052 if (val
& DF_P1_GROUPPERM
)
4054 printf (" GROUPPERM");
4055 val
^= DF_P1_GROUPPERM
;
4058 printf (" %lx", val
);
4067 printf (_("Flags:"));
4068 if (entry
->d_un
.d_val
== 0)
4069 printf (_(" None\n"));
4072 unsigned long int val
= entry
->d_un
.d_val
;
4078 if (val
& DF_1_GLOBAL
)
4083 if (val
& DF_1_GROUP
)
4088 if (val
& DF_1_NODELETE
)
4090 printf (" NODELETE");
4091 val
^= DF_1_NODELETE
;
4093 if (val
& DF_1_LOADFLTR
)
4095 printf (" LOADFLTR");
4096 val
^= DF_1_LOADFLTR
;
4098 if (val
& DF_1_INITFIRST
)
4100 printf (" INITFIRST");
4101 val
^= DF_1_INITFIRST
;
4103 if (val
& DF_1_NOOPEN
)
4108 if (val
& DF_1_ORIGIN
)
4113 if (val
& DF_1_DIRECT
)
4118 if (val
& DF_1_TRANS
)
4123 if (val
& DF_1_INTERPOSE
)
4125 printf (" INTERPOSE");
4126 val
^= DF_1_INTERPOSE
;
4128 if (val
& DF_1_NODEFLIB
)
4130 printf (" NODEFLIB");
4131 val
^= DF_1_NODEFLIB
;
4133 if (val
& DF_1_NODUMP
)
4138 if (val
& DF_1_CONLFAT
)
4140 printf (" CONLFAT");
4141 val
^= DF_1_CONLFAT
;
4144 printf (" %lx", val
);
4152 puts (get_dynamic_type (entry
->d_un
.d_val
));
4172 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4178 if (dynamic_strings
== NULL
)
4181 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4185 switch (entry
->d_tag
)
4188 printf (_("Shared library: [%s]"), name
);
4190 if (strcmp (name
, program_interpreter
) == 0)
4191 printf (_(" program interpreter"));
4195 printf (_("Library soname: [%s]"), name
);
4199 printf (_("Library rpath: [%s]"), name
);
4203 printf (_("Library runpath: [%s]"), name
);
4207 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4212 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4228 case DT_INIT_ARRAYSZ
:
4229 case DT_FINI_ARRAYSZ
:
4232 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4233 printf (" (bytes)\n");
4243 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4256 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4260 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4264 printf (_("Not needed object: [%s]\n"), name
);
4269 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4275 /* The value of this entry is ignored. */
4279 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
4280 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
4285 switch (elf_header
.e_machine
)
4288 case EM_MIPS_RS3_LE
:
4289 dynamic_segment_mips_val (entry
);
4292 dynamic_segment_parisc_val (entry
);
4295 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4307 get_ver_flags (flags
)
4310 static char buff
[32];
4317 if (flags
& VER_FLG_BASE
)
4318 strcat (buff
, "BASE ");
4320 if (flags
& VER_FLG_WEAK
)
4322 if (flags
& VER_FLG_BASE
)
4323 strcat (buff
, "| ");
4325 strcat (buff
, "WEAK ");
4328 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
4329 strcat (buff
, "| <unknown>");
4334 /* Display the contents of the version sections. */
4336 process_version_sections (file
)
4339 Elf32_Internal_Shdr
* section
;
4346 for (i
= 0, section
= section_headers
;
4347 i
< elf_header
.e_shnum
;
4350 switch (section
->sh_type
)
4352 case SHT_GNU_verdef
:
4354 Elf_External_Verdef
* edefs
;
4361 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4362 SECTION_NAME (section
), section
->sh_info
);
4364 printf (_(" Addr: 0x"));
4365 printf_vma (section
->sh_addr
);
4366 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4367 (unsigned long) section
->sh_offset
, section
->sh_link
,
4368 SECTION_NAME (section_headers
+ section
->sh_link
));
4370 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
4371 edefs
, Elf_External_Verdef
*,
4372 "version definition section");
4374 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
4377 Elf_External_Verdef
* edef
;
4378 Elf_Internal_Verdef ent
;
4379 Elf_External_Verdaux
* eaux
;
4380 Elf_Internal_Verdaux aux
;
4384 vstart
= ((char *) edefs
) + idx
;
4386 edef
= (Elf_External_Verdef
*) vstart
;
4388 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
4389 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
4390 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
4391 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
4392 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
4393 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
4394 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
4396 printf (_(" %#06x: Rev: %d Flags: %s"),
4397 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
4399 printf (_(" Index: %d Cnt: %d "),
4400 ent
.vd_ndx
, ent
.vd_cnt
);
4402 vstart
+= ent
.vd_aux
;
4404 eaux
= (Elf_External_Verdaux
*) vstart
;
4406 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4407 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4409 if (dynamic_strings
)
4410 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
4412 printf (_("Name index: %ld\n"), aux
.vda_name
);
4414 isum
= idx
+ ent
.vd_aux
;
4416 for (j
= 1; j
< ent
.vd_cnt
; j
++)
4418 isum
+= aux
.vda_next
;
4419 vstart
+= aux
.vda_next
;
4421 eaux
= (Elf_External_Verdaux
*) vstart
;
4423 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4424 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4426 if (dynamic_strings
)
4427 printf (_(" %#06x: Parent %d: %s\n"),
4428 isum
, j
, dynamic_strings
+ aux
.vda_name
);
4430 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4431 isum
, j
, aux
.vda_name
);
4441 case SHT_GNU_verneed
:
4443 Elf_External_Verneed
* eneed
;
4449 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4450 SECTION_NAME (section
), section
->sh_info
);
4452 printf (_(" Addr: 0x"));
4453 printf_vma (section
->sh_addr
);
4454 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4455 (unsigned long) section
->sh_offset
, section
->sh_link
,
4456 SECTION_NAME (section_headers
+ section
->sh_link
));
4458 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
4459 eneed
, Elf_External_Verneed
*,
4460 "version need section");
4462 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
4464 Elf_External_Verneed
* entry
;
4465 Elf_Internal_Verneed ent
;
4470 vstart
= ((char *) eneed
) + idx
;
4472 entry
= (Elf_External_Verneed
*) vstart
;
4474 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
4475 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
4476 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
4477 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
4478 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
4480 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
4482 if (dynamic_strings
)
4483 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
4485 printf (_(" File: %lx"), ent
.vn_file
);
4487 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
4489 vstart
+= ent
.vn_aux
;
4491 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
4493 Elf_External_Vernaux
* eaux
;
4494 Elf_Internal_Vernaux aux
;
4496 eaux
= (Elf_External_Vernaux
*) vstart
;
4498 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
4499 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
4500 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
4501 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
4502 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
4504 if (dynamic_strings
)
4505 printf (_(" %#06x: Name: %s"),
4506 isum
, dynamic_strings
+ aux
.vna_name
);
4508 printf (_(" %#06x: Name index: %lx"),
4509 isum
, aux
.vna_name
);
4511 printf (_(" Flags: %s Version: %d\n"),
4512 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
4514 isum
+= aux
.vna_next
;
4515 vstart
+= aux
.vna_next
;
4525 case SHT_GNU_versym
:
4527 Elf32_Internal_Shdr
* link_section
;
4530 unsigned char * edata
;
4531 unsigned short * data
;
4533 Elf_Internal_Sym
* symbols
;
4534 Elf32_Internal_Shdr
* string_sec
;
4536 link_section
= section_headers
+ section
->sh_link
;
4537 total
= section
->sh_size
/ section
->sh_entsize
;
4541 symbols
= GET_ELF_SYMBOLS (file
, link_section
->sh_offset
,
4542 link_section
->sh_size
/ link_section
->sh_entsize
);
4544 string_sec
= section_headers
+ link_section
->sh_link
;
4546 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
4547 strtab
, char *, "version string table");
4549 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4550 SECTION_NAME (section
), total
);
4552 printf (_(" Addr: "));
4553 printf_vma (section
->sh_addr
);
4554 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4555 (unsigned long) section
->sh_offset
, section
->sh_link
,
4556 SECTION_NAME (link_section
));
4558 GET_DATA_ALLOC (version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
4560 total
* sizeof (short), edata
,
4561 unsigned char *, "version symbol data");
4563 data
= (unsigned short *) malloc (total
* sizeof (short));
4565 for (cnt
= total
; cnt
--;)
4566 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
4571 for (cnt
= 0; cnt
< total
; cnt
+= 4)
4574 int check_def
, check_need
;
4577 printf (" %03x:", cnt
);
4579 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
4580 switch (data
[cnt
+ j
])
4583 fputs (_(" 0 (*local*) "), stdout
);
4587 fputs (_(" 1 (*global*) "), stdout
);
4591 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
4592 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
4596 if (symbols
[cnt
+ j
].st_shndx
>= SHN_LORESERVE
4597 || section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
4600 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
4607 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
4609 Elf_Internal_Verneed ivn
;
4610 unsigned long offset
;
4612 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
4617 Elf_Internal_Vernaux ivna
;
4618 Elf_External_Verneed evn
;
4619 Elf_External_Vernaux evna
;
4620 unsigned long a_off
;
4622 GET_DATA (offset
, evn
, "version need");
4624 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4625 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4627 a_off
= offset
+ ivn
.vn_aux
;
4631 GET_DATA (a_off
, evna
,
4632 "version need aux (2)");
4634 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4635 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4637 a_off
+= ivna
.vna_next
;
4639 while (ivna
.vna_other
!= data
[cnt
+ j
]
4640 && ivna
.vna_next
!= 0);
4642 if (ivna
.vna_other
== data
[cnt
+ j
])
4644 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4646 name
= strtab
+ ivna
.vna_name
;
4647 nn
+= printf ("(%s%-*s",
4649 12 - (int) strlen (name
),
4655 offset
+= ivn
.vn_next
;
4657 while (ivn
.vn_next
);
4660 if (check_def
&& data
[cnt
+ j
] != 0x8001
4661 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
4663 Elf_Internal_Verdef ivd
;
4664 Elf_External_Verdef evd
;
4665 unsigned long offset
;
4667 offset
= version_info
4668 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
4672 GET_DATA (offset
, evd
, "version def");
4674 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
4675 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
4677 offset
+= ivd
.vd_next
;
4679 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
4680 && ivd
.vd_next
!= 0);
4682 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
4684 Elf_External_Verdaux evda
;
4685 Elf_Internal_Verdaux ivda
;
4687 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
4689 GET_DATA (offset
- ivd
.vd_next
+ ivd
.vd_aux
,
4690 evda
, "version def aux");
4692 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
4694 name
= strtab
+ ivda
.vda_name
;
4695 nn
+= printf ("(%s%-*s",
4697 12 - (int) strlen (name
),
4703 printf ("%*c", 18 - nn
, ' ');
4721 printf (_("\nNo version information found in this file.\n"));
4727 get_symbol_binding (binding
)
4728 unsigned int binding
;
4730 static char buff
[32];
4734 case STB_LOCAL
: return "LOCAL";
4735 case STB_GLOBAL
: return "GLOBAL";
4736 case STB_WEAK
: return "WEAK";
4738 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
4739 sprintf (buff
, _("<processor specific>: %d"), binding
);
4740 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
4741 sprintf (buff
, _("<OS specific>: %d"), binding
);
4743 sprintf (buff
, _("<unknown>: %d"), binding
);
4749 get_symbol_type (type
)
4752 static char buff
[32];
4756 case STT_NOTYPE
: return "NOTYPE";
4757 case STT_OBJECT
: return "OBJECT";
4758 case STT_FUNC
: return "FUNC";
4759 case STT_SECTION
: return "SECTION";
4760 case STT_FILE
: return "FILE";
4761 case STT_COMMON
: return "COMMON";
4763 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
4765 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
4766 return "THUMB_FUNC";
4768 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
4771 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
4772 return "PARISC_MILLI";
4774 sprintf (buff
, _("<processor specific>: %d"), type
);
4776 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
4778 if (elf_header
.e_machine
== EM_PARISC
)
4780 if (type
== STT_HP_OPAQUE
)
4782 if (type
== STT_HP_STUB
)
4786 sprintf (buff
, _("<OS specific>: %d"), type
);
4789 sprintf (buff
, _("<unknown>: %d"), type
);
4795 get_symbol_visibility (visibility
)
4796 unsigned int visibility
;
4800 case STV_DEFAULT
: return "DEFAULT";
4801 case STV_INTERNAL
: return "INTERNAL";
4802 case STV_HIDDEN
: return "HIDDEN";
4803 case STV_PROTECTED
: return "PROTECTED";
4809 get_symbol_index_type (type
)
4814 case SHN_UNDEF
: return "UND";
4815 case SHN_ABS
: return "ABS";
4816 case SHN_COMMON
: return "COM";
4818 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
4820 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
4822 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
4826 static char buff
[32];
4828 sprintf (buff
, "%3d", type
);
4835 get_dynamic_data (file
, number
)
4837 unsigned int number
;
4839 unsigned char * e_data
;
4842 e_data
= (unsigned char *) malloc (number
* 4);
4846 error (_("Out of memory\n"));
4850 if (fread (e_data
, 4, number
, file
) != number
)
4852 error (_("Unable to read in dynamic data\n"));
4856 i_data
= (int *) malloc (number
* sizeof (* i_data
));
4860 error (_("Out of memory\n"));
4866 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
4873 /* Dump the symbol table */
4875 process_symbol_table (file
)
4878 Elf32_Internal_Shdr
* section
;
4879 unsigned char nb
[4];
4880 unsigned char nc
[4];
4883 int * buckets
= NULL
;
4884 int * chains
= NULL
;
4886 if (! do_syms
&& !do_histogram
)
4889 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
4892 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
4894 error (_("Unable to seek to start of dynamic information"));
4898 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
4900 error (_("Failed to read in number of buckets\n"));
4904 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
4906 error (_("Failed to read in number of chains\n"));
4910 nbuckets
= byte_get (nb
, 4);
4911 nchains
= byte_get (nc
, 4);
4913 buckets
= get_dynamic_data (file
, nbuckets
);
4914 chains
= get_dynamic_data (file
, nchains
);
4916 if (buckets
== NULL
|| chains
== NULL
)
4921 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
4926 printf (_("\nSymbol table for image:\n"));
4928 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4930 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4932 for (hn
= 0; hn
< nbuckets
; hn
++)
4937 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
4939 Elf_Internal_Sym
* psym
;
4941 psym
= dynamic_symbols
+ si
;
4943 printf (" %3d %3d: ", si
, hn
);
4944 print_vma (psym
->st_value
, LONG_HEX
);
4946 print_vma (psym
->st_size
, DEC_5
);
4948 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
4949 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
4950 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
4951 printf (" %3.3s", get_symbol_index_type (psym
->st_shndx
));
4952 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
4956 else if (do_syms
&& !do_using_dynamic
)
4960 for (i
= 0, section
= section_headers
;
4961 i
< elf_header
.e_shnum
;
4966 Elf_Internal_Sym
* symtab
;
4967 Elf_Internal_Sym
* psym
;
4970 if ( section
->sh_type
!= SHT_SYMTAB
4971 && section
->sh_type
!= SHT_DYNSYM
)
4974 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4975 SECTION_NAME (section
),
4976 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
4978 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4980 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4982 symtab
= GET_ELF_SYMBOLS (file
, section
->sh_offset
,
4983 section
->sh_size
/ section
->sh_entsize
);
4987 if (section
->sh_link
== elf_header
.e_shstrndx
)
4988 strtab
= string_table
;
4991 Elf32_Internal_Shdr
* string_sec
;
4993 string_sec
= section_headers
+ section
->sh_link
;
4995 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
4996 strtab
, char *, "string table");
4999 for (si
= 0, psym
= symtab
;
5000 si
< section
->sh_size
/ section
->sh_entsize
;
5003 printf ("%6d: ", si
);
5004 print_vma (psym
->st_value
, LONG_HEX
);
5006 print_vma (psym
->st_size
, DEC_5
);
5007 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5008 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5009 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5010 printf (" %4s", get_symbol_index_type (psym
->st_shndx
));
5011 printf (" %s", strtab
+ psym
->st_name
);
5013 if (section
->sh_type
== SHT_DYNSYM
&&
5014 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5016 unsigned char data
[2];
5017 unsigned short vers_data
;
5018 unsigned long offset
;
5022 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5025 GET_DATA (offset
+ si
* sizeof (vers_data
), data
,
5028 vers_data
= byte_get (data
, 2);
5030 is_nobits
= psym
->st_shndx
< SHN_LORESERVE
?
5031 (section_headers
[psym
->st_shndx
].sh_type
== SHT_NOBITS
)
5034 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5036 if ((vers_data
& 0x8000) || vers_data
> 1)
5038 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5039 && (is_nobits
|| ! check_def
))
5041 Elf_External_Verneed evn
;
5042 Elf_Internal_Verneed ivn
;
5043 Elf_Internal_Vernaux ivna
;
5045 /* We must test both. */
5046 offset
= version_info
5047 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
5051 unsigned long vna_off
;
5053 GET_DATA (offset
, evn
, "version need");
5055 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5056 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5058 vna_off
= offset
+ ivn
.vn_aux
;
5062 Elf_External_Vernaux evna
;
5064 GET_DATA (vna_off
, evna
,
5065 "version need aux (3)");
5067 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5068 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5069 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5071 vna_off
+= ivna
.vna_next
;
5073 while (ivna
.vna_other
!= vers_data
5074 && ivna
.vna_next
!= 0);
5076 if (ivna
.vna_other
== vers_data
)
5079 offset
+= ivn
.vn_next
;
5081 while (ivn
.vn_next
!= 0);
5083 if (ivna
.vna_other
== vers_data
)
5086 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5089 else if (! is_nobits
)
5090 error (_("bad dynamic symbol"));
5097 if (vers_data
!= 0x8001
5098 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5100 Elf_Internal_Verdef ivd
;
5101 Elf_Internal_Verdaux ivda
;
5102 Elf_External_Verdaux evda
;
5103 unsigned long offset
;
5106 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5111 Elf_External_Verdef evd
;
5113 GET_DATA (offset
, evd
, "version def");
5115 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5116 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5117 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5119 offset
+= ivd
.vd_next
;
5121 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5122 && ivd
.vd_next
!= 0);
5124 offset
-= ivd
.vd_next
;
5125 offset
+= ivd
.vd_aux
;
5127 GET_DATA (offset
, evda
, "version def aux");
5129 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5131 if (psym
->st_name
!= ivda
.vda_name
)
5132 printf ((vers_data
& 0x8000)
5134 strtab
+ ivda
.vda_name
);
5144 if (strtab
!= string_table
)
5150 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5152 if (do_histogram
&& buckets
!= NULL
)
5159 int nzero_counts
= 0;
5162 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5164 printf (_(" Length Number %% of total Coverage\n"));
5166 lengths
= (int *) calloc (nbuckets
, sizeof (int));
5167 if (lengths
== NULL
)
5169 error (_("Out of memory"));
5172 for (hn
= 0; hn
< nbuckets
; ++hn
)
5177 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5180 if (maxlength
< ++lengths
[hn
])
5185 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
5188 error (_("Out of memory"));
5192 for (hn
= 0; hn
< nbuckets
; ++hn
)
5193 ++ counts
[lengths
[hn
]];
5197 printf (" 0 %-10d (%5.1f%%)\n",
5198 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5199 for (si
= 1; si
<= maxlength
; ++si
)
5201 nzero_counts
+= counts
[si
] * si
;
5202 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5203 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5204 (nzero_counts
* 100.0) / nsyms
);
5212 if (buckets
!= NULL
)
5222 process_syminfo (file
)
5223 FILE * file ATTRIBUTE_UNUSED
;
5227 if (dynamic_syminfo
== NULL
5229 /* No syminfo, this is ok. */
5232 /* There better should be a dynamic symbol section. */
5233 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5237 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5238 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5240 printf (_(" Num: Name BoundTo Flags\n"));
5241 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5243 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5245 printf ("%4d: %-30s ", i
,
5246 dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5248 switch (dynamic_syminfo
[i
].si_boundto
)
5250 case SYMINFO_BT_SELF
:
5251 fputs ("SELF ", stdout
);
5253 case SYMINFO_BT_PARENT
:
5254 fputs ("PARENT ", stdout
);
5257 if (dynamic_syminfo
[i
].si_boundto
> 0
5258 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
5261 + dynamic_segment
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
5263 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
5267 if (flags
& SYMINFO_FLG_DIRECT
)
5269 if (flags
& SYMINFO_FLG_PASSTHRU
)
5270 printf (" PASSTHRU");
5271 if (flags
& SYMINFO_FLG_COPY
)
5273 if (flags
& SYMINFO_FLG_LAZYLOAD
)
5274 printf (" LAZYLOAD");
5282 #ifdef SUPPORT_DISASSEMBLY
5284 disassemble_section (section
, file
)
5285 Elf32_Internal_Shdr
* section
;
5288 printf (_("\nAssembly dump of section %s\n"),
5289 SECTION_NAME (section
));
5291 /* XXX -- to be done --- XXX */
5298 dump_section (section
, file
)
5299 Elf32_Internal_Shdr
* section
;
5302 bfd_size_type bytes
;
5304 unsigned char * data
;
5305 unsigned char * start
;
5307 bytes
= section
->sh_size
;
5311 printf (_("\nSection '%s' has no data to dump.\n"),
5312 SECTION_NAME (section
));
5316 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
5318 addr
= section
->sh_addr
;
5320 GET_DATA_ALLOC (section
->sh_offset
, bytes
, start
, unsigned char *,
5331 lbytes
= (bytes
> 16 ? 16 : bytes
);
5333 printf (" 0x%8.8lx ", (unsigned long) addr
);
5335 switch (elf_header
.e_ident
[EI_DATA
])
5339 for (j
= 15; j
>= 0; j
--)
5342 printf ("%2.2x", data
[j
]);
5352 for (j
= 0; j
< 16; j
++)
5355 printf ("%2.2x", data
[j
]);
5365 for (j
= 0; j
< lbytes
; j
++)
5368 if (k
>= ' ' && k
< 0x80)
5387 static unsigned long int
5388 read_leb128 (data
, length_return
, sign
)
5389 unsigned char * data
;
5390 int * length_return
;
5393 unsigned long int result
= 0;
5394 unsigned int num_read
= 0;
5403 result
|= (byte
& 0x7f) << shift
;
5408 while (byte
& 0x80);
5410 if (length_return
!= NULL
)
5411 * length_return
= num_read
;
5413 if (sign
&& (shift
< 32) && (byte
& 0x40))
5414 result
|= -1 << shift
;
5419 typedef struct State_Machine_Registers
5421 unsigned long address
;
5424 unsigned int column
;
5428 /* This variable hold the number of the last entry seen
5429 in the File Table. */
5430 unsigned int last_file_entry
;
5433 static SMR state_machine_regs
;
5436 reset_state_machine (is_stmt
)
5439 state_machine_regs
.address
= 0;
5440 state_machine_regs
.file
= 1;
5441 state_machine_regs
.line
= 1;
5442 state_machine_regs
.column
= 0;
5443 state_machine_regs
.is_stmt
= is_stmt
;
5444 state_machine_regs
.basic_block
= 0;
5445 state_machine_regs
.end_sequence
= 0;
5446 state_machine_regs
.last_file_entry
= 0;
5449 /* Handled an extend line op. Returns true if this is the end
5452 process_extended_line_op (data
, is_stmt
, pointer_size
)
5453 unsigned char * data
;
5457 unsigned char op_code
;
5460 unsigned char * name
;
5463 len
= read_leb128 (data
, & bytes_read
, 0);
5468 warn (_("badly formed extended line op encountered!"));
5473 op_code
= * data
++;
5475 printf (_(" Extended opcode %d: "), op_code
);
5479 case DW_LNE_end_sequence
:
5480 printf (_("End of Sequence\n\n"));
5481 reset_state_machine (is_stmt
);
5484 case DW_LNE_set_address
:
5485 adr
= byte_get (data
, pointer_size
);
5486 printf (_("set Address to 0x%lx\n"), adr
);
5487 state_machine_regs
.address
= adr
;
5490 case DW_LNE_define_file
:
5491 printf (_(" define new File Table entry\n"));
5492 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5494 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5496 data
+= strlen ((char *) data
) + 1;
5497 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5499 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5501 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5502 printf (_("%s\n\n"), name
);
5506 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
5513 /* Size of pointers in the .debug_line section. This information is not
5514 really present in that section. It's obtained before dumping the debug
5515 sections by doing some pre-scan of the .debug_info section. */
5516 static int debug_line_pointer_size
= 4;
5519 display_debug_lines (section
, start
, file
)
5520 Elf32_Internal_Shdr
* section
;
5521 unsigned char * start
;
5522 FILE * file ATTRIBUTE_UNUSED
;
5524 DWARF2_External_LineInfo
* external
;
5525 DWARF2_Internal_LineInfo info
;
5526 unsigned char * standard_opcodes
;
5527 unsigned char * data
= start
;
5528 unsigned char * end
= start
+ section
->sh_size
;
5529 unsigned char * end_of_sequence
;
5532 printf (_("\nDump of debug contents of section %s:\n\n"),
5533 SECTION_NAME (section
));
5537 external
= (DWARF2_External_LineInfo
*) data
;
5539 /* Check the length of the block. */
5540 info
.li_length
= BYTE_GET (external
->li_length
);
5541 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
5544 (_("The line info appears to be corrupt - the section is too small\n"));
5548 /* Check its version number. */
5549 info
.li_version
= BYTE_GET (external
->li_version
);
5550 if (info
.li_version
!= 2)
5552 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5556 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
5557 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
5558 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
5559 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
5560 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
5561 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
5563 /* Sign extend the line base field. */
5564 info
.li_line_base
<<= 24;
5565 info
.li_line_base
>>= 24;
5567 printf (_(" Length: %ld\n"), info
.li_length
);
5568 printf (_(" DWARF Version: %d\n"), info
.li_version
);
5569 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
5570 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
5571 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
5572 printf (_(" Line Base: %d\n"), info
.li_line_base
);
5573 printf (_(" Line Range: %d\n"), info
.li_line_range
);
5574 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
5576 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
5578 reset_state_machine (info
.li_default_is_stmt
);
5580 /* Display the contents of the Opcodes table. */
5581 standard_opcodes
= data
+ sizeof (* external
);
5583 printf (_("\n Opcodes:\n"));
5585 for (i
= 1; i
< info
.li_opcode_base
; i
++)
5586 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
5588 /* Display the contents of the Directory table. */
5589 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
5592 printf (_("\n The Directory Table is empty.\n"));
5595 printf (_("\n The Directory Table:\n"));
5599 printf (_(" %s\n"), data
);
5601 data
+= strlen ((char *) data
) + 1;
5605 /* Skip the NUL at the end of the table. */
5608 /* Display the contents of the File Name table. */
5610 printf (_("\n The File Name Table is empty.\n"));
5613 printf (_("\n The File Name Table:\n"));
5614 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5618 unsigned char * name
;
5621 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5624 data
+= strlen ((char *) data
) + 1;
5626 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5628 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5630 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5632 printf (_("%s\n"), name
);
5636 /* Skip the NUL at the end of the table. */
5639 /* Now display the statements. */
5640 printf (_("\n Line Number Statements:\n"));
5643 while (data
< end_of_sequence
)
5645 unsigned char op_code
;
5649 op_code
= * data
++;
5653 case DW_LNS_extended_op
:
5654 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
5655 debug_line_pointer_size
);
5659 printf (_(" Copy\n"));
5662 case DW_LNS_advance_pc
:
5663 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
5665 state_machine_regs
.address
+= adv
;
5666 printf (_(" Advance PC by %d to %lx\n"), adv
,
5667 state_machine_regs
.address
);
5670 case DW_LNS_advance_line
:
5671 adv
= read_leb128 (data
, & bytes_read
, 1);
5673 state_machine_regs
.line
+= adv
;
5674 printf (_(" Advance Line by %d to %d\n"), adv
,
5675 state_machine_regs
.line
);
5678 case DW_LNS_set_file
:
5679 adv
= read_leb128 (data
, & bytes_read
, 0);
5681 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5683 state_machine_regs
.file
= adv
;
5686 case DW_LNS_set_column
:
5687 adv
= read_leb128 (data
, & bytes_read
, 0);
5689 printf (_(" Set column to %d\n"), adv
);
5690 state_machine_regs
.column
= adv
;
5693 case DW_LNS_negate_stmt
:
5694 adv
= state_machine_regs
.is_stmt
;
5696 printf (_(" Set is_stmt to %d\n"), adv
);
5697 state_machine_regs
.is_stmt
= adv
;
5700 case DW_LNS_set_basic_block
:
5701 printf (_(" Set basic block\n"));
5702 state_machine_regs
.basic_block
= 1;
5705 case DW_LNS_const_add_pc
:
5706 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
5707 * info
.li_min_insn_length
);
5708 state_machine_regs
.address
+= adv
;
5709 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
5710 state_machine_regs
.address
);
5713 case DW_LNS_fixed_advance_pc
:
5714 adv
= byte_get (data
, 2);
5716 state_machine_regs
.address
+= adv
;
5717 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5718 adv
, state_machine_regs
.address
);
5722 op_code
-= info
.li_opcode_base
;
5723 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
5724 state_machine_regs
.address
+= adv
;
5725 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5726 op_code
, adv
, state_machine_regs
.address
);
5727 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
5728 state_machine_regs
.line
+= adv
;
5729 printf (_(" and Line by %d to %d\n"),
5730 adv
, state_machine_regs
.line
);
5741 display_debug_pubnames (section
, start
, file
)
5742 Elf32_Internal_Shdr
* section
;
5743 unsigned char * start
;
5744 FILE * file ATTRIBUTE_UNUSED
;
5746 DWARF2_External_PubNames
* external
;
5747 DWARF2_Internal_PubNames pubnames
;
5748 unsigned char * end
;
5750 end
= start
+ section
->sh_size
;
5752 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
5756 unsigned char * data
;
5757 unsigned long offset
;
5759 external
= (DWARF2_External_PubNames
*) start
;
5761 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
5762 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
5763 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
5764 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
5766 data
= start
+ sizeof (* external
);
5767 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
5769 if (pubnames
.pn_version
!= 2)
5771 static int warned
= 0;
5775 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5782 printf (_(" Length: %ld\n"),
5783 pubnames
.pn_length
);
5784 printf (_(" Version: %d\n"),
5785 pubnames
.pn_version
);
5786 printf (_(" Offset into .debug_info section: %ld\n"),
5787 pubnames
.pn_offset
);
5788 printf (_(" Size of area in .debug_info section: %ld\n"),
5791 printf (_("\n Offset\tName\n"));
5795 offset
= byte_get (data
, 4);
5800 printf (" %ld\t\t%s\n", offset
, data
);
5801 data
+= strlen ((char *) data
) + 1;
5804 while (offset
!= 0);
5817 case DW_TAG_padding
: return "DW_TAG_padding";
5818 case DW_TAG_array_type
: return "DW_TAG_array_type";
5819 case DW_TAG_class_type
: return "DW_TAG_class_type";
5820 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
5821 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
5822 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
5823 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
5824 case DW_TAG_label
: return "DW_TAG_label";
5825 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
5826 case DW_TAG_member
: return "DW_TAG_member";
5827 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
5828 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
5829 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
5830 case DW_TAG_string_type
: return "DW_TAG_string_type";
5831 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
5832 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
5833 case DW_TAG_typedef
: return "DW_TAG_typedef";
5834 case DW_TAG_union_type
: return "DW_TAG_union_type";
5835 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
5836 case DW_TAG_variant
: return "DW_TAG_variant";
5837 case DW_TAG_common_block
: return "DW_TAG_common_block";
5838 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
5839 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
5840 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
5841 case DW_TAG_module
: return "DW_TAG_module";
5842 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
5843 case DW_TAG_set_type
: return "DW_TAG_set_type";
5844 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
5845 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
5846 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
5847 case DW_TAG_base_type
: return "DW_TAG_base_type";
5848 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
5849 case DW_TAG_const_type
: return "DW_TAG_const_type";
5850 case DW_TAG_constant
: return "DW_TAG_constant";
5851 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
5852 case DW_TAG_file_type
: return "DW_TAG_file_type";
5853 case DW_TAG_friend
: return "DW_TAG_friend";
5854 case DW_TAG_namelist
: return "DW_TAG_namelist";
5855 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
5856 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
5857 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
5858 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
5859 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
5860 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
5861 case DW_TAG_try_block
: return "DW_TAG_try_block";
5862 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
5863 case DW_TAG_variable
: return "DW_TAG_variable";
5864 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
5865 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
5866 case DW_TAG_format_label
: return "DW_TAG_format_label";
5867 case DW_TAG_function_template
: return "DW_TAG_function_template";
5868 case DW_TAG_class_template
: return "DW_TAG_class_template";
5871 static char buffer
[100];
5873 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
5880 get_AT_name (attribute
)
5881 unsigned long attribute
;
5885 case DW_AT_sibling
: return "DW_AT_sibling";
5886 case DW_AT_location
: return "DW_AT_location";
5887 case DW_AT_name
: return "DW_AT_name";
5888 case DW_AT_ordering
: return "DW_AT_ordering";
5889 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
5890 case DW_AT_byte_size
: return "DW_AT_byte_size";
5891 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
5892 case DW_AT_bit_size
: return "DW_AT_bit_size";
5893 case DW_AT_element_list
: return "DW_AT_element_list";
5894 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
5895 case DW_AT_low_pc
: return "DW_AT_low_pc";
5896 case DW_AT_high_pc
: return "DW_AT_high_pc";
5897 case DW_AT_language
: return "DW_AT_language";
5898 case DW_AT_member
: return "DW_AT_member";
5899 case DW_AT_discr
: return "DW_AT_discr";
5900 case DW_AT_discr_value
: return "DW_AT_discr_value";
5901 case DW_AT_visibility
: return "DW_AT_visibility";
5902 case DW_AT_import
: return "DW_AT_import";
5903 case DW_AT_string_length
: return "DW_AT_string_length";
5904 case DW_AT_common_reference
: return "DW_AT_common_reference";
5905 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
5906 case DW_AT_const_value
: return "DW_AT_const_value";
5907 case DW_AT_containing_type
: return "DW_AT_containing_type";
5908 case DW_AT_default_value
: return "DW_AT_default_value";
5909 case DW_AT_inline
: return "DW_AT_inline";
5910 case DW_AT_is_optional
: return "DW_AT_is_optional";
5911 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
5912 case DW_AT_producer
: return "DW_AT_producer";
5913 case DW_AT_prototyped
: return "DW_AT_prototyped";
5914 case DW_AT_return_addr
: return "DW_AT_return_addr";
5915 case DW_AT_start_scope
: return "DW_AT_start_scope";
5916 case DW_AT_stride_size
: return "DW_AT_stride_size";
5917 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
5918 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
5919 case DW_AT_accessibility
: return "DW_AT_accessibility";
5920 case DW_AT_address_class
: return "DW_AT_address_class";
5921 case DW_AT_artificial
: return "DW_AT_artificial";
5922 case DW_AT_base_types
: return "DW_AT_base_types";
5923 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
5924 case DW_AT_count
: return "DW_AT_count";
5925 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
5926 case DW_AT_decl_column
: return "DW_AT_decl_column";
5927 case DW_AT_decl_file
: return "DW_AT_decl_file";
5928 case DW_AT_decl_line
: return "DW_AT_decl_line";
5929 case DW_AT_declaration
: return "DW_AT_declaration";
5930 case DW_AT_discr_list
: return "DW_AT_discr_list";
5931 case DW_AT_encoding
: return "DW_AT_encoding";
5932 case DW_AT_external
: return "DW_AT_external";
5933 case DW_AT_frame_base
: return "DW_AT_frame_base";
5934 case DW_AT_friend
: return "DW_AT_friend";
5935 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
5936 case DW_AT_macro_info
: return "DW_AT_macro_info";
5937 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
5938 case DW_AT_priority
: return "DW_AT_priority";
5939 case DW_AT_segment
: return "DW_AT_segment";
5940 case DW_AT_specification
: return "DW_AT_specification";
5941 case DW_AT_static_link
: return "DW_AT_static_link";
5942 case DW_AT_type
: return "DW_AT_type";
5943 case DW_AT_use_location
: return "DW_AT_use_location";
5944 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
5945 case DW_AT_virtuality
: return "DW_AT_virtuality";
5946 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
5947 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
5948 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
5949 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
5950 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
5951 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
5952 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
5953 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
5954 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
5955 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
5956 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
5957 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
5958 case DW_AT_sf_names
: return "DW_AT_sf_names";
5959 case DW_AT_src_info
: return "DW_AT_src_info";
5960 case DW_AT_mac_info
: return "DW_AT_mac_info";
5961 case DW_AT_src_coords
: return "DW_AT_src_coords";
5962 case DW_AT_body_begin
: return "DW_AT_body_begin";
5963 case DW_AT_body_end
: return "DW_AT_body_end";
5966 static char buffer
[100];
5968 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
5975 get_FORM_name (form
)
5980 case DW_FORM_addr
: return "DW_FORM_addr";
5981 case DW_FORM_block2
: return "DW_FORM_block2";
5982 case DW_FORM_block4
: return "DW_FORM_block4";
5983 case DW_FORM_data2
: return "DW_FORM_data2";
5984 case DW_FORM_data4
: return "DW_FORM_data4";
5985 case DW_FORM_data8
: return "DW_FORM_data8";
5986 case DW_FORM_string
: return "DW_FORM_string";
5987 case DW_FORM_block
: return "DW_FORM_block";
5988 case DW_FORM_block1
: return "DW_FORM_block1";
5989 case DW_FORM_data1
: return "DW_FORM_data1";
5990 case DW_FORM_flag
: return "DW_FORM_flag";
5991 case DW_FORM_sdata
: return "DW_FORM_sdata";
5992 case DW_FORM_strp
: return "DW_FORM_strp";
5993 case DW_FORM_udata
: return "DW_FORM_udata";
5994 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
5995 case DW_FORM_ref1
: return "DW_FORM_ref1";
5996 case DW_FORM_ref2
: return "DW_FORM_ref2";
5997 case DW_FORM_ref4
: return "DW_FORM_ref4";
5998 case DW_FORM_ref8
: return "DW_FORM_ref8";
5999 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6000 case DW_FORM_indirect
: return "DW_FORM_indirect";
6003 static char buffer
[100];
6005 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6011 /* FIXME: There are better and more effiecint ways to handle
6012 these structures. For now though, I just want something that
6013 is simple to implement. */
6014 typedef struct abbrev_attr
6016 unsigned long attribute
;
6018 struct abbrev_attr
* next
;
6022 typedef struct abbrev_entry
6024 unsigned long entry
;
6027 struct abbrev_attr
* first_attr
;
6028 struct abbrev_attr
* last_attr
;
6029 struct abbrev_entry
* next
;
6033 static abbrev_entry
* first_abbrev
= NULL
;
6034 static abbrev_entry
* last_abbrev
= NULL
;
6037 free_abbrevs
PARAMS ((void))
6039 abbrev_entry
* abbrev
;
6041 for (abbrev
= first_abbrev
; abbrev
;)
6043 abbrev_entry
* next
= abbrev
->next
;
6046 for (attr
= abbrev
->first_attr
; attr
;)
6048 abbrev_attr
* next
= attr
->next
;
6058 last_abbrev
= first_abbrev
= NULL
;
6062 add_abbrev (number
, tag
, children
)
6063 unsigned long number
;
6067 abbrev_entry
* entry
;
6069 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
6075 entry
->entry
= number
;
6077 entry
->children
= children
;
6078 entry
->first_attr
= NULL
;
6079 entry
->last_attr
= NULL
;
6082 if (first_abbrev
== NULL
)
6083 first_abbrev
= entry
;
6085 last_abbrev
->next
= entry
;
6087 last_abbrev
= entry
;
6091 add_abbrev_attr (attribute
, form
)
6092 unsigned long attribute
;
6097 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
6103 attr
->attribute
= attribute
;
6107 if (last_abbrev
->first_attr
== NULL
)
6108 last_abbrev
->first_attr
= attr
;
6110 last_abbrev
->last_attr
->next
= attr
;
6112 last_abbrev
->last_attr
= attr
;
6115 /* Processes the (partial) contents of a .debug_abbrev section.
6116 Returns NULL if the end of the section was encountered.
6117 Returns the address after the last byte read if the end of
6118 an abbreviation set was found. */
6120 static unsigned char *
6121 process_abbrev_section (start
, end
)
6122 unsigned char * start
;
6123 unsigned char * end
;
6125 if (first_abbrev
!= NULL
)
6131 unsigned long entry
;
6133 unsigned long attribute
;
6136 entry
= read_leb128 (start
, & bytes_read
, 0);
6137 start
+= bytes_read
;
6139 /* A single zero is supposed to end the section according
6140 to the standard. If there's more, then signal that to
6143 return start
== end
? NULL
: start
;
6145 tag
= read_leb128 (start
, & bytes_read
, 0);
6146 start
+= bytes_read
;
6148 children
= * start
++;
6150 add_abbrev (entry
, tag
, children
);
6156 attribute
= read_leb128 (start
, & bytes_read
, 0);
6157 start
+= bytes_read
;
6159 form
= read_leb128 (start
, & bytes_read
, 0);
6160 start
+= bytes_read
;
6163 add_abbrev_attr (attribute
, form
);
6165 while (attribute
!= 0);
6173 display_debug_abbrev (section
, start
, file
)
6174 Elf32_Internal_Shdr
* section
;
6175 unsigned char * start
;
6176 FILE * file ATTRIBUTE_UNUSED
;
6178 abbrev_entry
* entry
;
6179 unsigned char * end
= start
+ section
->sh_size
;
6181 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6185 start
= process_abbrev_section (start
, end
);
6187 printf (_(" Number TAG\n"));
6189 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
6193 printf (_(" %ld %s [%s]\n"),
6195 get_TAG_name (entry
->tag
),
6196 entry
->children
? _("has children") : _("no children"));
6198 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6200 printf (_(" %-18s %s\n"),
6201 get_AT_name (attr
->attribute
),
6202 get_FORM_name (attr
->form
));
6214 static unsigned char *
6215 display_block (data
, length
)
6216 unsigned char * data
;
6217 unsigned long length
;
6219 printf (_(" %lu byte block: "), length
);
6222 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
6228 decode_location_expression (data
, pointer_size
, length
)
6229 unsigned char * data
;
6230 unsigned int pointer_size
;
6231 unsigned long length
;
6235 unsigned long uvalue
;
6236 unsigned char * end
= data
+ length
;
6245 printf ("DW_OP_addr: %lx",
6246 (unsigned long) byte_get (data
, pointer_size
));
6247 data
+= pointer_size
;
6250 printf ("DW_OP_deref");
6253 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
6256 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
6259 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
6263 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
6267 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
6271 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
6275 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
6276 (unsigned long) byte_get (data
+ 4, 4));
6280 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
6281 (long) byte_get (data
+ 4, 4));
6285 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
6289 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
6293 printf ("DW_OP_dup");
6296 printf ("DW_OP_drop");
6299 printf ("DW_OP_over");
6302 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
6305 printf ("DW_OP_swap");
6308 printf ("DW_OP_rot");
6311 printf ("DW_OP_xderef");
6314 printf ("DW_OP_abs");
6317 printf ("DW_OP_and");
6320 printf ("DW_OP_div");
6323 printf ("DW_OP_minus");
6326 printf ("DW_OP_mod");
6329 printf ("DW_OP_mul");
6332 printf ("DW_OP_neg");
6335 printf ("DW_OP_not");
6338 printf ("DW_OP_or");
6341 printf ("DW_OP_plus");
6343 case DW_OP_plus_uconst
:
6344 printf ("DW_OP_plus_uconst: %lu",
6345 read_leb128 (data
, &bytes_read
, 0));
6349 printf ("DW_OP_shl");
6352 printf ("DW_OP_shr");
6355 printf ("DW_OP_shra");
6358 printf ("DW_OP_xor");
6361 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
6365 printf ("DW_OP_eq");
6368 printf ("DW_OP_ge");
6371 printf ("DW_OP_gt");
6374 printf ("DW_OP_le");
6377 printf ("DW_OP_lt");
6380 printf ("DW_OP_ne");
6383 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
6419 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
6454 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
6489 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
6490 read_leb128 (data
, &bytes_read
, 1));
6495 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
6499 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
6503 uvalue
= read_leb128 (data
, &bytes_read
, 0);
6505 printf ("DW_OP_bregx: %lu %ld", uvalue
,
6506 read_leb128 (data
, &bytes_read
, 1));
6510 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
6513 case DW_OP_deref_size
:
6514 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
6516 case DW_OP_xderef_size
:
6517 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
6520 printf ("DW_OP_nop");
6524 if (op
>= DW_OP_lo_user
6525 && op
<= DW_OP_hi_user
)
6526 printf (_("(User defined location op)"));
6528 printf (_("(Unknown location op)"));
6529 /* No way to tell where the next op is, so just bail. */
6536 static unsigned char *
6537 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
6538 unsigned long attribute
;
6540 unsigned char * data
;
6541 unsigned long cu_offset
;
6542 unsigned long pointer_size
;
6544 unsigned long uvalue
= 0;
6545 unsigned char * block_start
= NULL
;
6548 printf (" %-18s:", get_AT_name (attribute
));
6555 case DW_FORM_ref_addr
:
6557 uvalue
= byte_get (data
, pointer_size
);
6558 data
+= pointer_size
;
6564 uvalue
= byte_get (data
++, 1);
6569 uvalue
= byte_get (data
, 2);
6575 uvalue
= byte_get (data
, 4);
6580 uvalue
= read_leb128 (data
, & bytes_read
, 1);
6584 case DW_FORM_ref_udata
:
6586 uvalue
= read_leb128 (data
, & bytes_read
, 0);
6593 case DW_FORM_ref_addr
:
6594 printf (" <#%lx>", uvalue
);
6600 case DW_FORM_ref_udata
:
6601 printf (" <%lx>", uvalue
+ cu_offset
);
6605 printf (" %#lx", uvalue
);
6613 printf (" %ld", uvalue
);
6618 uvalue
= byte_get (data
, 4);
6619 printf (" %lx", uvalue
);
6620 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
6624 case DW_FORM_string
:
6625 printf (" %s", data
);
6626 data
+= strlen ((char *) data
) + 1;
6630 uvalue
= read_leb128 (data
, & bytes_read
, 0);
6631 block_start
= data
+ bytes_read
;
6632 data
= display_block (block_start
, uvalue
);
6635 case DW_FORM_block1
:
6636 uvalue
= byte_get (data
, 1);
6637 block_start
= data
+ 1;
6638 data
= display_block (block_start
, uvalue
);
6641 case DW_FORM_block2
:
6642 uvalue
= byte_get (data
, 2);
6643 block_start
= data
+ 2;
6644 data
= display_block (block_start
, uvalue
);
6647 case DW_FORM_block4
:
6648 uvalue
= byte_get (data
, 4);
6649 block_start
= data
+ 4;
6650 data
= display_block (block_start
, uvalue
);
6654 case DW_FORM_indirect
:
6655 warn (_("Unable to handle FORM: %d"), form
);
6659 warn (_("Unrecognised form: %d"), form
);
6663 /* For some attributes we can display futher information. */
6672 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
6673 case DW_INL_inlined
: printf (_("(inlined)")); break;
6674 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
6675 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
6676 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
6680 case DW_AT_language
:
6683 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
6684 case DW_LANG_C89
: printf ("(ANSI C)"); break;
6685 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
6686 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
6687 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
6688 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
6689 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
6690 case DW_LANG_Ada83
: printf ("(Ada)"); break;
6691 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
6692 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
6693 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
6694 default: printf ("(Unknown: %lx)", uvalue
); break;
6698 case DW_AT_encoding
:
6701 case DW_ATE_void
: printf ("(void)"); break;
6702 case DW_ATE_address
: printf ("(machine address)"); break;
6703 case DW_ATE_boolean
: printf ("(boolean)"); break;
6704 case DW_ATE_complex_float
: printf ("(complex float)"); break;
6705 case DW_ATE_float
: printf ("(float)"); break;
6706 case DW_ATE_signed
: printf ("(signed)"); break;
6707 case DW_ATE_signed_char
: printf ("(signed char)"); break;
6708 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
6709 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
6711 if (uvalue
>= DW_ATE_lo_user
6712 && uvalue
<= DW_ATE_hi_user
)
6713 printf ("(user defined type)");
6715 printf ("(unknown type)");
6720 case DW_AT_accessibility
:
6723 case DW_ACCESS_public
: printf ("(public)"); break;
6724 case DW_ACCESS_protected
: printf ("(protected)"); break;
6725 case DW_ACCESS_private
: printf ("(private)"); break;
6726 default: printf ("(unknown accessibility)"); break;
6730 case DW_AT_visibility
:
6733 case DW_VIS_local
: printf ("(local)"); break;
6734 case DW_VIS_exported
: printf ("(exported)"); break;
6735 case DW_VIS_qualified
: printf ("(qualified)"); break;
6736 default: printf ("(unknown visibility)"); break;
6740 case DW_AT_virtuality
:
6743 case DW_VIRTUALITY_none
: printf ("(none)"); break;
6744 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
6745 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
6746 default: printf ("(unknown virtuality)"); break;
6750 case DW_AT_identifier_case
:
6753 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
6754 case DW_ID_up_case
: printf ("(up_case)"); break;
6755 case DW_ID_down_case
: printf ("(down_case)"); break;
6756 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
6757 default: printf ("(unknown case)"); break;
6761 case DW_AT_calling_convention
:
6764 case DW_CC_normal
: printf ("(normal)"); break;
6765 case DW_CC_program
: printf ("(program)"); break;
6766 case DW_CC_nocall
: printf ("(nocall)"); break;
6768 if (uvalue
>= DW_CC_lo_user
6769 && uvalue
<= DW_CC_hi_user
)
6770 printf ("(user defined)");
6772 printf ("(unknown convention)");
6776 case DW_AT_frame_base
:
6777 case DW_AT_location
:
6778 case DW_AT_data_member_location
:
6779 case DW_AT_vtable_elem_location
:
6783 decode_location_expression (block_start
, pointer_size
, uvalue
);
6797 display_debug_info (section
, start
, file
)
6798 Elf32_Internal_Shdr
* section
;
6799 unsigned char * start
;
6802 unsigned char * end
= start
+ section
->sh_size
;
6803 unsigned char * section_begin
= start
;
6805 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6809 DWARF2_External_CompUnit
* external
;
6810 DWARF2_Internal_CompUnit compunit
;
6811 unsigned char * tags
;
6814 unsigned long cu_offset
;
6816 external
= (DWARF2_External_CompUnit
*) start
;
6818 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
6819 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
6820 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
6821 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
6823 tags
= start
+ sizeof (* external
);
6824 cu_offset
= start
- section_begin
;
6825 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
6827 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
6828 printf (_(" Length: %ld\n"), compunit
.cu_length
);
6829 printf (_(" Version: %d\n"), compunit
.cu_version
);
6830 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
6831 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
6833 if (compunit
.cu_version
!= 2)
6835 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6839 if (first_abbrev
!= NULL
)
6842 /* Read in the abbrevs used by this compilation unit. */
6845 Elf32_Internal_Shdr
* sec
;
6846 unsigned char * begin
;
6848 /* Locate the .debug_abbrev section and process it. */
6849 for (i
= 0, sec
= section_headers
;
6850 i
< elf_header
.e_shnum
;
6852 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
6855 if (i
== -1 || sec
->sh_size
== 0)
6857 warn (_("Unable to locate .debug_abbrev section!\n"));
6861 GET_DATA_ALLOC (sec
->sh_offset
, sec
->sh_size
, begin
, unsigned char *,
6862 "debug_abbrev section data");
6864 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
6865 begin
+ sec
->sh_size
);
6871 while (tags
< start
)
6874 unsigned long abbrev_number
;
6875 abbrev_entry
* entry
;
6878 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
6881 /* A null DIE marks the end of a list of children. */
6882 if (abbrev_number
== 0)
6888 /* Scan through the abbreviation list until we reach the
6890 for (entry
= first_abbrev
;
6891 entry
&& entry
->entry
!= abbrev_number
;
6892 entry
= entry
->next
)
6897 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6902 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6903 level
, tags
- section_begin
- bytes_read
,
6905 get_TAG_name (entry
->tag
));
6907 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6908 tags
= read_and_display_attr (attr
->attribute
,
6911 compunit
.cu_pointer_size
);
6913 if (entry
->children
)
6924 display_debug_aranges (section
, start
, file
)
6925 Elf32_Internal_Shdr
* section
;
6926 unsigned char * start
;
6927 FILE * file ATTRIBUTE_UNUSED
;
6929 unsigned char * end
= start
+ section
->sh_size
;
6931 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6935 DWARF2_External_ARange
* external
;
6936 DWARF2_Internal_ARange arange
;
6937 unsigned char * ranges
;
6938 unsigned long length
;
6939 unsigned long address
;
6942 external
= (DWARF2_External_ARange
*) start
;
6944 arange
.ar_length
= BYTE_GET (external
->ar_length
);
6945 arange
.ar_version
= BYTE_GET (external
->ar_version
);
6946 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
6947 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
6948 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
6950 if (arange
.ar_version
!= 2)
6952 warn (_("Only DWARF 2 aranges are currently supported.\n"));
6956 printf (_(" Length: %ld\n"), arange
.ar_length
);
6957 printf (_(" Version: %d\n"), arange
.ar_version
);
6958 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
6959 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
6960 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
6962 printf (_("\n Address Length\n"));
6964 ranges
= start
+ sizeof (* external
);
6966 /* Must pad to an alignment boundary that is twice the pointer size. */
6967 excess
= sizeof (* external
) % (2 * arange
.ar_pointer_size
);
6969 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
6973 address
= byte_get (ranges
, arange
.ar_pointer_size
);
6975 ranges
+= arange
.ar_pointer_size
;
6977 length
= byte_get (ranges
, arange
.ar_pointer_size
);
6979 ranges
+= arange
.ar_pointer_size
;
6981 /* A pair of zeros marks the end of the list. */
6982 if (address
== 0 && length
== 0)
6985 printf (" %8.8lx %lu\n", address
, length
);
6988 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
6996 typedef struct Frame_Chunk
6998 struct Frame_Chunk
* next
;
6999 unsigned char * chunk_start
;
7001 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7002 short int * col_type
;
7004 char * augmentation
;
7005 unsigned int code_factor
;
7007 unsigned long pc_begin
;
7008 unsigned long pc_range
;
7012 unsigned char fde_encoding
;
7016 /* A marker for a col_type that means this column was never referenced
7017 in the frame info. */
7018 #define DW_CFA_unreferenced (-1)
7021 frame_need_space (fc
, reg
)
7025 int prev
= fc
->ncols
;
7027 if (reg
< fc
->ncols
)
7030 fc
->ncols
= reg
+ 1;
7031 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
7032 fc
->ncols
* sizeof (short int));
7033 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
7034 fc
->ncols
* sizeof (int));
7036 while (prev
< fc
->ncols
)
7038 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
7039 fc
->col_offset
[prev
] = 0;
7045 frame_display_row (fc
, need_col_headers
, max_regs
)
7047 int * need_col_headers
;
7053 if (* max_regs
< fc
->ncols
)
7054 * max_regs
= fc
->ncols
;
7056 if (* need_col_headers
)
7058 * need_col_headers
= 0;
7060 printf (" LOC CFA ");
7062 for (r
= 0; r
< * max_regs
; r
++)
7063 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7068 printf ("r%-4d", r
);
7074 printf ("%08lx ", fc
->pc_begin
);
7075 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
7076 printf ("%-8s ", tmp
);
7078 for (r
= 0; r
< fc
->ncols
; r
++)
7080 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7082 switch (fc
->col_type
[r
])
7084 case DW_CFA_undefined
:
7087 case DW_CFA_same_value
:
7091 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
7093 case DW_CFA_register
:
7094 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
7097 strcpy (tmp
, "n/a");
7100 printf ("%-5s", tmp
);
7107 size_of_encoded_value (encoding
)
7110 switch (encoding
& 0x7)
7113 case 0: return is_32bit_elf
? 4 : 8;
7120 #define GET(N) byte_get (start, N); start += N
7121 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7122 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7125 display_debug_frames (section
, start
, file
)
7126 Elf32_Internal_Shdr
* section
;
7127 unsigned char * start
;
7128 FILE * file ATTRIBUTE_UNUSED
;
7130 unsigned char * end
= start
+ section
->sh_size
;
7131 unsigned char * section_start
= start
;
7132 Frame_Chunk
* chunks
= 0;
7133 Frame_Chunk
* remembered_state
= 0;
7135 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
7138 int addr_size
= is_32bit_elf
? 4 : 8;
7140 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
7144 unsigned char * saved_start
;
7145 unsigned char * block_end
;
7146 unsigned long length
;
7147 unsigned long cie_id
;
7150 int need_col_headers
= 1;
7151 unsigned char * augmentation_data
= NULL
;
7152 unsigned long augmentation_data_len
= 0;
7153 int encoded_ptr_size
= addr_size
;
7155 saved_start
= start
;
7156 length
= byte_get (start
, 4); start
+= 4;
7161 block_end
= saved_start
+ length
+ 4;
7162 cie_id
= byte_get (start
, 4); start
+= 4;
7164 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
7168 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
7169 memset (fc
, 0, sizeof (Frame_Chunk
));
7173 fc
->chunk_start
= saved_start
;
7175 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7176 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7177 frame_need_space (fc
, max_regs
-1);
7181 fc
->augmentation
= start
;
7182 start
= strchr (start
, '\0') + 1;
7184 if (fc
->augmentation
[0] == 'z')
7186 fc
->code_factor
= LEB ();
7187 fc
->data_factor
= SLEB ();
7188 fc
->ra
= byte_get (start
, 1); start
+= 1;
7189 augmentation_data_len
= LEB ();
7190 augmentation_data
= start
;
7191 start
+= augmentation_data_len
;
7193 else if (strcmp (fc
->augmentation
, "eh") == 0)
7196 fc
->code_factor
= LEB ();
7197 fc
->data_factor
= SLEB ();
7198 fc
->ra
= byte_get (start
, 1); start
+= 1;
7202 fc
->code_factor
= LEB ();
7203 fc
->data_factor
= SLEB ();
7204 fc
->ra
= byte_get (start
, 1); start
+= 1;
7208 if (do_debug_frames_interp
)
7209 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7210 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
7211 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
7215 printf ("\n%08lx %08lx %08lx CIE\n",
7216 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
7217 printf (" Version: %d\n", version
);
7218 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
7219 printf (" Code alignment factor: %u\n", fc
->code_factor
);
7220 printf (" Data alignment factor: %d\n", fc
->data_factor
);
7221 printf (" Return address column: %d\n", fc
->ra
);
7223 if (augmentation_data_len
)
7226 printf (" Augmentation data: ");
7227 for (i
= 0; i
< augmentation_data_len
; ++i
)
7228 printf (" %02x", augmentation_data
[i
]);
7234 if (augmentation_data_len
)
7236 unsigned char *p
, *q
;
7237 p
= fc
->augmentation
+ 1;
7238 q
= augmentation_data
;
7245 q
+= 1 + size_of_encoded_value (*q
);
7247 fc
->fde_encoding
= *q
++;
7253 if (fc
->fde_encoding
)
7254 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
7257 frame_need_space (fc
, fc
->ra
);
7261 unsigned char * look_for
;
7262 static Frame_Chunk fde_fc
;
7265 memset (fc
, 0, sizeof (Frame_Chunk
));
7267 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
7269 for (cie
=chunks
; cie
; cie
= cie
->next
)
7270 if (cie
->chunk_start
== look_for
)
7275 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7276 cie_id
, saved_start
);
7279 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7280 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7281 frame_need_space (fc
, max_regs
- 1);
7283 fc
->augmentation
= "";
7284 fc
->fde_encoding
= 0;
7288 fc
->ncols
= cie
->ncols
;
7289 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
7290 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
7291 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
7292 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
7293 fc
->augmentation
= cie
->augmentation
;
7294 fc
->code_factor
= cie
->code_factor
;
7295 fc
->data_factor
= cie
->data_factor
;
7296 fc
->cfa_reg
= cie
->cfa_reg
;
7297 fc
->cfa_offset
= cie
->cfa_offset
;
7299 frame_need_space (fc
, max_regs
-1);
7300 fc
->fde_encoding
= cie
->fde_encoding
;
7303 if (fc
->fde_encoding
)
7304 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
7306 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
7307 start
+= encoded_ptr_size
;
7308 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
7309 start
+= encoded_ptr_size
;
7311 if (cie
->augmentation
[0] == 'z')
7313 augmentation_data_len
= LEB ();
7314 augmentation_data
= start
;
7315 start
+= augmentation_data_len
;
7318 printf ("\n%08lx %08lx %08lx FDE cie=%08x pc=%08lx..%08lx\n",
7319 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
7320 cie
->chunk_start
- section_start
, fc
->pc_begin
,
7321 fc
->pc_begin
+ fc
->pc_range
);
7322 if (! do_debug_frames_interp
&& augmentation_data_len
)
7325 printf (" Augmentation data: ");
7326 for (i
= 0; i
< augmentation_data_len
; ++i
)
7327 printf (" %02x", augmentation_data
[i
]);
7333 /* At this point, fc is the current chunk, cie (if any) is set, and we're
7334 about to interpret instructions for the chunk. */
7336 if (do_debug_frames_interp
)
7338 /* Start by making a pass over the chunk, allocating storage
7339 and taking note of what registers are used. */
7340 unsigned char * tmp
= start
;
7342 while (start
< block_end
)
7352 /* Warning: if you add any more cases to this switch, be
7353 sure to add them to the corresponding switch below. */
7356 case DW_CFA_advance_loc
:
7360 frame_need_space (fc
, opa
);
7361 fc
->col_type
[opa
] = DW_CFA_undefined
;
7363 case DW_CFA_restore
:
7364 frame_need_space (fc
, opa
);
7365 fc
->col_type
[opa
] = DW_CFA_undefined
;
7367 case DW_CFA_set_loc
:
7368 start
+= encoded_ptr_size
;
7370 case DW_CFA_advance_loc1
:
7373 case DW_CFA_advance_loc2
:
7376 case DW_CFA_advance_loc4
:
7379 case DW_CFA_offset_extended
:
7380 reg
= LEB (); LEB ();
7381 frame_need_space (fc
, reg
);
7382 fc
->col_type
[reg
] = DW_CFA_undefined
;
7384 case DW_CFA_restore_extended
:
7386 frame_need_space (fc
, reg
);
7387 fc
->col_type
[reg
] = DW_CFA_undefined
;
7389 case DW_CFA_undefined
:
7391 frame_need_space (fc
, reg
);
7392 fc
->col_type
[reg
] = DW_CFA_undefined
;
7394 case DW_CFA_same_value
:
7396 frame_need_space (fc
, reg
);
7397 fc
->col_type
[reg
] = DW_CFA_undefined
;
7399 case DW_CFA_register
:
7400 reg
= LEB (); LEB ();
7401 frame_need_space (fc
, reg
);
7402 fc
->col_type
[reg
] = DW_CFA_undefined
;
7404 case DW_CFA_def_cfa
:
7407 case DW_CFA_def_cfa_register
:
7410 case DW_CFA_def_cfa_offset
:
7413 #ifndef DW_CFA_GNU_args_size
7414 #define DW_CFA_GNU_args_size 0x2e
7416 case DW_CFA_GNU_args_size
:
7419 #ifndef DW_CFA_GNU_negative_offset_extended
7420 #define DW_CFA_GNU_negative_offset_extended 0x2f
7422 case DW_CFA_GNU_negative_offset_extended
:
7423 reg
= LEB (); LEB ();
7424 frame_need_space (fc
, reg
);
7425 fc
->col_type
[reg
] = DW_CFA_undefined
;
7434 /* Now we know what registers are used, make a second pass over
7435 the chunk, this time actually printing out the info. */
7437 while (start
< block_end
)
7440 unsigned long ul
, reg
, roffs
;
7449 /* Warning: if you add any more cases to this switch, be
7450 sure to add them to the corresponding switch above. */
7453 case DW_CFA_advance_loc
:
7454 if (do_debug_frames_interp
)
7455 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7457 printf (" DW_CFA_advance_loc: %d to %08lx\n",
7458 opa
* fc
->code_factor
,
7459 fc
->pc_begin
+ opa
* fc
->code_factor
);
7460 fc
->pc_begin
+= opa
* fc
->code_factor
;
7465 if (! do_debug_frames_interp
)
7466 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
7467 opa
, roffs
* fc
->data_factor
);
7468 fc
->col_type
[opa
] = DW_CFA_offset
;
7469 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
7472 case DW_CFA_restore
:
7473 if (! do_debug_frames_interp
)
7474 printf (" DW_CFA_restore: r%d\n", opa
);
7475 fc
->col_type
[opa
] = cie
->col_type
[opa
];
7476 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
7479 case DW_CFA_set_loc
:
7480 vma
= byte_get (start
, encoded_ptr_size
);
7481 start
+= encoded_ptr_size
;
7482 if (do_debug_frames_interp
)
7483 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7485 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
7489 case DW_CFA_advance_loc1
:
7490 ofs
= byte_get (start
, 1); start
+= 1;
7491 if (do_debug_frames_interp
)
7492 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7494 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
7495 ofs
* fc
->code_factor
,
7496 fc
->pc_begin
+ ofs
* fc
->code_factor
);
7497 fc
->pc_begin
+= ofs
* fc
->code_factor
;
7500 case DW_CFA_advance_loc2
:
7501 ofs
= byte_get (start
, 2); start
+= 2;
7502 if (do_debug_frames_interp
)
7503 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7505 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
7506 ofs
* fc
->code_factor
,
7507 fc
->pc_begin
+ ofs
* fc
->code_factor
);
7508 fc
->pc_begin
+= ofs
* fc
->code_factor
;
7511 case DW_CFA_advance_loc4
:
7512 ofs
= byte_get (start
, 4); start
+= 4;
7513 if (do_debug_frames_interp
)
7514 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7516 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
7517 ofs
* fc
->code_factor
,
7518 fc
->pc_begin
+ ofs
* fc
->code_factor
);
7519 fc
->pc_begin
+= ofs
* fc
->code_factor
;
7522 case DW_CFA_offset_extended
:
7525 if (! do_debug_frames_interp
)
7526 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
7527 reg
, roffs
* fc
->data_factor
);
7528 fc
->col_type
[reg
] = DW_CFA_offset
;
7529 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
7532 case DW_CFA_restore_extended
:
7534 if (! do_debug_frames_interp
)
7535 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
7536 fc
->col_type
[reg
] = cie
->col_type
[reg
];
7537 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
7540 case DW_CFA_undefined
:
7542 if (! do_debug_frames_interp
)
7543 printf (" DW_CFA_undefined: r%ld\n", reg
);
7544 fc
->col_type
[reg
] = DW_CFA_undefined
;
7545 fc
->col_offset
[reg
] = 0;
7548 case DW_CFA_same_value
:
7550 if (! do_debug_frames_interp
)
7551 printf (" DW_CFA_same_value: r%ld\n", reg
);
7552 fc
->col_type
[reg
] = DW_CFA_same_value
;
7553 fc
->col_offset
[reg
] = 0;
7556 case DW_CFA_register
:
7559 if (! do_debug_frames_interp
)
7560 printf (" DW_CFA_register: r%ld\n", reg
);
7561 fc
->col_type
[reg
] = DW_CFA_register
;
7562 fc
->col_offset
[reg
] = roffs
;
7565 case DW_CFA_remember_state
:
7566 if (! do_debug_frames_interp
)
7567 printf (" DW_CFA_remember_state\n");
7568 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
7569 rs
->ncols
= fc
->ncols
;
7570 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
7571 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
7572 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
7573 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
7574 rs
->next
= remembered_state
;
7575 remembered_state
= rs
;
7578 case DW_CFA_restore_state
:
7579 if (! do_debug_frames_interp
)
7580 printf (" DW_CFA_restore_state\n");
7581 rs
= remembered_state
;
7582 remembered_state
= rs
->next
;
7583 frame_need_space (fc
, rs
->ncols
-1);
7584 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
7585 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
7586 free (rs
->col_type
);
7587 free (rs
->col_offset
);
7591 case DW_CFA_def_cfa
:
7592 fc
->cfa_reg
= LEB ();
7593 fc
->cfa_offset
= LEB ();
7594 if (! do_debug_frames_interp
)
7595 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
7596 fc
->cfa_reg
, fc
->cfa_offset
);
7599 case DW_CFA_def_cfa_register
:
7600 fc
->cfa_reg
= LEB ();
7601 if (! do_debug_frames_interp
)
7602 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
7605 case DW_CFA_def_cfa_offset
:
7606 fc
->cfa_offset
= LEB ();
7607 if (! do_debug_frames_interp
)
7608 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
7612 if (! do_debug_frames_interp
)
7613 printf (" DW_CFA_nop\n");
7616 #ifndef DW_CFA_GNU_window_save
7617 #define DW_CFA_GNU_window_save 0x2d
7619 case DW_CFA_GNU_window_save
:
7620 if (! do_debug_frames_interp
)
7621 printf (" DW_CFA_GNU_window_save\n");
7624 case DW_CFA_GNU_args_size
:
7626 if (! do_debug_frames_interp
)
7627 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
7630 case DW_CFA_GNU_negative_offset_extended
:
7633 frame_need_space (fc
, reg
);
7634 if (! do_debug_frames_interp
)
7635 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
7636 reg
, l
* fc
->data_factor
);
7637 fc
->col_type
[reg
] = DW_CFA_offset
;
7638 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
7642 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
7647 if (do_debug_frames_interp
)
7648 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7663 display_debug_not_supported (section
, start
, file
)
7664 Elf32_Internal_Shdr
* section
;
7665 unsigned char * start ATTRIBUTE_UNUSED
;
7666 FILE * file ATTRIBUTE_UNUSED
;
7668 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7669 SECTION_NAME (section
));
7674 /* Pre-scan the .debug_info section to record the size of address.
7675 When dumping the .debug_line, we use that size information, assuming
7676 that all compilation units have the same address size. */
7678 prescan_debug_info (section
, start
, file
)
7679 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
7680 unsigned char * start
;
7681 FILE * file ATTRIBUTE_UNUSED
;
7683 DWARF2_External_CompUnit
* external
;
7685 external
= (DWARF2_External_CompUnit
*) start
;
7687 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
7691 /* A structure containing the name of a debug section and a pointer
7692 to a function that can decode it. The third field is a prescan
7693 function to be run over the section before displaying any of the
7698 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
7699 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
7703 { ".debug_info", display_debug_info
, prescan_debug_info
},
7704 { ".debug_abbrev", display_debug_abbrev
, NULL
},
7705 { ".debug_line", display_debug_lines
, NULL
},
7706 { ".debug_aranges", display_debug_aranges
, NULL
},
7707 { ".debug_pubnames", display_debug_pubnames
, NULL
},
7708 { ".debug_frame", display_debug_frames
, NULL
},
7709 { ".eh_frame", display_debug_frames
, NULL
},
7710 { ".debug_macinfo", display_debug_not_supported
, NULL
},
7711 { ".debug_str", display_debug_not_supported
, NULL
},
7712 { ".debug_static_func", display_debug_not_supported
, NULL
},
7713 { ".debug_static_vars", display_debug_not_supported
, NULL
},
7714 { ".debug_types", display_debug_not_supported
, NULL
},
7715 { ".debug_weaknames", display_debug_not_supported
, NULL
}
7719 display_debug_section (section
, file
)
7720 Elf32_Internal_Shdr
* section
;
7723 char * name
= SECTION_NAME (section
);
7724 bfd_size_type length
;
7725 unsigned char * start
;
7728 length
= section
->sh_size
;
7731 printf (_("\nSection '%s' has no debugging data.\n"), name
);
7735 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
7736 "debug section data");
7738 /* See if we know how to display the contents of this section. */
7739 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
7740 name
= ".debug_info";
7742 for (i
= NUM_ELEM (debug_displays
); i
--;)
7743 if (strcmp (debug_displays
[i
].name
, name
) == 0)
7745 debug_displays
[i
].display (section
, start
, file
);
7750 printf (_("Unrecognised debug section: %s\n"), name
);
7754 /* If we loaded in the abbrev section at some point,
7755 we must release it here. */
7756 if (first_abbrev
!= NULL
)
7763 process_section_contents (file
)
7766 Elf32_Internal_Shdr
* section
;
7772 /* Pre-scan the debug sections to find some debug information not
7773 present in some of them. For the .debug_line, we must find out the
7774 size of address (specified in .debug_info and .debug_aranges). */
7775 for (i
= 0, section
= section_headers
;
7776 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
7779 char * name
= SECTION_NAME (section
);
7782 if (section
->sh_size
== 0)
7785 /* See if there is some pre-scan operation for this section. */
7786 for (j
= NUM_ELEM (debug_displays
); j
--;)
7787 if (strcmp (debug_displays
[j
].name
, name
) == 0)
7789 if (debug_displays
[j
].prescan
!= NULL
)
7791 bfd_size_type length
;
7792 unsigned char * start
;
7794 length
= section
->sh_size
;
7795 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
7796 "debug section data");
7798 debug_displays
[j
].prescan (section
, start
, file
);
7806 for (i
= 0, section
= section_headers
;
7807 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
7810 #ifdef SUPPORT_DISASSEMBLY
7811 if (dump_sects
[i
] & DISASS_DUMP
)
7812 disassemble_section (section
, file
);
7814 if (dump_sects
[i
] & HEX_DUMP
)
7815 dump_section (section
, file
);
7817 if (dump_sects
[i
] & DEBUG_DUMP
)
7818 display_debug_section (section
, file
);
7821 if (i
< num_dump_sects
)
7822 warn (_("Some sections were not dumped because they do not exist!\n"));
7828 process_mips_fpe_exception (mask
)
7834 if (mask
& OEX_FPU_INEX
)
7835 fputs ("INEX", stdout
), first
= 0;
7836 if (mask
& OEX_FPU_UFLO
)
7837 printf ("%sUFLO", first
? "" : "|"), first
= 0;
7838 if (mask
& OEX_FPU_OFLO
)
7839 printf ("%sOFLO", first
? "" : "|"), first
= 0;
7840 if (mask
& OEX_FPU_DIV0
)
7841 printf ("%sDIV0", first
? "" : "|"), first
= 0;
7842 if (mask
& OEX_FPU_INVAL
)
7843 printf ("%sINVAL", first
? "" : "|");
7846 fputs ("0", stdout
);
7850 process_mips_specific (file
)
7853 Elf_Internal_Dyn
* entry
;
7854 size_t liblist_offset
= 0;
7855 size_t liblistno
= 0;
7856 size_t conflictsno
= 0;
7857 size_t options_offset
= 0;
7858 size_t conflicts_offset
= 0;
7860 /* We have a lot of special sections. Thanks SGI! */
7861 if (dynamic_segment
== NULL
)
7862 /* No information available. */
7865 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
7866 switch (entry
->d_tag
)
7868 case DT_MIPS_LIBLIST
:
7869 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
7871 case DT_MIPS_LIBLISTNO
:
7872 liblistno
= entry
->d_un
.d_val
;
7874 case DT_MIPS_OPTIONS
:
7875 options_offset
= entry
->d_un
.d_val
- loadaddr
;
7877 case DT_MIPS_CONFLICT
:
7878 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
7880 case DT_MIPS_CONFLICTNO
:
7881 conflictsno
= entry
->d_un
.d_val
;
7887 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
7889 Elf32_External_Lib
* elib
;
7892 GET_DATA_ALLOC (liblist_offset
, liblistno
* sizeof (Elf32_External_Lib
),
7893 elib
, Elf32_External_Lib
*, "liblist");
7895 printf ("\nSection '.liblist' contains %lu entries:\n",
7896 (unsigned long) liblistno
);
7897 fputs (" Library Time Stamp Checksum Version Flags\n",
7900 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
7907 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
7908 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
7909 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
7910 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
7911 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
7913 tmp
= gmtime (&time
);
7914 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
7915 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
7916 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
7918 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt
,
7919 dynamic_strings
+ liblist
.l_name
, timebuf
,
7920 liblist
.l_checksum
, liblist
.l_version
);
7922 if (liblist
.l_flags
== 0)
7933 { " EXACT_MATCH", LL_EXACT_MATCH
},
7934 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
7935 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
7936 { " EXPORTS", LL_EXPORTS
},
7937 { " DELAY_LOAD", LL_DELAY_LOAD
},
7938 { " DELTA", LL_DELTA
}
7940 int flags
= liblist
.l_flags
;
7944 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
7946 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
7948 fputs (l_flags_vals
[fcnt
].name
, stdout
);
7949 flags
^= l_flags_vals
[fcnt
].bit
;
7952 printf (" %#x", (unsigned int) flags
);
7961 if (options_offset
!= 0)
7963 Elf_External_Options
* eopt
;
7964 Elf_Internal_Shdr
* sect
= section_headers
;
7965 Elf_Internal_Options
* iopt
;
7966 Elf_Internal_Options
* option
;
7970 /* Find the section header so that we get the size. */
7971 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
7974 GET_DATA_ALLOC (options_offset
, sect
->sh_size
, eopt
,
7975 Elf_External_Options
*, "options");
7977 iopt
= (Elf_Internal_Options
*) malloc ((sect
->sh_size
/ sizeof (eopt
))
7981 error (_("Out of memory"));
7988 while (offset
< sect
->sh_size
)
7990 Elf_External_Options
* eoption
;
7992 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
7994 option
->kind
= BYTE_GET (eoption
->kind
);
7995 option
->size
= BYTE_GET (eoption
->size
);
7996 option
->section
= BYTE_GET (eoption
->section
);
7997 option
->info
= BYTE_GET (eoption
->info
);
7999 offset
+= option
->size
;
8005 printf (_("\nSection '%s' contains %d entries:\n"),
8006 SECTION_NAME (sect
), cnt
);
8014 switch (option
->kind
)
8017 /* This shouldn't happen. */
8018 printf (" NULL %d %lx", option
->section
, option
->info
);
8021 printf (" REGINFO ");
8022 if (elf_header
.e_machine
== EM_MIPS
)
8025 Elf32_External_RegInfo
* ereg
;
8026 Elf32_RegInfo reginfo
;
8028 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8029 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8030 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8031 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8032 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8033 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8034 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8036 printf ("GPR %08lx GP 0x%lx\n",
8038 (unsigned long) reginfo
.ri_gp_value
);
8039 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8040 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8041 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8046 Elf64_External_RegInfo
* ereg
;
8047 Elf64_Internal_RegInfo reginfo
;
8049 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8050 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8051 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8052 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8053 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8054 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8055 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
8057 printf ("GPR %08lx GP 0x",
8058 reginfo
.ri_gprmask
);
8059 printf_vma (reginfo
.ri_gp_value
);
8062 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8063 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8064 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8068 case ODK_EXCEPTIONS
:
8069 fputs (" EXCEPTIONS fpe_min(", stdout
);
8070 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8071 fputs (") fpe_max(", stdout
);
8072 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8073 fputs (")", stdout
);
8075 if (option
->info
& OEX_PAGE0
)
8076 fputs (" PAGE0", stdout
);
8077 if (option
->info
& OEX_SMM
)
8078 fputs (" SMM", stdout
);
8079 if (option
->info
& OEX_FPDBUG
)
8080 fputs (" FPDBUG", stdout
);
8081 if (option
->info
& OEX_DISMISS
)
8082 fputs (" DISMISS", stdout
);
8085 fputs (" PAD ", stdout
);
8086 if (option
->info
& OPAD_PREFIX
)
8087 fputs (" PREFIX", stdout
);
8088 if (option
->info
& OPAD_POSTFIX
)
8089 fputs (" POSTFIX", stdout
);
8090 if (option
->info
& OPAD_SYMBOL
)
8091 fputs (" SYMBOL", stdout
);
8094 fputs (" HWPATCH ", stdout
);
8095 if (option
->info
& OHW_R4KEOP
)
8096 fputs (" R4KEOP", stdout
);
8097 if (option
->info
& OHW_R8KPFETCH
)
8098 fputs (" R8KPFETCH", stdout
);
8099 if (option
->info
& OHW_R5KEOP
)
8100 fputs (" R5KEOP", stdout
);
8101 if (option
->info
& OHW_R5KCVTL
)
8102 fputs (" R5KCVTL", stdout
);
8105 fputs (" FILL ", stdout
);
8106 /* XXX Print content of info word? */
8109 fputs (" TAGS ", stdout
);
8110 /* XXX Print content of info word? */
8113 fputs (" HWAND ", stdout
);
8114 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8115 fputs (" R4KEOP_CHECKED", stdout
);
8116 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8117 fputs (" R4KEOP_CLEAN", stdout
);
8120 fputs (" HWOR ", stdout
);
8121 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8122 fputs (" R4KEOP_CHECKED", stdout
);
8123 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8124 fputs (" R4KEOP_CLEAN", stdout
);
8127 printf (" GP_GROUP %#06lx self-contained %#06lx",
8128 option
->info
& OGP_GROUP
,
8129 (option
->info
& OGP_SELF
) >> 16);
8132 printf (" IDENT %#06lx self-contained %#06lx",
8133 option
->info
& OGP_GROUP
,
8134 (option
->info
& OGP_SELF
) >> 16);
8137 /* This shouldn't happen. */
8138 printf (" %3d ??? %d %lx",
8139 option
->kind
, option
->section
, option
->info
);
8143 len
= sizeof (* eopt
);
8144 while (len
< option
->size
)
8145 if (((char *) option
)[len
] >= ' '
8146 && ((char *) option
)[len
] < 0x7f)
8147 printf ("%c", ((char *) option
)[len
++]);
8149 printf ("\\%03o", ((char *) option
)[len
++]);
8151 fputs ("\n", stdout
);
8158 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8160 Elf32_External_Conflict
* econf32
;
8161 Elf64_External_Conflict
* econf64
;
8162 Elf32_Conflict
* iconf
;
8165 if (dynamic_symbols
== NULL
)
8167 error (_("conflict list with without table"));
8171 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (* iconf
));
8174 error (_("Out of memory"));
8180 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (* econf32
),
8181 econf32
, Elf32_External_Conflict
*, "conflict");
8183 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8184 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8188 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (* econf64
),
8189 econf64
, Elf64_External_Conflict
*, "conflict");
8191 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8192 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8195 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno
);
8196 puts (_(" Num: Index Value Name"));
8198 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8200 Elf_Internal_Sym
* psym
= &dynamic_symbols
[iconf
[cnt
]];
8202 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8203 print_vma (psym
->st_value
, FULL_HEX
);
8204 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
8214 get_note_type (e_type
)
8217 static char buff
[64];
8221 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
8222 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
8223 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
8224 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
8225 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
8226 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
8227 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
8228 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
8229 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8230 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8231 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8233 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
8238 /* Note that by the ELF standard, the name field is already null byte
8239 terminated, and namesz includes the terminating null byte.
8240 I.E. the value of namesz for the name "FSF" is 4.
8242 If the value of namesz is zero, there is no name present. */
8244 process_note (pnote
)
8245 Elf32_Internal_Note
* pnote
;
8247 printf (" %s\t\t0x%08lx\t%s\n",
8248 pnote
->namesz
? pnote
->namedata
: "(NONE)",
8249 pnote
->descsz
, get_note_type (pnote
->type
));
8255 process_corefile_note_segment (file
, offset
, length
)
8260 Elf_External_Note
* pnotes
;
8261 Elf_External_Note
* external
;
8267 GET_DATA_ALLOC (offset
, length
, pnotes
, Elf_External_Note
*, "notes");
8271 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8272 (unsigned long) offset
, (unsigned long) length
);
8273 printf (_(" Owner\t\tData size\tDescription\n"));
8275 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
8277 Elf32_Internal_Note inote
;
8280 inote
.type
= BYTE_GET (external
->type
);
8281 inote
.namesz
= BYTE_GET (external
->namesz
);
8282 inote
.namedata
= external
->name
;
8283 inote
.descsz
= BYTE_GET (external
->descsz
);
8284 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
8285 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
8287 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
8289 /* Verify that name is null terminated. It appears that at least
8290 one version of Linux (RedHat 6.0) generates corefiles that don't
8291 comply with the ELF spec by failing to include the null byte in
8293 if (inote
.namedata
[inote
.namesz
] != '\0')
8295 temp
= malloc (inote
.namesz
+ 1);
8299 error (_("Out of memory\n"));
8304 strncpy (temp
, inote
.namedata
, inote
.namesz
);
8305 temp
[inote
.namesz
] = 0;
8307 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8308 inote
.namedata
= temp
;
8311 res
&= process_note (& inote
);
8326 process_corefile_note_segments (file
)
8329 Elf_Internal_Phdr
* program_headers
;
8330 Elf_Internal_Phdr
* segment
;
8334 program_headers
= (Elf_Internal_Phdr
*) malloc
8335 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
8337 if (program_headers
== NULL
)
8339 error (_("Out of memory\n"));
8344 i
= get_32bit_program_headers (file
, program_headers
);
8346 i
= get_64bit_program_headers (file
, program_headers
);
8350 free (program_headers
);
8354 for (i
= 0, segment
= program_headers
;
8355 i
< elf_header
.e_phnum
;
8358 if (segment
->p_type
== PT_NOTE
)
8359 res
&= process_corefile_note_segment (file
,
8360 (bfd_vma
) segment
->p_offset
,
8361 (bfd_vma
) segment
->p_filesz
);
8364 free (program_headers
);
8370 process_corefile_contents (file
)
8373 /* If we have not been asked to display the notes then do nothing. */
8377 /* If file is not a core file then exit. */
8378 if (elf_header
.e_type
!= ET_CORE
)
8381 /* No program headers means no NOTE segment. */
8382 if (elf_header
.e_phnum
== 0)
8384 printf (_("No note segments present in the core file.\n"));
8388 return process_corefile_note_segments (file
);
8392 process_arch_specific (file
)
8398 switch (elf_header
.e_machine
)
8401 case EM_MIPS_RS3_LE
:
8402 return process_mips_specific (file
);
8411 get_file_header (file
)
8414 /* Read in the identity array. */
8415 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
8418 /* Determine how to read the rest of the header. */
8419 switch (elf_header
.e_ident
[EI_DATA
])
8421 default: /* fall through */
8422 case ELFDATANONE
: /* fall through */
8423 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
8424 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
8427 /* For now we only support 32 bit and 64 bit ELF files. */
8428 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
8430 /* Read in the rest of the header. */
8433 Elf32_External_Ehdr ehdr32
;
8435 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
8438 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
8439 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
8440 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
8441 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
8442 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
8443 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
8444 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
8445 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
8446 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
8447 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
8448 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
8449 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
8450 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
8454 Elf64_External_Ehdr ehdr64
;
8456 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8457 we will not be able to cope with the 64bit data found in
8458 64 ELF files. Detect this now and abort before we start
8459 overwritting things. */
8460 if (sizeof (bfd_vma
) < 8)
8462 error (_("This instance of readelf has been built without support for a\n"));
8463 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
8467 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
8470 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
8471 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
8472 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
8473 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
8474 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
8475 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
8476 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
8477 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
8478 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
8479 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
8480 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
8481 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
8482 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
8489 process_file (file_name
)
8493 struct stat statbuf
;
8496 if (stat (file_name
, & statbuf
) < 0)
8498 error (_("Cannot stat input file %s.\n"), file_name
);
8502 file
= fopen (file_name
, "rb");
8505 error (_("Input file %s not found.\n"), file_name
);
8509 if (! get_file_header (file
))
8511 error (_("%s: Failed to read file header\n"), file_name
);
8516 /* Initialise per file variables. */
8517 for (i
= NUM_ELEM (version_info
); i
--;)
8518 version_info
[i
] = 0;
8520 for (i
= NUM_ELEM (dynamic_info
); i
--;)
8521 dynamic_info
[i
] = 0;
8523 /* Process the file. */
8525 printf (_("\nFile: %s\n"), file_name
);
8527 if (! process_file_header ())
8533 process_section_headers (file
);
8535 process_program_headers (file
);
8537 process_dynamic_segment (file
);
8539 process_relocs (file
);
8541 process_unwind (file
);
8543 process_symbol_table (file
);
8545 process_syminfo (file
);
8547 process_version_sections (file
);
8549 process_section_contents (file
);
8551 process_corefile_contents (file
);
8553 process_arch_specific (file
);
8557 if (section_headers
)
8559 free (section_headers
);
8560 section_headers
= NULL
;
8565 free (string_table
);
8566 string_table
= NULL
;
8567 string_table_length
= 0;
8570 if (dynamic_strings
)
8572 free (dynamic_strings
);
8573 dynamic_strings
= NULL
;
8576 if (dynamic_symbols
)
8578 free (dynamic_symbols
);
8579 dynamic_symbols
= NULL
;
8580 num_dynamic_syms
= 0;
8583 if (dynamic_syminfo
)
8585 free (dynamic_syminfo
);
8586 dynamic_syminfo
= NULL
;
8590 #ifdef SUPPORT_DISASSEMBLY
8591 /* Needed by the i386 disassembler. For extra credit, someone could
8592 fix this so that we insert symbolic addresses here, esp for GOT/PLT
8596 print_address (unsigned int addr
, FILE * outfile
)
8598 fprintf (outfile
,"0x%8.8x", addr
);
8601 /* Needed by the i386 disassembler. */
8603 db_task_printsym (unsigned int addr
)
8605 print_address (addr
, stderr
);
8614 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
8615 setlocale (LC_MESSAGES
, "");
8617 bindtextdomain (PACKAGE
, LOCALEDIR
);
8618 textdomain (PACKAGE
);
8620 parse_args (argc
, argv
);
8622 if (optind
< (argc
- 1))
8625 while (optind
< argc
)
8626 process_file (argv
[optind
++]);
8628 if (dump_sects
!= NULL
)