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"
70 #include "elf/mcore.h"
78 #include "elf/x86-64.h"
80 #include "elf/xstormy16.h"
85 char * program_name
= "readelf";
86 unsigned int dynamic_addr
;
87 bfd_size_type dynamic_size
;
88 unsigned int rela_addr
;
89 unsigned int rela_size
;
90 char * dynamic_strings
;
92 unsigned long string_table_length
;
93 unsigned long num_dynamic_syms
;
94 Elf_Internal_Sym
* dynamic_symbols
;
95 Elf_Internal_Syminfo
* dynamic_syminfo
;
96 unsigned long dynamic_syminfo_offset
;
97 unsigned int dynamic_syminfo_nent
;
98 char program_interpreter
[64];
99 int dynamic_info
[DT_JMPREL
+ 1];
100 int version_info
[16];
102 Elf_Internal_Ehdr elf_header
;
103 Elf_Internal_Shdr
* section_headers
;
104 Elf_Internal_Dyn
* dynamic_segment
;
112 int do_using_dynamic
;
120 int do_debug_abbrevs
;
122 int do_debug_pubnames
;
123 int do_debug_aranges
;
125 int do_debug_frames_interp
;
126 int do_debug_macinfo
;
132 /* A dynamic array of flags indicating which sections require dumping. */
133 char * dump_sects
= NULL
;
134 unsigned int num_dump_sects
= 0;
136 #define HEX_DUMP (1 << 0)
137 #define DISASS_DUMP (1 << 1)
138 #define DEBUG_DUMP (1 << 2)
140 /* How to rpint a vma value. */
141 typedef enum print_mode
153 /* Forward declarations for dumb compilers. */
154 static void print_vma
PARAMS ((bfd_vma
, print_mode
));
155 static bfd_vma (* byte_get
) PARAMS ((unsigned char *, int));
156 static bfd_vma byte_get_little_endian
PARAMS ((unsigned char *, int));
157 static bfd_vma byte_get_big_endian
PARAMS ((unsigned char *, int));
158 static const char * get_mips_dynamic_type
PARAMS ((unsigned long));
159 static const char * get_sparc64_dynamic_type
PARAMS ((unsigned long));
160 static const char * get_parisc_dynamic_type
PARAMS ((unsigned long));
161 static const char * get_dynamic_type
PARAMS ((unsigned long));
162 static int slurp_rela_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**, unsigned long *));
163 static int slurp_rel_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel
**, unsigned long *));
164 static int dump_relocations
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*, unsigned long, char *, int));
165 static char * get_file_type
PARAMS ((unsigned));
166 static char * get_machine_name
PARAMS ((unsigned));
167 static void decode_ARM_machine_flags
PARAMS ((unsigned, char []));
168 static char * get_machine_flags
PARAMS ((unsigned, unsigned));
169 static const char * get_mips_segment_type
PARAMS ((unsigned long));
170 static const char * get_parisc_segment_type
PARAMS ((unsigned long));
171 static const char * get_ia64_segment_type
PARAMS ((unsigned long));
172 static const char * get_segment_type
PARAMS ((unsigned long));
173 static const char * get_mips_section_type_name
PARAMS ((unsigned int));
174 static const char * get_parisc_section_type_name
PARAMS ((unsigned int));
175 static const char * get_ia64_section_type_name
PARAMS ((unsigned int));
176 static const char * get_section_type_name
PARAMS ((unsigned int));
177 static const char * get_symbol_binding
PARAMS ((unsigned int));
178 static const char * get_symbol_type
PARAMS ((unsigned int));
179 static const char * get_symbol_visibility
PARAMS ((unsigned int));
180 static const char * get_symbol_index_type
PARAMS ((unsigned int));
181 static const char * get_dynamic_flags
PARAMS ((bfd_vma
));
182 static void usage
PARAMS ((void));
183 static void parse_args
PARAMS ((int, char **));
184 static int process_file_header
PARAMS ((void));
185 static int process_program_headers
PARAMS ((FILE *));
186 static int process_section_headers
PARAMS ((FILE *));
187 static int process_unwind
PARAMS ((FILE *));
188 static void dynamic_segment_mips_val
PARAMS ((Elf_Internal_Dyn
*));
189 static void dynamic_segment_parisc_val
PARAMS ((Elf_Internal_Dyn
*));
190 static int process_dynamic_segment
PARAMS ((FILE *));
191 static int process_symbol_table
PARAMS ((FILE *));
192 static int process_syminfo
PARAMS ((FILE *));
193 static int process_section_contents
PARAMS ((FILE *));
194 static void process_mips_fpe_exception
PARAMS ((int));
195 static int process_mips_specific
PARAMS ((FILE *));
196 static int process_file
PARAMS ((char *));
197 static int process_relocs
PARAMS ((FILE *));
198 static int process_version_sections
PARAMS ((FILE *));
199 static char * get_ver_flags
PARAMS ((unsigned int));
200 static int get_32bit_section_headers
PARAMS ((FILE *, unsigned int));
201 static int get_64bit_section_headers
PARAMS ((FILE *, unsigned int));
202 static int get_32bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
203 static int get_64bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
204 static int get_file_header
PARAMS ((FILE *));
205 static Elf_Internal_Sym
* get_32bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
206 static Elf_Internal_Sym
* get_64bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
207 static const char * get_elf_section_flags
PARAMS ((bfd_vma
));
208 static int * get_dynamic_data
PARAMS ((FILE *, unsigned int));
209 static int get_32bit_dynamic_segment
PARAMS ((FILE *));
210 static int get_64bit_dynamic_segment
PARAMS ((FILE *));
211 #ifdef SUPPORT_DISASSEMBLY
212 static int disassemble_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
214 static int dump_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
215 static int display_debug_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
216 static int display_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
217 static int display_debug_not_supported
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
218 static int prescan_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
219 static int display_debug_lines
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
220 static int display_debug_pubnames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
221 static int display_debug_abbrev
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
222 static int display_debug_aranges
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
223 static int display_debug_frames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
224 static int display_debug_macinfo
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
225 static int display_debug_str
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
226 static unsigned char * process_abbrev_section
PARAMS ((unsigned char *, unsigned char *));
227 static void load_debug_str
PARAMS ((FILE *));
228 static void free_debug_str
PARAMS ((void));
229 static const char * fetch_indirect_string
PARAMS ((unsigned long));
230 static unsigned long read_leb128
PARAMS ((unsigned char *, int *, int));
231 static int process_extended_line_op
PARAMS ((unsigned char *, int, int));
232 static void reset_state_machine
PARAMS ((int));
233 static char * get_TAG_name
PARAMS ((unsigned long));
234 static char * get_AT_name
PARAMS ((unsigned long));
235 static char * get_FORM_name
PARAMS ((unsigned long));
236 static void free_abbrevs
PARAMS ((void));
237 static void add_abbrev
PARAMS ((unsigned long, unsigned long, int));
238 static void add_abbrev_attr
PARAMS ((unsigned long, unsigned long));
239 static unsigned char * read_and_display_attr
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
240 static unsigned char * read_and_display_attr_value
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
241 static unsigned char * display_block
PARAMS ((unsigned char *, unsigned long));
242 static void decode_location_expression
PARAMS ((unsigned char *, unsigned int, unsigned long));
243 static void request_dump
PARAMS ((unsigned int, int));
244 static const char * get_elf_class
PARAMS ((unsigned int));
245 static const char * get_data_encoding
PARAMS ((unsigned int));
246 static const char * get_osabi_name
PARAMS ((unsigned int));
247 static int guess_is_rela
PARAMS ((unsigned long));
248 static char * get_note_type
PARAMS ((unsigned int));
249 static int process_note
PARAMS ((Elf32_Internal_Note
*));
250 static int process_corefile_note_segment
PARAMS ((FILE *, bfd_vma
, bfd_vma
));
251 static int process_corefile_note_segments
PARAMS ((FILE *));
252 static int process_corefile_contents
PARAMS ((FILE *));
253 static int process_arch_specific
PARAMS ((FILE *));
255 typedef int Elf32_Word
;
263 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
264 ((X)->sh_name >= string_table_length \
265 ? "<corrupt>" : string_table + (X)->sh_name))
267 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
269 #define BYTE_GET(field) byte_get (field, sizeof (field))
271 /* If we can support a 64 bit data type then BFD64 should be defined
272 and sizeof (bfd_vma) == 8. In this case when translating from an
273 external 8 byte field to an internal field, we can assume that the
274 internal field is also 8 bytes wide and so we can extract all the data.
275 If, however, BFD64 is not defined, then we must assume that the
276 internal data structure only has 4 byte wide fields that are the
277 equivalent of the 8 byte wide external counterparts, and so we must
278 truncate the data. */
280 #define BYTE_GET8(field) byte_get (field, -8)
282 #define BYTE_GET8(field) byte_get (field, 8)
285 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
287 #define GET_ELF_SYMBOLS(file, offset, size) \
288 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
289 : get_64bit_elf_symbols (file, offset, size))
293 error
VPARAMS ((const char *message
, ...))
295 VA_OPEN (args
, message
);
296 VA_FIXEDARG (args
, const char *, message
);
298 fprintf (stderr
, _("%s: Error: "), program_name
);
299 vfprintf (stderr
, message
, args
);
304 warn
VPARAMS ((const char *message
, ...))
306 VA_OPEN (args
, message
);
307 VA_FIXEDARG (args
, const char *, message
);
309 fprintf (stderr
, _("%s: Warning: "), program_name
);
310 vfprintf (stderr
, message
, args
);
314 static PTR get_data
PARAMS ((PTR
, FILE *, long, size_t, const char *));
317 get_data (var
, file
, offset
, size
, reason
)
329 if (fseek (file
, offset
, SEEK_SET
))
331 error (_("Unable to seek to %x for %s\n"), offset
, reason
);
338 mvar
= (PTR
) malloc (size
);
342 error (_("Out of memory allocating %d bytes for %s\n"),
348 if (fread (mvar
, size
, 1, file
) != 1)
350 error (_("Unable to read in %d bytes of %s\n"), size
, reason
);
360 byte_get_little_endian (field
, size
)
361 unsigned char * field
;
370 return ((unsigned int) (field
[0]))
371 | (((unsigned int) (field
[1])) << 8);
375 /* We want to extract data from an 8 byte wide field and
376 place it into a 4 byte wide field. Since this is a little
377 endian source we can juts use the 4 byte extraction code. */
381 return ((unsigned long) (field
[0]))
382 | (((unsigned long) (field
[1])) << 8)
383 | (((unsigned long) (field
[2])) << 16)
384 | (((unsigned long) (field
[3])) << 24);
389 /* This is a special case, generated by the BYTE_GET8 macro.
390 It means that we are loading an 8 byte value from a field
391 in an external structure into an 8 byte value in a field
392 in an internal strcuture. */
393 return ((bfd_vma
) (field
[0]))
394 | (((bfd_vma
) (field
[1])) << 8)
395 | (((bfd_vma
) (field
[2])) << 16)
396 | (((bfd_vma
) (field
[3])) << 24)
397 | (((bfd_vma
) (field
[4])) << 32)
398 | (((bfd_vma
) (field
[5])) << 40)
399 | (((bfd_vma
) (field
[6])) << 48)
400 | (((bfd_vma
) (field
[7])) << 56);
403 error (_("Unhandled data length: %d\n"), size
);
408 /* Print a VMA value. */
410 print_vma (vma
, mode
)
420 case FULL_HEX
: printf ("0x"); /* drop through */
421 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
422 case PREFIX_HEX
: printf ("0x"); /* drop through */
423 case HEX
: printf ("%lx", (unsigned long) vma
); break;
424 case DEC
: printf ("%ld", (unsigned long) vma
); break;
425 case DEC_5
: printf ("%5ld", (long) vma
); break;
426 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
447 #if BFD_HOST_64BIT_LONG
450 if (_bfd_int64_high (vma
))
451 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
453 printf ("%lx", _bfd_int64_low (vma
));
458 #if BFD_HOST_64BIT_LONG
461 if (_bfd_int64_high (vma
))
463 printf ("++%ld", _bfd_int64_low (vma
));
465 printf ("%ld", _bfd_int64_low (vma
));
470 #if BFD_HOST_64BIT_LONG
471 printf ("%5ld", vma
);
473 if (_bfd_int64_high (vma
))
475 printf ("++%ld", _bfd_int64_low (vma
));
477 printf ("%5ld", _bfd_int64_low (vma
));
482 #if BFD_HOST_64BIT_LONG
485 if (_bfd_int64_high (vma
))
487 printf ("++%lu", _bfd_int64_low (vma
));
489 printf ("%lu", _bfd_int64_low (vma
));
498 byte_get_big_endian (field
, size
)
499 unsigned char * field
;
508 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
511 return ((unsigned long) (field
[3]))
512 | (((unsigned long) (field
[2])) << 8)
513 | (((unsigned long) (field
[1])) << 16)
514 | (((unsigned long) (field
[0])) << 24);
518 /* Although we are extracing data from an 8 byte wide field, we
519 are returning only 4 bytes of data. */
520 return ((unsigned long) (field
[7]))
521 | (((unsigned long) (field
[6])) << 8)
522 | (((unsigned long) (field
[5])) << 16)
523 | (((unsigned long) (field
[4])) << 24);
527 /* This is a special case, generated by the BYTE_GET8 macro.
528 It means that we are loading an 8 byte value from a field
529 in an external structure into an 8 byte value in a field
530 in an internal strcuture. */
531 return ((bfd_vma
) (field
[7]))
532 | (((bfd_vma
) (field
[6])) << 8)
533 | (((bfd_vma
) (field
[5])) << 16)
534 | (((bfd_vma
) (field
[4])) << 24)
535 | (((bfd_vma
) (field
[3])) << 32)
536 | (((bfd_vma
) (field
[2])) << 40)
537 | (((bfd_vma
) (field
[1])) << 48)
538 | (((bfd_vma
) (field
[0])) << 56);
542 error (_("Unhandled data length: %d\n"), size
);
547 /* Guess the relocation size commonly used by the specific machines. */
550 guess_is_rela (e_machine
)
551 unsigned long e_machine
;
555 /* Targets that use REL relocations. */
568 /* Targets that use RELA relocations. */
582 case EM_CYGNUS_MN10200
:
584 case EM_CYGNUS_MN10300
:
621 warn (_("Don't know about relocations on this machine architecture\n"));
627 slurp_rela_relocs (file
, rel_offset
, rel_size
, relasp
, nrelasp
)
629 unsigned long rel_offset
;
630 unsigned long rel_size
;
631 Elf_Internal_Rela
**relasp
;
632 unsigned long *nrelasp
;
634 Elf_Internal_Rela
*relas
;
635 unsigned long nrelas
;
640 Elf32_External_Rela
* erelas
;
642 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
,
643 rel_size
, _("relocs"));
647 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
649 relas
= (Elf_Internal_Rela
*)
650 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
654 error(_("out of memory parsing relocs"));
658 for (i
= 0; i
< nrelas
; i
++)
660 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
661 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
662 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
669 Elf64_External_Rela
* erelas
;
671 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
,
672 rel_size
, _("relocs"));
676 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
678 relas
= (Elf_Internal_Rela
*)
679 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
683 error(_("out of memory parsing relocs"));
687 for (i
= 0; i
< nrelas
; i
++)
689 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
690 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
691 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
702 slurp_rel_relocs (file
, rel_offset
, rel_size
, relsp
, nrelsp
)
704 unsigned long rel_offset
;
705 unsigned long rel_size
;
706 Elf_Internal_Rel
**relsp
;
707 unsigned long *nrelsp
;
709 Elf_Internal_Rel
*rels
;
715 Elf32_External_Rel
* erels
;
717 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
,
718 rel_size
, _("relocs"));
722 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
724 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
728 error(_("out of memory parsing relocs"));
732 for (i
= 0; i
< nrels
; i
++)
734 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
735 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
742 Elf64_External_Rel
* erels
;
744 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
,
745 rel_size
, _("relocs"));
749 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
751 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
755 error(_("out of memory parsing relocs"));
759 for (i
= 0; i
< nrels
; i
++)
761 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
762 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
772 /* Display the contents of the relocation data found at the specified offset. */
774 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
776 unsigned long rel_offset
;
777 unsigned long rel_size
;
778 Elf_Internal_Sym
* symtab
;
784 Elf_Internal_Rel
* rels
;
785 Elf_Internal_Rela
* relas
;
788 if (is_rela
== UNKNOWN
)
789 is_rela
= guess_is_rela (elf_header
.e_machine
);
793 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &relas
, &rel_size
))
798 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
806 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
809 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
815 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
818 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
821 for (i
= 0; i
< rel_size
; i
++)
826 bfd_vma symtab_index
;
831 offset
= relas
[i
].r_offset
;
832 info
= relas
[i
].r_info
;
836 offset
= rels
[i
].r_offset
;
837 info
= rels
[i
].r_info
;
842 type
= ELF32_R_TYPE (info
);
843 symtab_index
= ELF32_R_SYM (info
);
847 if (elf_header
.e_machine
== EM_SPARCV9
)
848 type
= ELF64_R_TYPE_ID (info
);
850 type
= ELF64_R_TYPE (info
);
851 /* The #ifdef BFD64 below is to prevent a compile time warning.
852 We know that if we do not have a 64 bit data type that we
853 will never execute this code anyway. */
855 symtab_index
= ELF64_R_SYM (info
);
861 #ifdef _bfd_int64_low
862 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
864 printf ("%8.8lx %8.8lx ", offset
, info
);
869 #ifdef _bfd_int64_low
870 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
871 _bfd_int64_high (offset
),
872 _bfd_int64_low (offset
),
873 _bfd_int64_high (info
),
874 _bfd_int64_low (info
));
876 printf ("%16.16lx %16.16lx ", offset
, info
);
880 switch (elf_header
.e_machine
)
888 rtype
= elf_m32r_reloc_type (type
);
893 rtype
= elf_i386_reloc_type (type
);
897 rtype
= elf_m68k_reloc_type (type
);
901 rtype
= elf_i960_reloc_type (type
);
906 rtype
= elf_avr_reloc_type (type
);
913 rtype
= elf_sparc_reloc_type (type
);
918 rtype
= v850_reloc_type (type
);
923 rtype
= elf_d10v_reloc_type (type
);
928 rtype
= elf_d30v_reloc_type (type
);
932 rtype
= elf_sh_reloc_type (type
);
936 case EM_CYGNUS_MN10300
:
937 rtype
= elf_mn10300_reloc_type (type
);
941 case EM_CYGNUS_MN10200
:
942 rtype
= elf_mn10200_reloc_type (type
);
947 rtype
= elf_fr30_reloc_type (type
);
951 rtype
= elf_mcore_reloc_type (type
);
955 rtype
= elf_mmix_reloc_type (type
);
960 rtype
= elf_ppc_reloc_type (type
);
965 rtype
= elf_mips_reloc_type (type
);
969 rtype
= elf_alpha_reloc_type (type
);
973 rtype
= elf_arm_reloc_type (type
);
977 rtype
= elf_arc_reloc_type (type
);
981 rtype
= elf_hppa_reloc_type (type
);
987 rtype
= elf_h8_reloc_type (type
);
992 rtype
= elf_pj_reloc_type (type
);
995 rtype
= elf_ia64_reloc_type (type
);
999 rtype
= elf_cris_reloc_type (type
);
1003 rtype
= elf_i860_reloc_type (type
);
1007 rtype
= elf_x86_64_reloc_type (type
);
1012 rtype
= elf_s390_reloc_type (type
);
1016 rtype
= elf_xstormy16_reloc_type (type
);
1021 #ifdef _bfd_int64_low
1022 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type
));
1024 printf (_("unrecognised: %-7lx"), type
);
1027 printf ("%-21.21s", rtype
);
1031 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1032 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1035 Elf_Internal_Sym
* psym
;
1037 psym
= symtab
+ symtab_index
;
1040 print_vma (psym
->st_value
, LONG_HEX
);
1043 if (psym
->st_name
== 0)
1045 SECTION_NAME (section_headers
+ psym
->st_shndx
));
1046 else if (strtab
== NULL
)
1047 printf (_("<string table index %3ld>"), psym
->st_name
);
1049 printf ("%-25.25s", strtab
+ psym
->st_name
);
1052 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
1057 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
1058 print_vma (relas
[i
].r_addend
, LONG_HEX
);
1061 if (elf_header
.e_machine
== EM_SPARCV9
1062 && !strcmp (rtype
, "R_SPARC_OLO10"))
1063 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1077 get_mips_dynamic_type (type
)
1082 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1083 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1084 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1085 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1086 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1087 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1088 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1089 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1090 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1091 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1092 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1093 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1094 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1095 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1096 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1097 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1098 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1099 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1100 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1101 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1102 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1103 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1104 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1105 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1106 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1107 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1108 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1109 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1110 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1111 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1112 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1113 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1114 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1115 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1116 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1117 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1118 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1119 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1120 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1121 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1122 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1123 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1124 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1131 get_sparc64_dynamic_type (type
)
1136 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1143 get_parisc_dynamic_type (type
)
1148 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1149 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1150 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1151 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1152 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1153 case DT_HP_PREINIT
: return "HP_PREINIT";
1154 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1155 case DT_HP_NEEDED
: return "HP_NEEDED";
1156 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1157 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1158 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1159 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1160 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1167 get_dynamic_type (type
)
1170 static char buff
[32];
1174 case DT_NULL
: return "NULL";
1175 case DT_NEEDED
: return "NEEDED";
1176 case DT_PLTRELSZ
: return "PLTRELSZ";
1177 case DT_PLTGOT
: return "PLTGOT";
1178 case DT_HASH
: return "HASH";
1179 case DT_STRTAB
: return "STRTAB";
1180 case DT_SYMTAB
: return "SYMTAB";
1181 case DT_RELA
: return "RELA";
1182 case DT_RELASZ
: return "RELASZ";
1183 case DT_RELAENT
: return "RELAENT";
1184 case DT_STRSZ
: return "STRSZ";
1185 case DT_SYMENT
: return "SYMENT";
1186 case DT_INIT
: return "INIT";
1187 case DT_FINI
: return "FINI";
1188 case DT_SONAME
: return "SONAME";
1189 case DT_RPATH
: return "RPATH";
1190 case DT_SYMBOLIC
: return "SYMBOLIC";
1191 case DT_REL
: return "REL";
1192 case DT_RELSZ
: return "RELSZ";
1193 case DT_RELENT
: return "RELENT";
1194 case DT_PLTREL
: return "PLTREL";
1195 case DT_DEBUG
: return "DEBUG";
1196 case DT_TEXTREL
: return "TEXTREL";
1197 case DT_JMPREL
: return "JMPREL";
1198 case DT_BIND_NOW
: return "BIND_NOW";
1199 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1200 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1201 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1202 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1203 case DT_RUNPATH
: return "RUNPATH";
1204 case DT_FLAGS
: return "FLAGS";
1206 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1207 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1209 case DT_CHECKSUM
: return "CHECKSUM";
1210 case DT_PLTPADSZ
: return "PLTPADSZ";
1211 case DT_MOVEENT
: return "MOVEENT";
1212 case DT_MOVESZ
: return "MOVESZ";
1213 case DT_FEATURE
: return "FEATURE";
1214 case DT_POSFLAG_1
: return "POSFLAG_1";
1215 case DT_SYMINSZ
: return "SYMINSZ";
1216 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1218 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1219 case DT_CONFIG
: return "CONFIG";
1220 case DT_DEPAUDIT
: return "DEPAUDIT";
1221 case DT_AUDIT
: return "AUDIT";
1222 case DT_PLTPAD
: return "PLTPAD";
1223 case DT_MOVETAB
: return "MOVETAB";
1224 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1226 case DT_VERSYM
: return "VERSYM";
1228 case DT_RELACOUNT
: return "RELACOUNT";
1229 case DT_RELCOUNT
: return "RELCOUNT";
1230 case DT_FLAGS_1
: return "FLAGS_1";
1231 case DT_VERDEF
: return "VERDEF";
1232 case DT_VERDEFNUM
: return "VERDEFNUM";
1233 case DT_VERNEED
: return "VERNEED";
1234 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1236 case DT_AUXILIARY
: return "AUXILIARY";
1237 case DT_USED
: return "USED";
1238 case DT_FILTER
: return "FILTER";
1241 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1243 const char * result
;
1245 switch (elf_header
.e_machine
)
1248 case EM_MIPS_RS3_LE
:
1249 result
= get_mips_dynamic_type (type
);
1252 result
= get_sparc64_dynamic_type (type
);
1262 sprintf (buff
, _("Processor Specific: %lx"), type
);
1264 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1266 const char * result
;
1268 switch (elf_header
.e_machine
)
1271 result
= get_parisc_dynamic_type (type
);
1281 sprintf (buff
, _("Operating System specific: %lx"), type
);
1284 sprintf (buff
, _("<unknown>: %lx"), type
);
1291 get_file_type (e_type
)
1294 static char buff
[32];
1298 case ET_NONE
: return _("NONE (None)");
1299 case ET_REL
: return _("REL (Relocatable file)");
1300 case ET_EXEC
: return _("EXEC (Executable file)");
1301 case ET_DYN
: return _("DYN (Shared object file)");
1302 case ET_CORE
: return _("CORE (Core file)");
1305 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1306 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1307 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1308 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1310 sprintf (buff
, _("<unknown>: %x"), e_type
);
1316 get_machine_name (e_machine
)
1319 static char buff
[64]; /* XXX */
1323 case EM_NONE
: return _("None");
1324 case EM_M32
: return "WE32100";
1325 case EM_SPARC
: return "Sparc";
1326 case EM_386
: return "Intel 80386";
1327 case EM_68K
: return "MC68000";
1328 case EM_88K
: return "MC88000";
1329 case EM_486
: return "Intel 80486";
1330 case EM_860
: return "Intel 80860";
1331 case EM_MIPS
: return "MIPS R3000";
1332 case EM_S370
: return "IBM System/370";
1333 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1334 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1335 case EM_PARISC
: return "HPPA";
1336 case EM_PPC_OLD
: return "Power PC (old)";
1337 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1338 case EM_960
: return "Intel 90860";
1339 case EM_PPC
: return "PowerPC";
1340 case EM_V800
: return "NEC V800";
1341 case EM_FR20
: return "Fujitsu FR20";
1342 case EM_RH32
: return "TRW RH32";
1343 case EM_MCORE
: return "MCORE";
1344 case EM_ARM
: return "ARM";
1345 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1346 case EM_SH
: return "Hitachi SH";
1347 case EM_SPARCV9
: return "Sparc v9";
1348 case EM_TRICORE
: return "Siemens Tricore";
1349 case EM_ARC
: return "ARC";
1350 case EM_H8_300
: return "Hitachi H8/300";
1351 case EM_H8_300H
: return "Hitachi H8/300H";
1352 case EM_H8S
: return "Hitachi H8S";
1353 case EM_H8_500
: return "Hitachi H8/500";
1354 case EM_IA_64
: return "Intel IA-64";
1355 case EM_MIPS_X
: return "Stanford MIPS-X";
1356 case EM_COLDFIRE
: return "Motorola Coldfire";
1357 case EM_68HC12
: return "Motorola M68HC12";
1358 case EM_ALPHA
: return "Alpha";
1359 case EM_CYGNUS_D10V
:
1360 case EM_D10V
: return "d10v";
1361 case EM_CYGNUS_D30V
:
1362 case EM_D30V
: return "d30v";
1363 case EM_CYGNUS_M32R
:
1364 case EM_M32R
: return "Mitsubishi M32r";
1365 case EM_CYGNUS_V850
:
1366 case EM_V850
: return "NEC v850";
1367 case EM_CYGNUS_MN10300
:
1368 case EM_MN10300
: return "mn10300";
1369 case EM_CYGNUS_MN10200
:
1370 case EM_MN10200
: return "mn10200";
1371 case EM_CYGNUS_FR30
:
1372 case EM_FR30
: return "Fujitsu FR30";
1374 case EM_PJ
: return "picoJava";
1375 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1376 case EM_PCP
: return "Siemens PCP";
1377 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1378 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1379 case EM_STARCORE
: return "Motorola Star*Core processor";
1380 case EM_ME16
: return "Toyota ME16 processor";
1381 case EM_ST100
: return "STMicroelectronics ST100 processor";
1382 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1383 case EM_FX66
: return "Siemens FX66 microcontroller";
1384 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1385 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1386 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1387 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1388 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1389 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1390 case EM_SVX
: return "Silicon Graphics SVx";
1391 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1392 case EM_VAX
: return "Digital VAX";
1394 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1395 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1396 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1397 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1398 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1399 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1400 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1401 case EM_PRISM
: return "SiTera Prism";
1402 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1404 case EM_S390
: return "IBM S/390";
1405 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1407 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1413 decode_ARM_machine_flags (e_flags
, buf
)
1420 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1421 e_flags
&= ~ EF_ARM_EABIMASK
;
1423 /* Handle "generic" ARM flags. */
1424 if (e_flags
& EF_ARM_RELEXEC
)
1426 strcat (buf
, ", relocatable executable");
1427 e_flags
&= ~ EF_ARM_RELEXEC
;
1430 if (e_flags
& EF_ARM_HASENTRY
)
1432 strcat (buf
, ", has entry point");
1433 e_flags
&= ~ EF_ARM_HASENTRY
;
1436 /* Now handle EABI specific flags. */
1440 strcat (buf
, ", <unrecognised EABI>");
1445 case EF_ARM_EABI_VER1
:
1446 strcat (buf
, ", Version1 EABI");
1451 /* Process flags one bit at a time. */
1452 flag
= e_flags
& - e_flags
;
1457 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1458 strcat (buf
, ", sorted symbol tables");
1468 case EF_ARM_EABI_VER2
:
1469 strcat (buf
, ", Version2 EABI");
1474 /* Process flags one bit at a time. */
1475 flag
= e_flags
& - e_flags
;
1480 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1481 strcat (buf
, ", sorted symbol tables");
1484 case EF_ARM_DYNSYMSUSESEGIDX
:
1485 strcat (buf
, ", dynamic symbols use segment index");
1488 case EF_ARM_MAPSYMSFIRST
:
1489 strcat (buf
, ", mapping symbols precede others");
1499 case EF_ARM_EABI_UNKNOWN
:
1500 strcat (buf
, ", GNU EABI");
1505 /* Process flags one bit at a time. */
1506 flag
= e_flags
& - e_flags
;
1511 case EF_ARM_INTERWORK
:
1512 strcat (buf
, ", interworking enabled");
1515 case EF_ARM_APCS_26
:
1516 strcat (buf
, ", uses APCS/26");
1519 case EF_ARM_APCS_FLOAT
:
1520 strcat (buf
, ", uses APCS/float");
1524 strcat (buf
, ", position independent");
1528 strcat (buf
, ", 8 bit structure alignment");
1531 case EF_ARM_NEW_ABI
:
1532 strcat (buf
, ", uses new ABI");
1535 case EF_ARM_OLD_ABI
:
1536 strcat (buf
, ", uses old ABI");
1539 case EF_ARM_SOFT_FLOAT
:
1540 strcat (buf
, ", software FP");
1551 strcat (buf
,", <unknown>");
1555 get_machine_flags (e_flags
, e_machine
)
1559 static char buf
[1024];
1571 decode_ARM_machine_flags (e_flags
, buf
);
1575 if (e_flags
& EF_CPU32
)
1576 strcat (buf
, ", cpu32");
1580 if (e_flags
& EF_PPC_EMB
)
1581 strcat (buf
, ", emb");
1583 if (e_flags
& EF_PPC_RELOCATABLE
)
1584 strcat (buf
, ", relocatable");
1586 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1587 strcat (buf
, ", relocatable-lib");
1591 case EM_CYGNUS_V850
:
1592 switch (e_flags
& EF_V850_ARCH
)
1595 strcat (buf
, ", v850e");
1598 strcat (buf
, ", v850ea");
1601 strcat (buf
, ", v850");
1604 strcat (buf
, ", unknown v850 architecture variant");
1610 case EM_CYGNUS_M32R
:
1611 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1612 strcat (buf
, ", m32r");
1617 case EM_MIPS_RS3_LE
:
1618 if (e_flags
& EF_MIPS_NOREORDER
)
1619 strcat (buf
, ", noreorder");
1621 if (e_flags
& EF_MIPS_PIC
)
1622 strcat (buf
, ", pic");
1624 if (e_flags
& EF_MIPS_CPIC
)
1625 strcat (buf
, ", cpic");
1627 if (e_flags
& EF_MIPS_UCODE
)
1628 strcat (buf
, ", ugen_reserved");
1630 if (e_flags
& EF_MIPS_ABI2
)
1631 strcat (buf
, ", abi2");
1633 if (e_flags
& EF_MIPS_32BITMODE
)
1634 strcat (buf
, ", 32bitmode");
1636 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_1
)
1637 strcat (buf
, ", mips1");
1639 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_2
)
1640 strcat (buf
, ", mips2");
1642 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_3
)
1643 strcat (buf
, ", mips3");
1645 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_4
)
1646 strcat (buf
, ", mips4");
1648 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_5
)
1649 strcat (buf
, ", mips5");
1651 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_32
)
1652 strcat (buf
, ", mips32");
1654 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_64
)
1655 strcat (buf
, ", mips64");
1657 switch ((e_flags
& EF_MIPS_MACH
))
1659 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1660 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1661 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1662 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1663 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1664 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1665 default: strcat (buf
, " UNKNOWN"); break;
1670 if (e_flags
& EF_SPARC_32PLUS
)
1671 strcat (buf
, ", v8+");
1673 if (e_flags
& EF_SPARC_SUN_US1
)
1674 strcat (buf
, ", ultrasparcI");
1676 if (e_flags
& EF_SPARC_SUN_US3
)
1677 strcat (buf
, ", ultrasparcIII");
1679 if (e_flags
& EF_SPARC_HAL_R1
)
1680 strcat (buf
, ", halr1");
1682 if (e_flags
& EF_SPARC_LEDATA
)
1683 strcat (buf
, ", ledata");
1685 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1686 strcat (buf
, ", tso");
1688 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1689 strcat (buf
, ", pso");
1691 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1692 strcat (buf
, ", rmo");
1696 switch (e_flags
& EF_PARISC_ARCH
)
1698 case EFA_PARISC_1_0
:
1699 strcpy (buf
, ", PA-RISC 1.0");
1701 case EFA_PARISC_1_1
:
1702 strcpy (buf
, ", PA-RISC 1.1");
1704 case EFA_PARISC_2_0
:
1705 strcpy (buf
, ", PA-RISC 2.0");
1710 if (e_flags
& EF_PARISC_TRAPNIL
)
1711 strcat (buf
, ", trapnil");
1712 if (e_flags
& EF_PARISC_EXT
)
1713 strcat (buf
, ", ext");
1714 if (e_flags
& EF_PARISC_LSB
)
1715 strcat (buf
, ", lsb");
1716 if (e_flags
& EF_PARISC_WIDE
)
1717 strcat (buf
, ", wide");
1718 if (e_flags
& EF_PARISC_NO_KABP
)
1719 strcat (buf
, ", no kabp");
1720 if (e_flags
& EF_PARISC_LAZYSWAP
)
1721 strcat (buf
, ", lazyswap");
1726 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1727 strcat (buf
, ", new calling convention");
1729 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1730 strcat (buf
, ", gnu calling convention");
1734 if ((e_flags
& EF_IA_64_ABI64
))
1735 strcat (buf
, ", 64-bit");
1737 strcat (buf
, ", 32-bit");
1738 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1739 strcat (buf
, ", reduced fp model");
1740 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1741 strcat (buf
, ", no function descriptors, constant gp");
1742 else if ((e_flags
& EF_IA_64_CONS_GP
))
1743 strcat (buf
, ", constant gp");
1744 if ((e_flags
& EF_IA_64_ABSOLUTE
))
1745 strcat (buf
, ", absolute");
1754 get_mips_segment_type (type
)
1759 case PT_MIPS_REGINFO
:
1761 case PT_MIPS_RTPROC
:
1763 case PT_MIPS_OPTIONS
:
1773 get_parisc_segment_type (type
)
1778 case PT_HP_TLS
: return "HP_TLS";
1779 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1780 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1781 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1782 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1783 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1784 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1785 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1786 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1787 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1788 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1789 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1790 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1791 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1800 get_ia64_segment_type (type
)
1805 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
1806 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
1815 get_segment_type (p_type
)
1816 unsigned long p_type
;
1818 static char buff
[32];
1822 case PT_NULL
: return "NULL";
1823 case PT_LOAD
: return "LOAD";
1824 case PT_DYNAMIC
: return "DYNAMIC";
1825 case PT_INTERP
: return "INTERP";
1826 case PT_NOTE
: return "NOTE";
1827 case PT_SHLIB
: return "SHLIB";
1828 case PT_PHDR
: return "PHDR";
1831 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1833 const char * result
;
1835 switch (elf_header
.e_machine
)
1838 case EM_MIPS_RS3_LE
:
1839 result
= get_mips_segment_type (p_type
);
1842 result
= get_parisc_segment_type (p_type
);
1845 result
= get_ia64_segment_type (p_type
);
1855 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1857 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1859 const char * result
;
1861 switch (elf_header
.e_machine
)
1864 result
= get_parisc_segment_type (p_type
);
1874 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1877 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1884 get_mips_section_type_name (sh_type
)
1885 unsigned int sh_type
;
1889 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1890 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1891 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1892 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1893 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1894 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1895 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1896 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1897 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1898 case SHT_MIPS_RELD
: return "MIPS_RELD";
1899 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
1900 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
1901 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1902 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
1903 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
1904 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
1905 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
1906 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
1907 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
1908 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
1909 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
1910 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
1911 case SHT_MIPS_LINE
: return "MIPS_LINE";
1912 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
1913 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
1914 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
1915 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
1916 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
1917 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
1918 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1919 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
1920 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
1921 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
1922 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
1923 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
1924 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
1925 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
1926 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
1927 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
1935 get_parisc_section_type_name (sh_type
)
1936 unsigned int sh_type
;
1940 case SHT_PARISC_EXT
: return "PARISC_EXT";
1941 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
1942 case SHT_PARISC_DOC
: return "PARISC_DOC";
1950 get_ia64_section_type_name (sh_type
)
1951 unsigned int sh_type
;
1955 case SHT_IA_64_EXT
: return "IA_64_EXT";
1956 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
1964 get_section_type_name (sh_type
)
1965 unsigned int sh_type
;
1967 static char buff
[32];
1971 case SHT_NULL
: return "NULL";
1972 case SHT_PROGBITS
: return "PROGBITS";
1973 case SHT_SYMTAB
: return "SYMTAB";
1974 case SHT_STRTAB
: return "STRTAB";
1975 case SHT_RELA
: return "RELA";
1976 case SHT_HASH
: return "HASH";
1977 case SHT_DYNAMIC
: return "DYNAMIC";
1978 case SHT_NOTE
: return "NOTE";
1979 case SHT_NOBITS
: return "NOBITS";
1980 case SHT_REL
: return "REL";
1981 case SHT_SHLIB
: return "SHLIB";
1982 case SHT_DYNSYM
: return "DYNSYM";
1983 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
1984 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
1985 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1986 case SHT_GROUP
: return "GROUP";
1987 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
1988 case SHT_GNU_verdef
: return "VERDEF";
1989 case SHT_GNU_verneed
: return "VERNEED";
1990 case SHT_GNU_versym
: return "VERSYM";
1991 case 0x6ffffff0: return "VERSYM";
1992 case 0x6ffffffc: return "VERDEF";
1993 case 0x7ffffffd: return "AUXILIARY";
1994 case 0x7fffffff: return "FILTER";
1997 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
1999 const char * result
;
2001 switch (elf_header
.e_machine
)
2004 case EM_MIPS_RS3_LE
:
2005 result
= get_mips_section_type_name (sh_type
);
2008 result
= get_parisc_section_type_name (sh_type
);
2011 result
= get_ia64_section_type_name (sh_type
);
2021 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2023 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2024 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2025 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2026 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2028 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2034 struct option options
[] =
2036 {"all", no_argument
, 0, 'a'},
2037 {"file-header", no_argument
, 0, 'h'},
2038 {"program-headers", no_argument
, 0, 'l'},
2039 {"headers", no_argument
, 0, 'e'},
2040 {"histogram", no_argument
, 0, 'I'},
2041 {"segments", no_argument
, 0, 'l'},
2042 {"sections", no_argument
, 0, 'S'},
2043 {"section-headers", no_argument
, 0, 'S'},
2044 {"symbols", no_argument
, 0, 's'},
2045 {"syms", no_argument
, 0, 's'},
2046 {"relocs", no_argument
, 0, 'r'},
2047 {"notes", no_argument
, 0, 'n'},
2048 {"dynamic", no_argument
, 0, 'd'},
2049 {"arch-specific", no_argument
, 0, 'A'},
2050 {"version-info", no_argument
, 0, 'V'},
2051 {"use-dynamic", no_argument
, 0, 'D'},
2052 {"hex-dump", required_argument
, 0, 'x'},
2053 {"debug-dump", optional_argument
, 0, 'w'},
2054 {"unwind", no_argument
, 0, 'u'},
2055 #ifdef SUPPORT_DISASSEMBLY
2056 {"instruction-dump", required_argument
, 0, 'i'},
2059 {"version", no_argument
, 0, 'v'},
2060 {"wide", no_argument
, 0, 'W'},
2061 {"help", no_argument
, 0, 'H'},
2062 {0, no_argument
, 0, 0}
2068 fprintf (stdout
, _("Usage: readelf {options} elf-file(s)\n"));
2069 fprintf (stdout
, _(" Options are:\n"));
2070 fprintf (stdout
, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2071 fprintf (stdout
, _(" -h or --file-header Display the ELF file header\n"));
2072 fprintf (stdout
, _(" -l or --program-headers or --segments\n"));
2073 fprintf (stdout
, _(" Display the program headers\n"));
2074 fprintf (stdout
, _(" -S or --section-headers or --sections\n"));
2075 fprintf (stdout
, _(" Display the sections' header\n"));
2076 fprintf (stdout
, _(" -e or --headers Equivalent to: -h -l -S\n"));
2077 fprintf (stdout
, _(" -s or --syms or --symbols Display the symbol table\n"));
2078 fprintf (stdout
, _(" -n or --notes Display the core notes (if present)\n"));
2079 fprintf (stdout
, _(" -r or --relocs Display the relocations (if present)\n"));
2080 fprintf (stdout
, _(" -u or --unwind Display the unwind info (if present)\n"));
2081 fprintf (stdout
, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2082 fprintf (stdout
, _(" -V or --version-info Display the version sections (if present)\n"));
2083 fprintf (stdout
, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2084 fprintf (stdout
, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2085 fprintf (stdout
, _(" -x <number> or --hex-dump=<number>\n"));
2086 fprintf (stdout
, _(" Dump the contents of section <number>\n"));
2087 fprintf (stdout
, _(" -w[liaprmfs] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n"));
2088 fprintf (stdout
, _(" Display the contents of DWARF2 debug sections\n"));
2089 #ifdef SUPPORT_DISASSEMBLY
2090 fprintf (stdout
, _(" -i <number> or --instruction-dump=<number>\n"));
2091 fprintf (stdout
, _(" Disassemble the contents of section <number>\n"));
2093 fprintf (stdout
, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2094 fprintf (stdout
, _(" -v or --version Display the version number of readelf\n"));
2095 fprintf (stdout
, _(" -W or --wide Don't split lines to fit into 80 columns\n"));
2096 fprintf (stdout
, _(" -H or --help Display this information\n"));
2097 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2103 request_dump (section
, type
)
2104 unsigned int section
;
2107 if (section
>= num_dump_sects
)
2109 char * new_dump_sects
;
2111 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2113 if (new_dump_sects
== NULL
)
2114 error (_("Out of memory allocating dump request table."));
2117 /* Copy current flag settings. */
2118 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2122 dump_sects
= new_dump_sects
;
2123 num_dump_sects
= section
+ 1;
2128 dump_sects
[section
] |= type
;
2134 parse_args (argc
, argv
)
2143 while ((c
= getopt_long
2144 (argc
, argv
, "ersuahnldSDAIw::x:i:vVW", options
, NULL
)) != EOF
)
2180 do_using_dynamic
++;
2211 section
= strtoul (optarg
, & cp
, 0);
2212 if (! * cp
&& section
>= 0)
2214 request_dump (section
, HEX_DUMP
);
2224 unsigned int index
= 0;
2228 while (optarg
[index
])
2229 switch (optarg
[index
++])
2238 do_debug_abbrevs
= 1;
2248 do_debug_pubnames
= 1;
2253 do_debug_aranges
= 1;
2257 do_debug_frames_interp
= 1;
2259 do_debug_frames
= 1;
2264 do_debug_macinfo
= 1;
2273 warn (_("Unrecognised debug option '%s'\n"), optarg
);
2278 #ifdef SUPPORT_DISASSEMBLY
2281 section
= strtoul (optarg
, & cp
, 0);
2282 if (! * cp
&& section
>= 0)
2284 request_dump (section
, DISASS_DUMP
);
2290 print_version (program_name
);
2300 /* xgettext:c-format */
2301 error (_("Invalid option '-%c'\n"), c
);
2308 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2309 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2310 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2314 warn (_("Nothing to do.\n"));
2320 get_elf_class (elf_class
)
2321 unsigned int elf_class
;
2323 static char buff
[32];
2327 case ELFCLASSNONE
: return _("none");
2328 case ELFCLASS32
: return "ELF32";
2329 case ELFCLASS64
: return "ELF64";
2331 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2337 get_data_encoding (encoding
)
2338 unsigned int encoding
;
2340 static char buff
[32];
2344 case ELFDATANONE
: return _("none");
2345 case ELFDATA2LSB
: return _("2's complement, little endian");
2346 case ELFDATA2MSB
: return _("2's complement, big endian");
2348 sprintf (buff
, _("<unknown: %x>"), encoding
);
2354 get_osabi_name (osabi
)
2357 static char buff
[32];
2361 case ELFOSABI_NONE
: return "UNIX - System V";
2362 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2363 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2364 case ELFOSABI_LINUX
: return "UNIX - Linux";
2365 case ELFOSABI_HURD
: return "GNU/Hurd";
2366 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2367 case ELFOSABI_AIX
: return "UNIX - AIX";
2368 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2369 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2370 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2371 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2372 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2373 case ELFOSABI_STANDALONE
: return _("Standalone App");
2374 case ELFOSABI_ARM
: return "ARM";
2376 sprintf (buff
, _("<unknown: %x>"), osabi
);
2381 /* Decode the data held in 'elf_header'. */
2383 process_file_header ()
2385 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2386 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2387 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2388 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2391 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2399 printf (_("ELF Header:\n"));
2400 printf (_(" Magic: "));
2401 for (i
= 0; i
< EI_NIDENT
; i
++)
2402 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2404 printf (_(" Class: %s\n"),
2405 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2406 printf (_(" Data: %s\n"),
2407 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2408 printf (_(" Version: %d %s\n"),
2409 elf_header
.e_ident
[EI_VERSION
],
2410 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2412 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2415 printf (_(" OS/ABI: %s\n"),
2416 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2417 printf (_(" ABI Version: %d\n"),
2418 elf_header
.e_ident
[EI_ABIVERSION
]);
2419 printf (_(" Type: %s\n"),
2420 get_file_type (elf_header
.e_type
));
2421 printf (_(" Machine: %s\n"),
2422 get_machine_name (elf_header
.e_machine
));
2423 printf (_(" Version: 0x%lx\n"),
2424 (unsigned long) elf_header
.e_version
);
2426 printf (_(" Entry point address: "));
2427 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2428 printf (_("\n Start of program headers: "));
2429 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2430 printf (_(" (bytes into file)\n Start of section headers: "));
2431 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2432 printf (_(" (bytes into file)\n"));
2434 printf (_(" Flags: 0x%lx%s\n"),
2435 (unsigned long) elf_header
.e_flags
,
2436 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2437 printf (_(" Size of this header: %ld (bytes)\n"),
2438 (long) elf_header
.e_ehsize
);
2439 printf (_(" Size of program headers: %ld (bytes)\n"),
2440 (long) elf_header
.e_phentsize
);
2441 printf (_(" Number of program headers: %ld\n"),
2442 (long) elf_header
.e_phnum
);
2443 printf (_(" Size of section headers: %ld (bytes)\n"),
2444 (long) elf_header
.e_shentsize
);
2445 printf (_(" Number of section headers: %ld"),
2446 (long) elf_header
.e_shnum
);
2447 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2448 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2449 putc ('\n', stdout
);
2450 printf (_(" Section header string table index: %ld"),
2451 (long) elf_header
.e_shstrndx
);
2452 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2453 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2454 putc ('\n', stdout
);
2457 if (section_headers
!= NULL
)
2459 if (elf_header
.e_shnum
== 0)
2460 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2461 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2462 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2463 free (section_headers
);
2464 section_headers
= NULL
;
2472 get_32bit_program_headers (file
, program_headers
)
2474 Elf_Internal_Phdr
* program_headers
;
2476 Elf32_External_Phdr
* phdrs
;
2477 Elf32_External_Phdr
* external
;
2478 Elf32_Internal_Phdr
* internal
;
2481 phdrs
= ((Elf32_External_Phdr
*)
2482 get_data (NULL
, file
, elf_header
.e_phoff
,
2483 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2484 _("program headers")));
2488 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2489 i
< elf_header
.e_phnum
;
2490 i
++, internal
++, external
++)
2492 internal
->p_type
= BYTE_GET (external
->p_type
);
2493 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2494 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2495 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2496 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2497 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2498 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2499 internal
->p_align
= BYTE_GET (external
->p_align
);
2508 get_64bit_program_headers (file
, program_headers
)
2510 Elf_Internal_Phdr
* program_headers
;
2512 Elf64_External_Phdr
* phdrs
;
2513 Elf64_External_Phdr
* external
;
2514 Elf64_Internal_Phdr
* internal
;
2517 phdrs
= ((Elf64_External_Phdr
*)
2518 get_data (NULL
, file
, elf_header
.e_phoff
,
2519 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2520 _("program headers")));
2524 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2525 i
< elf_header
.e_phnum
;
2526 i
++, internal
++, external
++)
2528 internal
->p_type
= BYTE_GET (external
->p_type
);
2529 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2530 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2531 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2532 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2533 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2534 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2535 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2544 process_program_headers (file
)
2547 Elf_Internal_Phdr
* program_headers
;
2548 Elf_Internal_Phdr
* segment
;
2551 if (elf_header
.e_phnum
== 0)
2554 printf (_("\nThere are no program headers in this file.\n"));
2558 if (do_segments
&& !do_header
)
2560 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2561 printf (_("Entry point "));
2562 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2563 printf (_("\nThere are %d program headers, starting at offset "),
2564 elf_header
.e_phnum
);
2565 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2569 program_headers
= (Elf_Internal_Phdr
*) malloc
2570 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2572 if (program_headers
== NULL
)
2574 error (_("Out of memory\n"));
2579 i
= get_32bit_program_headers (file
, program_headers
);
2581 i
= get_64bit_program_headers (file
, program_headers
);
2585 free (program_headers
);
2592 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2596 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2599 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2603 (_(" Type Offset VirtAddr PhysAddr\n"));
2605 (_(" FileSiz MemSiz Flags Align\n"));
2613 for (i
= 0, segment
= program_headers
;
2614 i
< elf_header
.e_phnum
;
2619 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2623 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2624 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2625 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2626 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2627 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2629 (segment
->p_flags
& PF_R
? 'R' : ' '),
2630 (segment
->p_flags
& PF_W
? 'W' : ' '),
2631 (segment
->p_flags
& PF_X
? 'E' : ' '));
2632 printf ("%#lx", (unsigned long) segment
->p_align
);
2636 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
2637 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2640 print_vma (segment
->p_offset
, FULL_HEX
);
2644 print_vma (segment
->p_vaddr
, FULL_HEX
);
2646 print_vma (segment
->p_paddr
, FULL_HEX
);
2649 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
2650 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
2653 print_vma (segment
->p_filesz
, FULL_HEX
);
2657 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
2658 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
2661 print_vma (segment
->p_offset
, FULL_HEX
);
2665 (segment
->p_flags
& PF_R
? 'R' : ' '),
2666 (segment
->p_flags
& PF_W
? 'W' : ' '),
2667 (segment
->p_flags
& PF_X
? 'E' : ' '));
2669 if ((unsigned long) segment
->p_align
== segment
->p_align
)
2670 printf ("%#lx", (unsigned long) segment
->p_align
);
2673 print_vma (segment
->p_align
, PREFIX_HEX
);
2678 print_vma (segment
->p_offset
, FULL_HEX
);
2680 print_vma (segment
->p_vaddr
, FULL_HEX
);
2682 print_vma (segment
->p_paddr
, FULL_HEX
);
2684 print_vma (segment
->p_filesz
, FULL_HEX
);
2686 print_vma (segment
->p_memsz
, FULL_HEX
);
2688 (segment
->p_flags
& PF_R
? 'R' : ' '),
2689 (segment
->p_flags
& PF_W
? 'W' : ' '),
2690 (segment
->p_flags
& PF_X
? 'E' : ' '));
2691 print_vma (segment
->p_align
, HEX
);
2695 switch (segment
->p_type
)
2699 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2700 - (segment
->p_offset
& 0xfffff000);
2705 error (_("more than one dynamic segment\n"));
2707 dynamic_addr
= segment
->p_offset
;
2708 dynamic_size
= segment
->p_filesz
;
2712 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2713 error (_("Unable to find program interpreter name\n"));
2716 program_interpreter
[0] = 0;
2717 fscanf (file
, "%63s", program_interpreter
);
2720 printf (_("\n [Requesting program interpreter: %s]"),
2721 program_interpreter
);
2727 putc ('\n', stdout
);
2736 if (do_segments
&& section_headers
!= NULL
)
2738 printf (_("\n Section to Segment mapping:\n"));
2739 printf (_(" Segment Sections...\n"));
2741 assert (string_table
!= NULL
);
2743 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2746 Elf_Internal_Shdr
* section
;
2748 segment
= program_headers
+ i
;
2749 section
= section_headers
;
2751 printf (" %2.2d ", i
);
2753 for (j
= 0; j
< elf_header
.e_shnum
; j
++, section
++)
2755 if (section
->sh_size
> 0
2756 /* Compare allocated sections by VMA, unallocated
2757 sections by file offset. */
2758 && (section
->sh_flags
& SHF_ALLOC
2759 ? (section
->sh_addr
>= segment
->p_vaddr
2760 && section
->sh_addr
+ section
->sh_size
2761 <= segment
->p_vaddr
+ segment
->p_memsz
)
2762 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2763 && (section
->sh_offset
+ section
->sh_size
2764 <= segment
->p_offset
+ segment
->p_filesz
))))
2765 printf ("%s ", SECTION_NAME (section
));
2772 free (program_headers
);
2779 get_32bit_section_headers (file
, num
)
2783 Elf32_External_Shdr
* shdrs
;
2784 Elf32_Internal_Shdr
* internal
;
2787 shdrs
= ((Elf32_External_Shdr
*)
2788 get_data (NULL
, file
, elf_header
.e_shoff
,
2789 elf_header
.e_shentsize
* num
,
2790 _("section headers")));
2794 section_headers
= ((Elf_Internal_Shdr
*)
2795 malloc (num
* sizeof (Elf_Internal_Shdr
)));
2797 if (section_headers
== NULL
)
2799 error (_("Out of memory\n"));
2803 for (i
= 0, internal
= section_headers
;
2807 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2808 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2809 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2810 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2811 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2812 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2813 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2814 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2815 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2816 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2825 get_64bit_section_headers (file
, num
)
2829 Elf64_External_Shdr
* shdrs
;
2830 Elf64_Internal_Shdr
* internal
;
2833 shdrs
= ((Elf64_External_Shdr
*)
2834 get_data (NULL
, file
, elf_header
.e_shoff
,
2835 elf_header
.e_shentsize
* num
,
2836 _("section headers")));
2840 section_headers
= ((Elf_Internal_Shdr
*)
2841 malloc (num
* sizeof (Elf_Internal_Shdr
)));
2843 if (section_headers
== NULL
)
2845 error (_("Out of memory\n"));
2849 for (i
= 0, internal
= section_headers
;
2853 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2854 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2855 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2856 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2857 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2858 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2859 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2860 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2861 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2862 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2870 static Elf_Internal_Sym
*
2871 get_32bit_elf_symbols (file
, offset
, number
)
2873 unsigned long offset
;
2874 unsigned long number
;
2876 Elf32_External_Sym
* esyms
;
2877 Elf_Internal_Sym
* isyms
;
2878 Elf_Internal_Sym
* psym
;
2881 esyms
= ((Elf32_External_Sym
*)
2882 get_data (NULL
, file
, offset
,
2883 number
* sizeof (Elf32_External_Sym
), _("symbols")));
2887 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2891 error (_("Out of memory\n"));
2897 for (j
= 0, psym
= isyms
;
2901 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2902 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
2903 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
2904 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2905 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2906 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2914 static Elf_Internal_Sym
*
2915 get_64bit_elf_symbols (file
, offset
, number
)
2917 unsigned long offset
;
2918 unsigned long number
;
2920 Elf64_External_Sym
* esyms
;
2921 Elf_Internal_Sym
* isyms
;
2922 Elf_Internal_Sym
* psym
;
2925 esyms
= ((Elf64_External_Sym
*)
2926 get_data (NULL
, file
, offset
,
2927 number
* sizeof (Elf64_External_Sym
), _("symbols")));
2931 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2935 error (_("Out of memory\n"));
2941 for (j
= 0, psym
= isyms
;
2945 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2946 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2947 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2948 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2949 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
2950 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
2959 get_elf_section_flags (sh_flags
)
2962 static char buff
[32];
2970 flag
= sh_flags
& - sh_flags
;
2975 case SHF_WRITE
: strcat (buff
, "W"); break;
2976 case SHF_ALLOC
: strcat (buff
, "A"); break;
2977 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
2978 case SHF_MERGE
: strcat (buff
, "M"); break;
2979 case SHF_STRINGS
: strcat (buff
, "S"); break;
2980 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
2981 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
2982 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
2983 case SHF_GROUP
: strcat (buff
, "G"); break;
2986 if (flag
& SHF_MASKOS
)
2989 sh_flags
&= ~ SHF_MASKOS
;
2991 else if (flag
& SHF_MASKPROC
)
2994 sh_flags
&= ~ SHF_MASKPROC
;
3006 process_section_headers (file
)
3009 Elf_Internal_Shdr
* section
;
3012 section_headers
= NULL
;
3014 if (elf_header
.e_shnum
== 0)
3017 printf (_("\nThere are no sections in this file.\n"));
3022 if (do_sections
&& !do_header
)
3023 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3024 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3028 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3031 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3034 /* Read in the string table, so that we have names to display. */
3035 section
= section_headers
+ elf_header
.e_shstrndx
;
3037 if (section
->sh_size
!= 0)
3039 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3040 section
->sh_size
, _("string table"));
3042 string_table_length
= section
->sh_size
;
3045 /* Scan the sections for the dynamic symbol table
3046 and dynamic string table and debug sections. */
3047 dynamic_symbols
= NULL
;
3048 dynamic_strings
= NULL
;
3049 dynamic_syminfo
= NULL
;
3051 for (i
= 0, section
= section_headers
;
3052 i
< elf_header
.e_shnum
;
3055 char * name
= SECTION_NAME (section
);
3057 if (section
->sh_type
== SHT_DYNSYM
)
3059 if (dynamic_symbols
!= NULL
)
3061 error (_("File contains multiple dynamic symbol tables\n"));
3065 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3067 GET_ELF_SYMBOLS (file
, section
->sh_offset
, num_dynamic_syms
);
3069 else if (section
->sh_type
== SHT_STRTAB
3070 && strcmp (name
, ".dynstr") == 0)
3072 if (dynamic_strings
!= NULL
)
3074 error (_("File contains multiple dynamic string tables\n"));
3078 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3080 _("dynamic strings"));
3082 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3083 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3084 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
)
3085 && strncmp (name
, ".debug_", 7) == 0)
3090 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3091 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3092 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3093 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3094 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3095 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3096 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3097 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3099 request_dump (i
, DEBUG_DUMP
);
3101 /* linkonce section to be combined with .debug_info at link time. */
3102 else if ((do_debugging
|| do_debug_info
)
3103 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3104 request_dump (i
, DEBUG_DUMP
);
3105 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3106 request_dump (i
, DEBUG_DUMP
);
3112 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
3116 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3119 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3122 printf (_(" [Nr] Name Type Address Offset\n"));
3123 printf (_(" Size EntSize Flags Link Info Align\n"));
3126 for (i
= 0, section
= section_headers
;
3127 i
< elf_header
.e_shnum
;
3130 printf (" [%2d] %-17.17s %-15.15s ",
3132 SECTION_NAME (section
),
3133 get_section_type_name (section
->sh_type
));
3137 print_vma (section
->sh_addr
, LONG_HEX
);
3139 printf ( " %6.6lx %6.6lx %2.2lx",
3140 (unsigned long) section
->sh_offset
,
3141 (unsigned long) section
->sh_size
,
3142 (unsigned long) section
->sh_entsize
);
3144 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3146 printf ("%2ld %3lx %2ld\n",
3147 (unsigned long) section
->sh_link
,
3148 (unsigned long) section
->sh_info
,
3149 (unsigned long) section
->sh_addralign
);
3153 print_vma (section
->sh_addr
, LONG_HEX
);
3155 if ((long) section
->sh_offset
== section
->sh_offset
)
3156 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3160 print_vma (section
->sh_offset
, LONG_HEX
);
3163 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3164 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3168 print_vma (section
->sh_size
, LONG_HEX
);
3171 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3172 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3176 print_vma (section
->sh_entsize
, LONG_HEX
);
3179 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3181 printf ("%2ld %3lx ",
3182 (unsigned long) section
->sh_link
,
3183 (unsigned long) section
->sh_info
);
3185 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3186 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3189 print_vma (section
->sh_addralign
, DEC
);
3196 print_vma (section
->sh_addr
, LONG_HEX
);
3197 if ((long) section
->sh_offset
== section
->sh_offset
)
3198 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3202 print_vma (section
->sh_offset
, LONG_HEX
);
3205 print_vma (section
->sh_size
, LONG_HEX
);
3207 print_vma (section
->sh_entsize
, LONG_HEX
);
3209 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3211 printf (" %2ld %3lx %ld\n",
3212 (unsigned long) section
->sh_link
,
3213 (unsigned long) section
->sh_info
,
3214 (unsigned long) section
->sh_addralign
);
3218 printf (_("Key to Flags:\n\
3219 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3220 I (info), L (link order), G (group), x (unknown)\n\
3221 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3226 /* Process the reloc section. */
3228 process_relocs (file
)
3231 unsigned long rel_size
;
3232 unsigned long rel_offset
;
3238 if (do_using_dynamic
)
3240 int is_rela
= FALSE
;
3245 if (dynamic_info
[DT_REL
])
3247 rel_offset
= dynamic_info
[DT_REL
];
3248 rel_size
= dynamic_info
[DT_RELSZ
];
3251 else if (dynamic_info
[DT_RELA
])
3253 rel_offset
= dynamic_info
[DT_RELA
];
3254 rel_size
= dynamic_info
[DT_RELASZ
];
3257 else if (dynamic_info
[DT_JMPREL
])
3259 rel_offset
= dynamic_info
[DT_JMPREL
];
3260 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3262 switch (dynamic_info
[DT_PLTREL
])
3279 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3280 rel_offset
, rel_size
);
3282 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3283 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
3286 printf (_("\nThere are no dynamic relocations in this file.\n"));
3290 Elf32_Internal_Shdr
* section
;
3294 for (i
= 0, section
= section_headers
;
3295 i
< elf_header
.e_shnum
;
3298 if ( section
->sh_type
!= SHT_RELA
3299 && section
->sh_type
!= SHT_REL
)
3302 rel_offset
= section
->sh_offset
;
3303 rel_size
= section
->sh_size
;
3307 Elf32_Internal_Shdr
* strsec
;
3308 Elf_Internal_Sym
* symtab
;
3311 unsigned long nsyms
;
3313 printf (_("\nRelocation section "));
3315 if (string_table
== NULL
)
3316 printf ("%d", section
->sh_name
);
3318 printf ("'%s'", SECTION_NAME (section
));
3320 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3321 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3326 if (section
->sh_link
)
3328 Elf32_Internal_Shdr
* symsec
;
3330 symsec
= section_headers
+ section
->sh_link
;
3331 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3332 symtab
= GET_ELF_SYMBOLS (file
, symsec
->sh_offset
, nsyms
);
3337 strsec
= section_headers
+ symsec
->sh_link
;
3339 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3343 is_rela
= section
->sh_type
== SHT_RELA
;
3345 dump_relocations (file
, rel_offset
, rel_size
,
3346 symtab
, nsyms
, strtab
, is_rela
);
3358 printf (_("\nThere are no relocations in this file.\n"));
3364 #include "unwind-ia64.h"
3366 /* An absolute address consists of a section and an offset. If the
3367 section is NULL, the offset itself is the address, otherwise, the
3368 address equals to LOAD_ADDRESS(section) + offset. */
3372 unsigned short section
;
3378 struct unw_table_entry
3380 struct absaddr start
;
3382 struct absaddr info
;
3384 *table
; /* Unwind table. */
3385 unsigned long table_len
; /* Length of unwind table. */
3386 unsigned char * info
; /* Unwind info. */
3387 unsigned long info_size
; /* Size of unwind info. */
3388 bfd_vma info_addr
; /* starting address of unwind info. */
3389 bfd_vma seg_base
; /* Starting address of segment. */
3390 Elf_Internal_Sym
* symtab
; /* The symbol table. */
3391 unsigned long nsyms
; /* Number of symbols. */
3392 char * strtab
; /* The string table. */
3393 unsigned long strtab_size
; /* Size of string table. */
3396 static void find_symbol_for_address
PARAMS ((struct unw_aux_info
*,
3397 struct absaddr
, const char **,
3399 static void dump_ia64_unwind
PARAMS ((struct unw_aux_info
*));
3400 static int slurp_ia64_unwind_table
PARAMS ((FILE *, struct unw_aux_info
*,
3401 Elf32_Internal_Shdr
*));
3404 find_symbol_for_address (aux
, addr
, symname
, offset
)
3405 struct unw_aux_info
*aux
;
3406 struct absaddr addr
;
3407 const char **symname
;
3410 bfd_vma dist
= (bfd_vma
) 0x100000;
3411 Elf_Internal_Sym
*sym
, *best
= NULL
;
3414 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3416 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3417 && sym
->st_name
!= 0
3418 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3419 && addr
.offset
>= sym
->st_value
3420 && addr
.offset
- sym
->st_value
< dist
)
3423 dist
= addr
.offset
- sym
->st_value
;
3430 *symname
= (best
->st_name
>= aux
->strtab_size
3431 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3436 *offset
= addr
.offset
;
3440 dump_ia64_unwind (aux
)
3441 struct unw_aux_info
*aux
;
3444 struct unw_table_entry
* tp
;
3447 addr_size
= is_32bit_elf
? 4 : 8;
3449 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3453 const unsigned char * dp
;
3454 const unsigned char * head
;
3455 const char * procname
;
3457 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3459 fputs ("\n<", stdout
);
3463 fputs (procname
, stdout
);
3466 printf ("+%lx", (unsigned long) offset
);
3469 fputs (">: [", stdout
);
3470 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3471 fputc ('-', stdout
);
3472 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3473 printf ("), info at +0x%lx\n",
3474 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3476 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3477 stamp
= BYTE_GET8 ((unsigned char *) head
);
3479 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3480 (unsigned) UNW_VER (stamp
),
3481 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3482 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3483 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3484 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3486 if (UNW_VER (stamp
) != 1)
3488 printf ("\tUnknown version.\n");
3493 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3494 dp
= unw_decode (dp
, in_body
, & in_body
);
3499 slurp_ia64_unwind_table (file
, aux
, sec
)
3501 struct unw_aux_info
*aux
;
3502 Elf32_Internal_Shdr
*sec
;
3504 unsigned long size
, addr_size
, nrelas
, i
;
3505 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
3506 struct unw_table_entry
*tep
;
3507 Elf32_Internal_Shdr
*relsec
;
3508 Elf_Internal_Rela
*rela
, *rp
;
3509 unsigned char *table
, *tp
;
3510 Elf_Internal_Sym
*sym
;
3511 const char *relname
;
3514 addr_size
= is_32bit_elf
? 4 : 8;
3516 /* First, find the starting address of the segment that includes
3519 if (elf_header
.e_phnum
)
3521 prog_hdrs
= (Elf_Internal_Phdr
*)
3522 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3525 result
= get_32bit_program_headers (file
, prog_hdrs
);
3527 result
= get_64bit_program_headers (file
, prog_hdrs
);
3535 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
3537 if (seg
->p_type
!= PT_LOAD
)
3540 if (sec
->sh_addr
>= seg
->p_vaddr
3541 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3543 aux
->seg_base
= seg
->p_vaddr
;
3551 /* Second, build the unwind table from the contents of the unwind section: */
3552 size
= sec
->sh_size
;
3553 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3554 size
, _("unwind table"));
3558 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3559 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++ tep
)
3561 tep
->start
.section
= SHN_UNDEF
;
3562 tep
->end
.section
= SHN_UNDEF
;
3563 tep
->info
.section
= SHN_UNDEF
;
3566 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3567 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3568 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3572 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3573 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3574 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3576 tep
->start
.offset
+= aux
->seg_base
;
3577 tep
->end
.offset
+= aux
->seg_base
;
3578 tep
->info
.offset
+= aux
->seg_base
;
3582 /* Third, apply any relocations to the unwind table: */
3584 for (relsec
= section_headers
;
3585 relsec
< section_headers
+ elf_header
.e_shnum
;
3588 if (relsec
->sh_type
!= SHT_RELA
3589 || section_headers
+ relsec
->sh_info
!= sec
)
3592 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
3596 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
3600 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
3601 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
3603 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3605 warn (_("Skipping unexpected symbol type %u\n"),
3606 ELF32_ST_TYPE (sym
->st_info
));
3612 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
3613 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
3615 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3617 warn (_("Skipping unexpected symbol type %u\n"),
3618 ELF64_ST_TYPE (sym
->st_info
));
3623 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
3625 warn (_("Skipping unexpected relocation type %s\n"), relname
);
3629 i
= rp
->r_offset
/ (3 * addr_size
);
3631 switch (rp
->r_offset
/addr_size
% 3)
3634 aux
->table
[i
].start
.section
= sym
->st_shndx
;
3635 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
3638 aux
->table
[i
].end
.section
= sym
->st_shndx
;
3639 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
3642 aux
->table
[i
].info
.section
= sym
->st_shndx
;
3643 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
3653 aux
->table_len
= size
/ (3 * addr_size
);
3658 process_unwind (file
)
3661 Elf32_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
3662 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
3663 struct unw_aux_info aux
;
3668 if (elf_header
.e_machine
!= EM_IA_64
)
3670 printf (_("\nThere are no unwind sections in this file.\n"));
3674 memset (& aux
, 0, sizeof (aux
));
3676 addr_size
= is_32bit_elf
? 4 : 8;
3678 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
3680 if (sec
->sh_type
== SHT_SYMTAB
)
3682 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
3683 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
->sh_offset
, aux
.nsyms
);
3685 strsec
= section_headers
+ sec
->sh_link
;
3686 aux
.strtab_size
= strsec
->sh_size
;
3687 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3688 aux
.strtab_size
, _("string table"));
3690 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3695 printf (_("\nThere are no unwind sections in this file.\n"));
3697 while (unwcount
-- > 0)
3702 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
3703 i
< elf_header
.e_shnum
; ++i
, ++sec
)
3704 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3711 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
3713 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
3716 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3717 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
3718 suffix
= SECTION_NAME (unwsec
) + len
;
3719 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3721 if (strncmp (SECTION_NAME (sec
),
3722 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
3723 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3728 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3729 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3730 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
3731 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
3733 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
3735 suffix
= SECTION_NAME (unwsec
) + len
;
3736 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3738 if (strncmp (SECTION_NAME (sec
),
3739 ELF_STRING_ia64_unwind_info
, len2
) == 0
3740 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3744 if (i
== elf_header
.e_shnum
)
3746 printf (_("\nCould not find unwind info section for "));
3748 if (string_table
== NULL
)
3749 printf ("%d", unwsec
->sh_name
);
3751 printf ("'%s'", SECTION_NAME (unwsec
));
3755 aux
.info_size
= sec
->sh_size
;
3756 aux
.info_addr
= sec
->sh_addr
;
3757 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3758 aux
.info_size
, _("unwind info"));
3760 printf (_("\nUnwind section "));
3762 if (string_table
== NULL
)
3763 printf ("%d", unwsec
->sh_name
);
3765 printf ("'%s'", SECTION_NAME (unwsec
));
3767 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3768 (unsigned long) unwsec
->sh_offset
,
3769 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
3771 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
3773 if (aux
.table_len
> 0)
3774 dump_ia64_unwind (& aux
);
3777 free ((char *) aux
.table
);
3779 free ((char *) aux
.info
);
3788 free ((char *) aux
.strtab
);
3794 dynamic_segment_mips_val (entry
)
3795 Elf_Internal_Dyn
* entry
;
3797 switch (entry
->d_tag
)
3800 if (entry
->d_un
.d_val
== 0)
3804 static const char * opts
[] =
3806 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3807 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3808 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3809 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3814 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
3815 if (entry
->d_un
.d_val
& (1 << cnt
))
3817 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
3824 case DT_MIPS_IVERSION
:
3825 if (dynamic_strings
!= NULL
)
3826 printf ("Interface Version: %s\n",
3827 dynamic_strings
+ entry
->d_un
.d_val
);
3829 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3832 case DT_MIPS_TIME_STAMP
:
3837 time_t time
= entry
->d_un
.d_val
;
3838 tmp
= gmtime (&time
);
3839 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
3840 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
3841 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
3842 printf ("Time Stamp: %s\n", timebuf
);
3846 case DT_MIPS_RLD_VERSION
:
3847 case DT_MIPS_LOCAL_GOTNO
:
3848 case DT_MIPS_CONFLICTNO
:
3849 case DT_MIPS_LIBLISTNO
:
3850 case DT_MIPS_SYMTABNO
:
3851 case DT_MIPS_UNREFEXTNO
:
3852 case DT_MIPS_HIPAGENO
:
3853 case DT_MIPS_DELTA_CLASS_NO
:
3854 case DT_MIPS_DELTA_INSTANCE_NO
:
3855 case DT_MIPS_DELTA_RELOC_NO
:
3856 case DT_MIPS_DELTA_SYM_NO
:
3857 case DT_MIPS_DELTA_CLASSSYM_NO
:
3858 case DT_MIPS_COMPACT_SIZE
:
3859 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3863 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
3869 dynamic_segment_parisc_val (entry
)
3870 Elf_Internal_Dyn
* entry
;
3872 switch (entry
->d_tag
)
3874 case DT_HP_DLD_FLAGS
:
3883 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
3884 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
3885 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
3886 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
3887 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
3888 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
3889 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
3890 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
3891 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
3892 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
3893 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
3897 bfd_vma val
= entry
->d_un
.d_val
;
3899 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
3900 if (val
& flags
[cnt
].bit
)
3904 fputs (flags
[cnt
].str
, stdout
);
3906 val
^= flags
[cnt
].bit
;
3909 if (val
!= 0 || first
)
3913 print_vma (val
, HEX
);
3919 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
3925 get_32bit_dynamic_segment (file
)
3928 Elf32_External_Dyn
* edyn
;
3929 Elf_Internal_Dyn
* entry
;
3932 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
3933 dynamic_size
, _("dynamic segment"));
3937 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3938 how large this .dynamic is now. We can do this even before the byte
3939 swapping since the DT_NULL tag is recognizable. */
3941 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3944 dynamic_segment
= (Elf_Internal_Dyn
*)
3945 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3947 if (dynamic_segment
== NULL
)
3949 error (_("Out of memory\n"));
3954 for (i
= 0, entry
= dynamic_segment
;
3958 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
3959 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
3968 get_64bit_dynamic_segment (file
)
3971 Elf64_External_Dyn
* edyn
;
3972 Elf_Internal_Dyn
* entry
;
3975 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
3976 dynamic_size
, _("dynamic segment"));
3980 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3981 how large this .dynamic is now. We can do this even before the byte
3982 swapping since the DT_NULL tag is recognizable. */
3984 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3987 dynamic_segment
= (Elf_Internal_Dyn
*)
3988 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3990 if (dynamic_segment
== NULL
)
3992 error (_("Out of memory\n"));
3997 for (i
= 0, entry
= dynamic_segment
;
4001 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4002 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4011 get_dynamic_flags (flags
)
4014 static char buff
[64];
4019 flag
= flags
& - flags
;
4024 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
4025 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
4026 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
4027 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
4028 default: strcat (buff
, "unknown "); break;
4034 /* Parse and display the contents of the dynamic segment. */
4036 process_dynamic_segment (file
)
4039 Elf_Internal_Dyn
* entry
;
4042 if (dynamic_size
== 0)
4045 printf (_("\nThere is no dynamic segment in this file.\n"));
4052 if (! get_32bit_dynamic_segment (file
))
4055 else if (! get_64bit_dynamic_segment (file
))
4058 /* Find the appropriate symbol table. */
4059 if (dynamic_symbols
== NULL
)
4061 for (i
= 0, entry
= dynamic_segment
;
4065 unsigned long offset
;
4067 if (entry
->d_tag
!= DT_SYMTAB
)
4070 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4072 /* Since we do not know how big the symbol table is,
4073 we default to reading in the entire file (!) and
4074 processing that. This is overkill, I know, but it
4076 offset
= entry
->d_un
.d_val
- loadaddr
;
4078 if (fseek (file
, 0, SEEK_END
))
4079 error (_("Unable to seek to end of file!"));
4082 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf32_External_Sym
);
4084 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf64_External_Sym
);
4086 if (num_dynamic_syms
< 1)
4088 error (_("Unable to determine the number of symbols to load\n"));
4092 dynamic_symbols
= GET_ELF_SYMBOLS (file
, offset
, num_dynamic_syms
);
4096 /* Similarly find a string table. */
4097 if (dynamic_strings
== NULL
)
4099 for (i
= 0, entry
= dynamic_segment
;
4103 unsigned long offset
;
4106 if (entry
->d_tag
!= DT_STRTAB
)
4109 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4111 /* Since we do not know how big the string table is,
4112 we default to reading in the entire file (!) and
4113 processing that. This is overkill, I know, but it
4116 offset
= entry
->d_un
.d_val
- loadaddr
;
4117 if (fseek (file
, 0, SEEK_END
))
4118 error (_("Unable to seek to end of file\n"));
4119 str_tab_len
= ftell (file
) - offset
;
4121 if (str_tab_len
< 1)
4124 (_("Unable to determine the length of the dynamic string table\n"));
4128 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
4129 _("dynamic string table"));
4134 /* And find the syminfo section if available. */
4135 if (dynamic_syminfo
== NULL
)
4137 unsigned int syminsz
= 0;
4139 for (i
= 0, entry
= dynamic_segment
;
4143 if (entry
->d_tag
== DT_SYMINENT
)
4145 /* Note: these braces are necessary to avoid a syntax
4146 error from the SunOS4 C compiler. */
4147 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4149 else if (entry
->d_tag
== DT_SYMINSZ
)
4150 syminsz
= entry
->d_un
.d_val
;
4151 else if (entry
->d_tag
== DT_SYMINFO
)
4152 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
4155 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4157 Elf_External_Syminfo
* extsyminfo
;
4158 Elf_Internal_Syminfo
* syminfo
;
4160 /* There is a syminfo section. Read the data. */
4161 extsyminfo
= ((Elf_External_Syminfo
*)
4162 get_data (NULL
, file
, dynamic_syminfo_offset
,
4163 syminsz
, _("symbol information")));
4167 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4168 if (dynamic_syminfo
== NULL
)
4170 error (_("Out of memory\n"));
4174 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4175 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4178 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4179 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4186 if (do_dynamic
&& dynamic_addr
)
4187 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4188 dynamic_addr
, (long) dynamic_size
);
4190 printf (_(" Tag Type Name/Value\n"));
4192 for (i
= 0, entry
= dynamic_segment
;
4201 print_vma (entry
->d_tag
, FULL_HEX
);
4202 dtype
= get_dynamic_type (entry
->d_tag
);
4203 printf (" (%s)%*s", dtype
,
4204 ((is_32bit_elf
? 27 : 19)
4205 - (int) strlen (dtype
)),
4209 switch (entry
->d_tag
)
4213 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
4223 switch (entry
->d_tag
)
4226 printf (_("Auxiliary library"));
4230 printf (_("Filter library"));
4234 printf (_("Configuration file"));
4238 printf (_("Dependency audit library"));
4242 printf (_("Audit library"));
4246 if (dynamic_strings
)
4247 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4251 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4260 printf (_("Flags:"));
4261 if (entry
->d_un
.d_val
== 0)
4262 printf (_(" None\n"));
4265 unsigned long int val
= entry
->d_un
.d_val
;
4266 if (val
& DTF_1_PARINIT
)
4268 printf (" PARINIT");
4269 val
^= DTF_1_PARINIT
;
4271 if (val
& DTF_1_CONFEXP
)
4273 printf (" CONFEXP");
4274 val
^= DTF_1_CONFEXP
;
4277 printf (" %lx", val
);
4286 printf (_("Flags:"));
4287 if (entry
->d_un
.d_val
== 0)
4288 printf (_(" None\n"));
4291 unsigned long int val
= entry
->d_un
.d_val
;
4292 if (val
& DF_P1_LAZYLOAD
)
4294 printf (" LAZYLOAD");
4295 val
^= DF_P1_LAZYLOAD
;
4297 if (val
& DF_P1_GROUPPERM
)
4299 printf (" GROUPPERM");
4300 val
^= DF_P1_GROUPPERM
;
4303 printf (" %lx", val
);
4312 printf (_("Flags:"));
4313 if (entry
->d_un
.d_val
== 0)
4314 printf (_(" None\n"));
4317 unsigned long int val
= entry
->d_un
.d_val
;
4323 if (val
& DF_1_GLOBAL
)
4328 if (val
& DF_1_GROUP
)
4333 if (val
& DF_1_NODELETE
)
4335 printf (" NODELETE");
4336 val
^= DF_1_NODELETE
;
4338 if (val
& DF_1_LOADFLTR
)
4340 printf (" LOADFLTR");
4341 val
^= DF_1_LOADFLTR
;
4343 if (val
& DF_1_INITFIRST
)
4345 printf (" INITFIRST");
4346 val
^= DF_1_INITFIRST
;
4348 if (val
& DF_1_NOOPEN
)
4353 if (val
& DF_1_ORIGIN
)
4358 if (val
& DF_1_DIRECT
)
4363 if (val
& DF_1_TRANS
)
4368 if (val
& DF_1_INTERPOSE
)
4370 printf (" INTERPOSE");
4371 val
^= DF_1_INTERPOSE
;
4373 if (val
& DF_1_NODEFLIB
)
4375 printf (" NODEFLIB");
4376 val
^= DF_1_NODEFLIB
;
4378 if (val
& DF_1_NODUMP
)
4383 if (val
& DF_1_CONLFAT
)
4385 printf (" CONLFAT");
4386 val
^= DF_1_CONLFAT
;
4389 printf (" %lx", val
);
4397 puts (get_dynamic_type (entry
->d_un
.d_val
));
4417 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4423 if (dynamic_strings
== NULL
)
4426 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4430 switch (entry
->d_tag
)
4433 printf (_("Shared library: [%s]"), name
);
4435 if (strcmp (name
, program_interpreter
) == 0)
4436 printf (_(" program interpreter"));
4440 printf (_("Library soname: [%s]"), name
);
4444 printf (_("Library rpath: [%s]"), name
);
4448 printf (_("Library runpath: [%s]"), name
);
4452 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4457 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4473 case DT_INIT_ARRAYSZ
:
4474 case DT_FINI_ARRAYSZ
:
4477 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4478 printf (" (bytes)\n");
4488 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4501 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4505 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4509 printf (_("Not needed object: [%s]\n"), name
);
4514 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4520 /* The value of this entry is ignored. */
4524 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
4525 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
4530 switch (elf_header
.e_machine
)
4533 case EM_MIPS_RS3_LE
:
4534 dynamic_segment_mips_val (entry
);
4537 dynamic_segment_parisc_val (entry
);
4540 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4552 get_ver_flags (flags
)
4555 static char buff
[32];
4562 if (flags
& VER_FLG_BASE
)
4563 strcat (buff
, "BASE ");
4565 if (flags
& VER_FLG_WEAK
)
4567 if (flags
& VER_FLG_BASE
)
4568 strcat (buff
, "| ");
4570 strcat (buff
, "WEAK ");
4573 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
4574 strcat (buff
, "| <unknown>");
4579 /* Display the contents of the version sections. */
4581 process_version_sections (file
)
4584 Elf32_Internal_Shdr
* section
;
4591 for (i
= 0, section
= section_headers
;
4592 i
< elf_header
.e_shnum
;
4595 switch (section
->sh_type
)
4597 case SHT_GNU_verdef
:
4599 Elf_External_Verdef
* edefs
;
4606 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4607 SECTION_NAME (section
), section
->sh_info
);
4609 printf (_(" Addr: 0x"));
4610 printf_vma (section
->sh_addr
);
4611 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4612 (unsigned long) section
->sh_offset
, section
->sh_link
,
4613 SECTION_NAME (section_headers
+ section
->sh_link
));
4615 edefs
= ((Elf_External_Verdef
*)
4616 get_data (NULL
, file
, section
->sh_offset
,
4618 _("version definition section")));
4622 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
4625 Elf_External_Verdef
* edef
;
4626 Elf_Internal_Verdef ent
;
4627 Elf_External_Verdaux
* eaux
;
4628 Elf_Internal_Verdaux aux
;
4632 vstart
= ((char *) edefs
) + idx
;
4634 edef
= (Elf_External_Verdef
*) vstart
;
4636 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
4637 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
4638 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
4639 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
4640 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
4641 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
4642 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
4644 printf (_(" %#06x: Rev: %d Flags: %s"),
4645 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
4647 printf (_(" Index: %d Cnt: %d "),
4648 ent
.vd_ndx
, ent
.vd_cnt
);
4650 vstart
+= ent
.vd_aux
;
4652 eaux
= (Elf_External_Verdaux
*) vstart
;
4654 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4655 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4657 if (dynamic_strings
)
4658 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
4660 printf (_("Name index: %ld\n"), aux
.vda_name
);
4662 isum
= idx
+ ent
.vd_aux
;
4664 for (j
= 1; j
< ent
.vd_cnt
; j
++)
4666 isum
+= aux
.vda_next
;
4667 vstart
+= aux
.vda_next
;
4669 eaux
= (Elf_External_Verdaux
*) vstart
;
4671 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4672 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4674 if (dynamic_strings
)
4675 printf (_(" %#06x: Parent %d: %s\n"),
4676 isum
, j
, dynamic_strings
+ aux
.vda_name
);
4678 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4679 isum
, j
, aux
.vda_name
);
4689 case SHT_GNU_verneed
:
4691 Elf_External_Verneed
* eneed
;
4697 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4698 SECTION_NAME (section
), section
->sh_info
);
4700 printf (_(" Addr: 0x"));
4701 printf_vma (section
->sh_addr
);
4702 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4703 (unsigned long) section
->sh_offset
, section
->sh_link
,
4704 SECTION_NAME (section_headers
+ section
->sh_link
));
4706 eneed
= ((Elf_External_Verneed
*)
4707 get_data (NULL
, file
, section
->sh_offset
,
4708 section
->sh_size
, _("version need section")));
4712 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
4714 Elf_External_Verneed
* entry
;
4715 Elf_Internal_Verneed ent
;
4720 vstart
= ((char *) eneed
) + idx
;
4722 entry
= (Elf_External_Verneed
*) vstart
;
4724 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
4725 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
4726 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
4727 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
4728 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
4730 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
4732 if (dynamic_strings
)
4733 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
4735 printf (_(" File: %lx"), ent
.vn_file
);
4737 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
4739 vstart
+= ent
.vn_aux
;
4741 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
4743 Elf_External_Vernaux
* eaux
;
4744 Elf_Internal_Vernaux aux
;
4746 eaux
= (Elf_External_Vernaux
*) vstart
;
4748 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
4749 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
4750 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
4751 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
4752 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
4754 if (dynamic_strings
)
4755 printf (_(" %#06x: Name: %s"),
4756 isum
, dynamic_strings
+ aux
.vna_name
);
4758 printf (_(" %#06x: Name index: %lx"),
4759 isum
, aux
.vna_name
);
4761 printf (_(" Flags: %s Version: %d\n"),
4762 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
4764 isum
+= aux
.vna_next
;
4765 vstart
+= aux
.vna_next
;
4775 case SHT_GNU_versym
:
4777 Elf32_Internal_Shdr
* link_section
;
4780 unsigned char * edata
;
4781 unsigned short * data
;
4783 Elf_Internal_Sym
* symbols
;
4784 Elf32_Internal_Shdr
* string_sec
;
4786 link_section
= section_headers
+ section
->sh_link
;
4787 total
= section
->sh_size
/ section
->sh_entsize
;
4791 symbols
= GET_ELF_SYMBOLS (file
, link_section
->sh_offset
,
4792 link_section
->sh_size
/ link_section
->sh_entsize
);
4794 string_sec
= section_headers
+ link_section
->sh_link
;
4796 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
4797 string_sec
->sh_size
,
4798 _("version string table"));
4802 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4803 SECTION_NAME (section
), total
);
4805 printf (_(" Addr: "));
4806 printf_vma (section
->sh_addr
);
4807 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4808 (unsigned long) section
->sh_offset
, section
->sh_link
,
4809 SECTION_NAME (link_section
));
4813 get_data (NULL
, file
,
4814 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
4815 total
* sizeof (short), _("version symbol data")));
4822 data
= (unsigned short *) malloc (total
* sizeof (short));
4824 for (cnt
= total
; cnt
--;)
4825 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
4830 for (cnt
= 0; cnt
< total
; cnt
+= 4)
4833 int check_def
, check_need
;
4836 printf (" %03x:", cnt
);
4838 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
4839 switch (data
[cnt
+ j
])
4842 fputs (_(" 0 (*local*) "), stdout
);
4846 fputs (_(" 1 (*global*) "), stdout
);
4850 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
4851 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
4855 if (symbols
[cnt
+ j
].st_shndx
>= SHN_LORESERVE
4856 || section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
4859 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
4866 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
4868 Elf_Internal_Verneed ivn
;
4869 unsigned long offset
;
4871 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
4876 Elf_Internal_Vernaux ivna
;
4877 Elf_External_Verneed evn
;
4878 Elf_External_Vernaux evna
;
4879 unsigned long a_off
;
4881 get_data (&evn
, file
, offset
, sizeof (evn
),
4884 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4885 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4887 a_off
= offset
+ ivn
.vn_aux
;
4891 get_data (&evna
, file
, a_off
, sizeof (evna
),
4892 _("version need aux (2)"));
4894 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4895 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4897 a_off
+= ivna
.vna_next
;
4899 while (ivna
.vna_other
!= data
[cnt
+ j
]
4900 && ivna
.vna_next
!= 0);
4902 if (ivna
.vna_other
== data
[cnt
+ j
])
4904 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4906 name
= strtab
+ ivna
.vna_name
;
4907 nn
+= printf ("(%s%-*s",
4909 12 - (int) strlen (name
),
4915 offset
+= ivn
.vn_next
;
4917 while (ivn
.vn_next
);
4920 if (check_def
&& data
[cnt
+ j
] != 0x8001
4921 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
4923 Elf_Internal_Verdef ivd
;
4924 Elf_External_Verdef evd
;
4925 unsigned long offset
;
4927 offset
= version_info
4928 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
4932 get_data (&evd
, file
, offset
, sizeof (evd
),
4935 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
4936 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
4938 offset
+= ivd
.vd_next
;
4940 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
4941 && ivd
.vd_next
!= 0);
4943 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
4945 Elf_External_Verdaux evda
;
4946 Elf_Internal_Verdaux ivda
;
4948 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
4950 get_data (&evda
, file
,
4951 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
4952 sizeof (evda
), _("version def aux"));
4954 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
4956 name
= strtab
+ ivda
.vda_name
;
4957 nn
+= printf ("(%s%-*s",
4959 12 - (int) strlen (name
),
4965 printf ("%*c", 18 - nn
, ' ');
4983 printf (_("\nNo version information found in this file.\n"));
4989 get_symbol_binding (binding
)
4990 unsigned int binding
;
4992 static char buff
[32];
4996 case STB_LOCAL
: return "LOCAL";
4997 case STB_GLOBAL
: return "GLOBAL";
4998 case STB_WEAK
: return "WEAK";
5000 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5001 sprintf (buff
, _("<processor specific>: %d"), binding
);
5002 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5003 sprintf (buff
, _("<OS specific>: %d"), binding
);
5005 sprintf (buff
, _("<unknown>: %d"), binding
);
5011 get_symbol_type (type
)
5014 static char buff
[32];
5018 case STT_NOTYPE
: return "NOTYPE";
5019 case STT_OBJECT
: return "OBJECT";
5020 case STT_FUNC
: return "FUNC";
5021 case STT_SECTION
: return "SECTION";
5022 case STT_FILE
: return "FILE";
5023 case STT_COMMON
: return "COMMON";
5025 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5027 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5028 return "THUMB_FUNC";
5030 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5033 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5034 return "PARISC_MILLI";
5036 sprintf (buff
, _("<processor specific>: %d"), type
);
5038 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5040 if (elf_header
.e_machine
== EM_PARISC
)
5042 if (type
== STT_HP_OPAQUE
)
5044 if (type
== STT_HP_STUB
)
5048 sprintf (buff
, _("<OS specific>: %d"), type
);
5051 sprintf (buff
, _("<unknown>: %d"), type
);
5057 get_symbol_visibility (visibility
)
5058 unsigned int visibility
;
5062 case STV_DEFAULT
: return "DEFAULT";
5063 case STV_INTERNAL
: return "INTERNAL";
5064 case STV_HIDDEN
: return "HIDDEN";
5065 case STV_PROTECTED
: return "PROTECTED";
5071 get_symbol_index_type (type
)
5076 case SHN_UNDEF
: return "UND";
5077 case SHN_ABS
: return "ABS";
5078 case SHN_COMMON
: return "COM";
5080 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5082 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5084 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5088 static char buff
[32];
5090 sprintf (buff
, "%3d", type
);
5097 get_dynamic_data (file
, number
)
5099 unsigned int number
;
5101 unsigned char * e_data
;
5104 e_data
= (unsigned char *) malloc (number
* 4);
5108 error (_("Out of memory\n"));
5112 if (fread (e_data
, 4, number
, file
) != number
)
5114 error (_("Unable to read in dynamic data\n"));
5118 i_data
= (int *) malloc (number
* sizeof (* i_data
));
5122 error (_("Out of memory\n"));
5128 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5135 /* Dump the symbol table. */
5137 process_symbol_table (file
)
5140 Elf32_Internal_Shdr
* section
;
5141 unsigned char nb
[4];
5142 unsigned char nc
[4];
5145 int * buckets
= NULL
;
5146 int * chains
= NULL
;
5148 if (! do_syms
&& !do_histogram
)
5151 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5154 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
5156 error (_("Unable to seek to start of dynamic information"));
5160 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5162 error (_("Failed to read in number of buckets\n"));
5166 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5168 error (_("Failed to read in number of chains\n"));
5172 nbuckets
= byte_get (nb
, 4);
5173 nchains
= byte_get (nc
, 4);
5175 buckets
= get_dynamic_data (file
, nbuckets
);
5176 chains
= get_dynamic_data (file
, nchains
);
5178 if (buckets
== NULL
|| chains
== NULL
)
5183 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5188 printf (_("\nSymbol table for image:\n"));
5190 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5192 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5194 for (hn
= 0; hn
< nbuckets
; hn
++)
5199 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5201 Elf_Internal_Sym
* psym
;
5203 psym
= dynamic_symbols
+ si
;
5205 printf (" %3d %3d: ", si
, hn
);
5206 print_vma (psym
->st_value
, LONG_HEX
);
5208 print_vma (psym
->st_size
, DEC_5
);
5210 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5211 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5212 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5213 printf (" %3.3s", get_symbol_index_type (psym
->st_shndx
));
5214 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
5218 else if (do_syms
&& !do_using_dynamic
)
5222 for (i
= 0, section
= section_headers
;
5223 i
< elf_header
.e_shnum
;
5228 Elf_Internal_Sym
* symtab
;
5229 Elf_Internal_Sym
* psym
;
5232 if ( section
->sh_type
!= SHT_SYMTAB
5233 && section
->sh_type
!= SHT_DYNSYM
)
5236 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5237 SECTION_NAME (section
),
5238 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5240 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5242 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5244 symtab
= GET_ELF_SYMBOLS (file
, section
->sh_offset
,
5245 section
->sh_size
/ section
->sh_entsize
);
5249 if (section
->sh_link
== elf_header
.e_shstrndx
)
5250 strtab
= string_table
;
5253 Elf32_Internal_Shdr
* string_sec
;
5255 string_sec
= section_headers
+ section
->sh_link
;
5257 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5258 string_sec
->sh_size
,
5262 for (si
= 0, psym
= symtab
;
5263 si
< section
->sh_size
/ section
->sh_entsize
;
5266 printf ("%6d: ", si
);
5267 print_vma (psym
->st_value
, LONG_HEX
);
5269 print_vma (psym
->st_size
, DEC_5
);
5270 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5271 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5272 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5273 printf (" %4s", get_symbol_index_type (psym
->st_shndx
));
5274 printf (" %s", strtab
+ psym
->st_name
);
5276 if (section
->sh_type
== SHT_DYNSYM
&&
5277 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5279 unsigned char data
[2];
5280 unsigned short vers_data
;
5281 unsigned long offset
;
5285 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5288 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5289 sizeof (data
), _("version data"));
5291 vers_data
= byte_get (data
, 2);
5293 is_nobits
= psym
->st_shndx
< SHN_LORESERVE
?
5294 (section_headers
[psym
->st_shndx
].sh_type
== SHT_NOBITS
)
5297 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5299 if ((vers_data
& 0x8000) || vers_data
> 1)
5301 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5302 && (is_nobits
|| ! check_def
))
5304 Elf_External_Verneed evn
;
5305 Elf_Internal_Verneed ivn
;
5306 Elf_Internal_Vernaux ivna
;
5308 /* We must test both. */
5309 offset
= version_info
5310 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
5314 unsigned long vna_off
;
5316 get_data (&evn
, file
, offset
, sizeof (evn
),
5319 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5320 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5322 vna_off
= offset
+ ivn
.vn_aux
;
5326 Elf_External_Vernaux evna
;
5328 get_data (&evna
, file
, vna_off
,
5330 _("version need aux (3)"));
5332 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5333 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5334 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5336 vna_off
+= ivna
.vna_next
;
5338 while (ivna
.vna_other
!= vers_data
5339 && ivna
.vna_next
!= 0);
5341 if (ivna
.vna_other
== vers_data
)
5344 offset
+= ivn
.vn_next
;
5346 while (ivn
.vn_next
!= 0);
5348 if (ivna
.vna_other
== vers_data
)
5351 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5354 else if (! is_nobits
)
5355 error (_("bad dynamic symbol"));
5362 if (vers_data
!= 0x8001
5363 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5365 Elf_Internal_Verdef ivd
;
5366 Elf_Internal_Verdaux ivda
;
5367 Elf_External_Verdaux evda
;
5368 unsigned long offset
;
5371 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5376 Elf_External_Verdef evd
;
5378 get_data (&evd
, file
, offset
, sizeof (evd
),
5381 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5382 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5383 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5385 offset
+= ivd
.vd_next
;
5387 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5388 && ivd
.vd_next
!= 0);
5390 offset
-= ivd
.vd_next
;
5391 offset
+= ivd
.vd_aux
;
5393 get_data (&evda
, file
, offset
, sizeof (evda
),
5394 _("version def aux"));
5396 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5398 if (psym
->st_name
!= ivda
.vda_name
)
5399 printf ((vers_data
& 0x8000)
5401 strtab
+ ivda
.vda_name
);
5411 if (strtab
!= string_table
)
5417 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5419 if (do_histogram
&& buckets
!= NULL
)
5426 int nzero_counts
= 0;
5429 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5431 printf (_(" Length Number %% of total Coverage\n"));
5433 lengths
= (int *) calloc (nbuckets
, sizeof (int));
5434 if (lengths
== NULL
)
5436 error (_("Out of memory"));
5439 for (hn
= 0; hn
< nbuckets
; ++hn
)
5444 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5447 if (maxlength
< ++lengths
[hn
])
5452 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
5455 error (_("Out of memory"));
5459 for (hn
= 0; hn
< nbuckets
; ++hn
)
5460 ++ counts
[lengths
[hn
]];
5464 printf (" 0 %-10d (%5.1f%%)\n",
5465 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5466 for (si
= 1; si
<= maxlength
; ++si
)
5468 nzero_counts
+= counts
[si
] * si
;
5469 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5470 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5471 (nzero_counts
* 100.0) / nsyms
);
5479 if (buckets
!= NULL
)
5489 process_syminfo (file
)
5490 FILE * file ATTRIBUTE_UNUSED
;
5494 if (dynamic_syminfo
== NULL
5496 /* No syminfo, this is ok. */
5499 /* There better should be a dynamic symbol section. */
5500 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5504 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5505 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5507 printf (_(" Num: Name BoundTo Flags\n"));
5508 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5510 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5512 printf ("%4d: %-30s ", i
,
5513 dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5515 switch (dynamic_syminfo
[i
].si_boundto
)
5517 case SYMINFO_BT_SELF
:
5518 fputs ("SELF ", stdout
);
5520 case SYMINFO_BT_PARENT
:
5521 fputs ("PARENT ", stdout
);
5524 if (dynamic_syminfo
[i
].si_boundto
> 0
5525 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
5528 + dynamic_segment
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
5530 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
5534 if (flags
& SYMINFO_FLG_DIRECT
)
5536 if (flags
& SYMINFO_FLG_PASSTHRU
)
5537 printf (" PASSTHRU");
5538 if (flags
& SYMINFO_FLG_COPY
)
5540 if (flags
& SYMINFO_FLG_LAZYLOAD
)
5541 printf (" LAZYLOAD");
5549 #ifdef SUPPORT_DISASSEMBLY
5551 disassemble_section (section
, file
)
5552 Elf32_Internal_Shdr
* section
;
5555 printf (_("\nAssembly dump of section %s\n"),
5556 SECTION_NAME (section
));
5558 /* XXX -- to be done --- XXX */
5565 dump_section (section
, file
)
5566 Elf32_Internal_Shdr
* section
;
5569 bfd_size_type bytes
;
5571 unsigned char * data
;
5572 unsigned char * start
;
5574 bytes
= section
->sh_size
;
5578 printf (_("\nSection '%s' has no data to dump.\n"),
5579 SECTION_NAME (section
));
5583 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
5585 addr
= section
->sh_addr
;
5587 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
5600 lbytes
= (bytes
> 16 ? 16 : bytes
);
5602 printf (" 0x%8.8lx ", (unsigned long) addr
);
5604 switch (elf_header
.e_ident
[EI_DATA
])
5608 for (j
= 15; j
>= 0; j
--)
5611 printf ("%2.2x", data
[j
]);
5621 for (j
= 0; j
< 16; j
++)
5624 printf ("%2.2x", data
[j
]);
5634 for (j
= 0; j
< lbytes
; j
++)
5637 if (k
>= ' ' && k
< 0x80)
5656 static unsigned long int
5657 read_leb128 (data
, length_return
, sign
)
5658 unsigned char * data
;
5659 int * length_return
;
5662 unsigned long int result
= 0;
5663 unsigned int num_read
= 0;
5672 result
|= (byte
& 0x7f) << shift
;
5677 while (byte
& 0x80);
5679 if (length_return
!= NULL
)
5680 * length_return
= num_read
;
5682 if (sign
&& (shift
< 32) && (byte
& 0x40))
5683 result
|= -1 << shift
;
5688 typedef struct State_Machine_Registers
5690 unsigned long address
;
5693 unsigned int column
;
5697 /* This variable hold the number of the last entry seen
5698 in the File Table. */
5699 unsigned int last_file_entry
;
5702 static SMR state_machine_regs
;
5705 reset_state_machine (is_stmt
)
5708 state_machine_regs
.address
= 0;
5709 state_machine_regs
.file
= 1;
5710 state_machine_regs
.line
= 1;
5711 state_machine_regs
.column
= 0;
5712 state_machine_regs
.is_stmt
= is_stmt
;
5713 state_machine_regs
.basic_block
= 0;
5714 state_machine_regs
.end_sequence
= 0;
5715 state_machine_regs
.last_file_entry
= 0;
5718 /* Handled an extend line op. Returns true if this is the end
5721 process_extended_line_op (data
, is_stmt
, pointer_size
)
5722 unsigned char * data
;
5726 unsigned char op_code
;
5729 unsigned char * name
;
5732 len
= read_leb128 (data
, & bytes_read
, 0);
5737 warn (_("badly formed extended line op encountered!\n"));
5742 op_code
= * data
++;
5744 printf (_(" Extended opcode %d: "), op_code
);
5748 case DW_LNE_end_sequence
:
5749 printf (_("End of Sequence\n\n"));
5750 reset_state_machine (is_stmt
);
5753 case DW_LNE_set_address
:
5754 adr
= byte_get (data
, pointer_size
);
5755 printf (_("set Address to 0x%lx\n"), adr
);
5756 state_machine_regs
.address
= adr
;
5759 case DW_LNE_define_file
:
5760 printf (_(" define new File Table entry\n"));
5761 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5763 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5765 data
+= strlen ((char *) data
) + 1;
5766 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5768 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5770 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5771 printf (_("%s\n\n"), name
);
5775 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
5782 /* Size of pointers in the .debug_line section. This information is not
5783 really present in that section. It's obtained before dumping the debug
5784 sections by doing some pre-scan of the .debug_info section. */
5785 static int debug_line_pointer_size
= 4;
5788 display_debug_lines (section
, start
, file
)
5789 Elf32_Internal_Shdr
* section
;
5790 unsigned char * start
;
5791 FILE * file ATTRIBUTE_UNUSED
;
5793 DWARF2_External_LineInfo
* external
;
5794 DWARF2_Internal_LineInfo info
;
5795 unsigned char * standard_opcodes
;
5796 unsigned char * data
= start
;
5797 unsigned char * end
= start
+ section
->sh_size
;
5798 unsigned char * end_of_sequence
;
5801 printf (_("\nDump of debug contents of section %s:\n\n"),
5802 SECTION_NAME (section
));
5806 external
= (DWARF2_External_LineInfo
*) data
;
5808 /* Check the length of the block. */
5809 info
.li_length
= BYTE_GET (external
->li_length
);
5811 if (info
.li_length
== 0xffffffff)
5813 warn (_("64-bit DWARF line info is not supported yet.\n"));
5817 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
5820 (_("The line info appears to be corrupt - the section is too small\n"));
5824 /* Check its version number. */
5825 info
.li_version
= BYTE_GET (external
->li_version
);
5826 if (info
.li_version
!= 2)
5828 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5832 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
5833 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
5834 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
5835 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
5836 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
5837 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
5839 /* Sign extend the line base field. */
5840 info
.li_line_base
<<= 24;
5841 info
.li_line_base
>>= 24;
5843 printf (_(" Length: %ld\n"), info
.li_length
);
5844 printf (_(" DWARF Version: %d\n"), info
.li_version
);
5845 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
5846 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
5847 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
5848 printf (_(" Line Base: %d\n"), info
.li_line_base
);
5849 printf (_(" Line Range: %d\n"), info
.li_line_range
);
5850 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
5852 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
5854 reset_state_machine (info
.li_default_is_stmt
);
5856 /* Display the contents of the Opcodes table. */
5857 standard_opcodes
= data
+ sizeof (* external
);
5859 printf (_("\n Opcodes:\n"));
5861 for (i
= 1; i
< info
.li_opcode_base
; i
++)
5862 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
5864 /* Display the contents of the Directory table. */
5865 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
5868 printf (_("\n The Directory Table is empty.\n"));
5871 printf (_("\n The Directory Table:\n"));
5875 printf (_(" %s\n"), data
);
5877 data
+= strlen ((char *) data
) + 1;
5881 /* Skip the NUL at the end of the table. */
5884 /* Display the contents of the File Name table. */
5886 printf (_("\n The File Name Table is empty.\n"));
5889 printf (_("\n The File Name Table:\n"));
5890 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5894 unsigned char * name
;
5897 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5900 data
+= strlen ((char *) data
) + 1;
5902 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5904 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5906 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5908 printf (_("%s\n"), name
);
5912 /* Skip the NUL at the end of the table. */
5915 /* Now display the statements. */
5916 printf (_("\n Line Number Statements:\n"));
5919 while (data
< end_of_sequence
)
5921 unsigned char op_code
;
5925 op_code
= * data
++;
5927 if (op_code
>= info
.li_opcode_base
)
5929 op_code
-= info
.li_opcode_base
;
5930 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
5931 state_machine_regs
.address
+= adv
;
5932 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5933 op_code
, adv
, state_machine_regs
.address
);
5934 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
5935 state_machine_regs
.line
+= adv
;
5936 printf (_(" and Line by %d to %d\n"),
5937 adv
, state_machine_regs
.line
);
5939 else switch (op_code
)
5941 case DW_LNS_extended_op
:
5942 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
5943 debug_line_pointer_size
);
5947 printf (_(" Copy\n"));
5950 case DW_LNS_advance_pc
:
5951 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
5953 state_machine_regs
.address
+= adv
;
5954 printf (_(" Advance PC by %d to %lx\n"), adv
,
5955 state_machine_regs
.address
);
5958 case DW_LNS_advance_line
:
5959 adv
= read_leb128 (data
, & bytes_read
, 1);
5961 state_machine_regs
.line
+= adv
;
5962 printf (_(" Advance Line by %d to %d\n"), adv
,
5963 state_machine_regs
.line
);
5966 case DW_LNS_set_file
:
5967 adv
= read_leb128 (data
, & bytes_read
, 0);
5969 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5971 state_machine_regs
.file
= adv
;
5974 case DW_LNS_set_column
:
5975 adv
= read_leb128 (data
, & bytes_read
, 0);
5977 printf (_(" Set column to %d\n"), adv
);
5978 state_machine_regs
.column
= adv
;
5981 case DW_LNS_negate_stmt
:
5982 adv
= state_machine_regs
.is_stmt
;
5984 printf (_(" Set is_stmt to %d\n"), adv
);
5985 state_machine_regs
.is_stmt
= adv
;
5988 case DW_LNS_set_basic_block
:
5989 printf (_(" Set basic block\n"));
5990 state_machine_regs
.basic_block
= 1;
5993 case DW_LNS_const_add_pc
:
5994 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
5995 * info
.li_min_insn_length
);
5996 state_machine_regs
.address
+= adv
;
5997 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
5998 state_machine_regs
.address
);
6001 case DW_LNS_fixed_advance_pc
:
6002 adv
= byte_get (data
, 2);
6004 state_machine_regs
.address
+= adv
;
6005 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6006 adv
, state_machine_regs
.address
);
6009 case DW_LNS_set_prologue_end
:
6010 printf (_(" Set prologue_end to true\n"));
6013 case DW_LNS_set_epilogue_begin
:
6014 printf (_(" Set epilogue_begin to true\n"));
6017 case DW_LNS_set_isa
:
6018 adv
= read_leb128 (data
, & bytes_read
, 0);
6020 printf (_(" Set ISA to %d\n"), adv
);
6024 printf (_(" Unknown opcode %d with operands: "), op_code
);
6027 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6029 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6030 i
== 1 ? "" : ", ");
6045 display_debug_pubnames (section
, start
, file
)
6046 Elf32_Internal_Shdr
* section
;
6047 unsigned char * start
;
6048 FILE * file ATTRIBUTE_UNUSED
;
6050 DWARF2_External_PubNames
* external
;
6051 DWARF2_Internal_PubNames pubnames
;
6052 unsigned char * end
;
6054 end
= start
+ section
->sh_size
;
6056 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6060 unsigned char * data
;
6061 unsigned long offset
;
6063 external
= (DWARF2_External_PubNames
*) start
;
6065 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
6066 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
6067 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
6068 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
6070 data
= start
+ sizeof (* external
);
6071 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
6073 if (pubnames
.pn_length
== 0xffffffff)
6075 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6079 if (pubnames
.pn_version
!= 2)
6081 static int warned
= 0;
6085 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6092 printf (_(" Length: %ld\n"),
6093 pubnames
.pn_length
);
6094 printf (_(" Version: %d\n"),
6095 pubnames
.pn_version
);
6096 printf (_(" Offset into .debug_info section: %ld\n"),
6097 pubnames
.pn_offset
);
6098 printf (_(" Size of area in .debug_info section: %ld\n"),
6101 printf (_("\n Offset\tName\n"));
6105 offset
= byte_get (data
, 4);
6110 printf (" %ld\t\t%s\n", offset
, data
);
6111 data
+= strlen ((char *) data
) + 1;
6114 while (offset
!= 0);
6127 case DW_TAG_padding
: return "DW_TAG_padding";
6128 case DW_TAG_array_type
: return "DW_TAG_array_type";
6129 case DW_TAG_class_type
: return "DW_TAG_class_type";
6130 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6131 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6132 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6133 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6134 case DW_TAG_label
: return "DW_TAG_label";
6135 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6136 case DW_TAG_member
: return "DW_TAG_member";
6137 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6138 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6139 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6140 case DW_TAG_string_type
: return "DW_TAG_string_type";
6141 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6142 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6143 case DW_TAG_typedef
: return "DW_TAG_typedef";
6144 case DW_TAG_union_type
: return "DW_TAG_union_type";
6145 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6146 case DW_TAG_variant
: return "DW_TAG_variant";
6147 case DW_TAG_common_block
: return "DW_TAG_common_block";
6148 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6149 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6150 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6151 case DW_TAG_module
: return "DW_TAG_module";
6152 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6153 case DW_TAG_set_type
: return "DW_TAG_set_type";
6154 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6155 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6156 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6157 case DW_TAG_base_type
: return "DW_TAG_base_type";
6158 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6159 case DW_TAG_const_type
: return "DW_TAG_const_type";
6160 case DW_TAG_constant
: return "DW_TAG_constant";
6161 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6162 case DW_TAG_file_type
: return "DW_TAG_file_type";
6163 case DW_TAG_friend
: return "DW_TAG_friend";
6164 case DW_TAG_namelist
: return "DW_TAG_namelist";
6165 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6166 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6167 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6168 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6169 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6170 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6171 case DW_TAG_try_block
: return "DW_TAG_try_block";
6172 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6173 case DW_TAG_variable
: return "DW_TAG_variable";
6174 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6175 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6176 case DW_TAG_format_label
: return "DW_TAG_format_label";
6177 case DW_TAG_function_template
: return "DW_TAG_function_template";
6178 case DW_TAG_class_template
: return "DW_TAG_class_template";
6179 /* DWARF 2.1 values. */
6180 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6181 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6182 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6183 case DW_TAG_namespace
: return "DW_TAG_namespace";
6184 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6185 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6186 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6187 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6190 static char buffer
[100];
6192 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6199 get_AT_name (attribute
)
6200 unsigned long attribute
;
6204 case DW_AT_sibling
: return "DW_AT_sibling";
6205 case DW_AT_location
: return "DW_AT_location";
6206 case DW_AT_name
: return "DW_AT_name";
6207 case DW_AT_ordering
: return "DW_AT_ordering";
6208 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6209 case DW_AT_byte_size
: return "DW_AT_byte_size";
6210 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6211 case DW_AT_bit_size
: return "DW_AT_bit_size";
6212 case DW_AT_element_list
: return "DW_AT_element_list";
6213 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6214 case DW_AT_low_pc
: return "DW_AT_low_pc";
6215 case DW_AT_high_pc
: return "DW_AT_high_pc";
6216 case DW_AT_language
: return "DW_AT_language";
6217 case DW_AT_member
: return "DW_AT_member";
6218 case DW_AT_discr
: return "DW_AT_discr";
6219 case DW_AT_discr_value
: return "DW_AT_discr_value";
6220 case DW_AT_visibility
: return "DW_AT_visibility";
6221 case DW_AT_import
: return "DW_AT_import";
6222 case DW_AT_string_length
: return "DW_AT_string_length";
6223 case DW_AT_common_reference
: return "DW_AT_common_reference";
6224 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6225 case DW_AT_const_value
: return "DW_AT_const_value";
6226 case DW_AT_containing_type
: return "DW_AT_containing_type";
6227 case DW_AT_default_value
: return "DW_AT_default_value";
6228 case DW_AT_inline
: return "DW_AT_inline";
6229 case DW_AT_is_optional
: return "DW_AT_is_optional";
6230 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6231 case DW_AT_producer
: return "DW_AT_producer";
6232 case DW_AT_prototyped
: return "DW_AT_prototyped";
6233 case DW_AT_return_addr
: return "DW_AT_return_addr";
6234 case DW_AT_start_scope
: return "DW_AT_start_scope";
6235 case DW_AT_stride_size
: return "DW_AT_stride_size";
6236 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6237 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6238 case DW_AT_accessibility
: return "DW_AT_accessibility";
6239 case DW_AT_address_class
: return "DW_AT_address_class";
6240 case DW_AT_artificial
: return "DW_AT_artificial";
6241 case DW_AT_base_types
: return "DW_AT_base_types";
6242 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6243 case DW_AT_count
: return "DW_AT_count";
6244 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6245 case DW_AT_decl_column
: return "DW_AT_decl_column";
6246 case DW_AT_decl_file
: return "DW_AT_decl_file";
6247 case DW_AT_decl_line
: return "DW_AT_decl_line";
6248 case DW_AT_declaration
: return "DW_AT_declaration";
6249 case DW_AT_discr_list
: return "DW_AT_discr_list";
6250 case DW_AT_encoding
: return "DW_AT_encoding";
6251 case DW_AT_external
: return "DW_AT_external";
6252 case DW_AT_frame_base
: return "DW_AT_frame_base";
6253 case DW_AT_friend
: return "DW_AT_friend";
6254 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6255 case DW_AT_macro_info
: return "DW_AT_macro_info";
6256 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6257 case DW_AT_priority
: return "DW_AT_priority";
6258 case DW_AT_segment
: return "DW_AT_segment";
6259 case DW_AT_specification
: return "DW_AT_specification";
6260 case DW_AT_static_link
: return "DW_AT_static_link";
6261 case DW_AT_type
: return "DW_AT_type";
6262 case DW_AT_use_location
: return "DW_AT_use_location";
6263 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6264 case DW_AT_virtuality
: return "DW_AT_virtuality";
6265 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6266 /* DWARF 2.1 values. */
6267 case DW_AT_allocated
: return "DW_AT_allocated";
6268 case DW_AT_associated
: return "DW_AT_associated";
6269 case DW_AT_data_location
: return "DW_AT_data_location";
6270 case DW_AT_stride
: return "DW_AT_stride";
6271 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6272 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6273 case DW_AT_extension
: return "DW_AT_extension";
6274 case DW_AT_ranges
: return "DW_AT_ranges";
6275 case DW_AT_trampoline
: return "DW_AT_trampoline";
6276 case DW_AT_call_column
: return "DW_AT_call_column";
6277 case DW_AT_call_file
: return "DW_AT_call_file";
6278 case DW_AT_call_line
: return "DW_AT_call_line";
6279 /* SGI/MIPS extensions. */
6280 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6281 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6282 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6283 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6284 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6285 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
6286 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6287 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6288 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6289 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6290 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6291 /* GNU extensions. */
6292 case DW_AT_sf_names
: return "DW_AT_sf_names";
6293 case DW_AT_src_info
: return "DW_AT_src_info";
6294 case DW_AT_mac_info
: return "DW_AT_mac_info";
6295 case DW_AT_src_coords
: return "DW_AT_src_coords";
6296 case DW_AT_body_begin
: return "DW_AT_body_begin";
6297 case DW_AT_body_end
: return "DW_AT_body_end";
6300 static char buffer
[100];
6302 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6309 get_FORM_name (form
)
6314 case DW_FORM_addr
: return "DW_FORM_addr";
6315 case DW_FORM_block2
: return "DW_FORM_block2";
6316 case DW_FORM_block4
: return "DW_FORM_block4";
6317 case DW_FORM_data2
: return "DW_FORM_data2";
6318 case DW_FORM_data4
: return "DW_FORM_data4";
6319 case DW_FORM_data8
: return "DW_FORM_data8";
6320 case DW_FORM_string
: return "DW_FORM_string";
6321 case DW_FORM_block
: return "DW_FORM_block";
6322 case DW_FORM_block1
: return "DW_FORM_block1";
6323 case DW_FORM_data1
: return "DW_FORM_data1";
6324 case DW_FORM_flag
: return "DW_FORM_flag";
6325 case DW_FORM_sdata
: return "DW_FORM_sdata";
6326 case DW_FORM_strp
: return "DW_FORM_strp";
6327 case DW_FORM_udata
: return "DW_FORM_udata";
6328 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6329 case DW_FORM_ref1
: return "DW_FORM_ref1";
6330 case DW_FORM_ref2
: return "DW_FORM_ref2";
6331 case DW_FORM_ref4
: return "DW_FORM_ref4";
6332 case DW_FORM_ref8
: return "DW_FORM_ref8";
6333 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6334 case DW_FORM_indirect
: return "DW_FORM_indirect";
6337 static char buffer
[100];
6339 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6345 /* FIXME: There are better and more effiecint ways to handle
6346 these structures. For now though, I just want something that
6347 is simple to implement. */
6348 typedef struct abbrev_attr
6350 unsigned long attribute
;
6352 struct abbrev_attr
* next
;
6356 typedef struct abbrev_entry
6358 unsigned long entry
;
6361 struct abbrev_attr
* first_attr
;
6362 struct abbrev_attr
* last_attr
;
6363 struct abbrev_entry
* next
;
6367 static abbrev_entry
* first_abbrev
= NULL
;
6368 static abbrev_entry
* last_abbrev
= NULL
;
6371 free_abbrevs
PARAMS ((void))
6373 abbrev_entry
* abbrev
;
6375 for (abbrev
= first_abbrev
; abbrev
;)
6377 abbrev_entry
* next
= abbrev
->next
;
6380 for (attr
= abbrev
->first_attr
; attr
;)
6382 abbrev_attr
* next
= attr
->next
;
6392 last_abbrev
= first_abbrev
= NULL
;
6396 add_abbrev (number
, tag
, children
)
6397 unsigned long number
;
6401 abbrev_entry
* entry
;
6403 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
6409 entry
->entry
= number
;
6411 entry
->children
= children
;
6412 entry
->first_attr
= NULL
;
6413 entry
->last_attr
= NULL
;
6416 if (first_abbrev
== NULL
)
6417 first_abbrev
= entry
;
6419 last_abbrev
->next
= entry
;
6421 last_abbrev
= entry
;
6425 add_abbrev_attr (attribute
, form
)
6426 unsigned long attribute
;
6431 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
6437 attr
->attribute
= attribute
;
6441 if (last_abbrev
->first_attr
== NULL
)
6442 last_abbrev
->first_attr
= attr
;
6444 last_abbrev
->last_attr
->next
= attr
;
6446 last_abbrev
->last_attr
= attr
;
6449 /* Processes the (partial) contents of a .debug_abbrev section.
6450 Returns NULL if the end of the section was encountered.
6451 Returns the address after the last byte read if the end of
6452 an abbreviation set was found. */
6454 static unsigned char *
6455 process_abbrev_section (start
, end
)
6456 unsigned char * start
;
6457 unsigned char * end
;
6459 if (first_abbrev
!= NULL
)
6465 unsigned long entry
;
6467 unsigned long attribute
;
6470 entry
= read_leb128 (start
, & bytes_read
, 0);
6471 start
+= bytes_read
;
6473 /* A single zero is supposed to end the section according
6474 to the standard. If there's more, then signal that to
6477 return start
== end
? NULL
: start
;
6479 tag
= read_leb128 (start
, & bytes_read
, 0);
6480 start
+= bytes_read
;
6482 children
= * start
++;
6484 add_abbrev (entry
, tag
, children
);
6490 attribute
= read_leb128 (start
, & bytes_read
, 0);
6491 start
+= bytes_read
;
6493 form
= read_leb128 (start
, & bytes_read
, 0);
6494 start
+= bytes_read
;
6497 add_abbrev_attr (attribute
, form
);
6499 while (attribute
!= 0);
6507 display_debug_macinfo (section
, start
, file
)
6508 Elf32_Internal_Shdr
* section
;
6509 unsigned char * start
;
6510 FILE * file ATTRIBUTE_UNUSED
;
6512 unsigned char * end
= start
+ section
->sh_size
;
6513 unsigned char * curr
= start
;
6514 unsigned int bytes_read
;
6515 enum dwarf_macinfo_record_type op
;
6517 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6521 unsigned int lineno
;
6522 const char * string
;
6529 case DW_MACINFO_start_file
:
6531 unsigned int filenum
;
6533 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6535 filenum
= read_leb128 (curr
, & bytes_read
, 0);
6538 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
6542 case DW_MACINFO_end_file
:
6543 printf (_(" DW_MACINFO_end_file\n"));
6546 case DW_MACINFO_define
:
6547 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6550 curr
+= strlen (string
) + 1;
6551 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
6554 case DW_MACINFO_undef
:
6555 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6558 curr
+= strlen (string
) + 1;
6559 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
6562 case DW_MACINFO_vendor_ext
:
6564 unsigned int constant
;
6566 constant
= read_leb128 (curr
, & bytes_read
, 0);
6569 curr
+= strlen (string
) + 1;
6570 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
6581 display_debug_abbrev (section
, start
, file
)
6582 Elf32_Internal_Shdr
* section
;
6583 unsigned char * start
;
6584 FILE * file ATTRIBUTE_UNUSED
;
6586 abbrev_entry
* entry
;
6587 unsigned char * end
= start
+ section
->sh_size
;
6589 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6593 start
= process_abbrev_section (start
, end
);
6595 if (first_abbrev
== NULL
)
6598 printf (_(" Number TAG\n"));
6600 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
6604 printf (_(" %ld %s [%s]\n"),
6606 get_TAG_name (entry
->tag
),
6607 entry
->children
? _("has children") : _("no children"));
6609 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6611 printf (_(" %-18s %s\n"),
6612 get_AT_name (attr
->attribute
),
6613 get_FORM_name (attr
->form
));
6627 static unsigned char *
6628 display_block (data
, length
)
6629 unsigned char * data
;
6630 unsigned long length
;
6632 printf (_(" %lu byte block: "), length
);
6635 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
6641 decode_location_expression (data
, pointer_size
, length
)
6642 unsigned char * data
;
6643 unsigned int pointer_size
;
6644 unsigned long length
;
6648 unsigned long uvalue
;
6649 unsigned char * end
= data
+ length
;
6658 printf ("DW_OP_addr: %lx",
6659 (unsigned long) byte_get (data
, pointer_size
));
6660 data
+= pointer_size
;
6663 printf ("DW_OP_deref");
6666 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
6669 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
6672 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
6676 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
6680 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
6684 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
6688 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
6689 (unsigned long) byte_get (data
+ 4, 4));
6693 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
6694 (long) byte_get (data
+ 4, 4));
6698 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
6702 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
6706 printf ("DW_OP_dup");
6709 printf ("DW_OP_drop");
6712 printf ("DW_OP_over");
6715 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
6718 printf ("DW_OP_swap");
6721 printf ("DW_OP_rot");
6724 printf ("DW_OP_xderef");
6727 printf ("DW_OP_abs");
6730 printf ("DW_OP_and");
6733 printf ("DW_OP_div");
6736 printf ("DW_OP_minus");
6739 printf ("DW_OP_mod");
6742 printf ("DW_OP_mul");
6745 printf ("DW_OP_neg");
6748 printf ("DW_OP_not");
6751 printf ("DW_OP_or");
6754 printf ("DW_OP_plus");
6756 case DW_OP_plus_uconst
:
6757 printf ("DW_OP_plus_uconst: %lu",
6758 read_leb128 (data
, &bytes_read
, 0));
6762 printf ("DW_OP_shl");
6765 printf ("DW_OP_shr");
6768 printf ("DW_OP_shra");
6771 printf ("DW_OP_xor");
6774 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
6778 printf ("DW_OP_eq");
6781 printf ("DW_OP_ge");
6784 printf ("DW_OP_gt");
6787 printf ("DW_OP_le");
6790 printf ("DW_OP_lt");
6793 printf ("DW_OP_ne");
6796 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
6832 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
6867 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
6902 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
6903 read_leb128 (data
, &bytes_read
, 1));
6908 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
6912 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
6916 uvalue
= read_leb128 (data
, &bytes_read
, 0);
6918 printf ("DW_OP_bregx: %lu %ld", uvalue
,
6919 read_leb128 (data
, &bytes_read
, 1));
6923 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
6926 case DW_OP_deref_size
:
6927 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
6929 case DW_OP_xderef_size
:
6930 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
6933 printf ("DW_OP_nop");
6936 /* DWARF 2.1 extensions. */
6937 case DW_OP_push_object_address
:
6938 printf ("DW_OP_push_object_address");
6941 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
6945 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
6949 printf ("DW_OP_calli");
6953 if (op
>= DW_OP_lo_user
6954 && op
<= DW_OP_hi_user
)
6955 printf (_("(User defined location op)"));
6957 printf (_("(Unknown location op)"));
6958 /* No way to tell where the next op is, so just bail. */
6962 /* Separate the ops. */
6968 static const char * debug_str_contents
;
6969 static bfd_vma debug_str_size
;
6972 load_debug_str (file
)
6975 Elf32_Internal_Shdr
* sec
;
6978 /* If it is already loaded, do nothing. */
6979 if (debug_str_contents
!= NULL
)
6982 /* Locate the .debug_str section. */
6983 for (i
= 0, sec
= section_headers
;
6984 i
< elf_header
.e_shnum
;
6986 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
6989 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
6992 debug_str_size
= sec
->sh_size
;
6994 debug_str_contents
= ((char *)
6995 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
6996 _("debug_str section data")));
7002 if (debug_str_contents
== NULL
)
7005 free ((char *) debug_str_contents
);
7006 debug_str_contents
= NULL
;
7011 fetch_indirect_string (offset
)
7012 unsigned long offset
;
7014 if (debug_str_contents
== NULL
)
7015 return _("<no .debug_str section>");
7017 if (offset
> debug_str_size
)
7018 return _("<offset is too big>");
7020 return debug_str_contents
+ offset
;
7025 display_debug_str (section
, start
, file
)
7026 Elf32_Internal_Shdr
* section
;
7027 unsigned char * start
;
7028 FILE * file ATTRIBUTE_UNUSED
;
7030 unsigned long bytes
;
7033 addr
= section
->sh_addr
;
7034 bytes
= section
->sh_size
;
7038 printf (_("\nThe .debug_str section is empty.\n"));
7042 printf (_("Contents of the .debug_str section:\n\n"));
7050 lbytes
= (bytes
> 16 ? 16 : bytes
);
7052 printf (" 0x%8.8lx ", (unsigned long) addr
);
7054 for (j
= 0; j
< 16; j
++)
7057 printf ("%2.2x", start
[j
]);
7065 for (j
= 0; j
< lbytes
; j
++)
7068 if (k
>= ' ' && k
< 0x80)
7085 static unsigned char *
7086 read_and_display_attr_value (attribute
, form
, data
, cu_offset
, pointer_size
)
7087 unsigned long attribute
;
7089 unsigned char * data
;
7090 unsigned long cu_offset
;
7091 unsigned long pointer_size
;
7093 unsigned long uvalue
= 0;
7094 unsigned char * block_start
= NULL
;
7102 case DW_FORM_ref_addr
:
7104 uvalue
= byte_get (data
, pointer_size
);
7105 data
+= pointer_size
;
7109 uvalue
= byte_get (data
, /* offset_size */ 4);
7110 data
+= /* offset_size */ 4;
7116 uvalue
= byte_get (data
++, 1);
7121 uvalue
= byte_get (data
, 2);
7127 uvalue
= byte_get (data
, 4);
7132 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7136 case DW_FORM_ref_udata
:
7138 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7142 case DW_FORM_indirect
:
7143 form
= read_leb128 (data
, & bytes_read
, 0);
7145 printf (" %s", get_FORM_name (form
));
7146 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7152 case DW_FORM_ref_addr
:
7153 printf (" <#%lx>", uvalue
);
7159 case DW_FORM_ref_udata
:
7160 printf (" <%lx>", uvalue
+ cu_offset
);
7164 printf (" %#lx", uvalue
);
7172 printf (" %ld", uvalue
);
7177 uvalue
= byte_get (data
, 4);
7178 printf (" %lx", uvalue
);
7179 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7183 case DW_FORM_string
:
7184 printf (" %s", data
);
7185 data
+= strlen ((char *) data
) + 1;
7189 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7190 block_start
= data
+ bytes_read
;
7191 data
= display_block (block_start
, uvalue
);
7194 case DW_FORM_block1
:
7195 uvalue
= byte_get (data
, 1);
7196 block_start
= data
+ 1;
7197 data
= display_block (block_start
, uvalue
);
7200 case DW_FORM_block2
:
7201 uvalue
= byte_get (data
, 2);
7202 block_start
= data
+ 2;
7203 data
= display_block (block_start
, uvalue
);
7206 case DW_FORM_block4
:
7207 uvalue
= byte_get (data
, 4);
7208 block_start
= data
+ 4;
7209 data
= display_block (block_start
, uvalue
);
7213 printf (_(" (indirect string, offset: 0x%lx): "), uvalue
);
7214 printf (fetch_indirect_string (uvalue
));
7217 case DW_FORM_indirect
:
7218 /* Handled above. */
7222 warn (_("Unrecognised form: %d\n"), form
);
7226 /* For some attributes we can display futher information. */
7235 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
7236 case DW_INL_inlined
: printf (_("(inlined)")); break;
7237 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
7238 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
7239 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
7243 case DW_AT_language
:
7246 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7247 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7248 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7249 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7250 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7251 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7252 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7253 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7254 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7255 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7256 /* DWARF 2.1 values. */
7257 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7258 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7259 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7260 /* MIPS extension. */
7261 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7262 default: printf ("(Unknown: %lx)", uvalue
); break;
7266 case DW_AT_encoding
:
7269 case DW_ATE_void
: printf ("(void)"); break;
7270 case DW_ATE_address
: printf ("(machine address)"); break;
7271 case DW_ATE_boolean
: printf ("(boolean)"); break;
7272 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7273 case DW_ATE_float
: printf ("(float)"); break;
7274 case DW_ATE_signed
: printf ("(signed)"); break;
7275 case DW_ATE_signed_char
: printf ("(signed char)"); break;
7276 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
7277 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
7278 /* DWARF 2.1 value. */
7279 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
7281 if (uvalue
>= DW_ATE_lo_user
7282 && uvalue
<= DW_ATE_hi_user
)
7283 printf ("(user defined type)");
7285 printf ("(unknown type)");
7290 case DW_AT_accessibility
:
7293 case DW_ACCESS_public
: printf ("(public)"); break;
7294 case DW_ACCESS_protected
: printf ("(protected)"); break;
7295 case DW_ACCESS_private
: printf ("(private)"); break;
7296 default: printf ("(unknown accessibility)"); break;
7300 case DW_AT_visibility
:
7303 case DW_VIS_local
: printf ("(local)"); break;
7304 case DW_VIS_exported
: printf ("(exported)"); break;
7305 case DW_VIS_qualified
: printf ("(qualified)"); break;
7306 default: printf ("(unknown visibility)"); break;
7310 case DW_AT_virtuality
:
7313 case DW_VIRTUALITY_none
: printf ("(none)"); break;
7314 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
7315 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
7316 default: printf ("(unknown virtuality)"); break;
7320 case DW_AT_identifier_case
:
7323 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
7324 case DW_ID_up_case
: printf ("(up_case)"); break;
7325 case DW_ID_down_case
: printf ("(down_case)"); break;
7326 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
7327 default: printf ("(unknown case)"); break;
7331 case DW_AT_calling_convention
:
7334 case DW_CC_normal
: printf ("(normal)"); break;
7335 case DW_CC_program
: printf ("(program)"); break;
7336 case DW_CC_nocall
: printf ("(nocall)"); break;
7338 if (uvalue
>= DW_CC_lo_user
7339 && uvalue
<= DW_CC_hi_user
)
7340 printf ("(user defined)");
7342 printf ("(unknown convention)");
7346 case DW_AT_ordering
:
7349 case -1: printf ("(undefined)"); break;
7350 case 0: printf ("(row major)"); break;
7351 case 1: printf ("(column major)"); break;
7355 case DW_AT_frame_base
:
7356 case DW_AT_location
:
7357 case DW_AT_data_member_location
:
7358 case DW_AT_vtable_elem_location
:
7359 case DW_AT_allocated
:
7360 case DW_AT_associated
:
7361 case DW_AT_data_location
:
7363 case DW_AT_upper_bound
:
7364 case DW_AT_lower_bound
:
7368 decode_location_expression (block_start
, pointer_size
, uvalue
);
7380 static unsigned char *
7381 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
7382 unsigned long attribute
;
7384 unsigned char * data
;
7385 unsigned long cu_offset
;
7386 unsigned long pointer_size
;
7388 printf (" %-18s:", get_AT_name (attribute
));
7389 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7396 display_debug_info (section
, start
, file
)
7397 Elf32_Internal_Shdr
* section
;
7398 unsigned char * start
;
7401 unsigned char * end
= start
+ section
->sh_size
;
7402 unsigned char * section_begin
= start
;
7404 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7406 load_debug_str (file
);
7410 DWARF2_External_CompUnit
* external
;
7411 DWARF2_Internal_CompUnit compunit
;
7412 Elf32_Internal_Shdr
* relsec
;
7413 unsigned char * tags
;
7416 unsigned long cu_offset
;
7418 external
= (DWARF2_External_CompUnit
*) start
;
7420 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
7421 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
7422 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
7423 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
7425 if (compunit
.cu_length
== 0xffffffff)
7427 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7431 /* Check for RELA relocations in the abbrev_offset address, and
7433 for (relsec
= section_headers
;
7434 relsec
< section_headers
+ elf_header
.e_shnum
;
7437 unsigned long nrelas
, nsyms
;
7438 Elf_Internal_Rela
*rela
, *rp
;
7439 Elf32_Internal_Shdr
*symsec
;
7440 Elf_Internal_Sym
*symtab
;
7441 Elf_Internal_Sym
*sym
;
7443 if (relsec
->sh_type
!= SHT_RELA
7444 || section_headers
+ relsec
->sh_info
!= section
)
7447 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7451 symsec
= section_headers
+ relsec
->sh_link
;
7452 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
7453 symtab
= GET_ELF_SYMBOLS (file
, symsec
->sh_offset
, nsyms
);
7455 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7458 != (bfd_vma
) ((unsigned char *) &external
->cu_abbrev_offset
7464 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7466 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7468 warn (_("Skipping unexpected symbol type %u\n"),
7469 ELF32_ST_TYPE (sym
->st_info
));
7475 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7477 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7479 warn (_("Skipping unexpected symbol type %u\n"),
7480 ELF64_ST_TYPE (sym
->st_info
));
7485 compunit
.cu_abbrev_offset
+= rp
->r_addend
;
7493 tags
= start
+ sizeof (* external
);
7494 cu_offset
= start
- section_begin
;
7495 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
7497 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
7498 printf (_(" Length: %ld\n"), compunit
.cu_length
);
7499 printf (_(" Version: %d\n"), compunit
.cu_version
);
7500 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
7501 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
7503 if (compunit
.cu_version
!= 2)
7505 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7511 /* Read in the abbrevs used by this compilation unit. */
7514 Elf32_Internal_Shdr
* sec
;
7515 unsigned char * begin
;
7517 /* Locate the .debug_abbrev section and process it. */
7518 for (i
= 0, sec
= section_headers
;
7519 i
< elf_header
.e_shnum
;
7521 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
7524 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7526 warn (_("Unable to locate .debug_abbrev section!\n"));
7530 begin
= ((unsigned char *)
7531 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7532 _("debug_abbrev section data")));
7536 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
7537 begin
+ sec
->sh_size
);
7543 while (tags
< start
)
7546 unsigned long abbrev_number
;
7547 abbrev_entry
* entry
;
7550 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
7553 /* A null DIE marks the end of a list of children. */
7554 if (abbrev_number
== 0)
7560 /* Scan through the abbreviation list until we reach the
7562 for (entry
= first_abbrev
;
7563 entry
&& entry
->entry
!= abbrev_number
;
7564 entry
= entry
->next
)
7569 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7574 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7576 (unsigned long) (tags
- section_begin
- bytes_read
),
7578 get_TAG_name (entry
->tag
));
7580 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7581 tags
= read_and_display_attr (attr
->attribute
,
7584 compunit
.cu_pointer_size
);
7586 if (entry
->children
)
7599 display_debug_aranges (section
, start
, file
)
7600 Elf32_Internal_Shdr
* section
;
7601 unsigned char * start
;
7602 FILE * file ATTRIBUTE_UNUSED
;
7604 unsigned char * end
= start
+ section
->sh_size
;
7606 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7610 DWARF2_External_ARange
* external
;
7611 DWARF2_Internal_ARange arange
;
7612 unsigned char * ranges
;
7613 unsigned long length
;
7614 unsigned long address
;
7617 external
= (DWARF2_External_ARange
*) start
;
7619 arange
.ar_length
= BYTE_GET (external
->ar_length
);
7620 arange
.ar_version
= BYTE_GET (external
->ar_version
);
7621 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
7622 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
7623 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
7625 if (arange
.ar_length
== 0xffffffff)
7627 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7631 if (arange
.ar_version
!= 2)
7633 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7637 printf (_(" Length: %ld\n"), arange
.ar_length
);
7638 printf (_(" Version: %d\n"), arange
.ar_version
);
7639 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
7640 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
7641 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
7643 printf (_("\n Address Length\n"));
7645 ranges
= start
+ sizeof (* external
);
7647 /* Must pad to an alignment boundary that is twice the pointer size. */
7648 excess
= sizeof (* external
) % (2 * arange
.ar_pointer_size
);
7650 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
7654 address
= byte_get (ranges
, arange
.ar_pointer_size
);
7656 ranges
+= arange
.ar_pointer_size
;
7658 length
= byte_get (ranges
, arange
.ar_pointer_size
);
7660 ranges
+= arange
.ar_pointer_size
;
7662 /* A pair of zeros marks the end of the list. */
7663 if (address
== 0 && length
== 0)
7666 printf (" %8.8lx %lu\n", address
, length
);
7669 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
7677 typedef struct Frame_Chunk
7679 struct Frame_Chunk
* next
;
7680 unsigned char * chunk_start
;
7682 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7683 short int * col_type
;
7685 char * augmentation
;
7686 unsigned int code_factor
;
7688 unsigned long pc_begin
;
7689 unsigned long pc_range
;
7693 unsigned char fde_encoding
;
7697 /* A marker for a col_type that means this column was never referenced
7698 in the frame info. */
7699 #define DW_CFA_unreferenced (-1)
7701 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
7702 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
7703 static int size_of_encoded_value
PARAMS ((int));
7706 frame_need_space (fc
, reg
)
7710 int prev
= fc
->ncols
;
7712 if (reg
< fc
->ncols
)
7715 fc
->ncols
= reg
+ 1;
7716 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
7717 fc
->ncols
* sizeof (short int));
7718 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
7719 fc
->ncols
* sizeof (int));
7721 while (prev
< fc
->ncols
)
7723 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
7724 fc
->col_offset
[prev
] = 0;
7730 frame_display_row (fc
, need_col_headers
, max_regs
)
7732 int * need_col_headers
;
7738 if (* max_regs
< fc
->ncols
)
7739 * max_regs
= fc
->ncols
;
7741 if (* need_col_headers
)
7743 * need_col_headers
= 0;
7745 printf (" LOC CFA ");
7747 for (r
= 0; r
< * max_regs
; r
++)
7748 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7753 printf ("r%-4d", r
);
7759 printf ("%08lx ", fc
->pc_begin
);
7760 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
7761 printf ("%-8s ", tmp
);
7763 for (r
= 0; r
< fc
->ncols
; r
++)
7765 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7767 switch (fc
->col_type
[r
])
7769 case DW_CFA_undefined
:
7772 case DW_CFA_same_value
:
7776 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
7778 case DW_CFA_register
:
7779 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
7782 strcpy (tmp
, "n/a");
7785 printf ("%-5s", tmp
);
7792 size_of_encoded_value (encoding
)
7795 switch (encoding
& 0x7)
7798 case 0: return is_32bit_elf
? 4 : 8;
7805 #define GET(N) byte_get (start, N); start += N
7806 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7807 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7810 display_debug_frames (section
, start
, file
)
7811 Elf32_Internal_Shdr
* section
;
7812 unsigned char * start
;
7813 FILE * file ATTRIBUTE_UNUSED
;
7815 unsigned char * end
= start
+ section
->sh_size
;
7816 unsigned char * section_start
= start
;
7817 Frame_Chunk
* chunks
= 0;
7818 Frame_Chunk
* remembered_state
= 0;
7820 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
7823 int addr_size
= is_32bit_elf
? 4 : 8;
7825 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
7829 unsigned char * saved_start
;
7830 unsigned char * block_end
;
7831 unsigned long length
;
7832 unsigned long cie_id
;
7835 int need_col_headers
= 1;
7836 unsigned char * augmentation_data
= NULL
;
7837 unsigned long augmentation_data_len
= 0;
7838 int encoded_ptr_size
= addr_size
;
7840 saved_start
= start
;
7841 length
= byte_get (start
, 4); start
+= 4;
7846 if (length
== 0xffffffff)
7848 warn (_("64-bit DWARF format frames are not supported yet.\n"));
7852 block_end
= saved_start
+ length
+ 4;
7853 cie_id
= byte_get (start
, 4); start
+= 4;
7855 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
7859 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
7860 memset (fc
, 0, sizeof (Frame_Chunk
));
7864 fc
->chunk_start
= saved_start
;
7866 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7867 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7868 frame_need_space (fc
, max_regs
-1);
7872 fc
->augmentation
= start
;
7873 start
= strchr (start
, '\0') + 1;
7875 if (fc
->augmentation
[0] == 'z')
7877 fc
->code_factor
= LEB ();
7878 fc
->data_factor
= SLEB ();
7879 fc
->ra
= byte_get (start
, 1); start
+= 1;
7880 augmentation_data_len
= LEB ();
7881 augmentation_data
= start
;
7882 start
+= augmentation_data_len
;
7884 else if (strcmp (fc
->augmentation
, "eh") == 0)
7887 fc
->code_factor
= LEB ();
7888 fc
->data_factor
= SLEB ();
7889 fc
->ra
= byte_get (start
, 1); start
+= 1;
7893 fc
->code_factor
= LEB ();
7894 fc
->data_factor
= SLEB ();
7895 fc
->ra
= byte_get (start
, 1); start
+= 1;
7899 if (do_debug_frames_interp
)
7900 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7901 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
7902 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
7906 printf ("\n%08lx %08lx %08lx CIE\n",
7907 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
7908 printf (" Version: %d\n", version
);
7909 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
7910 printf (" Code alignment factor: %u\n", fc
->code_factor
);
7911 printf (" Data alignment factor: %d\n", fc
->data_factor
);
7912 printf (" Return address column: %d\n", fc
->ra
);
7914 if (augmentation_data_len
)
7917 printf (" Augmentation data: ");
7918 for (i
= 0; i
< augmentation_data_len
; ++i
)
7919 printf (" %02x", augmentation_data
[i
]);
7925 if (augmentation_data_len
)
7927 unsigned char *p
, *q
;
7928 p
= fc
->augmentation
+ 1;
7929 q
= augmentation_data
;
7936 q
+= 1 + size_of_encoded_value (*q
);
7938 fc
->fde_encoding
= *q
++;
7944 if (fc
->fde_encoding
)
7945 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
7948 frame_need_space (fc
, fc
->ra
);
7952 unsigned char * look_for
;
7953 static Frame_Chunk fde_fc
;
7956 memset (fc
, 0, sizeof (Frame_Chunk
));
7958 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
7960 for (cie
= chunks
; cie
; cie
= cie
->next
)
7961 if (cie
->chunk_start
== look_for
)
7966 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7967 cie_id
, saved_start
);
7970 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7971 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7972 frame_need_space (fc
, max_regs
- 1);
7974 fc
->augmentation
= "";
7975 fc
->fde_encoding
= 0;
7979 fc
->ncols
= cie
->ncols
;
7980 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
7981 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
7982 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
7983 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
7984 fc
->augmentation
= cie
->augmentation
;
7985 fc
->code_factor
= cie
->code_factor
;
7986 fc
->data_factor
= cie
->data_factor
;
7987 fc
->cfa_reg
= cie
->cfa_reg
;
7988 fc
->cfa_offset
= cie
->cfa_offset
;
7990 frame_need_space (fc
, max_regs
-1);
7991 fc
->fde_encoding
= cie
->fde_encoding
;
7994 if (fc
->fde_encoding
)
7995 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
7997 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
7998 start
+= encoded_ptr_size
;
7999 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8000 start
+= encoded_ptr_size
;
8002 if (cie
->augmentation
[0] == 'z')
8004 augmentation_data_len
= LEB ();
8005 augmentation_data
= start
;
8006 start
+= augmentation_data_len
;
8009 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8010 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8011 (unsigned long)(cie
->chunk_start
- section_start
),
8012 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8013 if (! do_debug_frames_interp
&& augmentation_data_len
)
8016 printf (" Augmentation data: ");
8017 for (i
= 0; i
< augmentation_data_len
; ++i
)
8018 printf (" %02x", augmentation_data
[i
]);
8024 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8025 about to interpret instructions for the chunk. */
8027 if (do_debug_frames_interp
)
8029 /* Start by making a pass over the chunk, allocating storage
8030 and taking note of what registers are used. */
8031 unsigned char * tmp
= start
;
8033 while (start
< block_end
)
8043 /* Warning: if you add any more cases to this switch, be
8044 sure to add them to the corresponding switch below. */
8047 case DW_CFA_advance_loc
:
8051 frame_need_space (fc
, opa
);
8052 fc
->col_type
[opa
] = DW_CFA_undefined
;
8054 case DW_CFA_restore
:
8055 frame_need_space (fc
, opa
);
8056 fc
->col_type
[opa
] = DW_CFA_undefined
;
8058 case DW_CFA_set_loc
:
8059 start
+= encoded_ptr_size
;
8061 case DW_CFA_advance_loc1
:
8064 case DW_CFA_advance_loc2
:
8067 case DW_CFA_advance_loc4
:
8070 case DW_CFA_offset_extended
:
8071 reg
= LEB (); LEB ();
8072 frame_need_space (fc
, reg
);
8073 fc
->col_type
[reg
] = DW_CFA_undefined
;
8075 case DW_CFA_restore_extended
:
8077 frame_need_space (fc
, reg
);
8078 fc
->col_type
[reg
] = DW_CFA_undefined
;
8080 case DW_CFA_undefined
:
8082 frame_need_space (fc
, reg
);
8083 fc
->col_type
[reg
] = DW_CFA_undefined
;
8085 case DW_CFA_same_value
:
8087 frame_need_space (fc
, reg
);
8088 fc
->col_type
[reg
] = DW_CFA_undefined
;
8090 case DW_CFA_register
:
8091 reg
= LEB (); LEB ();
8092 frame_need_space (fc
, reg
);
8093 fc
->col_type
[reg
] = DW_CFA_undefined
;
8095 case DW_CFA_def_cfa
:
8098 case DW_CFA_def_cfa_register
:
8101 case DW_CFA_def_cfa_offset
:
8104 #ifndef DW_CFA_GNU_args_size
8105 #define DW_CFA_GNU_args_size 0x2e
8107 case DW_CFA_GNU_args_size
:
8110 #ifndef DW_CFA_GNU_negative_offset_extended
8111 #define DW_CFA_GNU_negative_offset_extended 0x2f
8113 case DW_CFA_GNU_negative_offset_extended
:
8114 reg
= LEB (); LEB ();
8115 frame_need_space (fc
, reg
);
8116 fc
->col_type
[reg
] = DW_CFA_undefined
;
8125 /* Now we know what registers are used, make a second pass over
8126 the chunk, this time actually printing out the info. */
8128 while (start
< block_end
)
8131 unsigned long ul
, reg
, roffs
;
8140 /* Warning: if you add any more cases to this switch, be
8141 sure to add them to the corresponding switch above. */
8144 case DW_CFA_advance_loc
:
8145 if (do_debug_frames_interp
)
8146 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8148 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8149 opa
* fc
->code_factor
,
8150 fc
->pc_begin
+ opa
* fc
->code_factor
);
8151 fc
->pc_begin
+= opa
* fc
->code_factor
;
8156 if (! do_debug_frames_interp
)
8157 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8158 opa
, roffs
* fc
->data_factor
);
8159 fc
->col_type
[opa
] = DW_CFA_offset
;
8160 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8163 case DW_CFA_restore
:
8164 if (! do_debug_frames_interp
)
8165 printf (" DW_CFA_restore: r%d\n", opa
);
8166 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8167 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8170 case DW_CFA_set_loc
:
8171 vma
= byte_get (start
, encoded_ptr_size
);
8172 start
+= encoded_ptr_size
;
8173 if (do_debug_frames_interp
)
8174 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8176 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8180 case DW_CFA_advance_loc1
:
8181 ofs
= byte_get (start
, 1); start
+= 1;
8182 if (do_debug_frames_interp
)
8183 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8185 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8186 ofs
* fc
->code_factor
,
8187 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8188 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8191 case DW_CFA_advance_loc2
:
8192 ofs
= byte_get (start
, 2); start
+= 2;
8193 if (do_debug_frames_interp
)
8194 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8196 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8197 ofs
* fc
->code_factor
,
8198 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8199 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8202 case DW_CFA_advance_loc4
:
8203 ofs
= byte_get (start
, 4); start
+= 4;
8204 if (do_debug_frames_interp
)
8205 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8207 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8208 ofs
* fc
->code_factor
,
8209 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8210 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8213 case DW_CFA_offset_extended
:
8216 if (! do_debug_frames_interp
)
8217 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8218 reg
, roffs
* fc
->data_factor
);
8219 fc
->col_type
[reg
] = DW_CFA_offset
;
8220 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8223 case DW_CFA_restore_extended
:
8225 if (! do_debug_frames_interp
)
8226 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8227 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8228 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8231 case DW_CFA_undefined
:
8233 if (! do_debug_frames_interp
)
8234 printf (" DW_CFA_undefined: r%ld\n", reg
);
8235 fc
->col_type
[reg
] = DW_CFA_undefined
;
8236 fc
->col_offset
[reg
] = 0;
8239 case DW_CFA_same_value
:
8241 if (! do_debug_frames_interp
)
8242 printf (" DW_CFA_same_value: r%ld\n", reg
);
8243 fc
->col_type
[reg
] = DW_CFA_same_value
;
8244 fc
->col_offset
[reg
] = 0;
8247 case DW_CFA_register
:
8250 if (! do_debug_frames_interp
)
8251 printf (" DW_CFA_register: r%ld\n", reg
);
8252 fc
->col_type
[reg
] = DW_CFA_register
;
8253 fc
->col_offset
[reg
] = roffs
;
8256 case DW_CFA_remember_state
:
8257 if (! do_debug_frames_interp
)
8258 printf (" DW_CFA_remember_state\n");
8259 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8260 rs
->ncols
= fc
->ncols
;
8261 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
8262 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
8263 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
8264 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
8265 rs
->next
= remembered_state
;
8266 remembered_state
= rs
;
8269 case DW_CFA_restore_state
:
8270 if (! do_debug_frames_interp
)
8271 printf (" DW_CFA_restore_state\n");
8272 rs
= remembered_state
;
8273 remembered_state
= rs
->next
;
8274 frame_need_space (fc
, rs
->ncols
-1);
8275 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
8276 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
8277 free (rs
->col_type
);
8278 free (rs
->col_offset
);
8282 case DW_CFA_def_cfa
:
8283 fc
->cfa_reg
= LEB ();
8284 fc
->cfa_offset
= LEB ();
8285 if (! do_debug_frames_interp
)
8286 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8287 fc
->cfa_reg
, fc
->cfa_offset
);
8290 case DW_CFA_def_cfa_register
:
8291 fc
->cfa_reg
= LEB ();
8292 if (! do_debug_frames_interp
)
8293 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
8296 case DW_CFA_def_cfa_offset
:
8297 fc
->cfa_offset
= LEB ();
8298 if (! do_debug_frames_interp
)
8299 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
8303 if (! do_debug_frames_interp
)
8304 printf (" DW_CFA_nop\n");
8307 #ifndef DW_CFA_GNU_window_save
8308 #define DW_CFA_GNU_window_save 0x2d
8310 case DW_CFA_GNU_window_save
:
8311 if (! do_debug_frames_interp
)
8312 printf (" DW_CFA_GNU_window_save\n");
8315 case DW_CFA_GNU_args_size
:
8317 if (! do_debug_frames_interp
)
8318 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
8321 case DW_CFA_GNU_negative_offset_extended
:
8324 frame_need_space (fc
, reg
);
8325 if (! do_debug_frames_interp
)
8326 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8327 reg
, l
* fc
->data_factor
);
8328 fc
->col_type
[reg
] = DW_CFA_offset
;
8329 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
8333 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
8338 if (do_debug_frames_interp
)
8339 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8354 display_debug_not_supported (section
, start
, file
)
8355 Elf32_Internal_Shdr
* section
;
8356 unsigned char * start ATTRIBUTE_UNUSED
;
8357 FILE * file ATTRIBUTE_UNUSED
;
8359 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8360 SECTION_NAME (section
));
8365 /* Pre-scan the .debug_info section to record the size of address.
8366 When dumping the .debug_line, we use that size information, assuming
8367 that all compilation units have the same address size. */
8369 prescan_debug_info (section
, start
, file
)
8370 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
8371 unsigned char * start
;
8372 FILE * file ATTRIBUTE_UNUSED
;
8374 DWARF2_External_CompUnit
* external
;
8376 external
= (DWARF2_External_CompUnit
*) start
;
8378 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
8382 /* A structure containing the name of a debug section and a pointer
8383 to a function that can decode it. The third field is a prescan
8384 function to be run over the section before displaying any of the
8388 const char * const name
;
8389 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8390 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8394 { ".debug_abbrev", display_debug_abbrev
, NULL
},
8395 { ".debug_aranges", display_debug_aranges
, NULL
},
8396 { ".debug_frame", display_debug_frames
, NULL
},
8397 { ".debug_info", display_debug_info
, prescan_debug_info
},
8398 { ".debug_line", display_debug_lines
, NULL
},
8399 { ".debug_pubnames", display_debug_pubnames
, NULL
},
8400 { ".eh_frame", display_debug_frames
, NULL
},
8401 { ".debug_macinfo", display_debug_macinfo
, NULL
},
8402 { ".debug_str", display_debug_str
, NULL
},
8404 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
8405 { ".debug_ranges", display_debug_not_supported
, NULL
},
8406 { ".debug_static_func", display_debug_not_supported
, NULL
},
8407 { ".debug_static_vars", display_debug_not_supported
, NULL
},
8408 { ".debug_types", display_debug_not_supported
, NULL
},
8409 { ".debug_weaknames", display_debug_not_supported
, NULL
}
8413 display_debug_section (section
, file
)
8414 Elf32_Internal_Shdr
* section
;
8417 char * name
= SECTION_NAME (section
);
8418 bfd_size_type length
;
8419 unsigned char * start
;
8422 length
= section
->sh_size
;
8425 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8429 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
8430 _("debug section data"));
8434 /* See if we know how to display the contents of this section. */
8435 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
8436 name
= ".debug_info";
8438 for (i
= NUM_ELEM (debug_displays
); i
--;)
8439 if (strcmp (debug_displays
[i
].name
, name
) == 0)
8441 debug_displays
[i
].display (section
, start
, file
);
8446 printf (_("Unrecognised debug section: %s\n"), name
);
8450 /* If we loaded in the abbrev section at some point,
8451 we must release it here. */
8458 process_section_contents (file
)
8461 Elf32_Internal_Shdr
* section
;
8467 /* Pre-scan the debug sections to find some debug information not
8468 present in some of them. For the .debug_line, we must find out the
8469 size of address (specified in .debug_info and .debug_aranges). */
8470 for (i
= 0, section
= section_headers
;
8471 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8474 char * name
= SECTION_NAME (section
);
8477 if (section
->sh_size
== 0)
8480 /* See if there is some pre-scan operation for this section. */
8481 for (j
= NUM_ELEM (debug_displays
); j
--;)
8482 if (strcmp (debug_displays
[j
].name
, name
) == 0)
8484 if (debug_displays
[j
].prescan
!= NULL
)
8486 bfd_size_type length
;
8487 unsigned char * start
;
8489 length
= section
->sh_size
;
8490 start
= ((unsigned char *)
8491 get_data (NULL
, file
, section
->sh_offset
, length
,
8492 _("debug section data")));
8496 debug_displays
[j
].prescan (section
, start
, file
);
8504 for (i
= 0, section
= section_headers
;
8505 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8508 #ifdef SUPPORT_DISASSEMBLY
8509 if (dump_sects
[i
] & DISASS_DUMP
)
8510 disassemble_section (section
, file
);
8512 if (dump_sects
[i
] & HEX_DUMP
)
8513 dump_section (section
, file
);
8515 if (dump_sects
[i
] & DEBUG_DUMP
)
8516 display_debug_section (section
, file
);
8519 if (i
< num_dump_sects
)
8520 warn (_("Some sections were not dumped because they do not exist!\n"));
8526 process_mips_fpe_exception (mask
)
8532 if (mask
& OEX_FPU_INEX
)
8533 fputs ("INEX", stdout
), first
= 0;
8534 if (mask
& OEX_FPU_UFLO
)
8535 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8536 if (mask
& OEX_FPU_OFLO
)
8537 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8538 if (mask
& OEX_FPU_DIV0
)
8539 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8540 if (mask
& OEX_FPU_INVAL
)
8541 printf ("%sINVAL", first
? "" : "|");
8544 fputs ("0", stdout
);
8548 process_mips_specific (file
)
8551 Elf_Internal_Dyn
* entry
;
8552 size_t liblist_offset
= 0;
8553 size_t liblistno
= 0;
8554 size_t conflictsno
= 0;
8555 size_t options_offset
= 0;
8556 size_t conflicts_offset
= 0;
8558 /* We have a lot of special sections. Thanks SGI! */
8559 if (dynamic_segment
== NULL
)
8560 /* No information available. */
8563 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
8564 switch (entry
->d_tag
)
8566 case DT_MIPS_LIBLIST
:
8567 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
8569 case DT_MIPS_LIBLISTNO
:
8570 liblistno
= entry
->d_un
.d_val
;
8572 case DT_MIPS_OPTIONS
:
8573 options_offset
= entry
->d_un
.d_val
- loadaddr
;
8575 case DT_MIPS_CONFLICT
:
8576 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
8578 case DT_MIPS_CONFLICTNO
:
8579 conflictsno
= entry
->d_un
.d_val
;
8585 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8587 Elf32_External_Lib
* elib
;
8590 elib
= ((Elf32_External_Lib
*)
8591 get_data (NULL
, file
, liblist_offset
,
8592 liblistno
* sizeof (Elf32_External_Lib
),
8596 printf ("\nSection '.liblist' contains %lu entries:\n",
8597 (unsigned long) liblistno
);
8598 fputs (" Library Time Stamp Checksum Version Flags\n",
8601 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8608 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8609 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8610 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8611 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8612 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8614 tmp
= gmtime (&time
);
8615 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
8616 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8617 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8619 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt
,
8620 dynamic_strings
+ liblist
.l_name
, timebuf
,
8621 liblist
.l_checksum
, liblist
.l_version
);
8623 if (liblist
.l_flags
== 0)
8634 { " EXACT_MATCH", LL_EXACT_MATCH
},
8635 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8636 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8637 { " EXPORTS", LL_EXPORTS
},
8638 { " DELAY_LOAD", LL_DELAY_LOAD
},
8639 { " DELTA", LL_DELTA
}
8641 int flags
= liblist
.l_flags
;
8645 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8647 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8649 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8650 flags
^= l_flags_vals
[fcnt
].bit
;
8653 printf (" %#x", (unsigned int) flags
);
8663 if (options_offset
!= 0)
8665 Elf_External_Options
* eopt
;
8666 Elf_Internal_Shdr
* sect
= section_headers
;
8667 Elf_Internal_Options
* iopt
;
8668 Elf_Internal_Options
* option
;
8672 /* Find the section header so that we get the size. */
8673 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8676 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
8677 sect
->sh_size
, _("options"));
8680 iopt
= ((Elf_Internal_Options
*)
8681 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (* iopt
)));
8684 error (_("Out of memory"));
8691 while (offset
< sect
->sh_size
)
8693 Elf_External_Options
* eoption
;
8695 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8697 option
->kind
= BYTE_GET (eoption
->kind
);
8698 option
->size
= BYTE_GET (eoption
->size
);
8699 option
->section
= BYTE_GET (eoption
->section
);
8700 option
->info
= BYTE_GET (eoption
->info
);
8702 offset
+= option
->size
;
8708 printf (_("\nSection '%s' contains %d entries:\n"),
8709 SECTION_NAME (sect
), cnt
);
8717 switch (option
->kind
)
8720 /* This shouldn't happen. */
8721 printf (" NULL %d %lx", option
->section
, option
->info
);
8724 printf (" REGINFO ");
8725 if (elf_header
.e_machine
== EM_MIPS
)
8728 Elf32_External_RegInfo
* ereg
;
8729 Elf32_RegInfo reginfo
;
8731 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8732 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8733 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8734 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8735 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8736 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8737 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8739 printf ("GPR %08lx GP 0x%lx\n",
8741 (unsigned long) reginfo
.ri_gp_value
);
8742 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8743 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8744 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8749 Elf64_External_RegInfo
* ereg
;
8750 Elf64_Internal_RegInfo reginfo
;
8752 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8753 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8754 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8755 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8756 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8757 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8758 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
8760 printf ("GPR %08lx GP 0x",
8761 reginfo
.ri_gprmask
);
8762 printf_vma (reginfo
.ri_gp_value
);
8765 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8766 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8767 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8771 case ODK_EXCEPTIONS
:
8772 fputs (" EXCEPTIONS fpe_min(", stdout
);
8773 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8774 fputs (") fpe_max(", stdout
);
8775 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8776 fputs (")", stdout
);
8778 if (option
->info
& OEX_PAGE0
)
8779 fputs (" PAGE0", stdout
);
8780 if (option
->info
& OEX_SMM
)
8781 fputs (" SMM", stdout
);
8782 if (option
->info
& OEX_FPDBUG
)
8783 fputs (" FPDBUG", stdout
);
8784 if (option
->info
& OEX_DISMISS
)
8785 fputs (" DISMISS", stdout
);
8788 fputs (" PAD ", stdout
);
8789 if (option
->info
& OPAD_PREFIX
)
8790 fputs (" PREFIX", stdout
);
8791 if (option
->info
& OPAD_POSTFIX
)
8792 fputs (" POSTFIX", stdout
);
8793 if (option
->info
& OPAD_SYMBOL
)
8794 fputs (" SYMBOL", stdout
);
8797 fputs (" HWPATCH ", stdout
);
8798 if (option
->info
& OHW_R4KEOP
)
8799 fputs (" R4KEOP", stdout
);
8800 if (option
->info
& OHW_R8KPFETCH
)
8801 fputs (" R8KPFETCH", stdout
);
8802 if (option
->info
& OHW_R5KEOP
)
8803 fputs (" R5KEOP", stdout
);
8804 if (option
->info
& OHW_R5KCVTL
)
8805 fputs (" R5KCVTL", stdout
);
8808 fputs (" FILL ", stdout
);
8809 /* XXX Print content of info word? */
8812 fputs (" TAGS ", stdout
);
8813 /* XXX Print content of info word? */
8816 fputs (" HWAND ", stdout
);
8817 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8818 fputs (" R4KEOP_CHECKED", stdout
);
8819 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8820 fputs (" R4KEOP_CLEAN", stdout
);
8823 fputs (" HWOR ", stdout
);
8824 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8825 fputs (" R4KEOP_CHECKED", stdout
);
8826 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8827 fputs (" R4KEOP_CLEAN", stdout
);
8830 printf (" GP_GROUP %#06lx self-contained %#06lx",
8831 option
->info
& OGP_GROUP
,
8832 (option
->info
& OGP_SELF
) >> 16);
8835 printf (" IDENT %#06lx self-contained %#06lx",
8836 option
->info
& OGP_GROUP
,
8837 (option
->info
& OGP_SELF
) >> 16);
8840 /* This shouldn't happen. */
8841 printf (" %3d ??? %d %lx",
8842 option
->kind
, option
->section
, option
->info
);
8846 len
= sizeof (* eopt
);
8847 while (len
< option
->size
)
8848 if (((char *) option
)[len
] >= ' '
8849 && ((char *) option
)[len
] < 0x7f)
8850 printf ("%c", ((char *) option
)[len
++]);
8852 printf ("\\%03o", ((char *) option
)[len
++]);
8854 fputs ("\n", stdout
);
8862 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8864 Elf32_Conflict
* iconf
;
8867 if (dynamic_symbols
== NULL
)
8869 error (_("conflict list with without table"));
8873 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (* iconf
));
8876 error (_("Out of memory"));
8882 Elf32_External_Conflict
* econf32
;
8884 econf32
= ((Elf32_External_Conflict
*)
8885 get_data (NULL
, file
, conflicts_offset
,
8886 conflictsno
* sizeof (* econf32
),
8891 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8892 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8898 Elf64_External_Conflict
* econf64
;
8900 econf64
= ((Elf64_External_Conflict
*)
8901 get_data (NULL
, file
, conflicts_offset
,
8902 conflictsno
* sizeof (* econf64
),
8907 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8908 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8913 printf (_("\nSection '.conflict' contains %ld entries:\n"),
8914 (long) conflictsno
);
8915 puts (_(" Num: Index Value Name"));
8917 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8919 Elf_Internal_Sym
* psym
= &dynamic_symbols
[iconf
[cnt
]];
8921 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8922 print_vma (psym
->st_value
, FULL_HEX
);
8923 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
8933 get_note_type (e_type
)
8936 static char buff
[64];
8940 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
8941 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
8942 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
8943 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
8944 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
8945 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
8946 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
8947 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
8948 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8949 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8950 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8952 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
8957 /* Note that by the ELF standard, the name field is already null byte
8958 terminated, and namesz includes the terminating null byte.
8959 I.E. the value of namesz for the name "FSF" is 4.
8961 If the value of namesz is zero, there is no name present. */
8963 process_note (pnote
)
8964 Elf32_Internal_Note
* pnote
;
8966 printf (" %s\t\t0x%08lx\t%s\n",
8967 pnote
->namesz
? pnote
->namedata
: "(NONE)",
8968 pnote
->descsz
, get_note_type (pnote
->type
));
8974 process_corefile_note_segment (file
, offset
, length
)
8979 Elf_External_Note
* pnotes
;
8980 Elf_External_Note
* external
;
8986 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
8993 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8994 (unsigned long) offset
, (unsigned long) length
);
8995 printf (_(" Owner\t\tData size\tDescription\n"));
8997 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
8999 Elf32_Internal_Note inote
;
9002 inote
.type
= BYTE_GET (external
->type
);
9003 inote
.namesz
= BYTE_GET (external
->namesz
);
9004 inote
.namedata
= external
->name
;
9005 inote
.descsz
= BYTE_GET (external
->descsz
);
9006 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9007 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9009 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9011 /* Verify that name is null terminated. It appears that at least
9012 one version of Linux (RedHat 6.0) generates corefiles that don't
9013 comply with the ELF spec by failing to include the null byte in
9015 if (inote
.namedata
[inote
.namesz
] != '\0')
9017 temp
= malloc (inote
.namesz
+ 1);
9021 error (_("Out of memory\n"));
9026 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9027 temp
[inote
.namesz
] = 0;
9029 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9030 inote
.namedata
= temp
;
9033 res
&= process_note (& inote
);
9048 process_corefile_note_segments (file
)
9051 Elf_Internal_Phdr
* program_headers
;
9052 Elf_Internal_Phdr
* segment
;
9056 program_headers
= (Elf_Internal_Phdr
*) malloc
9057 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
9059 if (program_headers
== NULL
)
9061 error (_("Out of memory\n"));
9066 i
= get_32bit_program_headers (file
, program_headers
);
9068 i
= get_64bit_program_headers (file
, program_headers
);
9072 free (program_headers
);
9076 for (i
= 0, segment
= program_headers
;
9077 i
< elf_header
.e_phnum
;
9080 if (segment
->p_type
== PT_NOTE
)
9081 res
&= process_corefile_note_segment (file
,
9082 (bfd_vma
) segment
->p_offset
,
9083 (bfd_vma
) segment
->p_filesz
);
9086 free (program_headers
);
9092 process_corefile_contents (file
)
9095 /* If we have not been asked to display the notes then do nothing. */
9099 /* If file is not a core file then exit. */
9100 if (elf_header
.e_type
!= ET_CORE
)
9103 /* No program headers means no NOTE segment. */
9104 if (elf_header
.e_phnum
== 0)
9106 printf (_("No note segments present in the core file.\n"));
9110 return process_corefile_note_segments (file
);
9114 process_arch_specific (file
)
9120 switch (elf_header
.e_machine
)
9123 case EM_MIPS_RS3_LE
:
9124 return process_mips_specific (file
);
9133 get_file_header (file
)
9136 /* Read in the identity array. */
9137 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
9140 /* Determine how to read the rest of the header. */
9141 switch (elf_header
.e_ident
[EI_DATA
])
9143 default: /* fall through */
9144 case ELFDATANONE
: /* fall through */
9145 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
9146 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
9149 /* For now we only support 32 bit and 64 bit ELF files. */
9150 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
9152 /* Read in the rest of the header. */
9155 Elf32_External_Ehdr ehdr32
;
9157 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
9160 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
9161 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
9162 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
9163 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
9164 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
9165 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
9166 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
9167 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
9168 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
9169 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
9170 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
9171 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
9172 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
9176 Elf64_External_Ehdr ehdr64
;
9178 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9179 we will not be able to cope with the 64bit data found in
9180 64 ELF files. Detect this now and abort before we start
9181 overwritting things. */
9182 if (sizeof (bfd_vma
) < 8)
9184 error (_("This instance of readelf has been built without support for a\n\
9185 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9189 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
9192 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
9193 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
9194 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
9195 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
9196 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
9197 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
9198 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
9199 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
9200 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
9201 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
9202 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
9203 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
9204 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
9207 /* There may be some extensions in the first section header. Don't
9208 bomb if we can't read it. */
9210 get_32bit_section_headers (file
, 1);
9212 get_64bit_section_headers (file
, 1);
9218 process_file (file_name
)
9222 struct stat statbuf
;
9225 if (stat (file_name
, & statbuf
) < 0)
9227 error (_("Cannot stat input file %s.\n"), file_name
);
9231 file
= fopen (file_name
, "rb");
9234 error (_("Input file %s not found.\n"), file_name
);
9238 if (! get_file_header (file
))
9240 error (_("%s: Failed to read file header\n"), file_name
);
9245 /* Initialise per file variables. */
9246 for (i
= NUM_ELEM (version_info
); i
--;)
9247 version_info
[i
] = 0;
9249 for (i
= NUM_ELEM (dynamic_info
); i
--;)
9250 dynamic_info
[i
] = 0;
9252 /* Process the file. */
9254 printf (_("\nFile: %s\n"), file_name
);
9256 if (! process_file_header ())
9262 process_section_headers (file
);
9264 process_program_headers (file
);
9266 process_dynamic_segment (file
);
9268 process_relocs (file
);
9270 process_unwind (file
);
9272 process_symbol_table (file
);
9274 process_syminfo (file
);
9276 process_version_sections (file
);
9278 process_section_contents (file
);
9280 process_corefile_contents (file
);
9282 process_arch_specific (file
);
9286 if (section_headers
)
9288 free (section_headers
);
9289 section_headers
= NULL
;
9294 free (string_table
);
9295 string_table
= NULL
;
9296 string_table_length
= 0;
9299 if (dynamic_strings
)
9301 free (dynamic_strings
);
9302 dynamic_strings
= NULL
;
9305 if (dynamic_symbols
)
9307 free (dynamic_symbols
);
9308 dynamic_symbols
= NULL
;
9309 num_dynamic_syms
= 0;
9312 if (dynamic_syminfo
)
9314 free (dynamic_syminfo
);
9315 dynamic_syminfo
= NULL
;
9321 #ifdef SUPPORT_DISASSEMBLY
9322 /* Needed by the i386 disassembler. For extra credit, someone could
9323 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9327 print_address (unsigned int addr
, FILE * outfile
)
9329 fprintf (outfile
,"0x%8.8x", addr
);
9332 /* Needed by the i386 disassembler. */
9334 db_task_printsym (unsigned int addr
)
9336 print_address (addr
, stderr
);
9340 int main
PARAMS ((int, char **));
9349 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9350 setlocale (LC_MESSAGES
, "");
9352 #if defined (HAVE_SETLOCALE)
9353 setlocale (LC_CTYPE
, "");
9355 bindtextdomain (PACKAGE
, LOCALEDIR
);
9356 textdomain (PACKAGE
);
9358 parse_args (argc
, argv
);
9360 if (optind
< (argc
- 1))
9364 while (optind
< argc
)
9365 err
|= process_file (argv
[optind
++]);
9367 if (dump_sects
!= NULL
)