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@redhat.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
;
122 int do_debug_macinfo
;
127 /* A dynamic array of flags indicating which sections require dumping. */
128 char * dump_sects
= NULL
;
129 unsigned int num_dump_sects
= 0;
131 #define HEX_DUMP (1 << 0)
132 #define DISASS_DUMP (1 << 1)
133 #define DEBUG_DUMP (1 << 2)
135 /* How to rpint a vma value. */
136 typedef enum print_mode
148 /* Forward declarations for dumb compilers. */
149 static void print_vma
PARAMS ((bfd_vma
, print_mode
));
150 static bfd_vma (* byte_get
) PARAMS ((unsigned char *, int));
151 static bfd_vma byte_get_little_endian
PARAMS ((unsigned char *, int));
152 static bfd_vma byte_get_big_endian
PARAMS ((unsigned char *, int));
153 static const char * get_mips_dynamic_type
PARAMS ((unsigned long));
154 static const char * get_sparc64_dynamic_type
PARAMS ((unsigned long));
155 static const char * get_parisc_dynamic_type
PARAMS ((unsigned long));
156 static const char * get_dynamic_type
PARAMS ((unsigned long));
157 static int slurp_rela_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**, unsigned long *));
158 static int slurp_rel_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel
**, unsigned long *));
159 static int dump_relocations
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*, unsigned long, char *, int));
160 static char * get_file_type
PARAMS ((unsigned));
161 static char * get_machine_name
PARAMS ((unsigned));
162 static void decode_ARM_machine_flags
PARAMS ((unsigned, char []));
163 static char * get_machine_flags
PARAMS ((unsigned, unsigned));
164 static const char * get_mips_segment_type
PARAMS ((unsigned long));
165 static const char * get_parisc_segment_type
PARAMS ((unsigned long));
166 static const char * get_ia64_segment_type
PARAMS ((unsigned long));
167 static const char * get_segment_type
PARAMS ((unsigned long));
168 static const char * get_mips_section_type_name
PARAMS ((unsigned int));
169 static const char * get_parisc_section_type_name
PARAMS ((unsigned int));
170 static const char * get_ia64_section_type_name
PARAMS ((unsigned int));
171 static const char * get_section_type_name
PARAMS ((unsigned int));
172 static const char * get_symbol_binding
PARAMS ((unsigned int));
173 static const char * get_symbol_type
PARAMS ((unsigned int));
174 static const char * get_symbol_visibility
PARAMS ((unsigned int));
175 static const char * get_symbol_index_type
PARAMS ((unsigned int));
176 static const char * get_dynamic_flags
PARAMS ((bfd_vma
));
177 static void usage
PARAMS ((void));
178 static void parse_args
PARAMS ((int, char **));
179 static int process_file_header
PARAMS ((void));
180 static int process_program_headers
PARAMS ((FILE *));
181 static int process_section_headers
PARAMS ((FILE *));
182 static int process_unwind
PARAMS ((FILE *));
183 static void dynamic_segment_mips_val
PARAMS ((Elf_Internal_Dyn
*));
184 static void dynamic_segment_parisc_val
PARAMS ((Elf_Internal_Dyn
*));
185 static int process_dynamic_segment
PARAMS ((FILE *));
186 static int process_symbol_table
PARAMS ((FILE *));
187 static int process_syminfo
PARAMS ((FILE *));
188 static int process_section_contents
PARAMS ((FILE *));
189 static void process_mips_fpe_exception
PARAMS ((int));
190 static int process_mips_specific
PARAMS ((FILE *));
191 static int process_file
PARAMS ((char *));
192 static int process_relocs
PARAMS ((FILE *));
193 static int process_version_sections
PARAMS ((FILE *));
194 static char * get_ver_flags
PARAMS ((unsigned int));
195 static int get_32bit_section_headers
PARAMS ((FILE *));
196 static int get_64bit_section_headers
PARAMS ((FILE *));
197 static int get_32bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
198 static int get_64bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
199 static int get_file_header
PARAMS ((FILE *));
200 static Elf_Internal_Sym
* get_32bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
201 static Elf_Internal_Sym
* get_64bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
202 static const char * get_elf_section_flags
PARAMS ((bfd_vma
));
203 static int * get_dynamic_data
PARAMS ((FILE *, unsigned int));
204 static int get_32bit_dynamic_segment
PARAMS ((FILE *));
205 static int get_64bit_dynamic_segment
PARAMS ((FILE *));
206 #ifdef SUPPORT_DISASSEMBLY
207 static int disassemble_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
209 static int dump_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
210 static int display_debug_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
211 static int display_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
212 static int display_debug_not_supported
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
213 static int prescan_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
214 static int display_debug_lines
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
215 static int display_debug_pubnames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
216 static int display_debug_abbrev
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
217 static int display_debug_aranges
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
218 static int display_debug_frames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
219 static int display_debug_macinfo
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
220 static unsigned char * process_abbrev_section
PARAMS ((unsigned char *, unsigned char *));
221 static unsigned long read_leb128
PARAMS ((unsigned char *, int *, int));
222 static int process_extended_line_op
PARAMS ((unsigned char *, int, int));
223 static void reset_state_machine
PARAMS ((int));
224 static char * get_TAG_name
PARAMS ((unsigned long));
225 static char * get_AT_name
PARAMS ((unsigned long));
226 static char * get_FORM_name
PARAMS ((unsigned long));
227 static void free_abbrevs
PARAMS ((void));
228 static void add_abbrev
PARAMS ((unsigned long, unsigned long, int));
229 static void add_abbrev_attr
PARAMS ((unsigned long, unsigned long));
230 static unsigned char * read_and_display_attr
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
231 static unsigned char * display_block
PARAMS ((unsigned char *, unsigned long));
232 static void decode_location_expression
PARAMS ((unsigned char *, unsigned int, unsigned long));
233 static void request_dump
PARAMS ((unsigned int, char));
234 static const char * get_elf_class
PARAMS ((unsigned char));
235 static const char * get_data_encoding
PARAMS ((unsigned char));
236 static const char * get_osabi_name
PARAMS ((unsigned char));
237 static int guess_is_rela
PARAMS ((unsigned long));
238 static char * get_note_type
PARAMS ((unsigned int));
239 static int process_note
PARAMS ((Elf32_Internal_Note
*));
240 static int process_corefile_note_segment
PARAMS ((FILE *, bfd_vma
, bfd_vma
));
241 static int process_corefile_note_segments
PARAMS ((FILE *));
242 static int process_corefile_contents
PARAMS ((FILE *));
243 static int process_arch_specific
PARAMS ((FILE *));
245 typedef int Elf32_Word
;
253 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
254 ((X)->sh_name >= string_table_length \
255 ? "<corrupt>" : string_table + (X)->sh_name))
257 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
259 #define BYTE_GET(field) byte_get (field, sizeof (field))
261 /* If we can support a 64 bit data type then BFD64 should be defined
262 and sizeof (bfd_vma) == 8. In this case when translating from an
263 external 8 byte field to an internal field, we can assume that the
264 internal field is also 8 bytes wide and so we can extract all the data.
265 If, however, BFD64 is not defined, then we must assume that the
266 internal data structure only has 4 byte wide fields that are the
267 equivalent of the 8 byte wide external counterparts, and so we must
268 truncate the data. */
270 #define BYTE_GET8(field) byte_get (field, -8)
272 #define BYTE_GET8(field) byte_get (field, 8)
275 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
277 #define GET_ELF_SYMBOLS(file, offset, size) \
278 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
279 : get_64bit_elf_symbols (file, offset, size))
282 #ifdef ANSI_PROTOTYPES
284 error (const char * message
, ...)
288 fprintf (stderr
, _("%s: Error: "), program_name
);
289 va_start (args
, message
);
290 vfprintf (stderr
, message
, args
);
296 warn (const char * message
, ...)
300 fprintf (stderr
, _("%s: Warning: "), program_name
);
301 va_start (args
, message
);
302 vfprintf (stderr
, message
, args
);
314 fprintf (stderr
, _("%s: Error: "), program_name
);
316 message
= va_arg (args
, char *);
317 vfprintf (stderr
, message
, args
);
329 fprintf (stderr
, _("%s: Warning: "), program_name
);
331 message
= va_arg (args
, char *);
332 vfprintf (stderr
, message
, args
);
338 static PTR get_data
PARAMS ((PTR
, FILE *, long, size_t, const char *));
341 get_data (var
, file
, offset
, size
, reason
)
353 if (fseek (file
, offset
, SEEK_SET
))
355 error (_("Unable to seek to %x for %s\n"), offset
, reason
);
362 mvar
= (PTR
) malloc (size
);
366 error (_("Out of memory allocating %d bytes for %s\n"),
372 if (fread (mvar
, size
, 1, file
) != 1)
374 error (_("Unable to read in %d bytes of %s\n"), size
, reason
);
384 byte_get_little_endian (field
, size
)
385 unsigned char * field
;
394 return ((unsigned int) (field
[0]))
395 | (((unsigned int) (field
[1])) << 8);
399 /* We want to extract data from an 8 byte wide field and
400 place it into a 4 byte wide field. Since this is a little
401 endian source we can juts use the 4 byte extraction code. */
405 return ((unsigned long) (field
[0]))
406 | (((unsigned long) (field
[1])) << 8)
407 | (((unsigned long) (field
[2])) << 16)
408 | (((unsigned long) (field
[3])) << 24);
413 /* This is a special case, generated by the BYTE_GET8 macro.
414 It means that we are loading an 8 byte value from a field
415 in an external structure into an 8 byte value in a field
416 in an internal strcuture. */
417 return ((bfd_vma
) (field
[0]))
418 | (((bfd_vma
) (field
[1])) << 8)
419 | (((bfd_vma
) (field
[2])) << 16)
420 | (((bfd_vma
) (field
[3])) << 24)
421 | (((bfd_vma
) (field
[4])) << 32)
422 | (((bfd_vma
) (field
[5])) << 40)
423 | (((bfd_vma
) (field
[6])) << 48)
424 | (((bfd_vma
) (field
[7])) << 56);
427 error (_("Unhandled data length: %d\n"), size
);
432 /* Print a VMA value. */
434 print_vma (vma
, mode
)
444 case FULL_HEX
: printf ("0x"); /* drop through */
445 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
446 case PREFIX_HEX
: printf ("0x"); /* drop through */
447 case HEX
: printf ("%lx", (unsigned long) vma
); break;
448 case DEC
: printf ("%ld", (unsigned long) vma
); break;
449 case DEC_5
: printf ("%5ld", (long) vma
); break;
450 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
471 #if BFD_HOST_64BIT_LONG
474 if (_bfd_int64_high (vma
))
475 printf ("%lx%lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
477 printf ("%lx", _bfd_int64_low (vma
));
482 #if BFD_HOST_64BIT_LONG
485 if (_bfd_int64_high (vma
))
487 printf ("++%ld", _bfd_int64_low (vma
));
489 printf ("%ld", _bfd_int64_low (vma
));
494 #if BFD_HOST_64BIT_LONG
495 printf ("%5ld", vma
);
497 if (_bfd_int64_high (vma
))
499 printf ("++%ld", _bfd_int64_low (vma
));
501 printf ("%5ld", _bfd_int64_low (vma
));
506 #if BFD_HOST_64BIT_LONG
509 if (_bfd_int64_high (vma
))
511 printf ("++%lu", _bfd_int64_low (vma
));
513 printf ("%lu", _bfd_int64_low (vma
));
522 byte_get_big_endian (field
, size
)
523 unsigned char * field
;
532 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
535 return ((unsigned long) (field
[3]))
536 | (((unsigned long) (field
[2])) << 8)
537 | (((unsigned long) (field
[1])) << 16)
538 | (((unsigned long) (field
[0])) << 24);
542 /* Although we are extracing data from an 8 byte wide field, we
543 are returning only 4 bytes of data. */
544 return ((unsigned long) (field
[7]))
545 | (((unsigned long) (field
[6])) << 8)
546 | (((unsigned long) (field
[5])) << 16)
547 | (((unsigned long) (field
[4])) << 24);
551 /* This is a special case, generated by the BYTE_GET8 macro.
552 It means that we are loading an 8 byte value from a field
553 in an external structure into an 8 byte value in a field
554 in an internal strcuture. */
555 return ((bfd_vma
) (field
[7]))
556 | (((bfd_vma
) (field
[6])) << 8)
557 | (((bfd_vma
) (field
[5])) << 16)
558 | (((bfd_vma
) (field
[4])) << 24)
559 | (((bfd_vma
) (field
[3])) << 32)
560 | (((bfd_vma
) (field
[2])) << 40)
561 | (((bfd_vma
) (field
[1])) << 48)
562 | (((bfd_vma
) (field
[0])) << 56);
566 error (_("Unhandled data length: %d\n"), size
);
571 /* Guess the relocation size commonly used by the specific machines. */
574 guess_is_rela (e_machine
)
575 unsigned long e_machine
;
579 /* Targets that use REL relocations. */
590 /* Targets that use RELA relocations. */
598 case EM_CYGNUS_MN10200
:
599 case EM_CYGNUS_MN10300
:
632 warn (_("Don't know about relocations on this machine architecture\n"));
638 slurp_rela_relocs (file
, rel_offset
, rel_size
, relasp
, nrelasp
)
640 unsigned long rel_offset
;
641 unsigned long rel_size
;
642 Elf_Internal_Rela
**relasp
;
643 unsigned long *nrelasp
;
645 Elf_Internal_Rela
*relas
;
646 unsigned long nrelas
;
651 Elf32_External_Rela
* erelas
;
653 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
,
654 rel_size
, _("relocs"));
658 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
660 relas
= (Elf_Internal_Rela
*)
661 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
665 error(_("out of memory parsing relocs"));
669 for (i
= 0; i
< nrelas
; i
++)
671 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
672 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
673 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
680 Elf64_External_Rela
* erelas
;
682 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
,
683 rel_size
, _("relocs"));
687 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
689 relas
= (Elf_Internal_Rela
*)
690 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
694 error(_("out of memory parsing relocs"));
698 for (i
= 0; i
< nrelas
; i
++)
700 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
701 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
702 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
713 slurp_rel_relocs (file
, rel_offset
, rel_size
, relsp
, nrelsp
)
715 unsigned long rel_offset
;
716 unsigned long rel_size
;
717 Elf_Internal_Rel
**relsp
;
718 unsigned long *nrelsp
;
720 Elf_Internal_Rel
*rels
;
726 Elf32_External_Rel
* erels
;
728 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
,
729 rel_size
, _("relocs"));
733 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
735 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
739 error(_("out of memory parsing relocs"));
743 for (i
= 0; i
< nrels
; i
++)
745 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
746 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
753 Elf64_External_Rel
* erels
;
755 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
,
756 rel_size
, _("relocs"));
760 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
762 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
766 error(_("out of memory parsing relocs"));
770 for (i
= 0; i
< nrels
; i
++)
772 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
773 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
783 /* Display the contents of the relocation data found at the specified offset. */
785 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
787 unsigned long rel_offset
;
788 unsigned long rel_size
;
789 Elf_Internal_Sym
* symtab
;
795 Elf_Internal_Rel
* rels
;
796 Elf_Internal_Rela
* relas
;
799 if (is_rela
== UNKNOWN
)
800 is_rela
= guess_is_rela (elf_header
.e_machine
);
804 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &relas
, &rel_size
))
809 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
817 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
820 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
826 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
829 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
832 for (i
= 0; i
< rel_size
; i
++)
837 bfd_vma symtab_index
;
842 offset
= relas
[i
].r_offset
;
843 info
= relas
[i
].r_info
;
847 offset
= rels
[i
].r_offset
;
848 info
= rels
[i
].r_info
;
853 type
= ELF32_R_TYPE (info
);
854 symtab_index
= ELF32_R_SYM (info
);
858 if (elf_header
.e_machine
== EM_SPARCV9
)
859 type
= ELF64_R_TYPE_ID (info
);
861 type
= ELF64_R_TYPE (info
);
862 /* The #ifdef BFD64 below is to prevent a compile time warning.
863 We know that if we do not have a 64 bit data type that we
864 will never execute this code anyway. */
866 symtab_index
= ELF64_R_SYM (info
);
872 #ifdef _bfd_int64_low
873 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
875 printf ("%8.8lx %8.8lx ", offset
, info
);
880 #ifdef _bfd_int64_low
881 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
882 _bfd_int64_high (offset
),
883 _bfd_int64_low (offset
),
884 _bfd_int64_high (info
),
885 _bfd_int64_low (info
));
887 printf ("%16.16lx %16.16lx ", offset
, info
);
891 switch (elf_header
.e_machine
)
898 rtype
= elf_m32r_reloc_type (type
);
903 rtype
= elf_i386_reloc_type (type
);
907 rtype
= elf_m68k_reloc_type (type
);
911 rtype
= elf_i960_reloc_type (type
);
915 rtype
= elf_avr_reloc_type (type
);
922 rtype
= elf_sparc_reloc_type (type
);
926 rtype
= v850_reloc_type (type
);
930 rtype
= elf_d10v_reloc_type (type
);
934 rtype
= elf_d30v_reloc_type (type
);
938 rtype
= elf_sh_reloc_type (type
);
941 case EM_CYGNUS_MN10300
:
942 rtype
= elf_mn10300_reloc_type (type
);
945 case EM_CYGNUS_MN10200
:
946 rtype
= elf_mn10200_reloc_type (type
);
950 rtype
= elf_fr30_reloc_type (type
);
954 rtype
= elf_mcore_reloc_type (type
);
958 rtype
= elf_ppc_reloc_type (type
);
963 rtype
= elf_mips_reloc_type (type
);
967 rtype
= elf_alpha_reloc_type (type
);
971 rtype
= elf_arm_reloc_type (type
);
976 rtype
= elf_arc_reloc_type (type
);
980 rtype
= elf_hppa_reloc_type (type
);
984 rtype
= elf_pj_reloc_type (type
);
987 rtype
= elf_ia64_reloc_type (type
);
991 rtype
= elf_cris_reloc_type (type
);
995 rtype
= elf_i860_reloc_type (type
);
999 rtype
= elf_x86_64_reloc_type (type
);
1004 rtype
= elf_s390_reloc_type (type
);
1009 #ifdef _bfd_int64_low
1010 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type
));
1012 printf (_("unrecognised: %-7lx"), type
);
1015 printf ("%-21.21s", rtype
);
1019 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1020 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1023 Elf_Internal_Sym
* psym
;
1025 psym
= symtab
+ symtab_index
;
1028 print_vma (psym
->st_value
, LONG_HEX
);
1031 if (psym
->st_name
== 0)
1033 SECTION_NAME (section_headers
+ psym
->st_shndx
));
1034 else if (strtab
== NULL
)
1035 printf (_("<string table index %3ld>"), psym
->st_name
);
1037 printf ("%-25.25s", strtab
+ psym
->st_name
);
1040 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
1045 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
1046 print_vma (relas
[i
].r_addend
, LONG_HEX
);
1049 if (elf_header
.e_machine
== EM_SPARCV9
1050 && !strcmp (rtype
, "R_SPARC_OLO10"))
1051 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1065 get_mips_dynamic_type (type
)
1070 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1071 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1072 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1073 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1074 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1075 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1076 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1077 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1078 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1079 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1080 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1081 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1082 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1083 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1084 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1085 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1086 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1087 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1088 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1089 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1090 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1091 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1092 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1093 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1094 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1095 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1096 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1097 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1098 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1099 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1100 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1101 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1102 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1103 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1104 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1105 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1106 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1107 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1108 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1109 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1110 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1111 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1112 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1119 get_sparc64_dynamic_type (type
)
1124 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1131 get_parisc_dynamic_type (type
)
1136 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1137 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1138 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1139 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1140 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1141 case DT_HP_PREINIT
: return "HP_PREINIT";
1142 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1143 case DT_HP_NEEDED
: return "HP_NEEDED";
1144 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1145 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1146 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1147 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1148 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1155 get_dynamic_type (type
)
1158 static char buff
[32];
1162 case DT_NULL
: return "NULL";
1163 case DT_NEEDED
: return "NEEDED";
1164 case DT_PLTRELSZ
: return "PLTRELSZ";
1165 case DT_PLTGOT
: return "PLTGOT";
1166 case DT_HASH
: return "HASH";
1167 case DT_STRTAB
: return "STRTAB";
1168 case DT_SYMTAB
: return "SYMTAB";
1169 case DT_RELA
: return "RELA";
1170 case DT_RELASZ
: return "RELASZ";
1171 case DT_RELAENT
: return "RELAENT";
1172 case DT_STRSZ
: return "STRSZ";
1173 case DT_SYMENT
: return "SYMENT";
1174 case DT_INIT
: return "INIT";
1175 case DT_FINI
: return "FINI";
1176 case DT_SONAME
: return "SONAME";
1177 case DT_RPATH
: return "RPATH";
1178 case DT_SYMBOLIC
: return "SYMBOLIC";
1179 case DT_REL
: return "REL";
1180 case DT_RELSZ
: return "RELSZ";
1181 case DT_RELENT
: return "RELENT";
1182 case DT_PLTREL
: return "PLTREL";
1183 case DT_DEBUG
: return "DEBUG";
1184 case DT_TEXTREL
: return "TEXTREL";
1185 case DT_JMPREL
: return "JMPREL";
1186 case DT_BIND_NOW
: return "BIND_NOW";
1187 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1188 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1189 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1190 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1191 case DT_RUNPATH
: return "RUNPATH";
1192 case DT_FLAGS
: return "FLAGS";
1194 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1195 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1197 case DT_CHECKSUM
: return "CHECKSUM";
1198 case DT_PLTPADSZ
: return "PLTPADSZ";
1199 case DT_MOVEENT
: return "MOVEENT";
1200 case DT_MOVESZ
: return "MOVESZ";
1201 case DT_FEATURE
: return "FEATURE";
1202 case DT_POSFLAG_1
: return "POSFLAG_1";
1203 case DT_SYMINSZ
: return "SYMINSZ";
1204 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1206 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1207 case DT_CONFIG
: return "CONFIG";
1208 case DT_DEPAUDIT
: return "DEPAUDIT";
1209 case DT_AUDIT
: return "AUDIT";
1210 case DT_PLTPAD
: return "PLTPAD";
1211 case DT_MOVETAB
: return "MOVETAB";
1212 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1214 case DT_VERSYM
: return "VERSYM";
1216 case DT_RELACOUNT
: return "RELACOUNT";
1217 case DT_RELCOUNT
: return "RELCOUNT";
1218 case DT_FLAGS_1
: return "FLAGS_1";
1219 case DT_VERDEF
: return "VERDEF";
1220 case DT_VERDEFNUM
: return "VERDEFNUM";
1221 case DT_VERNEED
: return "VERNEED";
1222 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1224 case DT_AUXILIARY
: return "AUXILIARY";
1225 case DT_USED
: return "USED";
1226 case DT_FILTER
: return "FILTER";
1229 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1231 const char * result
;
1233 switch (elf_header
.e_machine
)
1236 case EM_MIPS_RS3_LE
:
1237 result
= get_mips_dynamic_type (type
);
1240 result
= get_sparc64_dynamic_type (type
);
1250 sprintf (buff
, _("Processor Specific: %lx"), type
);
1252 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1254 const char * result
;
1256 switch (elf_header
.e_machine
)
1259 result
= get_parisc_dynamic_type (type
);
1269 sprintf (buff
, _("Operating System specific: %lx"), type
);
1272 sprintf (buff
, _("<unknown>: %lx"), type
);
1279 get_file_type (e_type
)
1282 static char buff
[32];
1286 case ET_NONE
: return _("NONE (None)");
1287 case ET_REL
: return _("REL (Relocatable file)");
1288 case ET_EXEC
: return _("EXEC (Executable file)");
1289 case ET_DYN
: return _("DYN (Shared object file)");
1290 case ET_CORE
: return _("CORE (Core file)");
1293 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1294 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1295 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1296 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1298 sprintf (buff
, _("<unknown>: %x"), e_type
);
1304 get_machine_name (e_machine
)
1307 static char buff
[64]; /* XXX */
1311 case EM_NONE
: return _("None");
1312 case EM_M32
: return "WE32100";
1313 case EM_SPARC
: return "Sparc";
1314 case EM_386
: return "Intel 80386";
1315 case EM_68K
: return "MC68000";
1316 case EM_88K
: return "MC88000";
1317 case EM_486
: return "Intel 80486";
1318 case EM_860
: return "Intel 80860";
1319 case EM_MIPS
: return "MIPS R3000";
1320 case EM_S370
: return "IBM System/370";
1321 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1322 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1323 case EM_PARISC
: return "HPPA";
1324 case EM_PPC_OLD
: return "Power PC (old)";
1325 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1326 case EM_960
: return "Intel 90860";
1327 case EM_PPC
: return "PowerPC";
1328 case EM_V800
: return "NEC V800";
1329 case EM_FR20
: return "Fujitsu FR20";
1330 case EM_RH32
: return "TRW RH32";
1331 case EM_MCORE
: return "MCORE";
1332 case EM_ARM
: return "ARM";
1333 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1334 case EM_SH
: return "Hitachi SH";
1335 case EM_SPARCV9
: return "Sparc v9";
1336 case EM_TRICORE
: return "Siemens Tricore";
1337 case EM_ARC
: return "ARC";
1338 case EM_H8_300
: return "Hitachi H8/300";
1339 case EM_H8_300H
: return "Hitachi H8/300H";
1340 case EM_H8S
: return "Hitachi H8S";
1341 case EM_H8_500
: return "Hitachi H8/500";
1342 case EM_IA_64
: return "Intel IA-64";
1343 case EM_MIPS_X
: return "Stanford MIPS-X";
1344 case EM_COLDFIRE
: return "Motorola Coldfire";
1345 case EM_68HC12
: return "Motorola M68HC12";
1346 case EM_ALPHA
: return "Alpha";
1347 case EM_CYGNUS_D10V
: return "d10v";
1348 case EM_CYGNUS_D30V
: return "d30v";
1349 case EM_CYGNUS_ARC
: return "ARC";
1350 case EM_CYGNUS_M32R
: return "Mitsubishi M32r";
1351 case EM_CYGNUS_V850
: return "NEC v850";
1352 case EM_CYGNUS_MN10300
: return "mn10300";
1353 case EM_CYGNUS_MN10200
: return "mn10200";
1354 case EM_CYGNUS_FR30
: return "Fujitsu FR30";
1355 case EM_PJ
: return "picoJava";
1356 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1357 case EM_PCP
: return "Siemens PCP";
1358 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1359 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1360 case EM_STARCORE
: return "Motorola Star*Core processor";
1361 case EM_ME16
: return "Toyota ME16 processor";
1362 case EM_ST100
: return "STMicroelectronics ST100 processor";
1363 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1364 case EM_FX66
: return "Siemens FX66 microcontroller";
1365 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1366 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1367 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1368 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1369 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1370 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1371 case EM_SVX
: return "Silicon Graphics SVx";
1372 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1373 case EM_VAX
: return "Digital VAX";
1374 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1375 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1376 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1377 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1378 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1379 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1380 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1381 case EM_PRISM
: return "SiTera Prism";
1382 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1384 case EM_S390
: return "IBM S/390";
1386 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1392 decode_ARM_machine_flags (e_flags
, buf
)
1399 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1400 e_flags
&= ~ EF_ARM_EABIMASK
;
1402 /* Handle "generic" ARM flags. */
1403 if (e_flags
& EF_ARM_RELEXEC
)
1405 strcat (buf
, ", relocatable executable");
1406 e_flags
&= ~ EF_ARM_RELEXEC
;
1409 if (e_flags
& EF_ARM_HASENTRY
)
1411 strcat (buf
, ", has entry point");
1412 e_flags
&= ~ EF_ARM_HASENTRY
;
1415 /* Now handle EABI specific flags. */
1419 strcat (buf
, ", <unrecognised EABI>");
1424 case EF_ARM_EABI_VER1
:
1425 strcat (buf
, ", Version1 EABI");
1430 /* Process flags one bit at a time. */
1431 flag
= e_flags
& - e_flags
;
1436 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1437 strcat (buf
, ", sorted symbol tables");
1447 case EF_ARM_EABI_VER2
:
1448 strcat (buf
, ", Version2 EABI");
1453 /* Process flags one bit at a time. */
1454 flag
= e_flags
& - e_flags
;
1459 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1460 strcat (buf
, ", sorted symbol tables");
1463 case EF_ARM_DYNSYMSUSESEGIDX
:
1464 strcat (buf
, ", dynamic symbols use segment index");
1467 case EF_ARM_MAPSYMSFIRST
:
1468 strcat (buf
, ", mapping symbols precede others");
1478 case EF_ARM_EABI_UNKNOWN
:
1479 strcat (buf
, ", GNU EABI");
1484 /* Process flags one bit at a time. */
1485 flag
= e_flags
& - e_flags
;
1490 case EF_ARM_INTERWORK
:
1491 strcat (buf
, ", interworking enabled");
1494 case EF_ARM_APCS_26
:
1495 strcat (buf
, ", uses APCS/26");
1498 case EF_ARM_APCS_FLOAT
:
1499 strcat (buf
, ", uses APCS/float");
1503 strcat (buf
, ", position independent");
1507 strcat (buf
, ", 8 bit structure alignment");
1510 case EF_ARM_NEW_ABI
:
1511 strcat (buf
, ", uses new ABI");
1514 case EF_ARM_OLD_ABI
:
1515 strcat (buf
, ", uses old ABI");
1518 case EF_ARM_SOFT_FLOAT
:
1519 strcat (buf
, ", software FP");
1530 strcat (buf
,", <unknown>");
1534 get_machine_flags (e_flags
, e_machine
)
1538 static char buf
[1024];
1550 decode_ARM_machine_flags (e_flags
, buf
);
1554 if (e_flags
& EF_CPU32
)
1555 strcat (buf
, ", cpu32");
1559 if (e_flags
& EF_PPC_EMB
)
1560 strcat (buf
, ", emb");
1562 if (e_flags
& EF_PPC_RELOCATABLE
)
1563 strcat (buf
, ", relocatable");
1565 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1566 strcat (buf
, ", relocatable-lib");
1569 case EM_CYGNUS_V850
:
1570 switch (e_flags
& EF_V850_ARCH
)
1573 strcat (buf
, ", v850e");
1576 strcat (buf
, ", v850ea");
1579 strcat (buf
, ", v850");
1582 strcat (buf
, ", unknown v850 architecture variant");
1587 case EM_CYGNUS_M32R
:
1588 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1589 strcat (buf
, ", m32r");
1594 case EM_MIPS_RS3_LE
:
1595 if (e_flags
& EF_MIPS_NOREORDER
)
1596 strcat (buf
, ", noreorder");
1598 if (e_flags
& EF_MIPS_PIC
)
1599 strcat (buf
, ", pic");
1601 if (e_flags
& EF_MIPS_CPIC
)
1602 strcat (buf
, ", cpic");
1604 if (e_flags
& EF_MIPS_ABI2
)
1605 strcat (buf
, ", abi2");
1607 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_1
)
1608 strcat (buf
, ", mips1");
1610 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_2
)
1611 strcat (buf
, ", mips2");
1613 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_3
)
1614 strcat (buf
, ", mips3");
1616 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_4
)
1617 strcat (buf
, ", mips4");
1619 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_5
)
1620 strcat (buf
, ", mips5");
1622 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_32
)
1623 strcat (buf
, ", mips32");
1625 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_64
)
1626 strcat (buf
, ", mips64");
1628 switch ((e_flags
& EF_MIPS_MACH
))
1630 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1631 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1632 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1633 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1634 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1635 case E_MIPS_MACH_MIPS32_4K
: strcat (buf
, ", mips32-4k"); break;
1636 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1637 default: strcat (buf
, " UNKNOWN"); break;
1642 if (e_flags
& EF_SPARC_32PLUS
)
1643 strcat (buf
, ", v8+");
1645 if (e_flags
& EF_SPARC_SUN_US1
)
1646 strcat (buf
, ", ultrasparcI");
1648 if (e_flags
& EF_SPARC_SUN_US3
)
1649 strcat (buf
, ", ultrasparcIII");
1651 if (e_flags
& EF_SPARC_HAL_R1
)
1652 strcat (buf
, ", halr1");
1654 if (e_flags
& EF_SPARC_LEDATA
)
1655 strcat (buf
, ", ledata");
1657 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1658 strcat (buf
, ", tso");
1660 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1661 strcat (buf
, ", pso");
1663 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1664 strcat (buf
, ", rmo");
1668 switch (e_flags
& EF_PARISC_ARCH
)
1670 case EFA_PARISC_1_0
:
1671 strcpy (buf
, ", PA-RISC 1.0");
1673 case EFA_PARISC_1_1
:
1674 strcpy (buf
, ", PA-RISC 1.1");
1676 case EFA_PARISC_2_0
:
1677 strcpy (buf
, ", PA-RISC 2.0");
1682 if (e_flags
& EF_PARISC_TRAPNIL
)
1683 strcat (buf
, ", trapnil");
1684 if (e_flags
& EF_PARISC_EXT
)
1685 strcat (buf
, ", ext");
1686 if (e_flags
& EF_PARISC_LSB
)
1687 strcat (buf
, ", lsb");
1688 if (e_flags
& EF_PARISC_WIDE
)
1689 strcat (buf
, ", wide");
1690 if (e_flags
& EF_PARISC_NO_KABP
)
1691 strcat (buf
, ", no kabp");
1692 if (e_flags
& EF_PARISC_LAZYSWAP
)
1693 strcat (buf
, ", lazyswap");
1697 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1698 strcat (buf
, ", new calling convention");
1700 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1701 strcat (buf
, ", gnu calling convention");
1705 if ((e_flags
& EF_IA_64_ABI64
))
1706 strcat (buf
, ", 64-bit");
1708 strcat (buf
, ", 32-bit");
1709 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1710 strcat (buf
, ", reduced fp model");
1711 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1712 strcat (buf
, ", no function descriptors, constant gp");
1713 else if ((e_flags
& EF_IA_64_CONS_GP
))
1714 strcat (buf
, ", constant gp");
1715 if ((e_flags
& EF_IA_64_ABSOLUTE
))
1716 strcat (buf
, ", absolute");
1725 get_mips_segment_type (type
)
1730 case PT_MIPS_REGINFO
:
1732 case PT_MIPS_RTPROC
:
1734 case PT_MIPS_OPTIONS
:
1744 get_parisc_segment_type (type
)
1749 case PT_HP_TLS
: return "HP_TLS";
1750 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1751 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1752 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1753 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1754 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1755 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1756 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1757 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1758 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1759 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1760 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1761 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1762 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1771 get_ia64_segment_type (type
)
1776 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
1777 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
1786 get_segment_type (p_type
)
1787 unsigned long p_type
;
1789 static char buff
[32];
1793 case PT_NULL
: return "NULL";
1794 case PT_LOAD
: return "LOAD";
1795 case PT_DYNAMIC
: return "DYNAMIC";
1796 case PT_INTERP
: return "INTERP";
1797 case PT_NOTE
: return "NOTE";
1798 case PT_SHLIB
: return "SHLIB";
1799 case PT_PHDR
: return "PHDR";
1802 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1804 const char * result
;
1806 switch (elf_header
.e_machine
)
1809 case EM_MIPS_RS3_LE
:
1810 result
= get_mips_segment_type (p_type
);
1813 result
= get_parisc_segment_type (p_type
);
1816 result
= get_ia64_segment_type (p_type
);
1826 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1828 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1830 const char * result
;
1832 switch (elf_header
.e_machine
)
1835 result
= get_parisc_segment_type (p_type
);
1845 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1848 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1855 get_mips_section_type_name (sh_type
)
1856 unsigned int sh_type
;
1860 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1861 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1862 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1863 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1864 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1865 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1866 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1867 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1868 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1869 case SHT_MIPS_RELD
: return "MIPS_RELD";
1870 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
1871 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
1872 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1873 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
1874 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
1875 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
1876 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
1877 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
1878 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
1879 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
1880 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
1881 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
1882 case SHT_MIPS_LINE
: return "MIPS_LINE";
1883 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
1884 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
1885 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
1886 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
1887 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
1888 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
1889 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1890 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
1891 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
1892 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
1893 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
1894 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
1895 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
1896 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
1897 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
1898 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
1906 get_parisc_section_type_name (sh_type
)
1907 unsigned int sh_type
;
1911 case SHT_PARISC_EXT
: return "PARISC_EXT";
1912 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
1913 case SHT_PARISC_DOC
: return "PARISC_DOC";
1921 get_ia64_section_type_name (sh_type
)
1922 unsigned int sh_type
;
1926 case SHT_IA_64_EXT
: return "IA_64_EXT";
1927 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
1935 get_section_type_name (sh_type
)
1936 unsigned int sh_type
;
1938 static char buff
[32];
1942 case SHT_NULL
: return "NULL";
1943 case SHT_PROGBITS
: return "PROGBITS";
1944 case SHT_SYMTAB
: return "SYMTAB";
1945 case SHT_STRTAB
: return "STRTAB";
1946 case SHT_RELA
: return "RELA";
1947 case SHT_HASH
: return "HASH";
1948 case SHT_DYNAMIC
: return "DYNAMIC";
1949 case SHT_NOTE
: return "NOTE";
1950 case SHT_NOBITS
: return "NOBITS";
1951 case SHT_REL
: return "REL";
1952 case SHT_SHLIB
: return "SHLIB";
1953 case SHT_DYNSYM
: return "DYNSYM";
1954 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
1955 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
1956 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1957 case SHT_GROUP
: return "GROUP";
1958 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
1959 case SHT_GNU_verdef
: return "VERDEF";
1960 case SHT_GNU_verneed
: return "VERNEED";
1961 case SHT_GNU_versym
: return "VERSYM";
1962 case 0x6ffffff0: return "VERSYM";
1963 case 0x6ffffffc: return "VERDEF";
1964 case 0x7ffffffd: return "AUXILIARY";
1965 case 0x7fffffff: return "FILTER";
1968 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
1970 const char * result
;
1972 switch (elf_header
.e_machine
)
1975 case EM_MIPS_RS3_LE
:
1976 result
= get_mips_section_type_name (sh_type
);
1979 result
= get_parisc_section_type_name (sh_type
);
1982 result
= get_ia64_section_type_name (sh_type
);
1992 sprintf (buff
, "SHT_LOPROC+%x", sh_type
- SHT_LOPROC
);
1994 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
1995 sprintf (buff
, "SHT_LOOS+%x", sh_type
- SHT_LOOS
);
1996 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
1997 sprintf (buff
, "SHT_LOUSER+%x", sh_type
- SHT_LOUSER
);
1999 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2005 struct option options
[] =
2007 {"all", no_argument
, 0, 'a'},
2008 {"file-header", no_argument
, 0, 'h'},
2009 {"program-headers", no_argument
, 0, 'l'},
2010 {"headers", no_argument
, 0, 'e'},
2011 {"histogram", no_argument
, 0, 'I'},
2012 {"segments", no_argument
, 0, 'l'},
2013 {"sections", no_argument
, 0, 'S'},
2014 {"section-headers", no_argument
, 0, 'S'},
2015 {"symbols", no_argument
, 0, 's'},
2016 {"syms", no_argument
, 0, 's'},
2017 {"relocs", no_argument
, 0, 'r'},
2018 {"notes", no_argument
, 0, 'n'},
2019 {"dynamic", no_argument
, 0, 'd'},
2020 {"arch-specific", no_argument
, 0, 'A'},
2021 {"version-info", no_argument
, 0, 'V'},
2022 {"use-dynamic", no_argument
, 0, 'D'},
2023 {"hex-dump", required_argument
, 0, 'x'},
2024 {"debug-dump", optional_argument
, 0, 'w'},
2025 {"unwind", no_argument
, 0, 'u'},
2026 #ifdef SUPPORT_DISASSEMBLY
2027 {"instruction-dump", required_argument
, 0, 'i'},
2030 {"version", no_argument
, 0, 'v'},
2031 {"help", no_argument
, 0, 'H'},
2032 {0, no_argument
, 0, 0}
2038 fprintf (stdout
, _("Usage: readelf {options} elf-file(s)\n"));
2039 fprintf (stdout
, _(" Options are:\n"));
2040 fprintf (stdout
, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2041 fprintf (stdout
, _(" -h or --file-header Display the ELF file header\n"));
2042 fprintf (stdout
, _(" -l or --program-headers or --segments\n"));
2043 fprintf (stdout
, _(" Display the program headers\n"));
2044 fprintf (stdout
, _(" -S or --section-headers or --sections\n"));
2045 fprintf (stdout
, _(" Display the sections' header\n"));
2046 fprintf (stdout
, _(" -e or --headers Equivalent to: -h -l -S\n"));
2047 fprintf (stdout
, _(" -s or --syms or --symbols Display the symbol table\n"));
2048 fprintf (stdout
, _(" -n or --notes Display the core notes (if present)\n"));
2049 fprintf (stdout
, _(" -r or --relocs Display the relocations (if present)\n"));
2050 fprintf (stdout
, _(" -u or --unwind Display the unwind info (if present)\n"));
2051 fprintf (stdout
, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2052 fprintf (stdout
, _(" -V or --version-info Display the version sections (if present)\n"));
2053 fprintf (stdout
, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2054 fprintf (stdout
, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2055 fprintf (stdout
, _(" -x <number> or --hex-dump=<number>\n"));
2056 fprintf (stdout
, _(" Dump the contents of section <number>\n"));
2057 fprintf (stdout
, _(" -w[liaprmf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames]\n"));
2058 fprintf (stdout
, _(" Display the contents of DWARF2 debug sections\n"));
2059 #ifdef SUPPORT_DISASSEMBLY
2060 fprintf (stdout
, _(" -i <number> or --instruction-dump=<number>\n"));
2061 fprintf (stdout
, _(" Disassemble the contents of section <number>\n"));
2063 fprintf (stdout
, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2064 fprintf (stdout
, _(" -v or --version Display the version number of readelf\n"));
2065 fprintf (stdout
, _(" -H or --help Display this information\n"));
2066 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2072 request_dump (section
, type
)
2073 unsigned int section
;
2076 if (section
>= num_dump_sects
)
2078 char * new_dump_sects
;
2080 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2082 if (new_dump_sects
== NULL
)
2083 error (_("Out of memory allocating dump request table."));
2086 /* Copy current flag settings. */
2087 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2091 dump_sects
= new_dump_sects
;
2092 num_dump_sects
= section
+ 1;
2097 dump_sects
[section
] |= type
;
2103 parse_args (argc
, argv
)
2112 while ((c
= getopt_long
2113 (argc
, argv
, "ersuahnldSDAIw::x:i:vV", options
, NULL
)) != EOF
)
2149 do_using_dynamic
++;
2180 section
= strtoul (optarg
, & cp
, 0);
2181 if (! * cp
&& section
>= 0)
2183 request_dump (section
, HEX_DUMP
);
2203 do_debug_abbrevs
= 1;
2213 do_debug_pubnames
= 1;
2218 do_debug_aranges
= 1;
2222 do_debug_frames_interp
= 1;
2224 do_debug_frames
= 1;
2229 do_debug_macinfo
= 1;
2233 warn (_("Unrecognised debug option '%s'\n"), optarg
);
2238 #ifdef SUPPORT_DISASSEMBLY
2241 section
= strtoul (optarg
, & cp
, 0);
2242 if (! * cp
&& section
>= 0)
2244 request_dump (section
, DISASS_DUMP
);
2250 print_version (program_name
);
2257 /* xgettext:c-format */
2258 error (_("Invalid option '-%c'\n"), c
);
2265 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2266 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2267 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2271 warn (_("Nothing to do.\n"));
2277 get_elf_class (elf_class
)
2278 unsigned char elf_class
;
2280 static char buff
[32];
2284 case ELFCLASSNONE
: return _("none");
2285 case ELFCLASS32
: return _("ELF32");
2286 case ELFCLASS64
: return _("ELF64");
2288 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2294 get_data_encoding (encoding
)
2295 unsigned char encoding
;
2297 static char buff
[32];
2301 case ELFDATANONE
: return _("none");
2302 case ELFDATA2LSB
: return _("2's complement, little endian");
2303 case ELFDATA2MSB
: return _("2's complement, big endian");
2305 sprintf (buff
, _("<unknown: %x>"), encoding
);
2311 get_osabi_name (osabi
)
2312 unsigned char osabi
;
2314 static char buff
[32];
2318 case ELFOSABI_NONE
: return _("UNIX - System V");
2319 case ELFOSABI_HPUX
: return _("UNIX - HP-UX");
2320 case ELFOSABI_NETBSD
: return _("UNIX - NetBSD");
2321 case ELFOSABI_LINUX
: return _("UNIX - Linux");
2322 case ELFOSABI_HURD
: return _("GNU/Hurd");
2323 case ELFOSABI_SOLARIS
: return _("UNIX - Solaris");
2324 case ELFOSABI_AIX
: return _("UNIX - AIX");
2325 case ELFOSABI_IRIX
: return _("UNIX - IRIX");
2326 case ELFOSABI_FREEBSD
: return _("UNIX - FreeBSD");
2327 case ELFOSABI_TRU64
: return _("UNIX - TRU64");
2328 case ELFOSABI_MODESTO
: return _("Novell - Modesto");
2329 case ELFOSABI_OPENBSD
: return _("UNIX - OpenBSD");
2330 case ELFOSABI_STANDALONE
: return _("Standalone App");
2331 case ELFOSABI_ARM
: return _("ARM");
2333 sprintf (buff
, _("<unknown: %x>"), osabi
);
2338 /* Decode the data held in 'elf_header'. */
2340 process_file_header ()
2342 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2343 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2344 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2345 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2348 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2356 printf (_("ELF Header:\n"));
2357 printf (_(" Magic: "));
2358 for (i
= 0; i
< EI_NIDENT
; i
++)
2359 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2361 printf (_(" Class: %s\n"),
2362 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2363 printf (_(" Data: %s\n"),
2364 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2365 printf (_(" Version: %d %s\n"),
2366 elf_header
.e_ident
[EI_VERSION
],
2367 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2369 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2372 printf (_(" OS/ABI: %s\n"),
2373 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2374 printf (_(" ABI Version: %d\n"),
2375 elf_header
.e_ident
[EI_ABIVERSION
]);
2376 printf (_(" Type: %s\n"),
2377 get_file_type (elf_header
.e_type
));
2378 printf (_(" Machine: %s\n"),
2379 get_machine_name (elf_header
.e_machine
));
2380 printf (_(" Version: 0x%lx\n"),
2381 (unsigned long) elf_header
.e_version
);
2383 printf (_(" Entry point address: "));
2384 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2385 printf (_("\n Start of program headers: "));
2386 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2387 printf (_(" (bytes into file)\n Start of section headers: "));
2388 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2389 printf (_(" (bytes into file)\n"));
2391 printf (_(" Flags: 0x%lx%s\n"),
2392 (unsigned long) elf_header
.e_flags
,
2393 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2394 printf (_(" Size of this header: %ld (bytes)\n"),
2395 (long) elf_header
.e_ehsize
);
2396 printf (_(" Size of program headers: %ld (bytes)\n"),
2397 (long) elf_header
.e_phentsize
);
2398 printf (_(" Number of program headers: %ld\n"),
2399 (long) elf_header
.e_phnum
);
2400 printf (_(" Size of section headers: %ld (bytes)\n"),
2401 (long) elf_header
.e_shentsize
);
2402 printf (_(" Number of section headers: %ld\n"),
2403 (long) elf_header
.e_shnum
);
2404 printf (_(" Section header string table index: %ld\n"),
2405 (long) elf_header
.e_shstrndx
);
2413 get_32bit_program_headers (file
, program_headers
)
2415 Elf_Internal_Phdr
* program_headers
;
2417 Elf32_External_Phdr
* phdrs
;
2418 Elf32_External_Phdr
* external
;
2419 Elf32_Internal_Phdr
* internal
;
2422 phdrs
= ((Elf32_External_Phdr
*)
2423 get_data (NULL
, file
, elf_header
.e_phoff
,
2424 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2425 _("program headers")));
2429 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2430 i
< elf_header
.e_phnum
;
2431 i
++, internal
++, external
++)
2433 internal
->p_type
= BYTE_GET (external
->p_type
);
2434 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2435 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2436 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2437 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2438 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2439 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2440 internal
->p_align
= BYTE_GET (external
->p_align
);
2449 get_64bit_program_headers (file
, program_headers
)
2451 Elf_Internal_Phdr
* program_headers
;
2453 Elf64_External_Phdr
* phdrs
;
2454 Elf64_External_Phdr
* external
;
2455 Elf64_Internal_Phdr
* internal
;
2458 phdrs
= ((Elf64_External_Phdr
*)
2459 get_data (NULL
, file
, elf_header
.e_phoff
,
2460 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2461 _("program headers")));
2465 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2466 i
< elf_header
.e_phnum
;
2467 i
++, internal
++, external
++)
2469 internal
->p_type
= BYTE_GET (external
->p_type
);
2470 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2471 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2472 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2473 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2474 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2475 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2476 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2485 process_program_headers (file
)
2488 Elf_Internal_Phdr
* program_headers
;
2489 Elf_Internal_Phdr
* segment
;
2492 if (elf_header
.e_phnum
== 0)
2495 printf (_("\nThere are no program headers in this file.\n"));
2499 if (do_segments
&& !do_header
)
2501 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2502 printf (_("Entry point "));
2503 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2504 printf (_("\nThere are %d program headers, starting at offset "),
2505 elf_header
.e_phnum
);
2506 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2510 program_headers
= (Elf_Internal_Phdr
*) malloc
2511 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2513 if (program_headers
== NULL
)
2515 error (_("Out of memory\n"));
2520 i
= get_32bit_program_headers (file
, program_headers
);
2522 i
= get_64bit_program_headers (file
, program_headers
);
2526 free (program_headers
);
2533 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2537 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2541 (_(" Type Offset VirtAddr PhysAddr\n"));
2543 (_(" FileSiz MemSiz Flags Align\n"));
2551 for (i
= 0, segment
= program_headers
;
2552 i
< elf_header
.e_phnum
;
2557 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2561 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2562 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2563 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2564 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2565 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2567 (segment
->p_flags
& PF_R
? 'R' : ' '),
2568 (segment
->p_flags
& PF_W
? 'W' : ' '),
2569 (segment
->p_flags
& PF_X
? 'E' : ' '));
2570 printf ("%#lx", (unsigned long) segment
->p_align
);
2574 print_vma (segment
->p_offset
, FULL_HEX
);
2576 print_vma (segment
->p_vaddr
, FULL_HEX
);
2578 print_vma (segment
->p_paddr
, FULL_HEX
);
2580 print_vma (segment
->p_filesz
, FULL_HEX
);
2582 print_vma (segment
->p_memsz
, FULL_HEX
);
2584 (segment
->p_flags
& PF_R
? 'R' : ' '),
2585 (segment
->p_flags
& PF_W
? 'W' : ' '),
2586 (segment
->p_flags
& PF_X
? 'E' : ' '));
2587 print_vma (segment
->p_align
, HEX
);
2591 switch (segment
->p_type
)
2595 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2596 - (segment
->p_offset
& 0xfffff000);
2601 error (_("more than one dynamic segment\n"));
2603 dynamic_addr
= segment
->p_offset
;
2604 dynamic_size
= segment
->p_filesz
;
2608 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2609 error (_("Unable to find program interpreter name\n"));
2612 program_interpreter
[0] = 0;
2613 fscanf (file
, "%63s", program_interpreter
);
2616 printf (_("\n [Requesting program interpreter: %s]"),
2617 program_interpreter
);
2623 putc ('\n', stdout
);
2632 if (do_segments
&& section_headers
!= NULL
)
2634 printf (_("\n Section to Segment mapping:\n"));
2635 printf (_(" Segment Sections...\n"));
2637 assert (string_table
!= NULL
);
2639 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2642 Elf_Internal_Shdr
* section
;
2644 segment
= program_headers
+ i
;
2645 section
= section_headers
;
2647 printf (" %2.2d ", i
);
2649 for (j
= 0; j
< elf_header
.e_shnum
; j
++, section
++)
2651 if (section
->sh_size
> 0
2652 /* Compare allocated sections by VMA, unallocated
2653 sections by file offset. */
2654 && (section
->sh_flags
& SHF_ALLOC
2655 ? (section
->sh_addr
>= segment
->p_vaddr
2656 && section
->sh_addr
+ section
->sh_size
2657 <= segment
->p_vaddr
+ segment
->p_memsz
)
2658 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2659 && (section
->sh_offset
+ section
->sh_size
2660 <= segment
->p_offset
+ segment
->p_filesz
))))
2661 printf ("%s ", SECTION_NAME (section
));
2668 free (program_headers
);
2675 get_32bit_section_headers (file
)
2678 Elf32_External_Shdr
* shdrs
;
2679 Elf32_Internal_Shdr
* internal
;
2682 shdrs
= ((Elf32_External_Shdr
*)
2683 get_data (NULL
, file
, elf_header
.e_shoff
,
2684 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2685 _("section headers")));
2689 section_headers
= (Elf_Internal_Shdr
*) malloc
2690 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2692 if (section_headers
== NULL
)
2694 error (_("Out of memory\n"));
2698 for (i
= 0, internal
= section_headers
;
2699 i
< elf_header
.e_shnum
;
2702 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2703 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2704 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2705 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2706 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2707 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2708 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2709 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2710 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2711 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2720 get_64bit_section_headers (file
)
2723 Elf64_External_Shdr
* shdrs
;
2724 Elf64_Internal_Shdr
* internal
;
2727 shdrs
= ((Elf64_External_Shdr
*)
2728 get_data (NULL
, file
, elf_header
.e_shoff
,
2729 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2730 _("section headers")));
2734 section_headers
= (Elf_Internal_Shdr
*) malloc
2735 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2737 if (section_headers
== NULL
)
2739 error (_("Out of memory\n"));
2743 for (i
= 0, internal
= section_headers
;
2744 i
< elf_header
.e_shnum
;
2747 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2748 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2749 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2750 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2751 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2752 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2753 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2754 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2755 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2756 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2764 static Elf_Internal_Sym
*
2765 get_32bit_elf_symbols (file
, offset
, number
)
2767 unsigned long offset
;
2768 unsigned long number
;
2770 Elf32_External_Sym
* esyms
;
2771 Elf_Internal_Sym
* isyms
;
2772 Elf_Internal_Sym
* psym
;
2775 esyms
= ((Elf32_External_Sym
*)
2776 get_data (NULL
, file
, offset
,
2777 number
* sizeof (Elf32_External_Sym
), _("symbols")));
2781 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2785 error (_("Out of memory\n"));
2791 for (j
= 0, psym
= isyms
;
2795 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2796 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
2797 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
2798 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2799 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2800 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2808 static Elf_Internal_Sym
*
2809 get_64bit_elf_symbols (file
, offset
, number
)
2811 unsigned long offset
;
2812 unsigned long number
;
2814 Elf64_External_Sym
* esyms
;
2815 Elf_Internal_Sym
* isyms
;
2816 Elf_Internal_Sym
* psym
;
2819 esyms
= ((Elf64_External_Sym
*)
2820 get_data (NULL
, file
, offset
,
2821 number
* sizeof (Elf64_External_Sym
), _("symbols")));
2825 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2829 error (_("Out of memory\n"));
2835 for (j
= 0, psym
= isyms
;
2839 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2840 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2841 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2842 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2843 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
2844 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
2853 get_elf_section_flags (sh_flags
)
2856 static char buff
[32];
2864 flag
= sh_flags
& - sh_flags
;
2869 case SHF_WRITE
: strcat (buff
, "W"); break;
2870 case SHF_ALLOC
: strcat (buff
, "A"); break;
2871 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
2872 case SHF_MERGE
: strcat (buff
, "M"); break;
2873 case SHF_STRINGS
: strcat (buff
, "S"); break;
2874 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
2875 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
2876 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
2877 case SHF_GROUP
: strcat (buff
, "G"); break;
2880 if (flag
& SHF_MASKOS
)
2883 sh_flags
&= ~ SHF_MASKOS
;
2885 else if (flag
& SHF_MASKPROC
)
2888 sh_flags
&= ~ SHF_MASKPROC
;
2900 process_section_headers (file
)
2903 Elf_Internal_Shdr
* section
;
2906 section_headers
= NULL
;
2908 if (elf_header
.e_shnum
== 0)
2911 printf (_("\nThere are no sections in this file.\n"));
2916 if (do_sections
&& !do_header
)
2917 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2918 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
2922 if (! get_32bit_section_headers (file
))
2925 else if (! get_64bit_section_headers (file
))
2928 /* Read in the string table, so that we have names to display. */
2929 section
= section_headers
+ elf_header
.e_shstrndx
;
2931 if (section
->sh_size
!= 0)
2933 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
2934 section
->sh_size
, _("string table"));
2936 string_table_length
= section
->sh_size
;
2939 /* Scan the sections for the dynamic symbol table
2940 and dynamic string table and debug sections. */
2941 dynamic_symbols
= NULL
;
2942 dynamic_strings
= NULL
;
2943 dynamic_syminfo
= NULL
;
2945 for (i
= 0, section
= section_headers
;
2946 i
< elf_header
.e_shnum
;
2949 char * name
= SECTION_NAME (section
);
2951 if (section
->sh_type
== SHT_DYNSYM
)
2953 if (dynamic_symbols
!= NULL
)
2955 error (_("File contains multiple dynamic symbol tables\n"));
2959 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
2961 GET_ELF_SYMBOLS (file
, section
->sh_offset
, num_dynamic_syms
);
2963 else if (section
->sh_type
== SHT_STRTAB
2964 && strcmp (name
, ".dynstr") == 0)
2966 if (dynamic_strings
!= NULL
)
2968 error (_("File contains multiple dynamic string tables\n"));
2972 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
2974 _("dynamic strings"));
2976 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
2977 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
2978 || do_debug_frames
|| do_debug_macinfo
)
2979 && strncmp (name
, ".debug_", 7) == 0)
2984 || (do_debug_info
&& (strcmp (name
, "info") == 0))
2985 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
2986 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
2987 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
2988 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
2989 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
2990 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
2992 request_dump (i
, DEBUG_DUMP
);
2994 /* linkonce section to be combined with .debug_info at link time. */
2995 else if ((do_debugging
|| do_debug_info
)
2996 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
2997 request_dump (i
, DEBUG_DUMP
);
2998 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
2999 request_dump (i
, DEBUG_DUMP
);
3005 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
3009 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3012 printf (_(" [Nr] Name Type Address Offset\n"));
3013 printf (_(" Size EntSize Flags Link Info Align\n"));
3016 for (i
= 0, section
= section_headers
;
3017 i
< elf_header
.e_shnum
;
3020 printf (" [%2d] %-17.17s %-15.15s ",
3022 SECTION_NAME (section
),
3023 get_section_type_name (section
->sh_type
));
3027 print_vma (section
->sh_addr
, LONG_HEX
);
3029 printf ( " %6.6lx %6.6lx %2.2lx",
3030 (unsigned long) section
->sh_offset
,
3031 (unsigned long) section
->sh_size
,
3032 (unsigned long) section
->sh_entsize
);
3034 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3036 printf ("%2ld %3lx %2ld\n",
3037 (unsigned long) section
->sh_link
,
3038 (unsigned long) section
->sh_info
,
3039 (unsigned long) section
->sh_addralign
);
3044 print_vma (section
->sh_addr
, LONG_HEX
);
3045 printf (" %8.8lx", section
->sh_offset
);
3047 print_vma (section
->sh_size
, LONG_HEX
);
3049 print_vma (section
->sh_entsize
, LONG_HEX
);
3051 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3053 printf (" %2ld %3lx %ld\n",
3054 (unsigned long) section
->sh_link
,
3055 (unsigned long) section
->sh_info
,
3056 (unsigned long) section
->sh_addralign
);
3060 printf (_("Key to Flags:\n"));
3061 printf (_(" W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
3062 printf (_(" I (info), L (link order), G (group), x (unknown)\n"));
3063 printf (_(" O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3068 /* Process the reloc section. */
3070 process_relocs (file
)
3073 unsigned long rel_size
;
3074 unsigned long rel_offset
;
3080 if (do_using_dynamic
)
3082 int is_rela
= FALSE
;
3087 if (dynamic_info
[DT_REL
])
3089 rel_offset
= dynamic_info
[DT_REL
];
3090 rel_size
= dynamic_info
[DT_RELSZ
];
3093 else if (dynamic_info
[DT_RELA
])
3095 rel_offset
= dynamic_info
[DT_RELA
];
3096 rel_size
= dynamic_info
[DT_RELASZ
];
3099 else if (dynamic_info
[DT_JMPREL
])
3101 rel_offset
= dynamic_info
[DT_JMPREL
];
3102 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3104 switch (dynamic_info
[DT_PLTREL
])
3121 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3122 rel_offset
, rel_size
);
3124 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3125 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
3128 printf (_("\nThere are no dynamic relocations in this file.\n"));
3132 Elf32_Internal_Shdr
* section
;
3136 for (i
= 0, section
= section_headers
;
3137 i
< elf_header
.e_shnum
;
3140 if ( section
->sh_type
!= SHT_RELA
3141 && section
->sh_type
!= SHT_REL
)
3144 rel_offset
= section
->sh_offset
;
3145 rel_size
= section
->sh_size
;
3149 Elf32_Internal_Shdr
* strsec
;
3150 Elf_Internal_Sym
* symtab
;
3153 unsigned long nsyms
;
3155 printf (_("\nRelocation section "));
3157 if (string_table
== NULL
)
3158 printf ("%d", section
->sh_name
);
3160 printf ("'%s'", SECTION_NAME (section
));
3162 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3163 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3168 if (section
->sh_link
)
3170 Elf32_Internal_Shdr
* symsec
;
3172 symsec
= section_headers
+ section
->sh_link
;
3173 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3174 symtab
= GET_ELF_SYMBOLS (file
, symsec
->sh_offset
, nsyms
);
3179 strsec
= section_headers
+ symsec
->sh_link
;
3181 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3185 is_rela
= section
->sh_type
== SHT_RELA
;
3187 dump_relocations (file
, rel_offset
, rel_size
,
3188 symtab
, nsyms
, strtab
, is_rela
);
3200 printf (_("\nThere are no relocations in this file.\n"));
3206 #include "unwind-ia64.h"
3208 /* An absolute address consists of a section and an offset. If the
3209 section is NULL, the offset itself is the address, otherwise, the
3210 address equals to LOAD_ADDRESS(section) + offset. */
3214 unsigned short section
;
3220 struct unw_table_entry
3222 struct absaddr start
;
3224 struct absaddr info
;
3226 *table
; /* Unwind table. */
3227 unsigned long table_len
; /* Length of unwind table. */
3228 unsigned char * info
; /* Unwind info. */
3229 unsigned long info_size
; /* Size of unwind info. */
3230 bfd_vma info_addr
; /* starting address of unwind info. */
3231 bfd_vma seg_base
; /* Starting address of segment. */
3232 Elf_Internal_Sym
* symtab
; /* The symbol table. */
3233 unsigned long nsyms
; /* Number of symbols. */
3234 char * strtab
; /* The string table. */
3235 unsigned long strtab_size
; /* Size of string table. */
3238 static void find_symbol_for_address
PARAMS ((struct unw_aux_info
*,
3239 struct absaddr
, const char **,
3241 static void dump_ia64_unwind
PARAMS ((struct unw_aux_info
*));
3242 static int slurp_ia64_unwind_table
PARAMS ((FILE *, struct unw_aux_info
*,
3243 Elf32_Internal_Shdr
*));
3246 find_symbol_for_address (aux
, addr
, symname
, offset
)
3247 struct unw_aux_info
*aux
;
3248 struct absaddr addr
;
3249 const char **symname
;
3252 bfd_vma dist
= (bfd_vma
) 0x100000;
3253 Elf_Internal_Sym
*sym
, *best
= NULL
;
3256 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3258 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3259 && sym
->st_name
!= 0
3260 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3261 && addr
.offset
>= sym
->st_value
3262 && addr
.offset
- sym
->st_value
< dist
)
3265 dist
= addr
.offset
- sym
->st_value
;
3272 *symname
= (best
->st_name
>= aux
->strtab_size
3273 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3278 *offset
= addr
.offset
;
3282 dump_ia64_unwind (aux
)
3283 struct unw_aux_info
*aux
;
3286 struct unw_table_entry
* tp
;
3289 addr_size
= is_32bit_elf
? 4 : 8;
3291 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3295 const unsigned char * dp
;
3296 const unsigned char * head
;
3297 const char * procname
;
3299 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3301 fputs ("\n<", stdout
);
3305 fputs (procname
, stdout
);
3308 printf ("+%lx", (unsigned long) offset
);
3311 fputs (">: [", stdout
);
3312 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3313 fputc ('-', stdout
);
3314 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3315 printf ("), info at +0x%lx\n",
3316 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3318 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3319 stamp
= BYTE_GET8 ((unsigned char *) head
);
3321 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3322 (unsigned) UNW_VER (stamp
),
3323 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3324 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3325 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3326 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3328 if (UNW_VER (stamp
) != 1)
3330 printf ("\tUnknown version.\n");
3335 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3336 dp
= unw_decode (dp
, in_body
, & in_body
);
3341 slurp_ia64_unwind_table (file
, aux
, sec
)
3343 struct unw_aux_info
*aux
;
3344 Elf32_Internal_Shdr
*sec
;
3346 unsigned long size
, addr_size
, nrelas
, i
;
3347 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
3348 struct unw_table_entry
*tep
;
3349 Elf32_Internal_Shdr
*relsec
;
3350 Elf_Internal_Rela
*rela
, *rp
;
3351 unsigned char *table
, *tp
;
3352 Elf_Internal_Sym
*sym
;
3353 const char *relname
;
3356 addr_size
= is_32bit_elf
? 4 : 8;
3358 /* First, find the starting address of the segment that includes
3361 if (elf_header
.e_phnum
)
3363 prog_hdrs
= (Elf_Internal_Phdr
*)
3364 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3367 result
= get_32bit_program_headers (file
, prog_hdrs
);
3369 result
= get_64bit_program_headers (file
, prog_hdrs
);
3377 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
3379 if (seg
->p_type
!= PT_LOAD
)
3382 if (sec
->sh_addr
>= seg
->p_vaddr
3383 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3385 aux
->seg_base
= seg
->p_vaddr
;
3393 /* Second, build the unwind table from the contents of the unwind section: */
3394 size
= sec
->sh_size
;
3395 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3396 size
, _("unwind table"));
3400 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3401 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++ tep
)
3403 tep
->start
.section
= SHN_UNDEF
;
3404 tep
->end
.section
= SHN_UNDEF
;
3405 tep
->info
.section
= SHN_UNDEF
;
3408 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3409 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3410 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3414 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3415 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3416 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3418 tep
->start
.offset
+= aux
->seg_base
;
3419 tep
->end
.offset
+= aux
->seg_base
;
3420 tep
->info
.offset
+= aux
->seg_base
;
3424 /* Third, apply any relocations to the unwind table: */
3426 for (relsec
= section_headers
;
3427 relsec
< section_headers
+ elf_header
.e_shnum
;
3430 if (relsec
->sh_type
!= SHT_RELA
3431 || section_headers
+ relsec
->sh_info
!= sec
)
3434 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
3438 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
3442 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
3443 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
3445 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3447 warn (_("Skipping unexpected symbol type %u"),
3448 ELF32_ST_TYPE (sym
->st_info
));
3454 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
3455 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
3457 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3459 warn (_("Skipping unexpected symbol type %u"),
3460 ELF64_ST_TYPE (sym
->st_info
));
3465 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
3467 warn (_("Skipping unexpected relocation type %s"), relname
);
3471 i
= rp
->r_offset
/ (3 * addr_size
);
3473 switch (rp
->r_offset
/addr_size
% 3)
3476 aux
->table
[i
].start
.section
= sym
->st_shndx
;
3477 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
3480 aux
->table
[i
].end
.section
= sym
->st_shndx
;
3481 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
3484 aux
->table
[i
].info
.section
= sym
->st_shndx
;
3485 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
3495 aux
->table_len
= size
/ (3 * addr_size
);
3500 process_unwind (file
)
3503 Elf32_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
3504 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
3505 struct unw_aux_info aux
;
3510 if (elf_header
.e_machine
!= EM_IA_64
)
3512 printf (_("\nThere are no unwind sections in this file.\n"));
3516 memset (& aux
, 0, sizeof (aux
));
3518 addr_size
= is_32bit_elf
? 4 : 8;
3520 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
3522 if (sec
->sh_type
== SHT_SYMTAB
)
3524 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
3525 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
->sh_offset
, aux
.nsyms
);
3527 strsec
= section_headers
+ sec
->sh_link
;
3528 aux
.strtab_size
= strsec
->sh_size
;
3529 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3530 aux
.strtab_size
, _("string table"));
3532 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3537 printf (_("\nThere are no unwind sections in this file.\n"));
3539 while (unwcount
-- > 0)
3544 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
3545 i
< elf_header
.e_shnum
; ++i
, ++sec
)
3546 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3553 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
3555 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
3558 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3559 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
3560 suffix
= SECTION_NAME (unwsec
) + len
;
3561 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3563 if (strncmp (SECTION_NAME (sec
),
3564 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
3565 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3570 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3571 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3572 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
3573 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
3575 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
3577 suffix
= SECTION_NAME (unwsec
) + len
;
3578 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3580 if (strncmp (SECTION_NAME (sec
),
3581 ELF_STRING_ia64_unwind_info
, len2
) == 0
3582 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3586 if (i
== elf_header
.e_shnum
)
3588 printf (_("\nCould not find unwind info section for "));
3590 if (string_table
== NULL
)
3591 printf ("%d", unwsec
->sh_name
);
3593 printf ("'%s'", SECTION_NAME (unwsec
));
3597 aux
.info_size
= sec
->sh_size
;
3598 aux
.info_addr
= sec
->sh_addr
;
3599 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3600 aux
.info_size
, _("unwind info"));
3602 printf (_("\nUnwind section "));
3604 if (string_table
== NULL
)
3605 printf ("%d", unwsec
->sh_name
);
3607 printf ("'%s'", SECTION_NAME (unwsec
));
3609 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3611 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
3613 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
3615 if (aux
.table_len
> 0)
3616 dump_ia64_unwind (& aux
);
3619 free ((char *) aux
.table
);
3621 free ((char *) aux
.info
);
3630 free ((char *) aux
.strtab
);
3636 dynamic_segment_mips_val (entry
)
3637 Elf_Internal_Dyn
* entry
;
3639 switch (entry
->d_tag
)
3642 if (entry
->d_un
.d_val
== 0)
3646 static const char * opts
[] =
3648 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3649 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3650 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3651 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3656 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
3657 if (entry
->d_un
.d_val
& (1 << cnt
))
3659 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
3666 case DT_MIPS_IVERSION
:
3667 if (dynamic_strings
!= NULL
)
3668 printf ("Interface Version: %s\n",
3669 dynamic_strings
+ entry
->d_un
.d_val
);
3671 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3674 case DT_MIPS_TIME_STAMP
:
3679 time_t time
= entry
->d_un
.d_val
;
3680 tmp
= gmtime (&time
);
3681 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
3682 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
3683 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
3684 printf ("Time Stamp: %s\n", timebuf
);
3688 case DT_MIPS_RLD_VERSION
:
3689 case DT_MIPS_LOCAL_GOTNO
:
3690 case DT_MIPS_CONFLICTNO
:
3691 case DT_MIPS_LIBLISTNO
:
3692 case DT_MIPS_SYMTABNO
:
3693 case DT_MIPS_UNREFEXTNO
:
3694 case DT_MIPS_HIPAGENO
:
3695 case DT_MIPS_DELTA_CLASS_NO
:
3696 case DT_MIPS_DELTA_INSTANCE_NO
:
3697 case DT_MIPS_DELTA_RELOC_NO
:
3698 case DT_MIPS_DELTA_SYM_NO
:
3699 case DT_MIPS_DELTA_CLASSSYM_NO
:
3700 case DT_MIPS_COMPACT_SIZE
:
3701 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3705 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
3711 dynamic_segment_parisc_val (entry
)
3712 Elf_Internal_Dyn
* entry
;
3714 switch (entry
->d_tag
)
3716 case DT_HP_DLD_FLAGS
:
3725 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
3726 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
3727 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
3728 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
3729 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
3730 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
3731 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
3732 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
3733 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
3734 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
3735 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
3739 bfd_vma val
= entry
->d_un
.d_val
;
3741 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
3742 if (val
& flags
[cnt
].bit
)
3746 fputs (flags
[cnt
].str
, stdout
);
3748 val
^= flags
[cnt
].bit
;
3751 if (val
!= 0 || first
)
3755 print_vma (val
, HEX
);
3761 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
3767 get_32bit_dynamic_segment (file
)
3770 Elf32_External_Dyn
* edyn
;
3771 Elf_Internal_Dyn
* entry
;
3774 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
3775 dynamic_size
, _("dynamic segment"));
3779 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3780 how large this .dynamic is now. We can do this even before the byte
3781 swapping since the DT_NULL tag is recognizable. */
3783 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3786 dynamic_segment
= (Elf_Internal_Dyn
*)
3787 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3789 if (dynamic_segment
== NULL
)
3791 error (_("Out of memory\n"));
3796 for (i
= 0, entry
= dynamic_segment
;
3800 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
3801 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
3810 get_64bit_dynamic_segment (file
)
3813 Elf64_External_Dyn
* edyn
;
3814 Elf_Internal_Dyn
* entry
;
3817 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
3818 dynamic_size
, _("dynamic segment"));
3822 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3823 how large this .dynamic is now. We can do this even before the byte
3824 swapping since the DT_NULL tag is recognizable. */
3826 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3829 dynamic_segment
= (Elf_Internal_Dyn
*)
3830 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3832 if (dynamic_segment
== NULL
)
3834 error (_("Out of memory\n"));
3839 for (i
= 0, entry
= dynamic_segment
;
3843 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
3844 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
3853 get_dynamic_flags (flags
)
3856 static char buff
[64];
3861 flag
= flags
& - flags
;
3866 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
3867 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
3868 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
3869 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
3870 default: strcat (buff
, "unknown "); break;
3876 /* Parse and display the contents of the dynamic segment. */
3878 process_dynamic_segment (file
)
3881 Elf_Internal_Dyn
* entry
;
3884 if (dynamic_size
== 0)
3887 printf (_("\nThere is no dynamic segment in this file.\n"));
3894 if (! get_32bit_dynamic_segment (file
))
3897 else if (! get_64bit_dynamic_segment (file
))
3900 /* Find the appropriate symbol table. */
3901 if (dynamic_symbols
== NULL
)
3903 for (i
= 0, entry
= dynamic_segment
;
3907 unsigned long offset
;
3909 if (entry
->d_tag
!= DT_SYMTAB
)
3912 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
3914 /* Since we do not know how big the symbol table is,
3915 we default to reading in the entire file (!) and
3916 processing that. This is overkill, I know, but it
3918 offset
= entry
->d_un
.d_val
- loadaddr
;
3920 if (fseek (file
, 0, SEEK_END
))
3921 error (_("Unable to seek to end of file!"));
3924 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf32_External_Sym
);
3926 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf64_External_Sym
);
3928 if (num_dynamic_syms
< 1)
3930 error (_("Unable to determine the number of symbols to load\n"));
3934 dynamic_symbols
= GET_ELF_SYMBOLS (file
, offset
, num_dynamic_syms
);
3938 /* Similarly find a string table. */
3939 if (dynamic_strings
== NULL
)
3941 for (i
= 0, entry
= dynamic_segment
;
3945 unsigned long offset
;
3948 if (entry
->d_tag
!= DT_STRTAB
)
3951 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
3953 /* Since we do not know how big the string table is,
3954 we default to reading in the entire file (!) and
3955 processing that. This is overkill, I know, but it
3958 offset
= entry
->d_un
.d_val
- loadaddr
;
3959 if (fseek (file
, 0, SEEK_END
))
3960 error (_("Unable to seek to end of file\n"));
3961 str_tab_len
= ftell (file
) - offset
;
3963 if (str_tab_len
< 1)
3966 (_("Unable to determine the length of the dynamic string table\n"));
3970 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
3971 _("dynamic string table"));
3977 /* And find the syminfo section if available. */
3978 if (dynamic_syminfo
== NULL
)
3980 unsigned int syminsz
= 0;
3982 for (i
= 0, entry
= dynamic_segment
;
3986 if (entry
->d_tag
== DT_SYMINENT
)
3988 /* Note: these braces are necessary to avoid a syntax
3989 error from the SunOS4 C compiler. */
3990 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
3992 else if (entry
->d_tag
== DT_SYMINSZ
)
3993 syminsz
= entry
->d_un
.d_val
;
3994 else if (entry
->d_tag
== DT_SYMINFO
)
3995 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
3998 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4000 Elf_External_Syminfo
* extsyminfo
;
4001 Elf_Internal_Syminfo
* syminfo
;
4003 /* There is a syminfo section. Read the data. */
4004 extsyminfo
= ((Elf_External_Syminfo
*)
4005 get_data (NULL
, file
, dynamic_syminfo_offset
,
4006 syminsz
, _("symbol information")));
4010 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4011 if (dynamic_syminfo
== NULL
)
4013 error (_("Out of memory\n"));
4017 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4018 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4021 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4022 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4029 if (do_dynamic
&& dynamic_addr
)
4030 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4031 dynamic_addr
, (long) dynamic_size
);
4033 printf (_(" Tag Type Name/Value\n"));
4035 for (i
= 0, entry
= dynamic_segment
;
4044 print_vma (entry
->d_tag
, FULL_HEX
);
4045 dtype
= get_dynamic_type (entry
->d_tag
);
4046 printf (" (%s)%*s", dtype
,
4047 ((is_32bit_elf
? 27 : 19)
4048 - (int) strlen (dtype
)),
4052 switch (entry
->d_tag
)
4056 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
4066 switch (entry
->d_tag
)
4069 printf (_("Auxiliary library"));
4073 printf (_("Filter library"));
4077 printf (_("Configuration file"));
4081 printf (_("Dependency audit library"));
4085 printf (_("Audit library"));
4089 if (dynamic_strings
)
4090 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4094 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4103 printf (_("Flags:"));
4104 if (entry
->d_un
.d_val
== 0)
4105 printf (_(" None\n"));
4108 unsigned long int val
= entry
->d_un
.d_val
;
4109 if (val
& DTF_1_PARINIT
)
4111 printf (" PARINIT");
4112 val
^= DTF_1_PARINIT
;
4114 if (val
& DTF_1_CONFEXP
)
4116 printf (" CONFEXP");
4117 val
^= DTF_1_CONFEXP
;
4120 printf (" %lx", val
);
4129 printf (_("Flags:"));
4130 if (entry
->d_un
.d_val
== 0)
4131 printf (_(" None\n"));
4134 unsigned long int val
= entry
->d_un
.d_val
;
4135 if (val
& DF_P1_LAZYLOAD
)
4137 printf (" LAZYLOAD");
4138 val
^= DF_P1_LAZYLOAD
;
4140 if (val
& DF_P1_GROUPPERM
)
4142 printf (" GROUPPERM");
4143 val
^= DF_P1_GROUPPERM
;
4146 printf (" %lx", val
);
4155 printf (_("Flags:"));
4156 if (entry
->d_un
.d_val
== 0)
4157 printf (_(" None\n"));
4160 unsigned long int val
= entry
->d_un
.d_val
;
4166 if (val
& DF_1_GLOBAL
)
4171 if (val
& DF_1_GROUP
)
4176 if (val
& DF_1_NODELETE
)
4178 printf (" NODELETE");
4179 val
^= DF_1_NODELETE
;
4181 if (val
& DF_1_LOADFLTR
)
4183 printf (" LOADFLTR");
4184 val
^= DF_1_LOADFLTR
;
4186 if (val
& DF_1_INITFIRST
)
4188 printf (" INITFIRST");
4189 val
^= DF_1_INITFIRST
;
4191 if (val
& DF_1_NOOPEN
)
4196 if (val
& DF_1_ORIGIN
)
4201 if (val
& DF_1_DIRECT
)
4206 if (val
& DF_1_TRANS
)
4211 if (val
& DF_1_INTERPOSE
)
4213 printf (" INTERPOSE");
4214 val
^= DF_1_INTERPOSE
;
4216 if (val
& DF_1_NODEFLIB
)
4218 printf (" NODEFLIB");
4219 val
^= DF_1_NODEFLIB
;
4221 if (val
& DF_1_NODUMP
)
4226 if (val
& DF_1_CONLFAT
)
4228 printf (" CONLFAT");
4229 val
^= DF_1_CONLFAT
;
4232 printf (" %lx", val
);
4240 puts (get_dynamic_type (entry
->d_un
.d_val
));
4260 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4266 if (dynamic_strings
== NULL
)
4269 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4273 switch (entry
->d_tag
)
4276 printf (_("Shared library: [%s]"), name
);
4278 if (strcmp (name
, program_interpreter
) == 0)
4279 printf (_(" program interpreter"));
4283 printf (_("Library soname: [%s]"), name
);
4287 printf (_("Library rpath: [%s]"), name
);
4291 printf (_("Library runpath: [%s]"), name
);
4295 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4300 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4316 case DT_INIT_ARRAYSZ
:
4317 case DT_FINI_ARRAYSZ
:
4320 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4321 printf (" (bytes)\n");
4331 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4344 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4348 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4352 printf (_("Not needed object: [%s]\n"), name
);
4357 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4363 /* The value of this entry is ignored. */
4367 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
4368 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
4373 switch (elf_header
.e_machine
)
4376 case EM_MIPS_RS3_LE
:
4377 dynamic_segment_mips_val (entry
);
4380 dynamic_segment_parisc_val (entry
);
4383 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4395 get_ver_flags (flags
)
4398 static char buff
[32];
4405 if (flags
& VER_FLG_BASE
)
4406 strcat (buff
, "BASE ");
4408 if (flags
& VER_FLG_WEAK
)
4410 if (flags
& VER_FLG_BASE
)
4411 strcat (buff
, "| ");
4413 strcat (buff
, "WEAK ");
4416 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
4417 strcat (buff
, "| <unknown>");
4422 /* Display the contents of the version sections. */
4424 process_version_sections (file
)
4427 Elf32_Internal_Shdr
* section
;
4434 for (i
= 0, section
= section_headers
;
4435 i
< elf_header
.e_shnum
;
4438 switch (section
->sh_type
)
4440 case SHT_GNU_verdef
:
4442 Elf_External_Verdef
* edefs
;
4449 (_("\nVersion definition 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: %lx (%s)\n"),
4455 (unsigned long) section
->sh_offset
, section
->sh_link
,
4456 SECTION_NAME (section_headers
+ section
->sh_link
));
4458 edefs
= ((Elf_External_Verdef
*)
4459 get_data (NULL
, file
, section
->sh_offset
,
4461 _("version definition section")));
4465 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
4468 Elf_External_Verdef
* edef
;
4469 Elf_Internal_Verdef ent
;
4470 Elf_External_Verdaux
* eaux
;
4471 Elf_Internal_Verdaux aux
;
4475 vstart
= ((char *) edefs
) + idx
;
4477 edef
= (Elf_External_Verdef
*) vstart
;
4479 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
4480 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
4481 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
4482 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
4483 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
4484 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
4485 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
4487 printf (_(" %#06x: Rev: %d Flags: %s"),
4488 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
4490 printf (_(" Index: %d Cnt: %d "),
4491 ent
.vd_ndx
, ent
.vd_cnt
);
4493 vstart
+= ent
.vd_aux
;
4495 eaux
= (Elf_External_Verdaux
*) vstart
;
4497 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4498 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4500 if (dynamic_strings
)
4501 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
4503 printf (_("Name index: %ld\n"), aux
.vda_name
);
4505 isum
= idx
+ ent
.vd_aux
;
4507 for (j
= 1; j
< ent
.vd_cnt
; j
++)
4509 isum
+= aux
.vda_next
;
4510 vstart
+= aux
.vda_next
;
4512 eaux
= (Elf_External_Verdaux
*) vstart
;
4514 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4515 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4517 if (dynamic_strings
)
4518 printf (_(" %#06x: Parent %d: %s\n"),
4519 isum
, j
, dynamic_strings
+ aux
.vda_name
);
4521 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4522 isum
, j
, aux
.vda_name
);
4532 case SHT_GNU_verneed
:
4534 Elf_External_Verneed
* eneed
;
4540 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4541 SECTION_NAME (section
), section
->sh_info
);
4543 printf (_(" Addr: 0x"));
4544 printf_vma (section
->sh_addr
);
4545 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4546 (unsigned long) section
->sh_offset
, section
->sh_link
,
4547 SECTION_NAME (section_headers
+ section
->sh_link
));
4549 eneed
= ((Elf_External_Verneed
*)
4550 get_data (NULL
, file
, section
->sh_offset
,
4551 section
->sh_size
, _("version need section")));
4555 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
4557 Elf_External_Verneed
* entry
;
4558 Elf_Internal_Verneed ent
;
4563 vstart
= ((char *) eneed
) + idx
;
4565 entry
= (Elf_External_Verneed
*) vstart
;
4567 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
4568 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
4569 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
4570 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
4571 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
4573 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
4575 if (dynamic_strings
)
4576 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
4578 printf (_(" File: %lx"), ent
.vn_file
);
4580 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
4582 vstart
+= ent
.vn_aux
;
4584 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
4586 Elf_External_Vernaux
* eaux
;
4587 Elf_Internal_Vernaux aux
;
4589 eaux
= (Elf_External_Vernaux
*) vstart
;
4591 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
4592 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
4593 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
4594 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
4595 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
4597 if (dynamic_strings
)
4598 printf (_(" %#06x: Name: %s"),
4599 isum
, dynamic_strings
+ aux
.vna_name
);
4601 printf (_(" %#06x: Name index: %lx"),
4602 isum
, aux
.vna_name
);
4604 printf (_(" Flags: %s Version: %d\n"),
4605 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
4607 isum
+= aux
.vna_next
;
4608 vstart
+= aux
.vna_next
;
4618 case SHT_GNU_versym
:
4620 Elf32_Internal_Shdr
* link_section
;
4623 unsigned char * edata
;
4624 unsigned short * data
;
4626 Elf_Internal_Sym
* symbols
;
4627 Elf32_Internal_Shdr
* string_sec
;
4629 link_section
= section_headers
+ section
->sh_link
;
4630 total
= section
->sh_size
/ section
->sh_entsize
;
4634 symbols
= GET_ELF_SYMBOLS (file
, link_section
->sh_offset
,
4635 link_section
->sh_size
/ link_section
->sh_entsize
);
4637 string_sec
= section_headers
+ link_section
->sh_link
;
4639 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
4640 string_sec
->sh_size
,
4641 _("version string table"));
4645 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4646 SECTION_NAME (section
), total
);
4648 printf (_(" Addr: "));
4649 printf_vma (section
->sh_addr
);
4650 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4651 (unsigned long) section
->sh_offset
, section
->sh_link
,
4652 SECTION_NAME (link_section
));
4656 get_data (NULL
, file
,
4657 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
4658 total
* sizeof (short), _("version symbol data")));
4665 data
= (unsigned short *) malloc (total
* sizeof (short));
4667 for (cnt
= total
; cnt
--;)
4668 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
4673 for (cnt
= 0; cnt
< total
; cnt
+= 4)
4676 int check_def
, check_need
;
4679 printf (" %03x:", cnt
);
4681 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
4682 switch (data
[cnt
+ j
])
4685 fputs (_(" 0 (*local*) "), stdout
);
4689 fputs (_(" 1 (*global*) "), stdout
);
4693 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
4694 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
4698 if (symbols
[cnt
+ j
].st_shndx
>= SHN_LORESERVE
4699 || section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
4702 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
4709 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
4711 Elf_Internal_Verneed ivn
;
4712 unsigned long offset
;
4714 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
4719 Elf_Internal_Vernaux ivna
;
4720 Elf_External_Verneed evn
;
4721 Elf_External_Vernaux evna
;
4722 unsigned long a_off
;
4724 get_data (&evn
, file
, offset
, sizeof (evn
),
4727 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4728 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4730 a_off
= offset
+ ivn
.vn_aux
;
4734 get_data (&evna
, file
, a_off
, sizeof (evna
),
4735 _("version need aux (2)"));
4737 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4738 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4740 a_off
+= ivna
.vna_next
;
4742 while (ivna
.vna_other
!= data
[cnt
+ j
]
4743 && ivna
.vna_next
!= 0);
4745 if (ivna
.vna_other
== data
[cnt
+ j
])
4747 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4749 name
= strtab
+ ivna
.vna_name
;
4750 nn
+= printf ("(%s%-*s",
4752 12 - (int) strlen (name
),
4758 offset
+= ivn
.vn_next
;
4760 while (ivn
.vn_next
);
4763 if (check_def
&& data
[cnt
+ j
] != 0x8001
4764 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
4766 Elf_Internal_Verdef ivd
;
4767 Elf_External_Verdef evd
;
4768 unsigned long offset
;
4770 offset
= version_info
4771 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
4775 get_data (&evd
, file
, offset
, sizeof (evd
),
4778 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
4779 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
4781 offset
+= ivd
.vd_next
;
4783 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
4784 && ivd
.vd_next
!= 0);
4786 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
4788 Elf_External_Verdaux evda
;
4789 Elf_Internal_Verdaux ivda
;
4791 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
4793 get_data (&evda
, file
,
4794 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
4795 sizeof (evda
), _("version def aux"));
4797 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
4799 name
= strtab
+ ivda
.vda_name
;
4800 nn
+= printf ("(%s%-*s",
4802 12 - (int) strlen (name
),
4808 printf ("%*c", 18 - nn
, ' ');
4826 printf (_("\nNo version information found in this file.\n"));
4832 get_symbol_binding (binding
)
4833 unsigned int binding
;
4835 static char buff
[32];
4839 case STB_LOCAL
: return "LOCAL";
4840 case STB_GLOBAL
: return "GLOBAL";
4841 case STB_WEAK
: return "WEAK";
4843 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
4844 sprintf (buff
, _("<processor specific>: %d"), binding
);
4845 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
4846 sprintf (buff
, _("<OS specific>: %d"), binding
);
4848 sprintf (buff
, _("<unknown>: %d"), binding
);
4854 get_symbol_type (type
)
4857 static char buff
[32];
4861 case STT_NOTYPE
: return "NOTYPE";
4862 case STT_OBJECT
: return "OBJECT";
4863 case STT_FUNC
: return "FUNC";
4864 case STT_SECTION
: return "SECTION";
4865 case STT_FILE
: return "FILE";
4866 case STT_COMMON
: return "COMMON";
4868 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
4870 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
4871 return "THUMB_FUNC";
4873 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
4876 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
4877 return "PARISC_MILLI";
4879 sprintf (buff
, _("<processor specific>: %d"), type
);
4881 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
4883 if (elf_header
.e_machine
== EM_PARISC
)
4885 if (type
== STT_HP_OPAQUE
)
4887 if (type
== STT_HP_STUB
)
4891 sprintf (buff
, _("<OS specific>: %d"), type
);
4894 sprintf (buff
, _("<unknown>: %d"), type
);
4900 get_symbol_visibility (visibility
)
4901 unsigned int visibility
;
4905 case STV_DEFAULT
: return "DEFAULT";
4906 case STV_INTERNAL
: return "INTERNAL";
4907 case STV_HIDDEN
: return "HIDDEN";
4908 case STV_PROTECTED
: return "PROTECTED";
4914 get_symbol_index_type (type
)
4919 case SHN_UNDEF
: return "UND";
4920 case SHN_ABS
: return "ABS";
4921 case SHN_COMMON
: return "COM";
4923 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
4925 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
4927 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
4931 static char buff
[32];
4933 sprintf (buff
, "%3d", type
);
4940 get_dynamic_data (file
, number
)
4942 unsigned int number
;
4944 unsigned char * e_data
;
4947 e_data
= (unsigned char *) malloc (number
* 4);
4951 error (_("Out of memory\n"));
4955 if (fread (e_data
, 4, number
, file
) != number
)
4957 error (_("Unable to read in dynamic data\n"));
4961 i_data
= (int *) malloc (number
* sizeof (* i_data
));
4965 error (_("Out of memory\n"));
4971 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
4978 /* Dump the symbol table */
4980 process_symbol_table (file
)
4983 Elf32_Internal_Shdr
* section
;
4984 unsigned char nb
[4];
4985 unsigned char nc
[4];
4988 int * buckets
= NULL
;
4989 int * chains
= NULL
;
4991 if (! do_syms
&& !do_histogram
)
4994 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
4997 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
4999 error (_("Unable to seek to start of dynamic information"));
5003 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5005 error (_("Failed to read in number of buckets\n"));
5009 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5011 error (_("Failed to read in number of chains\n"));
5015 nbuckets
= byte_get (nb
, 4);
5016 nchains
= byte_get (nc
, 4);
5018 buckets
= get_dynamic_data (file
, nbuckets
);
5019 chains
= get_dynamic_data (file
, nchains
);
5021 if (buckets
== NULL
|| chains
== NULL
)
5026 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5031 printf (_("\nSymbol table for image:\n"));
5033 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5035 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5037 for (hn
= 0; hn
< nbuckets
; hn
++)
5042 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5044 Elf_Internal_Sym
* psym
;
5046 psym
= dynamic_symbols
+ si
;
5048 printf (" %3d %3d: ", si
, hn
);
5049 print_vma (psym
->st_value
, LONG_HEX
);
5051 print_vma (psym
->st_size
, DEC_5
);
5053 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5054 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5055 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5056 printf (" %3.3s", get_symbol_index_type (psym
->st_shndx
));
5057 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
5061 else if (do_syms
&& !do_using_dynamic
)
5065 for (i
= 0, section
= section_headers
;
5066 i
< elf_header
.e_shnum
;
5071 Elf_Internal_Sym
* symtab
;
5072 Elf_Internal_Sym
* psym
;
5075 if ( section
->sh_type
!= SHT_SYMTAB
5076 && section
->sh_type
!= SHT_DYNSYM
)
5079 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5080 SECTION_NAME (section
),
5081 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5083 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5085 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5087 symtab
= GET_ELF_SYMBOLS (file
, section
->sh_offset
,
5088 section
->sh_size
/ section
->sh_entsize
);
5092 if (section
->sh_link
== elf_header
.e_shstrndx
)
5093 strtab
= string_table
;
5096 Elf32_Internal_Shdr
* string_sec
;
5098 string_sec
= section_headers
+ section
->sh_link
;
5100 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5101 string_sec
->sh_size
,
5105 for (si
= 0, psym
= symtab
;
5106 si
< section
->sh_size
/ section
->sh_entsize
;
5109 printf ("%6d: ", si
);
5110 print_vma (psym
->st_value
, LONG_HEX
);
5112 print_vma (psym
->st_size
, DEC_5
);
5113 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5114 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5115 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5116 printf (" %4s", get_symbol_index_type (psym
->st_shndx
));
5117 printf (" %s", strtab
+ psym
->st_name
);
5119 if (section
->sh_type
== SHT_DYNSYM
&&
5120 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5122 unsigned char data
[2];
5123 unsigned short vers_data
;
5124 unsigned long offset
;
5128 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5131 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5132 sizeof (data
), _("version data"));
5134 vers_data
= byte_get (data
, 2);
5136 is_nobits
= psym
->st_shndx
< SHN_LORESERVE
?
5137 (section_headers
[psym
->st_shndx
].sh_type
== SHT_NOBITS
)
5140 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5142 if ((vers_data
& 0x8000) || vers_data
> 1)
5144 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5145 && (is_nobits
|| ! check_def
))
5147 Elf_External_Verneed evn
;
5148 Elf_Internal_Verneed ivn
;
5149 Elf_Internal_Vernaux ivna
;
5151 /* We must test both. */
5152 offset
= version_info
5153 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
5157 unsigned long vna_off
;
5159 get_data (&evn
, file
, offset
, sizeof (evn
),
5162 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5163 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5165 vna_off
= offset
+ ivn
.vn_aux
;
5169 Elf_External_Vernaux evna
;
5171 get_data (&evna
, file
, vna_off
,
5173 _("version need aux (3)"));
5175 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5176 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5177 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5179 vna_off
+= ivna
.vna_next
;
5181 while (ivna
.vna_other
!= vers_data
5182 && ivna
.vna_next
!= 0);
5184 if (ivna
.vna_other
== vers_data
)
5187 offset
+= ivn
.vn_next
;
5189 while (ivn
.vn_next
!= 0);
5191 if (ivna
.vna_other
== vers_data
)
5194 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5197 else if (! is_nobits
)
5198 error (_("bad dynamic symbol"));
5205 if (vers_data
!= 0x8001
5206 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5208 Elf_Internal_Verdef ivd
;
5209 Elf_Internal_Verdaux ivda
;
5210 Elf_External_Verdaux evda
;
5211 unsigned long offset
;
5214 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5219 Elf_External_Verdef evd
;
5221 get_data (&evd
, file
, offset
, sizeof (evd
),
5224 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5225 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5226 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5228 offset
+= ivd
.vd_next
;
5230 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5231 && ivd
.vd_next
!= 0);
5233 offset
-= ivd
.vd_next
;
5234 offset
+= ivd
.vd_aux
;
5236 get_data (&evda
, file
, offset
, sizeof (evda
),
5237 _("version def aux"));
5239 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5241 if (psym
->st_name
!= ivda
.vda_name
)
5242 printf ((vers_data
& 0x8000)
5244 strtab
+ ivda
.vda_name
);
5254 if (strtab
!= string_table
)
5260 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5262 if (do_histogram
&& buckets
!= NULL
)
5269 int nzero_counts
= 0;
5272 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5274 printf (_(" Length Number %% of total Coverage\n"));
5276 lengths
= (int *) calloc (nbuckets
, sizeof (int));
5277 if (lengths
== NULL
)
5279 error (_("Out of memory"));
5282 for (hn
= 0; hn
< nbuckets
; ++hn
)
5287 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5290 if (maxlength
< ++lengths
[hn
])
5295 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
5298 error (_("Out of memory"));
5302 for (hn
= 0; hn
< nbuckets
; ++hn
)
5303 ++ counts
[lengths
[hn
]];
5307 printf (" 0 %-10d (%5.1f%%)\n",
5308 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5309 for (si
= 1; si
<= maxlength
; ++si
)
5311 nzero_counts
+= counts
[si
] * si
;
5312 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5313 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5314 (nzero_counts
* 100.0) / nsyms
);
5322 if (buckets
!= NULL
)
5332 process_syminfo (file
)
5333 FILE * file ATTRIBUTE_UNUSED
;
5337 if (dynamic_syminfo
== NULL
5339 /* No syminfo, this is ok. */
5342 /* There better should be a dynamic symbol section. */
5343 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5347 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5348 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5350 printf (_(" Num: Name BoundTo Flags\n"));
5351 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5353 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5355 printf ("%4d: %-30s ", i
,
5356 dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5358 switch (dynamic_syminfo
[i
].si_boundto
)
5360 case SYMINFO_BT_SELF
:
5361 fputs ("SELF ", stdout
);
5363 case SYMINFO_BT_PARENT
:
5364 fputs ("PARENT ", stdout
);
5367 if (dynamic_syminfo
[i
].si_boundto
> 0
5368 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
5371 + dynamic_segment
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
5373 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
5377 if (flags
& SYMINFO_FLG_DIRECT
)
5379 if (flags
& SYMINFO_FLG_PASSTHRU
)
5380 printf (" PASSTHRU");
5381 if (flags
& SYMINFO_FLG_COPY
)
5383 if (flags
& SYMINFO_FLG_LAZYLOAD
)
5384 printf (" LAZYLOAD");
5392 #ifdef SUPPORT_DISASSEMBLY
5394 disassemble_section (section
, file
)
5395 Elf32_Internal_Shdr
* section
;
5398 printf (_("\nAssembly dump of section %s\n"),
5399 SECTION_NAME (section
));
5401 /* XXX -- to be done --- XXX */
5408 dump_section (section
, file
)
5409 Elf32_Internal_Shdr
* section
;
5412 bfd_size_type bytes
;
5414 unsigned char * data
;
5415 unsigned char * start
;
5417 bytes
= section
->sh_size
;
5421 printf (_("\nSection '%s' has no data to dump.\n"),
5422 SECTION_NAME (section
));
5426 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
5428 addr
= section
->sh_addr
;
5430 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
5443 lbytes
= (bytes
> 16 ? 16 : bytes
);
5445 printf (" 0x%8.8lx ", (unsigned long) addr
);
5447 switch (elf_header
.e_ident
[EI_DATA
])
5451 for (j
= 15; j
>= 0; j
--)
5454 printf ("%2.2x", data
[j
]);
5464 for (j
= 0; j
< 16; j
++)
5467 printf ("%2.2x", data
[j
]);
5477 for (j
= 0; j
< lbytes
; j
++)
5480 if (k
>= ' ' && k
< 0x80)
5499 static unsigned long int
5500 read_leb128 (data
, length_return
, sign
)
5501 unsigned char * data
;
5502 int * length_return
;
5505 unsigned long int result
= 0;
5506 unsigned int num_read
= 0;
5515 result
|= (byte
& 0x7f) << shift
;
5520 while (byte
& 0x80);
5522 if (length_return
!= NULL
)
5523 * length_return
= num_read
;
5525 if (sign
&& (shift
< 32) && (byte
& 0x40))
5526 result
|= -1 << shift
;
5531 typedef struct State_Machine_Registers
5533 unsigned long address
;
5536 unsigned int column
;
5540 /* This variable hold the number of the last entry seen
5541 in the File Table. */
5542 unsigned int last_file_entry
;
5545 static SMR state_machine_regs
;
5548 reset_state_machine (is_stmt
)
5551 state_machine_regs
.address
= 0;
5552 state_machine_regs
.file
= 1;
5553 state_machine_regs
.line
= 1;
5554 state_machine_regs
.column
= 0;
5555 state_machine_regs
.is_stmt
= is_stmt
;
5556 state_machine_regs
.basic_block
= 0;
5557 state_machine_regs
.end_sequence
= 0;
5558 state_machine_regs
.last_file_entry
= 0;
5561 /* Handled an extend line op. Returns true if this is the end
5564 process_extended_line_op (data
, is_stmt
, pointer_size
)
5565 unsigned char * data
;
5569 unsigned char op_code
;
5572 unsigned char * name
;
5575 len
= read_leb128 (data
, & bytes_read
, 0);
5580 warn (_("badly formed extended line op encountered!"));
5585 op_code
= * data
++;
5587 printf (_(" Extended opcode %d: "), op_code
);
5591 case DW_LNE_end_sequence
:
5592 printf (_("End of Sequence\n\n"));
5593 reset_state_machine (is_stmt
);
5596 case DW_LNE_set_address
:
5597 adr
= byte_get (data
, pointer_size
);
5598 printf (_("set Address to 0x%lx\n"), adr
);
5599 state_machine_regs
.address
= adr
;
5602 case DW_LNE_define_file
:
5603 printf (_(" define new File Table entry\n"));
5604 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5606 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5608 data
+= strlen ((char *) data
) + 1;
5609 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5611 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5613 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5614 printf (_("%s\n\n"), name
);
5618 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
5625 /* Size of pointers in the .debug_line section. This information is not
5626 really present in that section. It's obtained before dumping the debug
5627 sections by doing some pre-scan of the .debug_info section. */
5628 static int debug_line_pointer_size
= 4;
5631 display_debug_lines (section
, start
, file
)
5632 Elf32_Internal_Shdr
* section
;
5633 unsigned char * start
;
5634 FILE * file ATTRIBUTE_UNUSED
;
5636 DWARF2_External_LineInfo
* external
;
5637 DWARF2_Internal_LineInfo info
;
5638 unsigned char * standard_opcodes
;
5639 unsigned char * data
= start
;
5640 unsigned char * end
= start
+ section
->sh_size
;
5641 unsigned char * end_of_sequence
;
5644 printf (_("\nDump of debug contents of section %s:\n\n"),
5645 SECTION_NAME (section
));
5649 external
= (DWARF2_External_LineInfo
*) data
;
5651 /* Check the length of the block. */
5652 info
.li_length
= BYTE_GET (external
->li_length
);
5653 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
5656 (_("The line info appears to be corrupt - the section is too small\n"));
5660 /* Check its version number. */
5661 info
.li_version
= BYTE_GET (external
->li_version
);
5662 if (info
.li_version
!= 2)
5664 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5668 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
5669 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
5670 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
5671 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
5672 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
5673 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
5675 /* Sign extend the line base field. */
5676 info
.li_line_base
<<= 24;
5677 info
.li_line_base
>>= 24;
5679 printf (_(" Length: %ld\n"), info
.li_length
);
5680 printf (_(" DWARF Version: %d\n"), info
.li_version
);
5681 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
5682 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
5683 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
5684 printf (_(" Line Base: %d\n"), info
.li_line_base
);
5685 printf (_(" Line Range: %d\n"), info
.li_line_range
);
5686 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
5688 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
5690 reset_state_machine (info
.li_default_is_stmt
);
5692 /* Display the contents of the Opcodes table. */
5693 standard_opcodes
= data
+ sizeof (* external
);
5695 printf (_("\n Opcodes:\n"));
5697 for (i
= 1; i
< info
.li_opcode_base
; i
++)
5698 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
5700 /* Display the contents of the Directory table. */
5701 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
5704 printf (_("\n The Directory Table is empty.\n"));
5707 printf (_("\n The Directory Table:\n"));
5711 printf (_(" %s\n"), data
);
5713 data
+= strlen ((char *) data
) + 1;
5717 /* Skip the NUL at the end of the table. */
5720 /* Display the contents of the File Name table. */
5722 printf (_("\n The File Name Table is empty.\n"));
5725 printf (_("\n The File Name Table:\n"));
5726 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5730 unsigned char * name
;
5733 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5736 data
+= strlen ((char *) data
) + 1;
5738 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5740 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5742 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5744 printf (_("%s\n"), name
);
5748 /* Skip the NUL at the end of the table. */
5751 /* Now display the statements. */
5752 printf (_("\n Line Number Statements:\n"));
5755 while (data
< end_of_sequence
)
5757 unsigned char op_code
;
5761 op_code
= * data
++;
5765 case DW_LNS_extended_op
:
5766 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
5767 debug_line_pointer_size
);
5771 printf (_(" Copy\n"));
5774 case DW_LNS_advance_pc
:
5775 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
5777 state_machine_regs
.address
+= adv
;
5778 printf (_(" Advance PC by %d to %lx\n"), adv
,
5779 state_machine_regs
.address
);
5782 case DW_LNS_advance_line
:
5783 adv
= read_leb128 (data
, & bytes_read
, 1);
5785 state_machine_regs
.line
+= adv
;
5786 printf (_(" Advance Line by %d to %d\n"), adv
,
5787 state_machine_regs
.line
);
5790 case DW_LNS_set_file
:
5791 adv
= read_leb128 (data
, & bytes_read
, 0);
5793 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5795 state_machine_regs
.file
= adv
;
5798 case DW_LNS_set_column
:
5799 adv
= read_leb128 (data
, & bytes_read
, 0);
5801 printf (_(" Set column to %d\n"), adv
);
5802 state_machine_regs
.column
= adv
;
5805 case DW_LNS_negate_stmt
:
5806 adv
= state_machine_regs
.is_stmt
;
5808 printf (_(" Set is_stmt to %d\n"), adv
);
5809 state_machine_regs
.is_stmt
= adv
;
5812 case DW_LNS_set_basic_block
:
5813 printf (_(" Set basic block\n"));
5814 state_machine_regs
.basic_block
= 1;
5817 case DW_LNS_const_add_pc
:
5818 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
5819 * info
.li_min_insn_length
);
5820 state_machine_regs
.address
+= adv
;
5821 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
5822 state_machine_regs
.address
);
5825 case DW_LNS_fixed_advance_pc
:
5826 adv
= byte_get (data
, 2);
5828 state_machine_regs
.address
+= adv
;
5829 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5830 adv
, state_machine_regs
.address
);
5834 op_code
-= info
.li_opcode_base
;
5835 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
5836 state_machine_regs
.address
+= adv
;
5837 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5838 op_code
, adv
, state_machine_regs
.address
);
5839 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
5840 state_machine_regs
.line
+= adv
;
5841 printf (_(" and Line by %d to %d\n"),
5842 adv
, state_machine_regs
.line
);
5853 display_debug_pubnames (section
, start
, file
)
5854 Elf32_Internal_Shdr
* section
;
5855 unsigned char * start
;
5856 FILE * file ATTRIBUTE_UNUSED
;
5858 DWARF2_External_PubNames
* external
;
5859 DWARF2_Internal_PubNames pubnames
;
5860 unsigned char * end
;
5862 end
= start
+ section
->sh_size
;
5864 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
5868 unsigned char * data
;
5869 unsigned long offset
;
5871 external
= (DWARF2_External_PubNames
*) start
;
5873 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
5874 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
5875 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
5876 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
5878 data
= start
+ sizeof (* external
);
5879 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
5881 if (pubnames
.pn_version
!= 2)
5883 static int warned
= 0;
5887 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5894 printf (_(" Length: %ld\n"),
5895 pubnames
.pn_length
);
5896 printf (_(" Version: %d\n"),
5897 pubnames
.pn_version
);
5898 printf (_(" Offset into .debug_info section: %ld\n"),
5899 pubnames
.pn_offset
);
5900 printf (_(" Size of area in .debug_info section: %ld\n"),
5903 printf (_("\n Offset\tName\n"));
5907 offset
= byte_get (data
, 4);
5912 printf (" %ld\t\t%s\n", offset
, data
);
5913 data
+= strlen ((char *) data
) + 1;
5916 while (offset
!= 0);
5929 case DW_TAG_padding
: return "DW_TAG_padding";
5930 case DW_TAG_array_type
: return "DW_TAG_array_type";
5931 case DW_TAG_class_type
: return "DW_TAG_class_type";
5932 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
5933 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
5934 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
5935 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
5936 case DW_TAG_label
: return "DW_TAG_label";
5937 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
5938 case DW_TAG_member
: return "DW_TAG_member";
5939 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
5940 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
5941 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
5942 case DW_TAG_string_type
: return "DW_TAG_string_type";
5943 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
5944 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
5945 case DW_TAG_typedef
: return "DW_TAG_typedef";
5946 case DW_TAG_union_type
: return "DW_TAG_union_type";
5947 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
5948 case DW_TAG_variant
: return "DW_TAG_variant";
5949 case DW_TAG_common_block
: return "DW_TAG_common_block";
5950 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
5951 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
5952 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
5953 case DW_TAG_module
: return "DW_TAG_module";
5954 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
5955 case DW_TAG_set_type
: return "DW_TAG_set_type";
5956 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
5957 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
5958 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
5959 case DW_TAG_base_type
: return "DW_TAG_base_type";
5960 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
5961 case DW_TAG_const_type
: return "DW_TAG_const_type";
5962 case DW_TAG_constant
: return "DW_TAG_constant";
5963 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
5964 case DW_TAG_file_type
: return "DW_TAG_file_type";
5965 case DW_TAG_friend
: return "DW_TAG_friend";
5966 case DW_TAG_namelist
: return "DW_TAG_namelist";
5967 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
5968 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
5969 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
5970 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
5971 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
5972 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
5973 case DW_TAG_try_block
: return "DW_TAG_try_block";
5974 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
5975 case DW_TAG_variable
: return "DW_TAG_variable";
5976 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
5977 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
5978 case DW_TAG_format_label
: return "DW_TAG_format_label";
5979 case DW_TAG_function_template
: return "DW_TAG_function_template";
5980 case DW_TAG_class_template
: return "DW_TAG_class_template";
5981 /* DWARF 2.1 values. */
5982 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
5983 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
5984 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
5985 case DW_TAG_namespace
: return "DW_TAG_namespace";
5986 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
5987 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
5988 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
5989 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
5992 static char buffer
[100];
5994 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6001 get_AT_name (attribute
)
6002 unsigned long attribute
;
6006 case DW_AT_sibling
: return "DW_AT_sibling";
6007 case DW_AT_location
: return "DW_AT_location";
6008 case DW_AT_name
: return "DW_AT_name";
6009 case DW_AT_ordering
: return "DW_AT_ordering";
6010 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6011 case DW_AT_byte_size
: return "DW_AT_byte_size";
6012 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6013 case DW_AT_bit_size
: return "DW_AT_bit_size";
6014 case DW_AT_element_list
: return "DW_AT_element_list";
6015 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6016 case DW_AT_low_pc
: return "DW_AT_low_pc";
6017 case DW_AT_high_pc
: return "DW_AT_high_pc";
6018 case DW_AT_language
: return "DW_AT_language";
6019 case DW_AT_member
: return "DW_AT_member";
6020 case DW_AT_discr
: return "DW_AT_discr";
6021 case DW_AT_discr_value
: return "DW_AT_discr_value";
6022 case DW_AT_visibility
: return "DW_AT_visibility";
6023 case DW_AT_import
: return "DW_AT_import";
6024 case DW_AT_string_length
: return "DW_AT_string_length";
6025 case DW_AT_common_reference
: return "DW_AT_common_reference";
6026 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6027 case DW_AT_const_value
: return "DW_AT_const_value";
6028 case DW_AT_containing_type
: return "DW_AT_containing_type";
6029 case DW_AT_default_value
: return "DW_AT_default_value";
6030 case DW_AT_inline
: return "DW_AT_inline";
6031 case DW_AT_is_optional
: return "DW_AT_is_optional";
6032 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6033 case DW_AT_producer
: return "DW_AT_producer";
6034 case DW_AT_prototyped
: return "DW_AT_prototyped";
6035 case DW_AT_return_addr
: return "DW_AT_return_addr";
6036 case DW_AT_start_scope
: return "DW_AT_start_scope";
6037 case DW_AT_stride_size
: return "DW_AT_stride_size";
6038 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6039 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6040 case DW_AT_accessibility
: return "DW_AT_accessibility";
6041 case DW_AT_address_class
: return "DW_AT_address_class";
6042 case DW_AT_artificial
: return "DW_AT_artificial";
6043 case DW_AT_base_types
: return "DW_AT_base_types";
6044 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6045 case DW_AT_count
: return "DW_AT_count";
6046 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6047 case DW_AT_decl_column
: return "DW_AT_decl_column";
6048 case DW_AT_decl_file
: return "DW_AT_decl_file";
6049 case DW_AT_decl_line
: return "DW_AT_decl_line";
6050 case DW_AT_declaration
: return "DW_AT_declaration";
6051 case DW_AT_discr_list
: return "DW_AT_discr_list";
6052 case DW_AT_encoding
: return "DW_AT_encoding";
6053 case DW_AT_external
: return "DW_AT_external";
6054 case DW_AT_frame_base
: return "DW_AT_frame_base";
6055 case DW_AT_friend
: return "DW_AT_friend";
6056 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6057 case DW_AT_macro_info
: return "DW_AT_macro_info";
6058 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6059 case DW_AT_priority
: return "DW_AT_priority";
6060 case DW_AT_segment
: return "DW_AT_segment";
6061 case DW_AT_specification
: return "DW_AT_specification";
6062 case DW_AT_static_link
: return "DW_AT_static_link";
6063 case DW_AT_type
: return "DW_AT_type";
6064 case DW_AT_use_location
: return "DW_AT_use_location";
6065 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6066 case DW_AT_virtuality
: return "DW_AT_virtuality";
6067 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6068 /* DWARF 2.1 values. */
6069 case DW_AT_allocated
: return "DW_AT_allocated";
6070 case DW_AT_associated
: return "DW_AT_associated";
6071 case DW_AT_data_location
: return "DW_AT_data_location";
6072 case DW_AT_stride
: return "DW_AT_stride";
6073 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6074 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6075 case DW_AT_extension
: return "DW_AT_extension";
6076 case DW_AT_ranges
: return "DW_AT_ranges";
6077 case DW_AT_trampoline
: return "DW_AT_trampoline";
6078 case DW_AT_call_column
: return "DW_AT_call_column";
6079 case DW_AT_call_file
: return "DW_AT_call_file";
6080 case DW_AT_call_line
: return "DW_AT_call_line";
6081 /* SGI/MIPS extensions. */
6082 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6083 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6084 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6085 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6086 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6087 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
6088 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6089 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6090 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6091 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6092 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6093 /* GNU extensions. */
6094 case DW_AT_sf_names
: return "DW_AT_sf_names";
6095 case DW_AT_src_info
: return "DW_AT_src_info";
6096 case DW_AT_mac_info
: return "DW_AT_mac_info";
6097 case DW_AT_src_coords
: return "DW_AT_src_coords";
6098 case DW_AT_body_begin
: return "DW_AT_body_begin";
6099 case DW_AT_body_end
: return "DW_AT_body_end";
6102 static char buffer
[100];
6104 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6111 get_FORM_name (form
)
6116 case DW_FORM_addr
: return "DW_FORM_addr";
6117 case DW_FORM_block2
: return "DW_FORM_block2";
6118 case DW_FORM_block4
: return "DW_FORM_block4";
6119 case DW_FORM_data2
: return "DW_FORM_data2";
6120 case DW_FORM_data4
: return "DW_FORM_data4";
6121 case DW_FORM_data8
: return "DW_FORM_data8";
6122 case DW_FORM_string
: return "DW_FORM_string";
6123 case DW_FORM_block
: return "DW_FORM_block";
6124 case DW_FORM_block1
: return "DW_FORM_block1";
6125 case DW_FORM_data1
: return "DW_FORM_data1";
6126 case DW_FORM_flag
: return "DW_FORM_flag";
6127 case DW_FORM_sdata
: return "DW_FORM_sdata";
6128 case DW_FORM_strp
: return "DW_FORM_strp";
6129 case DW_FORM_udata
: return "DW_FORM_udata";
6130 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6131 case DW_FORM_ref1
: return "DW_FORM_ref1";
6132 case DW_FORM_ref2
: return "DW_FORM_ref2";
6133 case DW_FORM_ref4
: return "DW_FORM_ref4";
6134 case DW_FORM_ref8
: return "DW_FORM_ref8";
6135 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6136 case DW_FORM_indirect
: return "DW_FORM_indirect";
6139 static char buffer
[100];
6141 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6147 /* FIXME: There are better and more effiecint ways to handle
6148 these structures. For now though, I just want something that
6149 is simple to implement. */
6150 typedef struct abbrev_attr
6152 unsigned long attribute
;
6154 struct abbrev_attr
* next
;
6158 typedef struct abbrev_entry
6160 unsigned long entry
;
6163 struct abbrev_attr
* first_attr
;
6164 struct abbrev_attr
* last_attr
;
6165 struct abbrev_entry
* next
;
6169 static abbrev_entry
* first_abbrev
= NULL
;
6170 static abbrev_entry
* last_abbrev
= NULL
;
6173 free_abbrevs
PARAMS ((void))
6175 abbrev_entry
* abbrev
;
6177 for (abbrev
= first_abbrev
; abbrev
;)
6179 abbrev_entry
* next
= abbrev
->next
;
6182 for (attr
= abbrev
->first_attr
; attr
;)
6184 abbrev_attr
* next
= attr
->next
;
6194 last_abbrev
= first_abbrev
= NULL
;
6198 add_abbrev (number
, tag
, children
)
6199 unsigned long number
;
6203 abbrev_entry
* entry
;
6205 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
6211 entry
->entry
= number
;
6213 entry
->children
= children
;
6214 entry
->first_attr
= NULL
;
6215 entry
->last_attr
= NULL
;
6218 if (first_abbrev
== NULL
)
6219 first_abbrev
= entry
;
6221 last_abbrev
->next
= entry
;
6223 last_abbrev
= entry
;
6227 add_abbrev_attr (attribute
, form
)
6228 unsigned long attribute
;
6233 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
6239 attr
->attribute
= attribute
;
6243 if (last_abbrev
->first_attr
== NULL
)
6244 last_abbrev
->first_attr
= attr
;
6246 last_abbrev
->last_attr
->next
= attr
;
6248 last_abbrev
->last_attr
= attr
;
6251 /* Processes the (partial) contents of a .debug_abbrev section.
6252 Returns NULL if the end of the section was encountered.
6253 Returns the address after the last byte read if the end of
6254 an abbreviation set was found. */
6256 static unsigned char *
6257 process_abbrev_section (start
, end
)
6258 unsigned char * start
;
6259 unsigned char * end
;
6261 if (first_abbrev
!= NULL
)
6267 unsigned long entry
;
6269 unsigned long attribute
;
6272 entry
= read_leb128 (start
, & bytes_read
, 0);
6273 start
+= bytes_read
;
6275 /* A single zero is supposed to end the section according
6276 to the standard. If there's more, then signal that to
6279 return start
== end
? NULL
: start
;
6281 tag
= read_leb128 (start
, & bytes_read
, 0);
6282 start
+= bytes_read
;
6284 children
= * start
++;
6286 add_abbrev (entry
, tag
, children
);
6292 attribute
= read_leb128 (start
, & bytes_read
, 0);
6293 start
+= bytes_read
;
6295 form
= read_leb128 (start
, & bytes_read
, 0);
6296 start
+= bytes_read
;
6299 add_abbrev_attr (attribute
, form
);
6301 while (attribute
!= 0);
6309 display_debug_macinfo (section
, start
, file
)
6310 Elf32_Internal_Shdr
* section
;
6311 unsigned char * start
;
6312 FILE * file ATTRIBUTE_UNUSED
;
6314 unsigned char * end
= start
+ section
->sh_size
;
6315 unsigned char * curr
= start
;
6316 unsigned int bytes_read
;
6317 enum dwarf_macinfo_record_type op
;
6319 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6323 unsigned int lineno
;
6324 const char * string
;
6331 case DW_MACINFO_start_file
:
6333 unsigned int filenum
;
6335 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6337 filenum
= read_leb128 (curr
, & bytes_read
, 0);
6340 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
6344 case DW_MACINFO_end_file
:
6345 printf (_(" DW_MACINFO_end_file\n"));
6348 case DW_MACINFO_define
:
6349 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6352 curr
+= strlen (string
) + 1;
6353 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
6356 case DW_MACINFO_undef
:
6357 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6360 curr
+= strlen (string
) + 1;
6361 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
6364 case DW_MACINFO_vendor_ext
:
6366 unsigned int constant
;
6368 constant
= read_leb128 (curr
, & bytes_read
, 0);
6371 curr
+= strlen (string
) + 1;
6372 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
6383 display_debug_abbrev (section
, start
, file
)
6384 Elf32_Internal_Shdr
* section
;
6385 unsigned char * start
;
6386 FILE * file ATTRIBUTE_UNUSED
;
6388 abbrev_entry
* entry
;
6389 unsigned char * end
= start
+ section
->sh_size
;
6391 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6395 start
= process_abbrev_section (start
, end
);
6397 printf (_(" Number TAG\n"));
6399 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
6403 printf (_(" %ld %s [%s]\n"),
6405 get_TAG_name (entry
->tag
),
6406 entry
->children
? _("has children") : _("no children"));
6408 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6410 printf (_(" %-18s %s\n"),
6411 get_AT_name (attr
->attribute
),
6412 get_FORM_name (attr
->form
));
6424 static unsigned char *
6425 display_block (data
, length
)
6426 unsigned char * data
;
6427 unsigned long length
;
6429 printf (_(" %lu byte block: "), length
);
6432 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
6438 decode_location_expression (data
, pointer_size
, length
)
6439 unsigned char * data
;
6440 unsigned int pointer_size
;
6441 unsigned long length
;
6445 unsigned long uvalue
;
6446 unsigned char * end
= data
+ length
;
6455 printf ("DW_OP_addr: %lx",
6456 (unsigned long) byte_get (data
, pointer_size
));
6457 data
+= pointer_size
;
6460 printf ("DW_OP_deref");
6463 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
6466 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
6469 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
6473 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
6477 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
6481 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
6485 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
6486 (unsigned long) byte_get (data
+ 4, 4));
6490 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
6491 (long) byte_get (data
+ 4, 4));
6495 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
6499 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
6503 printf ("DW_OP_dup");
6506 printf ("DW_OP_drop");
6509 printf ("DW_OP_over");
6512 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
6515 printf ("DW_OP_swap");
6518 printf ("DW_OP_rot");
6521 printf ("DW_OP_xderef");
6524 printf ("DW_OP_abs");
6527 printf ("DW_OP_and");
6530 printf ("DW_OP_div");
6533 printf ("DW_OP_minus");
6536 printf ("DW_OP_mod");
6539 printf ("DW_OP_mul");
6542 printf ("DW_OP_neg");
6545 printf ("DW_OP_not");
6548 printf ("DW_OP_or");
6551 printf ("DW_OP_plus");
6553 case DW_OP_plus_uconst
:
6554 printf ("DW_OP_plus_uconst: %lu",
6555 read_leb128 (data
, &bytes_read
, 0));
6559 printf ("DW_OP_shl");
6562 printf ("DW_OP_shr");
6565 printf ("DW_OP_shra");
6568 printf ("DW_OP_xor");
6571 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
6575 printf ("DW_OP_eq");
6578 printf ("DW_OP_ge");
6581 printf ("DW_OP_gt");
6584 printf ("DW_OP_le");
6587 printf ("DW_OP_lt");
6590 printf ("DW_OP_ne");
6593 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
6629 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
6664 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
6699 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
6700 read_leb128 (data
, &bytes_read
, 1));
6705 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
6709 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
6713 uvalue
= read_leb128 (data
, &bytes_read
, 0);
6715 printf ("DW_OP_bregx: %lu %ld", uvalue
,
6716 read_leb128 (data
, &bytes_read
, 1));
6720 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
6723 case DW_OP_deref_size
:
6724 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
6726 case DW_OP_xderef_size
:
6727 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
6730 printf ("DW_OP_nop");
6733 /* DWARF 2.1 extensions. */
6734 case DW_OP_push_object_address
:
6735 printf ("DW_OP_push_object_address");
6738 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
6742 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
6746 printf ("DW_OP_calli");
6750 if (op
>= DW_OP_lo_user
6751 && op
<= DW_OP_hi_user
)
6752 printf (_("(User defined location op)"));
6754 printf (_("(Unknown location op)"));
6755 /* No way to tell where the next op is, so just bail. */
6759 /* Separate the ops. */
6765 static unsigned char *
6766 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
6767 unsigned long attribute
;
6769 unsigned char * data
;
6770 unsigned long cu_offset
;
6771 unsigned long pointer_size
;
6773 unsigned long uvalue
= 0;
6774 unsigned char * block_start
= NULL
;
6777 printf (" %-18s:", get_AT_name (attribute
));
6784 case DW_FORM_ref_addr
:
6786 uvalue
= byte_get (data
, pointer_size
);
6787 data
+= pointer_size
;
6793 uvalue
= byte_get (data
++, 1);
6798 uvalue
= byte_get (data
, 2);
6804 uvalue
= byte_get (data
, 4);
6809 uvalue
= read_leb128 (data
, & bytes_read
, 1);
6813 case DW_FORM_ref_udata
:
6815 uvalue
= read_leb128 (data
, & bytes_read
, 0);
6822 case DW_FORM_ref_addr
:
6823 printf (" <#%lx>", uvalue
);
6829 case DW_FORM_ref_udata
:
6830 printf (" <%lx>", uvalue
+ cu_offset
);
6834 printf (" %#lx", uvalue
);
6842 printf (" %ld", uvalue
);
6847 uvalue
= byte_get (data
, 4);
6848 printf (" %lx", uvalue
);
6849 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
6853 case DW_FORM_string
:
6854 printf (" %s", data
);
6855 data
+= strlen ((char *) data
) + 1;
6859 uvalue
= read_leb128 (data
, & bytes_read
, 0);
6860 block_start
= data
+ bytes_read
;
6861 data
= display_block (block_start
, uvalue
);
6864 case DW_FORM_block1
:
6865 uvalue
= byte_get (data
, 1);
6866 block_start
= data
+ 1;
6867 data
= display_block (block_start
, uvalue
);
6870 case DW_FORM_block2
:
6871 uvalue
= byte_get (data
, 2);
6872 block_start
= data
+ 2;
6873 data
= display_block (block_start
, uvalue
);
6876 case DW_FORM_block4
:
6877 uvalue
= byte_get (data
, 4);
6878 block_start
= data
+ 4;
6879 data
= display_block (block_start
, uvalue
);
6883 case DW_FORM_indirect
:
6884 warn (_("Unable to handle FORM: %d"), form
);
6888 warn (_("Unrecognised form: %d"), form
);
6892 /* For some attributes we can display futher information. */
6901 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
6902 case DW_INL_inlined
: printf (_("(inlined)")); break;
6903 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
6904 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
6905 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
6909 case DW_AT_language
:
6912 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
6913 case DW_LANG_C89
: printf ("(ANSI C)"); break;
6914 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
6915 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
6916 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
6917 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
6918 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
6919 case DW_LANG_Ada83
: printf ("(Ada)"); break;
6920 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
6921 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
6922 /* DWARF 2.1 values. */
6923 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
6924 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
6925 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
6926 /* MIPS extension. */
6927 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
6928 default: printf ("(Unknown: %lx)", uvalue
); break;
6932 case DW_AT_encoding
:
6935 case DW_ATE_void
: printf ("(void)"); break;
6936 case DW_ATE_address
: printf ("(machine address)"); break;
6937 case DW_ATE_boolean
: printf ("(boolean)"); break;
6938 case DW_ATE_complex_float
: printf ("(complex float)"); break;
6939 case DW_ATE_float
: printf ("(float)"); break;
6940 case DW_ATE_signed
: printf ("(signed)"); break;
6941 case DW_ATE_signed_char
: printf ("(signed char)"); break;
6942 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
6943 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
6944 /* DWARF 2.1 value. */
6945 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
6947 if (uvalue
>= DW_ATE_lo_user
6948 && uvalue
<= DW_ATE_hi_user
)
6949 printf ("(user defined type)");
6951 printf ("(unknown type)");
6956 case DW_AT_accessibility
:
6959 case DW_ACCESS_public
: printf ("(public)"); break;
6960 case DW_ACCESS_protected
: printf ("(protected)"); break;
6961 case DW_ACCESS_private
: printf ("(private)"); break;
6962 default: printf ("(unknown accessibility)"); break;
6966 case DW_AT_visibility
:
6969 case DW_VIS_local
: printf ("(local)"); break;
6970 case DW_VIS_exported
: printf ("(exported)"); break;
6971 case DW_VIS_qualified
: printf ("(qualified)"); break;
6972 default: printf ("(unknown visibility)"); break;
6976 case DW_AT_virtuality
:
6979 case DW_VIRTUALITY_none
: printf ("(none)"); break;
6980 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
6981 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
6982 default: printf ("(unknown virtuality)"); break;
6986 case DW_AT_identifier_case
:
6989 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
6990 case DW_ID_up_case
: printf ("(up_case)"); break;
6991 case DW_ID_down_case
: printf ("(down_case)"); break;
6992 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
6993 default: printf ("(unknown case)"); break;
6997 case DW_AT_calling_convention
:
7000 case DW_CC_normal
: printf ("(normal)"); break;
7001 case DW_CC_program
: printf ("(program)"); break;
7002 case DW_CC_nocall
: printf ("(nocall)"); break;
7004 if (uvalue
>= DW_CC_lo_user
7005 && uvalue
<= DW_CC_hi_user
)
7006 printf ("(user defined)");
7008 printf ("(unknown convention)");
7012 case DW_AT_ordering
:
7015 case -1: printf ("(undefined)"); break;
7016 case 0: printf ("(row major)"); break;
7017 case 1: printf ("(column major)"); break;
7021 case DW_AT_frame_base
:
7022 case DW_AT_location
:
7023 case DW_AT_data_member_location
:
7024 case DW_AT_vtable_elem_location
:
7025 case DW_AT_allocated
:
7026 case DW_AT_associated
:
7027 case DW_AT_data_location
:
7029 case DW_AT_upper_bound
:
7030 case DW_AT_lower_bound
:
7034 decode_location_expression (block_start
, pointer_size
, uvalue
);
7048 display_debug_info (section
, start
, file
)
7049 Elf32_Internal_Shdr
* section
;
7050 unsigned char * start
;
7053 unsigned char * end
= start
+ section
->sh_size
;
7054 unsigned char * section_begin
= start
;
7056 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7060 DWARF2_External_CompUnit
* external
;
7061 DWARF2_Internal_CompUnit compunit
;
7062 Elf32_Internal_Shdr
* relsec
;
7063 unsigned char * tags
;
7066 unsigned long cu_offset
;
7068 external
= (DWARF2_External_CompUnit
*) start
;
7070 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
7071 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
7072 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
7073 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
7075 /* Check for RELA relocations in the abbrev_offset address, and
7077 for (relsec
= section_headers
;
7078 relsec
< section_headers
+ elf_header
.e_shnum
;
7081 unsigned long nrelas
, nsyms
;
7082 Elf_Internal_Rela
*rela
, *rp
;
7083 Elf32_Internal_Shdr
*symsec
;
7084 Elf_Internal_Sym
*symtab
;
7085 Elf_Internal_Sym
*sym
;
7087 if (relsec
->sh_type
!= SHT_RELA
7088 || section_headers
+ relsec
->sh_info
!= section
)
7091 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7095 symsec
= section_headers
+ relsec
->sh_link
;
7096 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
7097 symtab
= GET_ELF_SYMBOLS (file
, symsec
->sh_offset
, nsyms
);
7099 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7102 != (bfd_vma
) ((unsigned char *) &external
->cu_abbrev_offset
7108 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7110 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7112 warn (_("Skipping unexpected symbol type %u"),
7113 ELF32_ST_TYPE (sym
->st_info
));
7119 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7121 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7123 warn (_("Skipping unexpected symbol type %u"),
7124 ELF64_ST_TYPE (sym
->st_info
));
7129 compunit
.cu_abbrev_offset
+= rp
->r_addend
;
7137 tags
= start
+ sizeof (* external
);
7138 cu_offset
= start
- section_begin
;
7139 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
7141 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
7142 printf (_(" Length: %ld\n"), compunit
.cu_length
);
7143 printf (_(" Version: %d\n"), compunit
.cu_version
);
7144 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
7145 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
7147 if (compunit
.cu_version
!= 2)
7149 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7153 if (first_abbrev
!= NULL
)
7156 /* Read in the abbrevs used by this compilation unit. */
7159 Elf32_Internal_Shdr
* sec
;
7160 unsigned char * begin
;
7162 /* Locate the .debug_abbrev section and process it. */
7163 for (i
= 0, sec
= section_headers
;
7164 i
< elf_header
.e_shnum
;
7166 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
7169 if (i
== -1 || sec
->sh_size
== 0)
7171 warn (_("Unable to locate .debug_abbrev section!\n"));
7175 begin
= ((unsigned char *)
7176 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7177 _("debug_abbrev section data")));
7181 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
7182 begin
+ sec
->sh_size
);
7188 while (tags
< start
)
7191 unsigned long abbrev_number
;
7192 abbrev_entry
* entry
;
7195 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
7198 /* A null DIE marks the end of a list of children. */
7199 if (abbrev_number
== 0)
7205 /* Scan through the abbreviation list until we reach the
7207 for (entry
= first_abbrev
;
7208 entry
&& entry
->entry
!= abbrev_number
;
7209 entry
= entry
->next
)
7214 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7219 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7221 (unsigned long) (tags
- section_begin
- bytes_read
),
7223 get_TAG_name (entry
->tag
));
7225 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7226 tags
= read_and_display_attr (attr
->attribute
,
7229 compunit
.cu_pointer_size
);
7231 if (entry
->children
)
7242 display_debug_aranges (section
, start
, file
)
7243 Elf32_Internal_Shdr
* section
;
7244 unsigned char * start
;
7245 FILE * file ATTRIBUTE_UNUSED
;
7247 unsigned char * end
= start
+ section
->sh_size
;
7249 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7253 DWARF2_External_ARange
* external
;
7254 DWARF2_Internal_ARange arange
;
7255 unsigned char * ranges
;
7256 unsigned long length
;
7257 unsigned long address
;
7260 external
= (DWARF2_External_ARange
*) start
;
7262 arange
.ar_length
= BYTE_GET (external
->ar_length
);
7263 arange
.ar_version
= BYTE_GET (external
->ar_version
);
7264 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
7265 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
7266 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
7268 if (arange
.ar_version
!= 2)
7270 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7274 printf (_(" Length: %ld\n"), arange
.ar_length
);
7275 printf (_(" Version: %d\n"), arange
.ar_version
);
7276 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
7277 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
7278 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
7280 printf (_("\n Address Length\n"));
7282 ranges
= start
+ sizeof (* external
);
7284 /* Must pad to an alignment boundary that is twice the pointer size. */
7285 excess
= sizeof (* external
) % (2 * arange
.ar_pointer_size
);
7287 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
7291 address
= byte_get (ranges
, arange
.ar_pointer_size
);
7293 ranges
+= arange
.ar_pointer_size
;
7295 length
= byte_get (ranges
, arange
.ar_pointer_size
);
7297 ranges
+= arange
.ar_pointer_size
;
7299 /* A pair of zeros marks the end of the list. */
7300 if (address
== 0 && length
== 0)
7303 printf (" %8.8lx %lu\n", address
, length
);
7306 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
7314 typedef struct Frame_Chunk
7316 struct Frame_Chunk
* next
;
7317 unsigned char * chunk_start
;
7319 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7320 short int * col_type
;
7322 char * augmentation
;
7323 unsigned int code_factor
;
7325 unsigned long pc_begin
;
7326 unsigned long pc_range
;
7330 unsigned char fde_encoding
;
7334 /* A marker for a col_type that means this column was never referenced
7335 in the frame info. */
7336 #define DW_CFA_unreferenced (-1)
7338 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
7339 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
7340 static int size_of_encoded_value
PARAMS ((int));
7343 frame_need_space (fc
, reg
)
7347 int prev
= fc
->ncols
;
7349 if (reg
< fc
->ncols
)
7352 fc
->ncols
= reg
+ 1;
7353 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
7354 fc
->ncols
* sizeof (short int));
7355 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
7356 fc
->ncols
* sizeof (int));
7358 while (prev
< fc
->ncols
)
7360 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
7361 fc
->col_offset
[prev
] = 0;
7367 frame_display_row (fc
, need_col_headers
, max_regs
)
7369 int * need_col_headers
;
7375 if (* max_regs
< fc
->ncols
)
7376 * max_regs
= fc
->ncols
;
7378 if (* need_col_headers
)
7380 * need_col_headers
= 0;
7382 printf (" LOC CFA ");
7384 for (r
= 0; r
< * max_regs
; r
++)
7385 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7390 printf ("r%-4d", r
);
7396 printf ("%08lx ", fc
->pc_begin
);
7397 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
7398 printf ("%-8s ", tmp
);
7400 for (r
= 0; r
< fc
->ncols
; r
++)
7402 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7404 switch (fc
->col_type
[r
])
7406 case DW_CFA_undefined
:
7409 case DW_CFA_same_value
:
7413 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
7415 case DW_CFA_register
:
7416 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
7419 strcpy (tmp
, "n/a");
7422 printf ("%-5s", tmp
);
7429 size_of_encoded_value (encoding
)
7432 switch (encoding
& 0x7)
7435 case 0: return is_32bit_elf
? 4 : 8;
7442 #define GET(N) byte_get (start, N); start += N
7443 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7444 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7447 display_debug_frames (section
, start
, file
)
7448 Elf32_Internal_Shdr
* section
;
7449 unsigned char * start
;
7450 FILE * file ATTRIBUTE_UNUSED
;
7452 unsigned char * end
= start
+ section
->sh_size
;
7453 unsigned char * section_start
= start
;
7454 Frame_Chunk
* chunks
= 0;
7455 Frame_Chunk
* remembered_state
= 0;
7457 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
7460 int addr_size
= is_32bit_elf
? 4 : 8;
7462 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
7466 unsigned char * saved_start
;
7467 unsigned char * block_end
;
7468 unsigned long length
;
7469 unsigned long cie_id
;
7472 int need_col_headers
= 1;
7473 unsigned char * augmentation_data
= NULL
;
7474 unsigned long augmentation_data_len
= 0;
7475 int encoded_ptr_size
= addr_size
;
7477 saved_start
= start
;
7478 length
= byte_get (start
, 4); start
+= 4;
7483 block_end
= saved_start
+ length
+ 4;
7484 cie_id
= byte_get (start
, 4); start
+= 4;
7486 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
7490 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
7491 memset (fc
, 0, sizeof (Frame_Chunk
));
7495 fc
->chunk_start
= saved_start
;
7497 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7498 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7499 frame_need_space (fc
, max_regs
-1);
7503 fc
->augmentation
= start
;
7504 start
= strchr (start
, '\0') + 1;
7506 if (fc
->augmentation
[0] == 'z')
7508 fc
->code_factor
= LEB ();
7509 fc
->data_factor
= SLEB ();
7510 fc
->ra
= byte_get (start
, 1); start
+= 1;
7511 augmentation_data_len
= LEB ();
7512 augmentation_data
= start
;
7513 start
+= augmentation_data_len
;
7515 else if (strcmp (fc
->augmentation
, "eh") == 0)
7518 fc
->code_factor
= LEB ();
7519 fc
->data_factor
= SLEB ();
7520 fc
->ra
= byte_get (start
, 1); start
+= 1;
7524 fc
->code_factor
= LEB ();
7525 fc
->data_factor
= SLEB ();
7526 fc
->ra
= byte_get (start
, 1); start
+= 1;
7530 if (do_debug_frames_interp
)
7531 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7532 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
7533 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
7537 printf ("\n%08lx %08lx %08lx CIE\n",
7538 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
7539 printf (" Version: %d\n", version
);
7540 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
7541 printf (" Code alignment factor: %u\n", fc
->code_factor
);
7542 printf (" Data alignment factor: %d\n", fc
->data_factor
);
7543 printf (" Return address column: %d\n", fc
->ra
);
7545 if (augmentation_data_len
)
7548 printf (" Augmentation data: ");
7549 for (i
= 0; i
< augmentation_data_len
; ++i
)
7550 printf (" %02x", augmentation_data
[i
]);
7556 if (augmentation_data_len
)
7558 unsigned char *p
, *q
;
7559 p
= fc
->augmentation
+ 1;
7560 q
= augmentation_data
;
7567 q
+= 1 + size_of_encoded_value (*q
);
7569 fc
->fde_encoding
= *q
++;
7575 if (fc
->fde_encoding
)
7576 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
7579 frame_need_space (fc
, fc
->ra
);
7583 unsigned char * look_for
;
7584 static Frame_Chunk fde_fc
;
7587 memset (fc
, 0, sizeof (Frame_Chunk
));
7589 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
7591 for (cie
=chunks
; cie
; cie
= cie
->next
)
7592 if (cie
->chunk_start
== look_for
)
7597 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7598 cie_id
, saved_start
);
7601 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7602 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7603 frame_need_space (fc
, max_regs
- 1);
7605 fc
->augmentation
= "";
7606 fc
->fde_encoding
= 0;
7610 fc
->ncols
= cie
->ncols
;
7611 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
7612 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
7613 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
7614 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
7615 fc
->augmentation
= cie
->augmentation
;
7616 fc
->code_factor
= cie
->code_factor
;
7617 fc
->data_factor
= cie
->data_factor
;
7618 fc
->cfa_reg
= cie
->cfa_reg
;
7619 fc
->cfa_offset
= cie
->cfa_offset
;
7621 frame_need_space (fc
, max_regs
-1);
7622 fc
->fde_encoding
= cie
->fde_encoding
;
7625 if (fc
->fde_encoding
)
7626 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
7628 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
7629 start
+= encoded_ptr_size
;
7630 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
7631 start
+= encoded_ptr_size
;
7633 if (cie
->augmentation
[0] == 'z')
7635 augmentation_data_len
= LEB ();
7636 augmentation_data
= start
;
7637 start
+= augmentation_data_len
;
7640 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
7641 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
7642 (unsigned long)(cie
->chunk_start
- section_start
),
7643 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
7644 if (! do_debug_frames_interp
&& augmentation_data_len
)
7647 printf (" Augmentation data: ");
7648 for (i
= 0; i
< augmentation_data_len
; ++i
)
7649 printf (" %02x", augmentation_data
[i
]);
7655 /* At this point, fc is the current chunk, cie (if any) is set, and we're
7656 about to interpret instructions for the chunk. */
7658 if (do_debug_frames_interp
)
7660 /* Start by making a pass over the chunk, allocating storage
7661 and taking note of what registers are used. */
7662 unsigned char * tmp
= start
;
7664 while (start
< block_end
)
7674 /* Warning: if you add any more cases to this switch, be
7675 sure to add them to the corresponding switch below. */
7678 case DW_CFA_advance_loc
:
7682 frame_need_space (fc
, opa
);
7683 fc
->col_type
[opa
] = DW_CFA_undefined
;
7685 case DW_CFA_restore
:
7686 frame_need_space (fc
, opa
);
7687 fc
->col_type
[opa
] = DW_CFA_undefined
;
7689 case DW_CFA_set_loc
:
7690 start
+= encoded_ptr_size
;
7692 case DW_CFA_advance_loc1
:
7695 case DW_CFA_advance_loc2
:
7698 case DW_CFA_advance_loc4
:
7701 case DW_CFA_offset_extended
:
7702 reg
= LEB (); LEB ();
7703 frame_need_space (fc
, reg
);
7704 fc
->col_type
[reg
] = DW_CFA_undefined
;
7706 case DW_CFA_restore_extended
:
7708 frame_need_space (fc
, reg
);
7709 fc
->col_type
[reg
] = DW_CFA_undefined
;
7711 case DW_CFA_undefined
:
7713 frame_need_space (fc
, reg
);
7714 fc
->col_type
[reg
] = DW_CFA_undefined
;
7716 case DW_CFA_same_value
:
7718 frame_need_space (fc
, reg
);
7719 fc
->col_type
[reg
] = DW_CFA_undefined
;
7721 case DW_CFA_register
:
7722 reg
= LEB (); LEB ();
7723 frame_need_space (fc
, reg
);
7724 fc
->col_type
[reg
] = DW_CFA_undefined
;
7726 case DW_CFA_def_cfa
:
7729 case DW_CFA_def_cfa_register
:
7732 case DW_CFA_def_cfa_offset
:
7735 #ifndef DW_CFA_GNU_args_size
7736 #define DW_CFA_GNU_args_size 0x2e
7738 case DW_CFA_GNU_args_size
:
7741 #ifndef DW_CFA_GNU_negative_offset_extended
7742 #define DW_CFA_GNU_negative_offset_extended 0x2f
7744 case DW_CFA_GNU_negative_offset_extended
:
7745 reg
= LEB (); LEB ();
7746 frame_need_space (fc
, reg
);
7747 fc
->col_type
[reg
] = DW_CFA_undefined
;
7756 /* Now we know what registers are used, make a second pass over
7757 the chunk, this time actually printing out the info. */
7759 while (start
< block_end
)
7762 unsigned long ul
, reg
, roffs
;
7771 /* Warning: if you add any more cases to this switch, be
7772 sure to add them to the corresponding switch above. */
7775 case DW_CFA_advance_loc
:
7776 if (do_debug_frames_interp
)
7777 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7779 printf (" DW_CFA_advance_loc: %d to %08lx\n",
7780 opa
* fc
->code_factor
,
7781 fc
->pc_begin
+ opa
* fc
->code_factor
);
7782 fc
->pc_begin
+= opa
* fc
->code_factor
;
7787 if (! do_debug_frames_interp
)
7788 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
7789 opa
, roffs
* fc
->data_factor
);
7790 fc
->col_type
[opa
] = DW_CFA_offset
;
7791 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
7794 case DW_CFA_restore
:
7795 if (! do_debug_frames_interp
)
7796 printf (" DW_CFA_restore: r%d\n", opa
);
7797 fc
->col_type
[opa
] = cie
->col_type
[opa
];
7798 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
7801 case DW_CFA_set_loc
:
7802 vma
= byte_get (start
, encoded_ptr_size
);
7803 start
+= encoded_ptr_size
;
7804 if (do_debug_frames_interp
)
7805 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7807 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
7811 case DW_CFA_advance_loc1
:
7812 ofs
= byte_get (start
, 1); start
+= 1;
7813 if (do_debug_frames_interp
)
7814 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7816 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
7817 ofs
* fc
->code_factor
,
7818 fc
->pc_begin
+ ofs
* fc
->code_factor
);
7819 fc
->pc_begin
+= ofs
* fc
->code_factor
;
7822 case DW_CFA_advance_loc2
:
7823 ofs
= byte_get (start
, 2); start
+= 2;
7824 if (do_debug_frames_interp
)
7825 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7827 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
7828 ofs
* fc
->code_factor
,
7829 fc
->pc_begin
+ ofs
* fc
->code_factor
);
7830 fc
->pc_begin
+= ofs
* fc
->code_factor
;
7833 case DW_CFA_advance_loc4
:
7834 ofs
= byte_get (start
, 4); start
+= 4;
7835 if (do_debug_frames_interp
)
7836 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7838 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
7839 ofs
* fc
->code_factor
,
7840 fc
->pc_begin
+ ofs
* fc
->code_factor
);
7841 fc
->pc_begin
+= ofs
* fc
->code_factor
;
7844 case DW_CFA_offset_extended
:
7847 if (! do_debug_frames_interp
)
7848 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
7849 reg
, roffs
* fc
->data_factor
);
7850 fc
->col_type
[reg
] = DW_CFA_offset
;
7851 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
7854 case DW_CFA_restore_extended
:
7856 if (! do_debug_frames_interp
)
7857 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
7858 fc
->col_type
[reg
] = cie
->col_type
[reg
];
7859 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
7862 case DW_CFA_undefined
:
7864 if (! do_debug_frames_interp
)
7865 printf (" DW_CFA_undefined: r%ld\n", reg
);
7866 fc
->col_type
[reg
] = DW_CFA_undefined
;
7867 fc
->col_offset
[reg
] = 0;
7870 case DW_CFA_same_value
:
7872 if (! do_debug_frames_interp
)
7873 printf (" DW_CFA_same_value: r%ld\n", reg
);
7874 fc
->col_type
[reg
] = DW_CFA_same_value
;
7875 fc
->col_offset
[reg
] = 0;
7878 case DW_CFA_register
:
7881 if (! do_debug_frames_interp
)
7882 printf (" DW_CFA_register: r%ld\n", reg
);
7883 fc
->col_type
[reg
] = DW_CFA_register
;
7884 fc
->col_offset
[reg
] = roffs
;
7887 case DW_CFA_remember_state
:
7888 if (! do_debug_frames_interp
)
7889 printf (" DW_CFA_remember_state\n");
7890 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
7891 rs
->ncols
= fc
->ncols
;
7892 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
7893 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
7894 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
7895 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
7896 rs
->next
= remembered_state
;
7897 remembered_state
= rs
;
7900 case DW_CFA_restore_state
:
7901 if (! do_debug_frames_interp
)
7902 printf (" DW_CFA_restore_state\n");
7903 rs
= remembered_state
;
7904 remembered_state
= rs
->next
;
7905 frame_need_space (fc
, rs
->ncols
-1);
7906 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
7907 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
7908 free (rs
->col_type
);
7909 free (rs
->col_offset
);
7913 case DW_CFA_def_cfa
:
7914 fc
->cfa_reg
= LEB ();
7915 fc
->cfa_offset
= LEB ();
7916 if (! do_debug_frames_interp
)
7917 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
7918 fc
->cfa_reg
, fc
->cfa_offset
);
7921 case DW_CFA_def_cfa_register
:
7922 fc
->cfa_reg
= LEB ();
7923 if (! do_debug_frames_interp
)
7924 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
7927 case DW_CFA_def_cfa_offset
:
7928 fc
->cfa_offset
= LEB ();
7929 if (! do_debug_frames_interp
)
7930 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
7934 if (! do_debug_frames_interp
)
7935 printf (" DW_CFA_nop\n");
7938 #ifndef DW_CFA_GNU_window_save
7939 #define DW_CFA_GNU_window_save 0x2d
7941 case DW_CFA_GNU_window_save
:
7942 if (! do_debug_frames_interp
)
7943 printf (" DW_CFA_GNU_window_save\n");
7946 case DW_CFA_GNU_args_size
:
7948 if (! do_debug_frames_interp
)
7949 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
7952 case DW_CFA_GNU_negative_offset_extended
:
7955 frame_need_space (fc
, reg
);
7956 if (! do_debug_frames_interp
)
7957 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
7958 reg
, l
* fc
->data_factor
);
7959 fc
->col_type
[reg
] = DW_CFA_offset
;
7960 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
7964 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
7969 if (do_debug_frames_interp
)
7970 frame_display_row (fc
, &need_col_headers
, &max_regs
);
7985 display_debug_not_supported (section
, start
, file
)
7986 Elf32_Internal_Shdr
* section
;
7987 unsigned char * start ATTRIBUTE_UNUSED
;
7988 FILE * file ATTRIBUTE_UNUSED
;
7990 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7991 SECTION_NAME (section
));
7996 /* Pre-scan the .debug_info section to record the size of address.
7997 When dumping the .debug_line, we use that size information, assuming
7998 that all compilation units have the same address size. */
8000 prescan_debug_info (section
, start
, file
)
8001 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
8002 unsigned char * start
;
8003 FILE * file ATTRIBUTE_UNUSED
;
8005 DWARF2_External_CompUnit
* external
;
8007 external
= (DWARF2_External_CompUnit
*) start
;
8009 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
8013 /* A structure containing the name of a debug section and a pointer
8014 to a function that can decode it. The third field is a prescan
8015 function to be run over the section before displaying any of the
8020 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8021 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8025 { ".debug_info", display_debug_info
, prescan_debug_info
},
8026 { ".debug_abbrev", display_debug_abbrev
, NULL
},
8027 { ".debug_line", display_debug_lines
, NULL
},
8028 { ".debug_aranges", display_debug_aranges
, NULL
},
8029 { ".debug_pubnames", display_debug_pubnames
, NULL
},
8030 { ".debug_frame", display_debug_frames
, NULL
},
8031 { ".eh_frame", display_debug_frames
, NULL
},
8032 { ".debug_macinfo", display_debug_macinfo
, NULL
},
8033 { ".debug_str", display_debug_not_supported
, NULL
},
8034 { ".debug_static_func", display_debug_not_supported
, NULL
},
8035 { ".debug_static_vars", display_debug_not_supported
, NULL
},
8036 { ".debug_types", display_debug_not_supported
, NULL
},
8037 { ".debug_weaknames", display_debug_not_supported
, NULL
}
8041 display_debug_section (section
, file
)
8042 Elf32_Internal_Shdr
* section
;
8045 char * name
= SECTION_NAME (section
);
8046 bfd_size_type length
;
8047 unsigned char * start
;
8050 length
= section
->sh_size
;
8053 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8057 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
8058 _("debug section data"));
8062 /* See if we know how to display the contents of this section. */
8063 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
8064 name
= ".debug_info";
8066 for (i
= NUM_ELEM (debug_displays
); i
--;)
8067 if (strcmp (debug_displays
[i
].name
, name
) == 0)
8069 debug_displays
[i
].display (section
, start
, file
);
8074 printf (_("Unrecognised debug section: %s\n"), name
);
8078 /* If we loaded in the abbrev section at some point,
8079 we must release it here. */
8080 if (first_abbrev
!= NULL
)
8087 process_section_contents (file
)
8090 Elf32_Internal_Shdr
* section
;
8096 /* Pre-scan the debug sections to find some debug information not
8097 present in some of them. For the .debug_line, we must find out the
8098 size of address (specified in .debug_info and .debug_aranges). */
8099 for (i
= 0, section
= section_headers
;
8100 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8103 char * name
= SECTION_NAME (section
);
8106 if (section
->sh_size
== 0)
8109 /* See if there is some pre-scan operation for this section. */
8110 for (j
= NUM_ELEM (debug_displays
); j
--;)
8111 if (strcmp (debug_displays
[j
].name
, name
) == 0)
8113 if (debug_displays
[j
].prescan
!= NULL
)
8115 bfd_size_type length
;
8116 unsigned char * start
;
8118 length
= section
->sh_size
;
8119 start
= ((unsigned char *)
8120 get_data (NULL
, file
, section
->sh_offset
, length
,
8121 _("debug section data")));
8125 debug_displays
[j
].prescan (section
, start
, file
);
8133 for (i
= 0, section
= section_headers
;
8134 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8137 #ifdef SUPPORT_DISASSEMBLY
8138 if (dump_sects
[i
] & DISASS_DUMP
)
8139 disassemble_section (section
, file
);
8141 if (dump_sects
[i
] & HEX_DUMP
)
8142 dump_section (section
, file
);
8144 if (dump_sects
[i
] & DEBUG_DUMP
)
8145 display_debug_section (section
, file
);
8148 if (i
< num_dump_sects
)
8149 warn (_("Some sections were not dumped because they do not exist!\n"));
8155 process_mips_fpe_exception (mask
)
8161 if (mask
& OEX_FPU_INEX
)
8162 fputs ("INEX", stdout
), first
= 0;
8163 if (mask
& OEX_FPU_UFLO
)
8164 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8165 if (mask
& OEX_FPU_OFLO
)
8166 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8167 if (mask
& OEX_FPU_DIV0
)
8168 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8169 if (mask
& OEX_FPU_INVAL
)
8170 printf ("%sINVAL", first
? "" : "|");
8173 fputs ("0", stdout
);
8177 process_mips_specific (file
)
8180 Elf_Internal_Dyn
* entry
;
8181 size_t liblist_offset
= 0;
8182 size_t liblistno
= 0;
8183 size_t conflictsno
= 0;
8184 size_t options_offset
= 0;
8185 size_t conflicts_offset
= 0;
8187 /* We have a lot of special sections. Thanks SGI! */
8188 if (dynamic_segment
== NULL
)
8189 /* No information available. */
8192 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
8193 switch (entry
->d_tag
)
8195 case DT_MIPS_LIBLIST
:
8196 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
8198 case DT_MIPS_LIBLISTNO
:
8199 liblistno
= entry
->d_un
.d_val
;
8201 case DT_MIPS_OPTIONS
:
8202 options_offset
= entry
->d_un
.d_val
- loadaddr
;
8204 case DT_MIPS_CONFLICT
:
8205 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
8207 case DT_MIPS_CONFLICTNO
:
8208 conflictsno
= entry
->d_un
.d_val
;
8214 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8216 Elf32_External_Lib
* elib
;
8219 elib
= ((Elf32_External_Lib
*)
8220 get_data (NULL
, file
, liblist_offset
,
8221 liblistno
* sizeof (Elf32_External_Lib
),
8225 printf ("\nSection '.liblist' contains %lu entries:\n",
8226 (unsigned long) liblistno
);
8227 fputs (" Library Time Stamp Checksum Version Flags\n",
8230 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8237 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8238 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8239 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8240 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8241 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8243 tmp
= gmtime (&time
);
8244 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
8245 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8246 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8248 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt
,
8249 dynamic_strings
+ liblist
.l_name
, timebuf
,
8250 liblist
.l_checksum
, liblist
.l_version
);
8252 if (liblist
.l_flags
== 0)
8263 { " EXACT_MATCH", LL_EXACT_MATCH
},
8264 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8265 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8266 { " EXPORTS", LL_EXPORTS
},
8267 { " DELAY_LOAD", LL_DELAY_LOAD
},
8268 { " DELTA", LL_DELTA
}
8270 int flags
= liblist
.l_flags
;
8274 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8276 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8278 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8279 flags
^= l_flags_vals
[fcnt
].bit
;
8282 printf (" %#x", (unsigned int) flags
);
8292 if (options_offset
!= 0)
8294 Elf_External_Options
* eopt
;
8295 Elf_Internal_Shdr
* sect
= section_headers
;
8296 Elf_Internal_Options
* iopt
;
8297 Elf_Internal_Options
* option
;
8301 /* Find the section header so that we get the size. */
8302 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8305 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
8306 sect
->sh_size
, _("options"));
8309 iopt
= ((Elf_Internal_Options
*)
8310 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (* iopt
)));
8313 error (_("Out of memory"));
8320 while (offset
< sect
->sh_size
)
8322 Elf_External_Options
* eoption
;
8324 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8326 option
->kind
= BYTE_GET (eoption
->kind
);
8327 option
->size
= BYTE_GET (eoption
->size
);
8328 option
->section
= BYTE_GET (eoption
->section
);
8329 option
->info
= BYTE_GET (eoption
->info
);
8331 offset
+= option
->size
;
8337 printf (_("\nSection '%s' contains %d entries:\n"),
8338 SECTION_NAME (sect
), cnt
);
8346 switch (option
->kind
)
8349 /* This shouldn't happen. */
8350 printf (" NULL %d %lx", option
->section
, option
->info
);
8353 printf (" REGINFO ");
8354 if (elf_header
.e_machine
== EM_MIPS
)
8357 Elf32_External_RegInfo
* ereg
;
8358 Elf32_RegInfo reginfo
;
8360 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8361 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8362 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8363 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8364 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8365 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8366 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8368 printf ("GPR %08lx GP 0x%lx\n",
8370 (unsigned long) reginfo
.ri_gp_value
);
8371 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8372 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8373 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8378 Elf64_External_RegInfo
* ereg
;
8379 Elf64_Internal_RegInfo reginfo
;
8381 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8382 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8383 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8384 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8385 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8386 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8387 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
8389 printf ("GPR %08lx GP 0x",
8390 reginfo
.ri_gprmask
);
8391 printf_vma (reginfo
.ri_gp_value
);
8394 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8395 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8396 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8400 case ODK_EXCEPTIONS
:
8401 fputs (" EXCEPTIONS fpe_min(", stdout
);
8402 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8403 fputs (") fpe_max(", stdout
);
8404 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8405 fputs (")", stdout
);
8407 if (option
->info
& OEX_PAGE0
)
8408 fputs (" PAGE0", stdout
);
8409 if (option
->info
& OEX_SMM
)
8410 fputs (" SMM", stdout
);
8411 if (option
->info
& OEX_FPDBUG
)
8412 fputs (" FPDBUG", stdout
);
8413 if (option
->info
& OEX_DISMISS
)
8414 fputs (" DISMISS", stdout
);
8417 fputs (" PAD ", stdout
);
8418 if (option
->info
& OPAD_PREFIX
)
8419 fputs (" PREFIX", stdout
);
8420 if (option
->info
& OPAD_POSTFIX
)
8421 fputs (" POSTFIX", stdout
);
8422 if (option
->info
& OPAD_SYMBOL
)
8423 fputs (" SYMBOL", stdout
);
8426 fputs (" HWPATCH ", stdout
);
8427 if (option
->info
& OHW_R4KEOP
)
8428 fputs (" R4KEOP", stdout
);
8429 if (option
->info
& OHW_R8KPFETCH
)
8430 fputs (" R8KPFETCH", stdout
);
8431 if (option
->info
& OHW_R5KEOP
)
8432 fputs (" R5KEOP", stdout
);
8433 if (option
->info
& OHW_R5KCVTL
)
8434 fputs (" R5KCVTL", stdout
);
8437 fputs (" FILL ", stdout
);
8438 /* XXX Print content of info word? */
8441 fputs (" TAGS ", stdout
);
8442 /* XXX Print content of info word? */
8445 fputs (" HWAND ", stdout
);
8446 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8447 fputs (" R4KEOP_CHECKED", stdout
);
8448 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8449 fputs (" R4KEOP_CLEAN", stdout
);
8452 fputs (" HWOR ", stdout
);
8453 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8454 fputs (" R4KEOP_CHECKED", stdout
);
8455 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8456 fputs (" R4KEOP_CLEAN", stdout
);
8459 printf (" GP_GROUP %#06lx self-contained %#06lx",
8460 option
->info
& OGP_GROUP
,
8461 (option
->info
& OGP_SELF
) >> 16);
8464 printf (" IDENT %#06lx self-contained %#06lx",
8465 option
->info
& OGP_GROUP
,
8466 (option
->info
& OGP_SELF
) >> 16);
8469 /* This shouldn't happen. */
8470 printf (" %3d ??? %d %lx",
8471 option
->kind
, option
->section
, option
->info
);
8475 len
= sizeof (* eopt
);
8476 while (len
< option
->size
)
8477 if (((char *) option
)[len
] >= ' '
8478 && ((char *) option
)[len
] < 0x7f)
8479 printf ("%c", ((char *) option
)[len
++]);
8481 printf ("\\%03o", ((char *) option
)[len
++]);
8483 fputs ("\n", stdout
);
8491 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8493 Elf32_Conflict
* iconf
;
8496 if (dynamic_symbols
== NULL
)
8498 error (_("conflict list with without table"));
8502 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (* iconf
));
8505 error (_("Out of memory"));
8511 Elf32_External_Conflict
* econf32
;
8513 econf32
= ((Elf32_External_Conflict
*)
8514 get_data (NULL
, file
, conflicts_offset
,
8515 conflictsno
* sizeof (* econf32
),
8520 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8521 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8527 Elf64_External_Conflict
* econf64
;
8529 econf64
= ((Elf64_External_Conflict
*)
8530 get_data (NULL
, file
, conflicts_offset
,
8531 conflictsno
* sizeof (* econf64
),
8536 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8537 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8542 printf (_("\nSection '.conflict' contains %ld entries:\n"),
8543 (long) conflictsno
);
8544 puts (_(" Num: Index Value Name"));
8546 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8548 Elf_Internal_Sym
* psym
= &dynamic_symbols
[iconf
[cnt
]];
8550 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8551 print_vma (psym
->st_value
, FULL_HEX
);
8552 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
8562 get_note_type (e_type
)
8565 static char buff
[64];
8569 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
8570 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
8571 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
8572 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
8573 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
8574 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
8575 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
8576 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
8577 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8578 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8579 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8581 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
8586 /* Note that by the ELF standard, the name field is already null byte
8587 terminated, and namesz includes the terminating null byte.
8588 I.E. the value of namesz for the name "FSF" is 4.
8590 If the value of namesz is zero, there is no name present. */
8592 process_note (pnote
)
8593 Elf32_Internal_Note
* pnote
;
8595 printf (" %s\t\t0x%08lx\t%s\n",
8596 pnote
->namesz
? pnote
->namedata
: "(NONE)",
8597 pnote
->descsz
, get_note_type (pnote
->type
));
8603 process_corefile_note_segment (file
, offset
, length
)
8608 Elf_External_Note
* pnotes
;
8609 Elf_External_Note
* external
;
8615 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
8622 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8623 (unsigned long) offset
, (unsigned long) length
);
8624 printf (_(" Owner\t\tData size\tDescription\n"));
8626 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
8628 Elf32_Internal_Note inote
;
8631 inote
.type
= BYTE_GET (external
->type
);
8632 inote
.namesz
= BYTE_GET (external
->namesz
);
8633 inote
.namedata
= external
->name
;
8634 inote
.descsz
= BYTE_GET (external
->descsz
);
8635 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
8636 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
8638 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
8640 /* Verify that name is null terminated. It appears that at least
8641 one version of Linux (RedHat 6.0) generates corefiles that don't
8642 comply with the ELF spec by failing to include the null byte in
8644 if (inote
.namedata
[inote
.namesz
] != '\0')
8646 temp
= malloc (inote
.namesz
+ 1);
8650 error (_("Out of memory\n"));
8655 strncpy (temp
, inote
.namedata
, inote
.namesz
);
8656 temp
[inote
.namesz
] = 0;
8658 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8659 inote
.namedata
= temp
;
8662 res
&= process_note (& inote
);
8677 process_corefile_note_segments (file
)
8680 Elf_Internal_Phdr
* program_headers
;
8681 Elf_Internal_Phdr
* segment
;
8685 program_headers
= (Elf_Internal_Phdr
*) malloc
8686 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
8688 if (program_headers
== NULL
)
8690 error (_("Out of memory\n"));
8695 i
= get_32bit_program_headers (file
, program_headers
);
8697 i
= get_64bit_program_headers (file
, program_headers
);
8701 free (program_headers
);
8705 for (i
= 0, segment
= program_headers
;
8706 i
< elf_header
.e_phnum
;
8709 if (segment
->p_type
== PT_NOTE
)
8710 res
&= process_corefile_note_segment (file
,
8711 (bfd_vma
) segment
->p_offset
,
8712 (bfd_vma
) segment
->p_filesz
);
8715 free (program_headers
);
8721 process_corefile_contents (file
)
8724 /* If we have not been asked to display the notes then do nothing. */
8728 /* If file is not a core file then exit. */
8729 if (elf_header
.e_type
!= ET_CORE
)
8732 /* No program headers means no NOTE segment. */
8733 if (elf_header
.e_phnum
== 0)
8735 printf (_("No note segments present in the core file.\n"));
8739 return process_corefile_note_segments (file
);
8743 process_arch_specific (file
)
8749 switch (elf_header
.e_machine
)
8752 case EM_MIPS_RS3_LE
:
8753 return process_mips_specific (file
);
8762 get_file_header (file
)
8765 /* Read in the identity array. */
8766 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
8769 /* Determine how to read the rest of the header. */
8770 switch (elf_header
.e_ident
[EI_DATA
])
8772 default: /* fall through */
8773 case ELFDATANONE
: /* fall through */
8774 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
8775 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
8778 /* For now we only support 32 bit and 64 bit ELF files. */
8779 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
8781 /* Read in the rest of the header. */
8784 Elf32_External_Ehdr ehdr32
;
8786 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
8789 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
8790 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
8791 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
8792 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
8793 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
8794 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
8795 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
8796 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
8797 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
8798 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
8799 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
8800 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
8801 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
8805 Elf64_External_Ehdr ehdr64
;
8807 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8808 we will not be able to cope with the 64bit data found in
8809 64 ELF files. Detect this now and abort before we start
8810 overwritting things. */
8811 if (sizeof (bfd_vma
) < 8)
8813 error (_("This instance of readelf has been built without support for a\n"));
8814 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
8818 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
8821 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
8822 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
8823 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
8824 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
8825 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
8826 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
8827 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
8828 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
8829 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
8830 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
8831 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
8832 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
8833 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
8840 process_file (file_name
)
8844 struct stat statbuf
;
8847 if (stat (file_name
, & statbuf
) < 0)
8849 error (_("Cannot stat input file %s.\n"), file_name
);
8853 file
= fopen (file_name
, "rb");
8856 error (_("Input file %s not found.\n"), file_name
);
8860 if (! get_file_header (file
))
8862 error (_("%s: Failed to read file header\n"), file_name
);
8867 /* Initialise per file variables. */
8868 for (i
= NUM_ELEM (version_info
); i
--;)
8869 version_info
[i
] = 0;
8871 for (i
= NUM_ELEM (dynamic_info
); i
--;)
8872 dynamic_info
[i
] = 0;
8874 /* Process the file. */
8876 printf (_("\nFile: %s\n"), file_name
);
8878 if (! process_file_header ())
8884 process_section_headers (file
);
8886 process_program_headers (file
);
8888 process_dynamic_segment (file
);
8890 process_relocs (file
);
8892 process_unwind (file
);
8894 process_symbol_table (file
);
8896 process_syminfo (file
);
8898 process_version_sections (file
);
8900 process_section_contents (file
);
8902 process_corefile_contents (file
);
8904 process_arch_specific (file
);
8908 if (section_headers
)
8910 free (section_headers
);
8911 section_headers
= NULL
;
8916 free (string_table
);
8917 string_table
= NULL
;
8918 string_table_length
= 0;
8921 if (dynamic_strings
)
8923 free (dynamic_strings
);
8924 dynamic_strings
= NULL
;
8927 if (dynamic_symbols
)
8929 free (dynamic_symbols
);
8930 dynamic_symbols
= NULL
;
8931 num_dynamic_syms
= 0;
8934 if (dynamic_syminfo
)
8936 free (dynamic_syminfo
);
8937 dynamic_syminfo
= NULL
;
8943 #ifdef SUPPORT_DISASSEMBLY
8944 /* Needed by the i386 disassembler. For extra credit, someone could
8945 fix this so that we insert symbolic addresses here, esp for GOT/PLT
8949 print_address (unsigned int addr
, FILE * outfile
)
8951 fprintf (outfile
,"0x%8.8x", addr
);
8954 /* Needed by the i386 disassembler. */
8956 db_task_printsym (unsigned int addr
)
8958 print_address (addr
, stderr
);
8969 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
8970 setlocale (LC_MESSAGES
, "");
8972 bindtextdomain (PACKAGE
, LOCALEDIR
);
8973 textdomain (PACKAGE
);
8975 parse_args (argc
, argv
);
8977 if (optind
< (argc
- 1))
8981 while (optind
< argc
)
8982 err
|= process_file (argv
[optind
++]);
8984 if (dump_sects
!= NULL
)