1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998, 99, 2000 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@cygnus.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
56 #include "elf/alpha.h"
59 #include "elf/sparc.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
69 #include "elf/mcore.h"
78 char * program_name
= "readelf";
79 unsigned int dynamic_addr
;
80 bfd_size_type dynamic_size
;
81 unsigned int rela_addr
;
82 unsigned int rela_size
;
83 char * dynamic_strings
;
85 unsigned long num_dynamic_syms
;
86 Elf_Internal_Sym
* dynamic_symbols
;
87 Elf_Internal_Syminfo
* dynamic_syminfo
;
88 unsigned long dynamic_syminfo_offset
;
89 unsigned int dynamic_syminfo_nent
;
90 char program_interpreter
[64];
91 int dynamic_info
[DT_JMPREL
+ 1];
94 Elf_Internal_Ehdr elf_header
;
95 Elf_Internal_Shdr
* section_headers
;
96 Elf_Internal_Dyn
* dynamic_segment
;
103 int do_using_dynamic
;
110 int do_debug_abbrevs
;
112 int do_debug_pubnames
;
113 int do_debug_aranges
;
118 /* A dynamic array of flags indicating which sections require dumping. */
119 char * dump_sects
= NULL
;
120 unsigned int num_dump_sects
= 0;
122 #define HEX_DUMP (1 << 0)
123 #define DISASS_DUMP (1 << 1)
124 #define DEBUG_DUMP (1 << 2)
126 /* How to rpint a vma value. */
127 typedef enum print_mode
139 /* Forward declarations for dumb compilers. */
140 static void print_vma
PARAMS ((bfd_vma
, print_mode
));
141 static bfd_vma (* byte_get
) PARAMS ((unsigned char *, int));
142 static bfd_vma byte_get_little_endian
PARAMS ((unsigned char *, int));
143 static bfd_vma byte_get_big_endian
PARAMS ((unsigned char *, int));
144 static const char * get_mips_dynamic_type
PARAMS ((unsigned long));
145 static const char * get_sparc64_dynamic_type
PARAMS ((unsigned long));
146 static const char * get_parisc_dynamic_type
PARAMS ((unsigned long));
147 static const char * get_dynamic_type
PARAMS ((unsigned long));
148 static int dump_relocations
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*, unsigned long, char *, int));
149 static char * get_file_type
PARAMS ((unsigned));
150 static char * get_machine_name
PARAMS ((unsigned));
151 static void decode_ARM_machine_flags
PARAMS ((unsigned, char []));
152 static char * get_machine_flags
PARAMS ((unsigned, unsigned));
153 static const char * get_mips_segment_type
PARAMS ((unsigned long));
154 static const char * get_parisc_segment_type
PARAMS ((unsigned long));
155 static const char * get_segment_type
PARAMS ((unsigned long));
156 static const char * get_mips_section_type_name
PARAMS ((unsigned int));
157 static const char * get_parisc_section_type_name
PARAMS ((unsigned int));
158 static const char * get_section_type_name
PARAMS ((unsigned int));
159 static const char * get_symbol_binding
PARAMS ((unsigned int));
160 static const char * get_symbol_type
PARAMS ((unsigned int));
161 static const char * get_symbol_visibility
PARAMS ((unsigned int));
162 static const char * get_symbol_index_type
PARAMS ((unsigned int));
163 static const char * get_dynamic_flags
PARAMS ((bfd_vma
));
164 static void usage
PARAMS ((void));
165 static void parse_args
PARAMS ((int, char **));
166 static int process_file_header
PARAMS ((void));
167 static int process_program_headers
PARAMS ((FILE *));
168 static int process_section_headers
PARAMS ((FILE *));
169 static void dynamic_segment_mips_val
PARAMS ((Elf_Internal_Dyn
*));
170 static void dynamic_segment_parisc_val
PARAMS ((Elf_Internal_Dyn
*));
171 static int process_dynamic_segment
PARAMS ((FILE *));
172 static int process_symbol_table
PARAMS ((FILE *));
173 static int process_section_contents
PARAMS ((FILE *));
174 static void process_file
PARAMS ((char *));
175 static int process_relocs
PARAMS ((FILE *));
176 static int process_version_sections
PARAMS ((FILE *));
177 static char * get_ver_flags
PARAMS ((unsigned int));
178 static int get_32bit_section_headers
PARAMS ((FILE *));
179 static int get_64bit_section_headers
PARAMS ((FILE *));
180 static int get_32bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
181 static int get_64bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
182 static int get_file_header
PARAMS ((FILE *));
183 static Elf_Internal_Sym
* get_32bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
184 static Elf_Internal_Sym
* get_64bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
185 static int * get_dynamic_data
PARAMS ((FILE *, unsigned int));
186 static int get_32bit_dynamic_segment
PARAMS ((FILE *));
187 static int get_64bit_dynamic_segment
PARAMS ((FILE *));
188 #ifdef SUPPORT_DISASSEMBLY
189 static int disassemble_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
191 static int dump_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
192 static int display_debug_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
193 static int display_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
194 static int display_debug_not_supported
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
195 static int display_debug_lines
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
196 static int display_debug_abbrev
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
197 static int display_debug_aranges
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
198 static unsigned char * process_abbrev_section
PARAMS ((unsigned char *, unsigned char *));
199 static unsigned long read_leb128
PARAMS ((unsigned char *, int *, int));
200 static int process_extended_line_op
PARAMS ((unsigned char *, int, int));
201 static void reset_state_machine
PARAMS ((int));
202 static char * get_TAG_name
PARAMS ((unsigned long));
203 static char * get_AT_name
PARAMS ((unsigned long));
204 static char * get_FORM_name
PARAMS ((unsigned long));
205 static void free_abbrevs
PARAMS ((void));
206 static void add_abbrev
PARAMS ((unsigned long, unsigned long, int));
207 static void add_abbrev_attr
PARAMS ((unsigned long, unsigned long));
208 static unsigned char * read_and_display_attr
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
209 static unsigned char * display_block
PARAMS ((unsigned char *, unsigned long));
210 static void decode_location_expression
PARAMS ((unsigned char *, unsigned int, unsigned long));
211 static void request_dump
PARAMS ((unsigned int, char));
212 static const char * get_elf_class
PARAMS ((unsigned char));
213 static const char * get_data_encoding
PARAMS ((unsigned char));
214 static const char * get_osabi_name
PARAMS ((unsigned char));
215 static int guess_is_rela
PARAMS ((unsigned long));
216 static char * get_note_type
PARAMS ((unsigned int));
217 static int process_note
PARAMS ((Elf32_Internal_Note
*));
218 static int process_corefile_note_segment
PARAMS ((FILE *, bfd_vma
, bfd_vma
));
219 static int process_corefile_note_segments
PARAMS ((FILE *));
220 static int process_corefile_contents
PARAMS ((FILE *));
222 typedef int Elf32_Word
;
230 #define SECTION_NAME(X) (string_table + (X)->sh_name)
232 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
234 #define BYTE_GET(field) byte_get (field, sizeof (field))
236 /* If we can support a 64 bit data type then BFD64 should be defined
237 and sizeof (bfd_vma) == 8. In this case when translating from an
238 external 8 byte field to an internal field, we can assume that the
239 internal field is also 8 bytes wide and so we can extact all the data.
240 If, however, BFD64 is not defined, then we must assume that the
241 internal data structure only has 4 byte wide fields that are the
242 equivalent of the 8 byte wide external counterparts, and so we must
243 truncate the data. */
245 #define BYTE_GET8(field) byte_get (field, -8)
247 #define BYTE_GET8(field) byte_get (field, 8)
250 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
252 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
253 if (fseek (file, offset, SEEK_SET)) \
255 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
259 var = (type) malloc (size); \
263 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
267 if (fread (var, size, 1, file) != 1) \
269 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
276 #define GET_DATA(offset, var, reason) \
277 if (fseek (file, offset, SEEK_SET)) \
279 error (_("Unable to seek to %x for %s\n"), offset, reason); \
282 else if (fread (& var, sizeof (var), 1, file) != 1) \
284 error (_("Unable to read data at %x for %s\n"), offset, reason); \
288 #define GET_ELF_SYMBOLS(file, offset, size) \
289 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
290 : get_64bit_elf_symbols (file, offset, size))
293 #ifdef ANSI_PROTOTYPES
295 error (const char * message
, ...)
299 fprintf (stderr
, _("%s: Error: "), program_name
);
300 va_start (args
, message
);
301 vfprintf (stderr
, message
, args
);
307 warn (const char * message
, ...)
311 fprintf (stderr
, _("%s: Warning: "), program_name
);
312 va_start (args
, message
);
313 vfprintf (stderr
, message
, args
);
325 fprintf (stderr
, _("%s: Error: "), program_name
);
327 message
= va_arg (args
, char *);
328 vfprintf (stderr
, message
, args
);
340 fprintf (stderr
, _("%s: Warning: "), program_name
);
342 message
= va_arg (args
, char *);
343 vfprintf (stderr
, message
, args
);
350 byte_get_little_endian (field
, size
)
351 unsigned char * field
;
360 return ((unsigned int) (field
[0]))
361 | (((unsigned int) (field
[1])) << 8);
364 /* We want to extract data from an 8 byte wide field and
365 place it into a 4 byte wide field. Since this is a little
366 endian source we can juts use the 4 byte extraction code. */
369 return ((unsigned long) (field
[0]))
370 | (((unsigned long) (field
[1])) << 8)
371 | (((unsigned long) (field
[2])) << 16)
372 | (((unsigned long) (field
[3])) << 24);
376 /* This is a special case, generated by the BYTE_GET8 macro.
377 It means that we are loading an 8 byte value from a field
378 in an external structure into an 8 byte value in a field
379 in an internal strcuture. */
380 return ((bfd_vma
) (field
[0]))
381 | (((bfd_vma
) (field
[1])) << 8)
382 | (((bfd_vma
) (field
[2])) << 16)
383 | (((bfd_vma
) (field
[3])) << 24)
384 | (((bfd_vma
) (field
[4])) << 32)
385 | (((bfd_vma
) (field
[5])) << 40)
386 | (((bfd_vma
) (field
[6])) << 48)
387 | (((bfd_vma
) (field
[7])) << 56);
390 error (_("Unhandled data length: %d\n"), size
);
395 /* Print a VMA value. */
397 print_vma (vma
, mode
)
407 case FULL_HEX
: printf ("0x"); /* drop through */
408 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
409 case PREFIX_HEX
: printf ("0x"); /* drop through */
410 case HEX
: printf ("%lx", (unsigned long) vma
); break;
411 case DEC
: printf ("%ld", (unsigned long) vma
); break;
412 case DEC_5
: printf ("%5ld", (long) vma
); break;
413 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
434 #if BFD_HOST_64BIT_LONG
437 if (_bfd_int64_high (vma
))
438 printf ("%lx%lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
440 printf ("%lx", _bfd_int64_low (vma
));
445 #if BFD_HOST_64BIT_LONG
448 if (_bfd_int64_high (vma
))
450 printf ("++%ld", _bfd_int64_low (vma
));
452 printf ("%ld", _bfd_int64_low (vma
));
457 #if BFD_HOST_64BIT_LONG
458 printf ("%5ld", vma
);
460 if (_bfd_int64_high (vma
))
462 printf ("++%ld", _bfd_int64_low (vma
));
464 printf ("%5ld", _bfd_int64_low (vma
));
469 #if BFD_HOST_64BIT_LONG
472 if (_bfd_int64_high (vma
))
474 printf ("++%lu", _bfd_int64_low (vma
));
476 printf ("%lu", _bfd_int64_low (vma
));
485 byte_get_big_endian (field
, size
)
486 unsigned char * field
;
495 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
498 return ((unsigned long) (field
[3]))
499 | (((unsigned long) (field
[2])) << 8)
500 | (((unsigned long) (field
[1])) << 16)
501 | (((unsigned long) (field
[0])) << 24);
504 /* Although we are extracing data from an 8 byte wide field, we
505 are returning only 4 bytes of data. */
506 return ((unsigned long) (field
[7]))
507 | (((unsigned long) (field
[6])) << 8)
508 | (((unsigned long) (field
[5])) << 16)
509 | (((unsigned long) (field
[4])) << 24);
513 /* This is a special case, generated by the BYTE_GET8 macro.
514 It means that we are loading an 8 byte value from a field
515 in an external structure into an 8 byte value in a field
516 in an internal strcuture. */
517 return ((bfd_vma
) (field
[7]))
518 | (((bfd_vma
) (field
[6])) << 8)
519 | (((bfd_vma
) (field
[5])) << 16)
520 | (((bfd_vma
) (field
[4])) << 24)
521 | (((bfd_vma
) (field
[3])) << 32)
522 | (((bfd_vma
) (field
[2])) << 40)
523 | (((bfd_vma
) (field
[1])) << 48)
524 | (((bfd_vma
) (field
[0])) << 56);
528 error (_("Unhandled data length: %d\n"), size
);
534 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
536 guess_is_rela (e_machine
)
537 unsigned long e_machine
;
541 /* Targets that use REL relocations. */
552 /* Targets that use RELA relocations. */
560 case EM_CYGNUS_MN10200
:
561 case EM_CYGNUS_MN10300
:
589 warn (_("Don't know about relocations on this machine architecture\n"));
594 /* Display the contents of the relocation data found at the specified offset. */
596 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
598 unsigned long rel_offset
;
599 unsigned long rel_size
;
600 Elf_Internal_Sym
* symtab
;
606 Elf_Internal_Rel
* rels
;
607 Elf_Internal_Rela
* relas
;
610 if (is_rela
== UNKNOWN
)
611 is_rela
= guess_is_rela (elf_header
.e_machine
);
617 Elf32_External_Rela
* erelas
;
619 GET_DATA_ALLOC (rel_offset
, rel_size
, erelas
,
620 Elf32_External_Rela
*, "relocs");
622 rel_size
= rel_size
/ sizeof (Elf32_External_Rela
);
624 relas
= (Elf_Internal_Rela
*)
625 malloc (rel_size
* sizeof (Elf_Internal_Rela
));
629 error(_("out of memory parsing relocs"));
633 for (i
= 0; i
< rel_size
; i
++)
635 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
636 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
637 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
642 rels
= (Elf_Internal_Rel
*) relas
;
646 Elf64_External_Rela
* erelas
;
648 GET_DATA_ALLOC (rel_offset
, rel_size
, erelas
,
649 Elf64_External_Rela
*, "relocs");
651 rel_size
= rel_size
/ sizeof (Elf64_External_Rela
);
653 relas
= (Elf_Internal_Rela
*)
654 malloc (rel_size
* sizeof (Elf_Internal_Rela
));
658 error(_("out of memory parsing relocs"));
662 for (i
= 0; i
< rel_size
; i
++)
664 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
665 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
666 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
671 rels
= (Elf_Internal_Rel
*) relas
;
678 Elf32_External_Rel
* erels
;
680 GET_DATA_ALLOC (rel_offset
, rel_size
, erels
,
681 Elf32_External_Rel
*, "relocs");
683 rel_size
= rel_size
/ sizeof (Elf32_External_Rel
);
685 rels
= (Elf_Internal_Rel
*)
686 malloc (rel_size
* sizeof (Elf_Internal_Rel
));
690 error(_("out of memory parsing relocs"));
694 for (i
= 0; i
< rel_size
; i
++)
696 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
697 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
702 relas
= (Elf_Internal_Rela
*) rels
;
706 Elf64_External_Rel
* erels
;
708 GET_DATA_ALLOC (rel_offset
, rel_size
, erels
,
709 Elf64_External_Rel
*, "relocs");
711 rel_size
= rel_size
/ sizeof (Elf64_External_Rel
);
713 rels
= (Elf_Internal_Rel
*)
714 malloc (rel_size
* sizeof (Elf_Internal_Rel
));
718 error(_("out of memory parsing relocs"));
722 for (i
= 0; i
< rel_size
; i
++)
724 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
725 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
730 relas
= (Elf_Internal_Rela
*) rels
;
736 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
739 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
741 for (i
= 0; i
< rel_size
; i
++)
746 bfd_vma symtab_index
;
751 offset
= relas
[i
].r_offset
;
752 info
= relas
[i
].r_info
;
756 offset
= rels
[i
].r_offset
;
757 info
= rels
[i
].r_info
;
762 type
= ELF32_R_TYPE (info
);
763 symtab_index
= ELF32_R_SYM (info
);
767 if (elf_header
.e_machine
== EM_SPARCV9
)
768 type
= ELF64_R_TYPE_ID (info
);
770 type
= ELF64_R_TYPE (info
);
771 /* The #ifdef BFD64 below is to prevent a compile time warning.
772 We know that if we do not have a 64 bit data type that we
773 will never execute this code anyway. */
775 symtab_index
= ELF64_R_SYM (info
);
779 #ifdef _bfd_int64_low
780 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
782 printf (" %8.8lx %5.5lx ", offset
, info
);
785 switch (elf_header
.e_machine
)
792 rtype
= elf_m32r_reloc_type (type
);
797 rtype
= elf_i386_reloc_type (type
);
801 rtype
= elf_m68k_reloc_type (type
);
805 rtype
= elf_i960_reloc_type (type
);
809 rtype
= elf_avr_reloc_type (type
);
816 rtype
= elf_sparc_reloc_type (type
);
820 rtype
= v850_reloc_type (type
);
824 rtype
= elf_d10v_reloc_type (type
);
828 rtype
= elf_d30v_reloc_type (type
);
832 rtype
= elf_sh_reloc_type (type
);
835 case EM_CYGNUS_MN10300
:
836 rtype
= elf_mn10300_reloc_type (type
);
839 case EM_CYGNUS_MN10200
:
840 rtype
= elf_mn10200_reloc_type (type
);
844 rtype
= elf_fr30_reloc_type (type
);
848 rtype
= elf_mcore_reloc_type (type
);
852 rtype
= elf_ppc_reloc_type (type
);
857 rtype
= elf_mips_reloc_type (type
);
861 rtype
= elf_alpha_reloc_type (type
);
865 rtype
= elf_arm_reloc_type (type
);
869 rtype
= elf_arc_reloc_type (type
);
873 rtype
= elf_hppa_reloc_type (type
);
877 rtype
= elf_pj_reloc_type (type
);
880 rtype
= elf_ia64_reloc_type (type
);
885 #ifdef _bfd_int64_low
886 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type
));
888 printf (_("unrecognised: %-7lx"), type
);
891 printf ("%-21.21s", rtype
);
897 if (symtab_index
>= nsyms
)
898 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
901 Elf_Internal_Sym
* psym
;
903 psym
= symtab
+ symtab_index
;
906 print_vma (psym
->st_value
, LONG_HEX
);
909 if (psym
->st_name
== 0)
911 SECTION_NAME (section_headers
+ psym
->st_shndx
));
912 else if (strtab
== NULL
)
913 printf (_("<string table index %3ld>"), psym
->st_name
);
915 printf ("%-25.25s", strtab
+ psym
->st_name
);
918 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
924 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
925 print_vma (relas
[i
].r_addend
, LONG_HEX
);
928 if (elf_header
.e_machine
== EM_SPARCV9
929 && !strcmp (rtype
, "R_SPARC_OLO10"))
930 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
941 get_mips_dynamic_type (type
)
946 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
947 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
948 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
949 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
950 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
951 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
952 case DT_MIPS_MSYM
: return "MIPS_MSYM";
953 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
954 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
955 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
956 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
957 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
958 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
959 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
960 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
961 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
962 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
963 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
964 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
965 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
966 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
967 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
968 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
969 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
970 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
971 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
972 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
973 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
974 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
975 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
976 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
977 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
978 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
979 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
980 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
981 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
982 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
983 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
984 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
985 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
986 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
987 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
988 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
995 get_sparc64_dynamic_type (type
)
1000 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1007 get_parisc_dynamic_type (type
)
1012 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1013 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1014 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1015 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1016 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1017 case DT_HP_PREINIT
: return "HP_PREINIT";
1018 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1019 case DT_HP_NEEDED
: return "HP_NEEDED";
1020 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1021 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1022 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1023 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1024 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1031 get_dynamic_type (type
)
1034 static char buff
[32];
1038 case DT_NULL
: return "NULL";
1039 case DT_NEEDED
: return "NEEDED";
1040 case DT_PLTRELSZ
: return "PLTRELSZ";
1041 case DT_PLTGOT
: return "PLTGOT";
1042 case DT_HASH
: return "HASH";
1043 case DT_STRTAB
: return "STRTAB";
1044 case DT_SYMTAB
: return "SYMTAB";
1045 case DT_RELA
: return "RELA";
1046 case DT_RELASZ
: return "RELASZ";
1047 case DT_RELAENT
: return "RELAENT";
1048 case DT_STRSZ
: return "STRSZ";
1049 case DT_SYMENT
: return "SYMENT";
1050 case DT_INIT
: return "INIT";
1051 case DT_FINI
: return "FINI";
1052 case DT_SONAME
: return "SONAME";
1053 case DT_RPATH
: return "RPATH";
1054 case DT_SYMBOLIC
: return "SYMBOLIC";
1055 case DT_REL
: return "REL";
1056 case DT_RELSZ
: return "RELSZ";
1057 case DT_RELENT
: return "RELENT";
1058 case DT_PLTREL
: return "PLTREL";
1059 case DT_DEBUG
: return "DEBUG";
1060 case DT_TEXTREL
: return "TEXTREL";
1061 case DT_JMPREL
: return "JMPREL";
1062 case DT_BIND_NOW
: return "BIND_NOW";
1063 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1064 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1065 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1066 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1067 case DT_RUNPATH
: return "RUNPATH";
1068 case DT_FLAGS
: return "FLAGS";
1070 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1071 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1073 case DT_PLTPADSZ
: return "PLTPADSZ";
1074 case DT_MOVEENT
: return "MOVEENT";
1075 case DT_MOVESZ
: return "MOVESZ";
1076 case DT_FEATURE_1
: return "FEATURE_1";
1077 case DT_POSFLAG_1
: return "POSFLAG_1";
1078 case DT_SYMINSZ
: return "SYMINSZ";
1079 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1081 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1082 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1084 case DT_VERSYM
: return "VERSYM";
1086 case DT_RELACOUNT
: return "RELACOUNT";
1087 case DT_RELCOUNT
: return "RELCOUNT";
1088 case DT_FLAGS_1
: return "FLAGS_1";
1089 case DT_VERDEF
: return "VERDEF";
1090 case DT_VERDEFNUM
: return "VERDEFNUM";
1091 case DT_VERNEED
: return "VERNEED";
1092 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1094 case DT_AUXILIARY
: return "AUXILARY";
1095 case DT_USED
: return "USED";
1096 case DT_FILTER
: return "FILTER";
1099 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1101 const char * result
;
1103 switch (elf_header
.e_machine
)
1106 case EM_MIPS_RS4_BE
:
1107 result
= get_mips_dynamic_type (type
);
1110 result
= get_sparc64_dynamic_type (type
);
1120 sprintf (buff
, _("Processor Specific: %lx"), type
);
1122 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1124 const char * result
;
1126 switch (elf_header
.e_machine
)
1129 result
= get_parisc_dynamic_type (type
);
1139 sprintf (buff
, _("Operating System specific: %lx"), type
);
1142 sprintf (buff
, _("<unknown>: %lx"), type
);
1149 get_file_type (e_type
)
1152 static char buff
[32];
1156 case ET_NONE
: return _("NONE (None)");
1157 case ET_REL
: return _("REL (Relocatable file)");
1158 case ET_EXEC
: return _("EXEC (Executable file)");
1159 case ET_DYN
: return _("DYN (Shared object file)");
1160 case ET_CORE
: return _("CORE (Core file)");
1163 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1164 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1165 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1166 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1168 sprintf (buff
, _("<unknown>: %x"), e_type
);
1174 get_machine_name (e_machine
)
1177 static char buff
[64]; /* XXX */
1181 case EM_NONE
: return _("None");
1182 case EM_M32
: return "WE32100";
1183 case EM_SPARC
: return "Sparc";
1184 case EM_386
: return "Intel 80386";
1185 case EM_68K
: return "MC68000";
1186 case EM_88K
: return "MC88000";
1187 case EM_486
: return "Intel 80486";
1188 case EM_860
: return "Intel 80860";
1189 case EM_MIPS
: return "MIPS R3000";
1190 case EM_S370
: return "IBM System/370";
1191 case EM_MIPS_RS4_BE
: return "MIPS R4000 big-endian";
1192 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1193 case EM_PARISC
: return "HPPA";
1194 case EM_PPC_OLD
: return "Power PC (old)";
1195 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1196 case EM_960
: return "Intel 90860";
1197 case EM_PPC
: return "PowerPC";
1198 case EM_V800
: return "NEC V800";
1199 case EM_FR20
: return "Fujitsu FR20";
1200 case EM_RH32
: return "TRW RH32";
1201 case EM_MCORE
: return "MCORE";
1202 case EM_ARM
: return "ARM";
1203 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1204 case EM_SH
: return "Hitachi SH";
1205 case EM_SPARCV9
: return "Sparc v9";
1206 case EM_TRICORE
: return "Siemens Tricore";
1207 case EM_ARC
: return "Argonaut RISC Core";
1208 case EM_H8_300
: return "Hitachi H8/300";
1209 case EM_H8_300H
: return "Hitachi H8/300H";
1210 case EM_H8S
: return "Hitachi H8S";
1211 case EM_H8_500
: return "Hitachi H8/500";
1212 case EM_IA_64
: return "Intel IA-64";
1213 case EM_MIPS_X
: return "Stanford MIPS-X";
1214 case EM_COLDFIRE
: return "Motorola Coldfire";
1215 case EM_68HC12
: return "Motorola M68HC12";
1216 case EM_ALPHA
: return "Alpha";
1217 case EM_CYGNUS_D10V
: return "d10v";
1218 case EM_CYGNUS_D30V
: return "d30v";
1219 case EM_CYGNUS_ARC
: return "Arc";
1220 case EM_CYGNUS_M32R
: return "Mitsubishi M32r";
1221 case EM_CYGNUS_V850
: return "NEC v850";
1222 case EM_CYGNUS_MN10300
: return "mn10300";
1223 case EM_CYGNUS_MN10200
: return "mn10200";
1224 case EM_CYGNUS_FR30
: return "Fujitsu FR30";
1225 case EM_PJ
: return "picoJava";
1226 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1227 case EM_PCP
: return "Siemens PCP";
1228 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1229 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1230 case EM_STARCORE
: return "Motorola Star*Core processor";
1231 case EM_ME16
: return "Toyota ME16 processor";
1232 case EM_ST100
: return "STMicroelectronics ST100 processor";
1233 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1234 case EM_FX66
: return "Siemens FX66 microcontroller";
1235 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1236 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1237 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1238 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1239 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1240 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1241 case EM_SVX
: return "Silicon Graphics SVx";
1242 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1243 case EM_VAX
: return "Digital VAX";
1244 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1246 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1252 decode_ARM_machine_flags (e_flags
, buf
)
1259 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1260 e_flags
&= ~ EF_ARM_EABIMASK
;
1262 /* Handle "generic" ARM flags. */
1263 if (e_flags
& EF_ARM_RELEXEC
)
1265 strcat (buf
, ", relocatable executable");
1266 e_flags
&= ~ EF_ARM_RELEXEC
;
1269 if (e_flags
& EF_ARM_HASENTRY
)
1271 strcat (buf
, ", has entry point");
1272 e_flags
&= ~ EF_ARM_HASENTRY
;
1275 /* Now handle EABI specific flags. */
1279 strcat (buf
, ", <unknown EABI>");
1284 case EF_ARM_EABI_VER1
:
1289 /* Process flags one bit at a time. */
1290 flag
= e_flags
& - e_flags
;
1295 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_INTERWORK. */
1296 strcat (buf
, ", sorted symbol tables");
1306 case EF_ARM_EABI_UNKNOWN
:
1311 /* Process flags one bit at a time. */
1312 flag
= e_flags
& - e_flags
;
1318 strcat (buf
, ", interworking enabled");
1322 strcat (buf
, ", uses APCS/26");
1326 strcat (buf
, ", uses APCS/float");
1330 strcat (buf
, ", position independent");
1334 strcat (buf
, ", 8 bit structure alignment");
1338 strcat (buf
, ", uses new ABI");
1342 strcat (buf
, ", uses old ABI");
1346 strcat (buf
, ", software FP");
1357 strcat (buf
,", <unknown>");
1361 get_machine_flags (e_flags
, e_machine
)
1365 static char buf
[1024];
1377 decode_ARM_machine_flags (e_flags
, buf
);
1381 if (e_flags
& EF_CPU32
)
1382 strcat (buf
, ", cpu32");
1386 if (e_flags
& EF_PPC_EMB
)
1387 strcat (buf
, ", emb");
1389 if (e_flags
& EF_PPC_RELOCATABLE
)
1390 strcat (buf
, ", relocatable");
1392 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1393 strcat (buf
, ", relocatable-lib");
1396 case EM_CYGNUS_V850
:
1397 switch (e_flags
& EF_V850_ARCH
)
1400 strcat (buf
, ", v850e");
1403 strcat (buf
, ", v850ea");
1406 strcat (buf
, ", v850");
1409 strcat (buf
, ", unknown v850 architecture variant");
1414 case EM_CYGNUS_M32R
:
1415 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1416 strcat (buf
, ", m32r");
1421 case EM_MIPS_RS4_BE
:
1422 if (e_flags
& EF_MIPS_NOREORDER
)
1423 strcat (buf
, ", noreorder");
1425 if (e_flags
& EF_MIPS_PIC
)
1426 strcat (buf
, ", pic");
1428 if (e_flags
& EF_MIPS_CPIC
)
1429 strcat (buf
, ", cpic");
1431 if (e_flags
& EF_MIPS_ABI2
)
1432 strcat (buf
, ", abi2");
1434 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_1
)
1435 strcat (buf
, ", mips1");
1437 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_2
)
1438 strcat (buf
, ", mips2");
1440 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_3
)
1441 strcat (buf
, ", mips3");
1443 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_4
)
1444 strcat (buf
, ", mips4");
1448 if (e_flags
& EF_SPARC_32PLUS
)
1449 strcat (buf
, ", v8+");
1451 if (e_flags
& EF_SPARC_SUN_US1
)
1452 strcat (buf
, ", ultrasparcI");
1454 if (e_flags
& EF_SPARC_SUN_US3
)
1455 strcat (buf
, ", ultrasparcIII");
1457 if (e_flags
& EF_SPARC_HAL_R1
)
1458 strcat (buf
, ", halr1");
1460 if (e_flags
& EF_SPARC_LEDATA
)
1461 strcat (buf
, ", ledata");
1463 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1464 strcat (buf
, ", tso");
1466 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1467 strcat (buf
, ", pso");
1469 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1470 strcat (buf
, ", rmo");
1474 switch (e_flags
& EF_PARISC_ARCH
)
1476 case EFA_PARISC_1_0
:
1477 strcpy (buf
, ", PA-RISC 1.0");
1479 case EFA_PARISC_1_1
:
1480 strcpy (buf
, ", PA-RISC 1.1");
1482 case EFA_PARISC_2_0
:
1483 strcpy (buf
, ", PA-RISC 2.0");
1488 if (e_flags
& EF_PARISC_TRAPNIL
)
1489 strcat (buf
, ", trapnil");
1490 if (e_flags
& EF_PARISC_EXT
)
1491 strcat (buf
, ", ext");
1492 if (e_flags
& EF_PARISC_LSB
)
1493 strcat (buf
, ", lsb");
1494 if (e_flags
& EF_PARISC_WIDE
)
1495 strcat (buf
, ", wide");
1496 if (e_flags
& EF_PARISC_NO_KABP
)
1497 strcat (buf
, ", no kabp");
1498 if (e_flags
& EF_PARISC_LAZYSWAP
)
1499 strcat (buf
, ", lazyswap");
1503 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1504 strcat (buf
, ", new calling convention");
1506 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1507 strcat (buf
, ", gnu calling convention");
1516 get_mips_segment_type (type
)
1521 case PT_MIPS_REGINFO
:
1523 case PT_MIPS_RTPROC
:
1525 case PT_MIPS_OPTIONS
:
1535 get_parisc_segment_type (type
)
1540 case PT_HP_TLS
: return "HP_TLS";
1541 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1542 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1543 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1544 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1545 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1546 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1547 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1548 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1549 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1550 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1551 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1552 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1553 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1562 get_segment_type (p_type
)
1563 unsigned long p_type
;
1565 static char buff
[32];
1569 case PT_NULL
: return "NULL";
1570 case PT_LOAD
: return "LOAD";
1571 case PT_DYNAMIC
: return "DYNAMIC";
1572 case PT_INTERP
: return "INTERP";
1573 case PT_NOTE
: return "NOTE";
1574 case PT_SHLIB
: return "SHLIB";
1575 case PT_PHDR
: return "PHDR";
1578 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1580 const char * result
;
1582 switch (elf_header
.e_machine
)
1585 case EM_MIPS_RS4_BE
:
1586 result
= get_mips_segment_type (p_type
);
1589 result
= get_parisc_segment_type (p_type
);
1599 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1601 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1603 const char * result
;
1605 switch (elf_header
.e_machine
)
1608 result
= get_parisc_segment_type (p_type
);
1618 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1621 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1628 get_mips_section_type_name (sh_type
)
1629 unsigned int sh_type
;
1633 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1634 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1635 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1636 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1637 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1638 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1639 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1640 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1641 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1642 case SHT_MIPS_RELD
: return "MIPS_RELD";
1643 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
1644 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
1645 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1646 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
1647 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
1648 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
1649 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
1650 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
1651 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
1652 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
1653 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
1654 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
1655 case SHT_MIPS_LINE
: return "MIPS_LINE";
1656 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
1657 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
1658 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
1659 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
1660 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
1661 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
1662 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1663 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
1664 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
1665 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
1666 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
1667 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
1668 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
1669 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
1670 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
1671 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
1679 get_parisc_section_type_name (sh_type
)
1680 unsigned int sh_type
;
1684 case SHT_PARISC_EXT
: return "PARISC_EXT";
1685 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
1686 case SHT_PARISC_DOC
: return "PARISC_DOC";
1694 get_section_type_name (sh_type
)
1695 unsigned int sh_type
;
1697 static char buff
[32];
1701 case SHT_NULL
: return "NULL";
1702 case SHT_PROGBITS
: return "PROGBITS";
1703 case SHT_SYMTAB
: return "SYMTAB";
1704 case SHT_STRTAB
: return "STRTAB";
1705 case SHT_RELA
: return "RELA";
1706 case SHT_HASH
: return "HASH";
1707 case SHT_DYNAMIC
: return "DYNAMIC";
1708 case SHT_NOTE
: return "NOTE";
1709 case SHT_NOBITS
: return "NOBITS";
1710 case SHT_REL
: return "REL";
1711 case SHT_SHLIB
: return "SHLIB";
1712 case SHT_DYNSYM
: return "DYNSYM";
1713 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
1714 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
1715 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1716 case SHT_GNU_verdef
: return "VERDEF";
1717 case SHT_GNU_verneed
: return "VERNEED";
1718 case SHT_GNU_versym
: return "VERSYM";
1719 case 0x6ffffff0: return "VERSYM";
1720 case 0x6ffffffc: return "VERDEF";
1721 case 0x7ffffffd: return "AUXILIARY";
1722 case 0x7fffffff: return "FILTER";
1725 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
1727 const char * result
;
1729 switch (elf_header
.e_machine
)
1732 case EM_MIPS_RS4_BE
:
1733 result
= get_mips_section_type_name (sh_type
);
1736 result
= get_parisc_section_type_name (sh_type
);
1746 sprintf (buff
, "SHT_LOPROC+%x", sh_type
- SHT_LOPROC
);
1748 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
1749 sprintf (buff
, "SHT_LOOS+%x", sh_type
- SHT_LOOS
);
1750 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
1751 sprintf (buff
, "SHT_LOUSER+%x", sh_type
- SHT_LOUSER
);
1753 sprintf (buff
, _("<unknown>: %x"), sh_type
);
1759 struct option options
[] =
1761 {"all", no_argument
, 0, 'a'},
1762 {"file-header", no_argument
, 0, 'h'},
1763 {"program-headers", no_argument
, 0, 'l'},
1764 {"headers", no_argument
, 0, 'e'},
1765 {"histogram", no_argument
, 0, 'I'},
1766 {"segments", no_argument
, 0, 'l'},
1767 {"sections", no_argument
, 0, 'S'},
1768 {"section-headers", no_argument
, 0, 'S'},
1769 {"symbols", no_argument
, 0, 's'},
1770 {"syms", no_argument
, 0, 's'},
1771 {"relocs", no_argument
, 0, 'r'},
1772 {"notes", no_argument
, 0, 'n'},
1773 {"dynamic", no_argument
, 0, 'd'},
1774 {"arch-specific", no_argument
, 0, 'A'},
1775 {"version-info", no_argument
, 0, 'V'},
1776 {"use-dynamic", no_argument
, 0, 'D'},
1777 {"hex-dump", required_argument
, 0, 'x'},
1778 {"debug-dump", optional_argument
, 0, 'w'},
1779 #ifdef SUPPORT_DISASSEMBLY
1780 {"instruction-dump", required_argument
, 0, 'i'},
1783 {"version", no_argument
, 0, 'v'},
1784 {"help", no_argument
, 0, 'H'},
1785 {0, no_argument
, 0, 0}
1791 fprintf (stdout
, _("Usage: readelf {options} elf-file(s)\n"));
1792 fprintf (stdout
, _(" Options are:\n"));
1793 fprintf (stdout
, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1794 fprintf (stdout
, _(" -h or --file-header Display the ELF file header\n"));
1795 fprintf (stdout
, _(" -l or --program-headers or --segments\n"));
1796 fprintf (stdout
, _(" Display the program headers\n"));
1797 fprintf (stdout
, _(" -S or --section-headers or --sections\n"));
1798 fprintf (stdout
, _(" Display the sections' header\n"));
1799 fprintf (stdout
, _(" -e or --headers Equivalent to: -h -l -S\n"));
1800 fprintf (stdout
, _(" -s or --syms or --symbols Display the symbol table\n"));
1801 fprintf (stdout
, _(" -n or --notes Display the core notes (if present)\n"));
1802 fprintf (stdout
, _(" -r or --relocs Display the relocations (if present)\n"));
1803 fprintf (stdout
, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1804 fprintf (stdout
, _(" -V or --version-info Display the version sections (if present)\n"));
1805 fprintf (stdout
, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1806 fprintf (stdout
, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1807 fprintf (stdout
, _(" -x <number> or --hex-dump=<number>\n"));
1808 fprintf (stdout
, _(" Dump the contents of section <number>\n"));
1809 fprintf (stdout
, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1810 fprintf (stdout
, _(" Display the contents of DWARF2 debug sections\n"));
1811 #ifdef SUPPORT_DISASSEMBLY
1812 fprintf (stdout
, _(" -i <number> or --instruction-dump=<number>\n"));
1813 fprintf (stdout
, _(" Disassemble the contents of section <number>\n"));
1815 fprintf (stdout
, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1816 fprintf (stdout
, _(" -v or --version Display the version number of readelf\n"));
1817 fprintf (stdout
, _(" -H or --help Display this information\n"));
1818 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
1824 request_dump (section
, type
)
1825 unsigned int section
;
1828 if (section
>= num_dump_sects
)
1830 char * new_dump_sects
;
1832 new_dump_sects
= (char *) calloc (section
+ 1, 1);
1834 if (new_dump_sects
== NULL
)
1835 error (_("Out of memory allocating dump request table."));
1838 /* Copy current flag settings. */
1839 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
1843 dump_sects
= new_dump_sects
;
1844 num_dump_sects
= section
+ 1;
1849 dump_sects
[section
] |= type
;
1855 parse_args (argc
, argv
)
1864 while ((c
= getopt_long
1865 (argc
, argv
, "ersahnldSDAIw::x:i:vV", options
, NULL
)) != EOF
)
1900 do_using_dynamic
++;
1928 section
= strtoul (optarg
, & cp
, 0);
1929 if (! * cp
&& section
>= 0)
1931 request_dump (section
, HEX_DUMP
);
1951 do_debug_abbrevs
= 1;
1961 do_debug_pubnames
= 1;
1966 do_debug_aranges
= 1;
1970 warn (_("Unrecognised debug option '%s'\n"), optarg
);
1975 #ifdef SUPPORT_DISASSEMBLY
1978 section
= strtoul (optarg
, & cp
, 0);
1979 if (! * cp
&& section
>= 0)
1981 request_dump (section
, DISASS_DUMP
);
1987 print_version (program_name
);
1994 /* xgettext:c-format */
1995 error (_("Invalid option '-%c'\n"), c
);
2002 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_sections
2003 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2004 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2008 warn (_("Nothing to do.\n"));
2014 get_elf_class (elf_class
)
2015 unsigned char elf_class
;
2017 static char buff
[32];
2021 case ELFCLASSNONE
: return _("none");
2022 case ELFCLASS32
: return _("ELF32");
2023 case ELFCLASS64
: return _("ELF64");
2025 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2031 get_data_encoding (encoding
)
2032 unsigned char encoding
;
2034 static char buff
[32];
2038 case ELFDATANONE
: return _("none");
2039 case ELFDATA2LSB
: return _("2's complement, little endian");
2040 case ELFDATA2MSB
: return _("2's complement, big endian");
2042 sprintf (buff
, _("<unknown: %x>"), encoding
);
2048 get_osabi_name (osabi
)
2049 unsigned char osabi
;
2051 static char buff
[32];
2055 case ELFOSABI_NONE
: return _("UNIX - System V");
2056 case ELFOSABI_HPUX
: return _("UNIX - HP-UX");
2057 case ELFOSABI_NETBSD
: return _("UNIX - NetBSD");
2058 case ELFOSABI_LINUX
: return _("UNIX - Linux");
2059 case ELFOSABI_HURD
: return _("GNU/Hurd");
2060 case ELFOSABI_SOLARIS
: return _("UNIX - Solaris");
2061 case ELFOSABI_MONTEREY
: return _("UNIX - Monterey");
2062 case ELFOSABI_IRIX
: return _("UNIX - IRIX");
2063 case ELFOSABI_FREEBSD
: return _("UNIX - FreeBSD");
2064 case ELFOSABI_TRU64
: return _("UNIX - TRU64");
2065 case ELFOSABI_MODESTO
: return _("Novell - Modesto");
2066 case ELFOSABI_OPENBSD
: return _("UNIX - OpenBSD");
2067 case ELFOSABI_STANDALONE
: return _("Standalone App");
2068 case ELFOSABI_ARM
: return _("ARM");
2070 sprintf (buff
, _("<unknown: %x>"), osabi
);
2075 /* Decode the data held in 'elf_header'. */
2077 process_file_header ()
2079 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2080 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2081 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2082 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2085 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2093 printf (_("ELF Header:\n"));
2094 printf (_(" Magic: "));
2095 for (i
= 0; i
< EI_NIDENT
; i
++)
2096 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2098 printf (_(" Class: %s\n"),
2099 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2100 printf (_(" Data: %s\n"),
2101 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2102 printf (_(" Version: %d %s\n"),
2103 elf_header
.e_ident
[EI_VERSION
],
2104 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2106 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2109 printf (_(" OS/ABI: %s\n"),
2110 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2111 printf (_(" ABI Version: %d\n"),
2112 elf_header
.e_ident
[EI_ABIVERSION
]);
2113 printf (_(" Type: %s\n"),
2114 get_file_type (elf_header
.e_type
));
2115 printf (_(" Machine: %s\n"),
2116 get_machine_name (elf_header
.e_machine
));
2117 printf (_(" Version: 0x%lx\n"),
2118 (unsigned long) elf_header
.e_version
);
2120 printf (_(" Entry point address: "));
2121 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2122 printf (_("\n Start of program headers: "));
2123 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2124 printf (_(" (bytes into file)\n Start of section headers: "));
2125 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2126 printf (_(" (bytes into file)\n"));
2128 printf (_(" Flags: 0x%lx%s\n"),
2129 (unsigned long) elf_header
.e_flags
,
2130 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2131 printf (_(" Size of this header: %ld (bytes)\n"),
2132 (long) elf_header
.e_ehsize
);
2133 printf (_(" Size of program headers: %ld (bytes)\n"),
2134 (long) elf_header
.e_phentsize
);
2135 printf (_(" Number of program headers: %ld\n"),
2136 (long) elf_header
.e_phnum
);
2137 printf (_(" Size of section headers: %ld (bytes)\n"),
2138 (long) elf_header
.e_shentsize
);
2139 printf (_(" Number of section headers: %ld\n"),
2140 (long) elf_header
.e_shnum
);
2141 printf (_(" Section header string table index: %ld\n"),
2142 (long) elf_header
.e_shstrndx
);
2150 get_32bit_program_headers (file
, program_headers
)
2152 Elf_Internal_Phdr
* program_headers
;
2154 Elf32_External_Phdr
* phdrs
;
2155 Elf32_External_Phdr
* external
;
2156 Elf32_Internal_Phdr
* internal
;
2159 GET_DATA_ALLOC (elf_header
.e_phoff
,
2160 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2161 phdrs
, Elf32_External_Phdr
*, "program headers");
2163 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2164 i
< elf_header
.e_phnum
;
2165 i
++, internal
++, external
++)
2167 internal
->p_type
= BYTE_GET (external
->p_type
);
2168 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2169 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2170 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2171 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2172 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2173 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2174 internal
->p_align
= BYTE_GET (external
->p_align
);
2183 get_64bit_program_headers (file
, program_headers
)
2185 Elf_Internal_Phdr
* program_headers
;
2187 Elf64_External_Phdr
* phdrs
;
2188 Elf64_External_Phdr
* external
;
2189 Elf64_Internal_Phdr
* internal
;
2192 GET_DATA_ALLOC (elf_header
.e_phoff
,
2193 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2194 phdrs
, Elf64_External_Phdr
*, "program headers");
2196 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2197 i
< elf_header
.e_phnum
;
2198 i
++, internal
++, external
++)
2200 internal
->p_type
= BYTE_GET (external
->p_type
);
2201 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2202 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2203 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2204 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2205 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2206 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2207 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2216 process_program_headers (file
)
2219 Elf_Internal_Phdr
* program_headers
;
2220 Elf_Internal_Phdr
* segment
;
2223 if (elf_header
.e_phnum
== 0)
2226 printf (_("\nThere are no program headers in this file.\n"));
2230 if (do_segments
&& !do_header
)
2232 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2233 printf (_("Entry point "));
2234 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2235 printf (_("\nThere are %d program headers, starting at offset "),
2236 elf_header
.e_phnum
);
2237 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2241 program_headers
= (Elf_Internal_Phdr
*) malloc
2242 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2244 if (program_headers
== NULL
)
2246 error (_("Out of memory\n"));
2251 i
= get_32bit_program_headers (file
, program_headers
);
2253 i
= get_64bit_program_headers (file
, program_headers
);
2257 free (program_headers
);
2264 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2268 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2272 (_(" Type Offset VirtAddr PhysAddr\n"));
2274 (_(" FileSiz MemSiz Flags Align\n"));
2282 for (i
= 0, segment
= program_headers
;
2283 i
< elf_header
.e_phnum
;
2288 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2292 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2293 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2294 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2295 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2296 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2298 (segment
->p_flags
& PF_R
? 'R' : ' '),
2299 (segment
->p_flags
& PF_W
? 'W' : ' '),
2300 (segment
->p_flags
& PF_X
? 'E' : ' '));
2301 printf ("%#lx", (unsigned long) segment
->p_align
);
2305 print_vma (segment
->p_offset
, FULL_HEX
);
2307 print_vma (segment
->p_vaddr
, FULL_HEX
);
2309 print_vma (segment
->p_paddr
, FULL_HEX
);
2311 print_vma (segment
->p_filesz
, FULL_HEX
);
2313 print_vma (segment
->p_memsz
, FULL_HEX
);
2315 (segment
->p_flags
& PF_R
? 'R' : ' '),
2316 (segment
->p_flags
& PF_W
? 'W' : ' '),
2317 (segment
->p_flags
& PF_X
? 'E' : ' '));
2318 print_vma (segment
->p_align
, HEX
);
2322 switch (segment
->p_type
)
2326 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2327 - (segment
->p_offset
& 0xfffff000);
2332 error (_("more than one dynamic segment\n"));
2334 dynamic_addr
= segment
->p_offset
;
2335 dynamic_size
= segment
->p_filesz
;
2339 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2340 error (_("Unable to find program interpreter name\n"));
2343 program_interpreter
[0] = 0;
2344 fscanf (file
, "%63s", program_interpreter
);
2347 printf (_("\n [Requesting program interpreter: %s]"),
2348 program_interpreter
);
2354 putc ('\n', stdout
);
2363 if (do_segments
&& section_headers
!= NULL
)
2365 printf (_("\n Section to Segment mapping:\n"));
2366 printf (_(" Segment Sections...\n"));
2368 assert (string_table
!= NULL
);
2370 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2373 Elf_Internal_Shdr
* section
;
2375 segment
= program_headers
+ i
;
2376 section
= section_headers
;
2378 printf (" %2.2d ", i
);
2380 for (j
= 0; j
< elf_header
.e_shnum
; j
++, section
++)
2382 if (section
->sh_size
> 0
2383 /* Compare allocated sections by VMA, unallocated
2384 sections by file offset. */
2385 && (section
->sh_flags
& SHF_ALLOC
2386 ? (section
->sh_addr
>= segment
->p_vaddr
2387 && section
->sh_addr
+ section
->sh_size
2388 <= segment
->p_vaddr
+ segment
->p_memsz
)
2389 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2390 && (section
->sh_offset
+ section
->sh_size
2391 <= segment
->p_offset
+ segment
->p_filesz
))))
2392 printf ("%s ", SECTION_NAME (section
));
2399 free (program_headers
);
2406 get_32bit_section_headers (file
)
2409 Elf32_External_Shdr
* shdrs
;
2410 Elf32_Internal_Shdr
* internal
;
2413 GET_DATA_ALLOC (elf_header
.e_shoff
,
2414 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2415 shdrs
, Elf32_External_Shdr
*, "section headers");
2417 section_headers
= (Elf_Internal_Shdr
*) malloc
2418 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2420 if (section_headers
== NULL
)
2422 error (_("Out of memory\n"));
2426 for (i
= 0, internal
= section_headers
;
2427 i
< elf_header
.e_shnum
;
2430 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2431 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2432 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2433 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2434 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2435 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2436 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2437 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2438 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2439 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2448 get_64bit_section_headers (file
)
2451 Elf64_External_Shdr
* shdrs
;
2452 Elf64_Internal_Shdr
* internal
;
2455 GET_DATA_ALLOC (elf_header
.e_shoff
,
2456 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2457 shdrs
, Elf64_External_Shdr
*, "section headers");
2459 section_headers
= (Elf_Internal_Shdr
*) malloc
2460 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2462 if (section_headers
== NULL
)
2464 error (_("Out of memory\n"));
2468 for (i
= 0, internal
= section_headers
;
2469 i
< elf_header
.e_shnum
;
2472 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2473 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2474 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2475 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2476 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2477 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2478 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2479 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2480 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2481 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2489 static Elf_Internal_Sym
*
2490 get_32bit_elf_symbols (file
, offset
, number
)
2492 unsigned long offset
;
2493 unsigned long number
;
2495 Elf32_External_Sym
* esyms
;
2496 Elf_Internal_Sym
* isyms
;
2497 Elf_Internal_Sym
* psym
;
2500 GET_DATA_ALLOC (offset
, number
* sizeof (Elf32_External_Sym
),
2501 esyms
, Elf32_External_Sym
*, "symbols");
2503 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2507 error (_("Out of memory\n"));
2513 for (j
= 0, psym
= isyms
;
2517 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2518 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
2519 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
2520 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2521 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2522 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2530 static Elf_Internal_Sym
*
2531 get_64bit_elf_symbols (file
, offset
, number
)
2533 unsigned long offset
;
2534 unsigned long number
;
2536 Elf64_External_Sym
* esyms
;
2537 Elf_Internal_Sym
* isyms
;
2538 Elf_Internal_Sym
* psym
;
2541 GET_DATA_ALLOC (offset
, number
* sizeof (Elf64_External_Sym
),
2542 esyms
, Elf64_External_Sym
*, "symbols");
2544 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2548 error (_("Out of memory\n"));
2554 for (j
= 0, psym
= isyms
;
2558 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2559 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2560 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2561 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2562 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
2563 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
2572 get_elf_section_flags (sh_flags
)
2575 static char buff
[32];
2583 flag
= sh_flags
& - sh_flags
;
2588 case SHF_WRITE
: strcat (buff
, "W"); break;
2589 case SHF_ALLOC
: strcat (buff
, "A"); break;
2590 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
2591 case SHF_MERGE
: strcat (buff
, "M"); break;
2592 case SHF_STRINGS
: strcat (buff
, "S"); break;
2593 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
2594 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
2595 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
2598 if (flag
& SHF_MASKOS
)
2601 sh_flags
&= ~ SHF_MASKOS
;
2603 else if (flag
& SHF_MASKPROC
)
2606 sh_flags
&= ~ SHF_MASKPROC
;
2618 process_section_headers (file
)
2621 Elf_Internal_Shdr
* section
;
2624 section_headers
= NULL
;
2626 if (elf_header
.e_shnum
== 0)
2629 printf (_("\nThere are no sections in this file.\n"));
2634 if (do_sections
&& !do_header
)
2635 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2636 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
2640 if (! get_32bit_section_headers (file
))
2643 else if (! get_64bit_section_headers (file
))
2646 /* Read in the string table, so that we have names to display. */
2647 section
= section_headers
+ elf_header
.e_shstrndx
;
2649 if (section
->sh_size
!= 0)
2651 unsigned long string_table_offset
;
2653 string_table_offset
= section
->sh_offset
;
2655 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2656 string_table
, char *, "string table");
2659 /* Scan the sections for the dynamic symbol table
2660 and dynamic string table and debug sections. */
2661 dynamic_symbols
= NULL
;
2662 dynamic_strings
= NULL
;
2663 dynamic_syminfo
= NULL
;
2665 for (i
= 0, section
= section_headers
;
2666 i
< elf_header
.e_shnum
;
2669 char * name
= SECTION_NAME (section
);
2671 if (section
->sh_type
== SHT_DYNSYM
)
2673 if (dynamic_symbols
!= NULL
)
2675 error (_("File contains multiple dynamic symbol tables\n"));
2679 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
2681 GET_ELF_SYMBOLS (file
, section
->sh_offset
, num_dynamic_syms
);
2683 else if (section
->sh_type
== SHT_STRTAB
2684 && strcmp (name
, ".dynstr") == 0)
2686 if (dynamic_strings
!= NULL
)
2688 error (_("File contains multiple dynamic string tables\n"));
2692 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2693 dynamic_strings
, char *, "dynamic strings");
2695 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
2696 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
)
2697 && strncmp (name
, ".debug_", 7) == 0)
2702 || (do_debug_info
&& (strcmp (name
, "info") == 0))
2703 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
2704 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
2705 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
2706 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
2708 request_dump (i
, DEBUG_DUMP
);
2715 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
2719 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2722 printf (_(" [Nr] Name Type Address Offset\n"));
2723 printf (_(" Size EntSize Flags Link Info Align\n"));
2726 for (i
= 0, section
= section_headers
;
2727 i
< elf_header
.e_shnum
;
2730 printf (" [%2d] %-17.17s %-15.15s ",
2732 SECTION_NAME (section
),
2733 get_section_type_name (section
->sh_type
));
2737 print_vma (section
->sh_addr
, LONG_HEX
);
2739 printf ( " %6.6lx %6.6lx %2.2lx",
2740 (unsigned long) section
->sh_offset
,
2741 (unsigned long) section
->sh_size
,
2742 (unsigned long) section
->sh_entsize
);
2744 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
2746 printf (" %2ld %3lx %ld\n",
2747 (unsigned long) section
->sh_link
,
2748 (unsigned long) section
->sh_info
,
2749 (unsigned long) section
->sh_addralign
);
2754 print_vma (section
->sh_addr
, LONG_HEX
);
2755 printf (" %8.8lx", section
->sh_offset
);
2757 print_vma (section
->sh_size
, LONG_HEX
);
2759 print_vma (section
->sh_entsize
, LONG_HEX
);
2761 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
2763 printf (" %2ld %3lx %ld\n",
2764 (unsigned long) section
->sh_link
,
2765 (unsigned long) section
->sh_info
,
2766 (unsigned long) section
->sh_addralign
);
2770 printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2771 printf (_(" I (info), L (link order), O (extra OS processing required)\n"));
2772 printf (_(" o (os specific), p (processor specific) x (unknown)\n"));
2777 /* Process the reloc section. */
2779 process_relocs (file
)
2782 unsigned long rel_size
;
2783 unsigned long rel_offset
;
2789 if (do_using_dynamic
)
2791 int is_rela
= FALSE
;
2796 if (dynamic_info
[DT_REL
])
2798 rel_offset
= dynamic_info
[DT_REL
];
2799 rel_size
= dynamic_info
[DT_RELSZ
];
2802 else if (dynamic_info
[DT_RELA
])
2804 rel_offset
= dynamic_info
[DT_RELA
];
2805 rel_size
= dynamic_info
[DT_RELASZ
];
2808 else if (dynamic_info
[DT_JMPREL
])
2810 rel_offset
= dynamic_info
[DT_JMPREL
];
2811 rel_size
= dynamic_info
[DT_PLTRELSZ
];
2813 switch (dynamic_info
[DT_PLTREL
])
2830 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2831 rel_offset
, rel_size
);
2833 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
2834 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
2837 printf (_("\nThere are no dynamic relocations in this file.\n"));
2841 Elf32_Internal_Shdr
* section
;
2845 for (i
= 0, section
= section_headers
;
2846 i
< elf_header
.e_shnum
;
2849 if ( section
->sh_type
!= SHT_RELA
2850 && section
->sh_type
!= SHT_REL
)
2853 rel_offset
= section
->sh_offset
;
2854 rel_size
= section
->sh_size
;
2858 Elf32_Internal_Shdr
* strsec
;
2859 Elf32_Internal_Shdr
* symsec
;
2860 Elf_Internal_Sym
* symtab
;
2863 unsigned long nsyms
;
2865 printf (_("\nRelocation section "));
2867 if (string_table
== NULL
)
2868 printf ("%d", section
->sh_name
);
2870 printf ("'%s'", SECTION_NAME (section
));
2872 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2873 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
2875 symsec
= section_headers
+ section
->sh_link
;
2877 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
2878 symtab
= GET_ELF_SYMBOLS (file
, symsec
->sh_offset
, nsyms
);
2883 strsec
= section_headers
+ symsec
->sh_link
;
2885 GET_DATA_ALLOC (strsec
->sh_offset
, strsec
->sh_size
, strtab
,
2886 char *, "string table");
2888 is_rela
= section
->sh_type
== SHT_RELA
;
2890 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
);
2900 printf (_("\nThere are no relocations in this file.\n"));
2908 dynamic_segment_mips_val (entry
)
2909 Elf_Internal_Dyn
* entry
;
2911 switch (entry
->d_tag
)
2914 if (entry
->d_un
.d_val
== 0)
2918 static const char * opts
[] =
2920 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2921 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2922 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2923 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2928 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
2929 if (entry
->d_un
.d_val
& (1 << cnt
))
2931 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
2938 case DT_MIPS_IVERSION
:
2939 if (dynamic_strings
!= NULL
)
2940 printf ("Interface Version: %s\n",
2941 dynamic_strings
+ entry
->d_un
.d_val
);
2943 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
2946 case DT_MIPS_TIME_STAMP
:
2951 time_t time
= entry
->d_un
.d_val
;
2952 tmp
= gmtime (&time
);
2953 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
2954 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
2955 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
2956 printf ("Time Stamp: %s\n", timebuf
);
2960 case DT_MIPS_RLD_VERSION
:
2961 case DT_MIPS_LOCAL_GOTNO
:
2962 case DT_MIPS_CONFLICTNO
:
2963 case DT_MIPS_LIBLISTNO
:
2964 case DT_MIPS_SYMTABNO
:
2965 case DT_MIPS_UNREFEXTNO
:
2966 case DT_MIPS_HIPAGENO
:
2967 case DT_MIPS_DELTA_CLASS_NO
:
2968 case DT_MIPS_DELTA_INSTANCE_NO
:
2969 case DT_MIPS_DELTA_RELOC_NO
:
2970 case DT_MIPS_DELTA_SYM_NO
:
2971 case DT_MIPS_DELTA_CLASSSYM_NO
:
2972 case DT_MIPS_COMPACT_SIZE
:
2973 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
2977 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
2983 dynamic_segment_parisc_val (entry
)
2984 Elf_Internal_Dyn
* entry
;
2986 switch (entry
->d_tag
)
2988 case DT_HP_DLD_FLAGS
:
2997 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
2998 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
2999 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
3000 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
3001 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
3002 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
3003 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
3004 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
3005 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
3006 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
3007 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
3011 bfd_vma val
= entry
->d_un
.d_val
;
3013 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
3014 if (val
& flags
[cnt
].bit
)
3018 fputs (flags
[cnt
].str
, stdout
);
3020 val
^= flags
[cnt
].bit
;
3023 if (val
!= 0 || first
)
3027 print_vma (val
, HEX
);
3033 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
3039 get_32bit_dynamic_segment (file
)
3042 Elf32_External_Dyn
* edyn
;
3043 Elf_Internal_Dyn
* entry
;
3046 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
3047 edyn
, Elf32_External_Dyn
*, "dynamic segment");
3049 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3050 how large this .dynamic is now. We can do this even before the byte
3051 swapping since the DT_NULL tag is recognizable. */
3053 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3056 dynamic_segment
= (Elf_Internal_Dyn
*)
3057 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3059 if (dynamic_segment
== NULL
)
3061 error (_("Out of memory\n"));
3066 for (i
= 0, entry
= dynamic_segment
;
3070 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
3071 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
3080 get_64bit_dynamic_segment (file
)
3083 Elf64_External_Dyn
* edyn
;
3084 Elf_Internal_Dyn
* entry
;
3087 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
3088 edyn
, Elf64_External_Dyn
*, "dynamic segment");
3090 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3091 how large this .dynamic is now. We can do this even before the byte
3092 swapping since the DT_NULL tag is recognizable. */
3094 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3097 dynamic_segment
= (Elf_Internal_Dyn
*)
3098 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3100 if (dynamic_segment
== NULL
)
3102 error (_("Out of memory\n"));
3107 for (i
= 0, entry
= dynamic_segment
;
3111 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
3112 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
3121 get_dynamic_flags (flags
)
3124 static char buff
[64];
3129 flag
= flags
& - flags
;
3134 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
3135 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
3136 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
3137 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
3138 default: strcat (buff
, "unknown "); break;
3144 /* Parse and display the contents of the dynamic segment. */
3146 process_dynamic_segment (file
)
3149 Elf_Internal_Dyn
* entry
;
3152 if (dynamic_size
== 0)
3155 printf (_("\nThere is no dynamic segment in this file.\n"));
3162 if (! get_32bit_dynamic_segment (file
))
3165 else if (! get_64bit_dynamic_segment (file
))
3168 /* Find the appropriate symbol table. */
3169 if (dynamic_symbols
== NULL
)
3171 for (i
= 0, entry
= dynamic_segment
;
3175 unsigned long offset
;
3177 if (entry
->d_tag
!= DT_SYMTAB
)
3180 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
3182 /* Since we do not know how big the symbol table is,
3183 we default to reading in the entire file (!) and
3184 processing that. This is overkill, I know, but it
3186 offset
= entry
->d_un
.d_val
- loadaddr
;
3188 if (fseek (file
, 0, SEEK_END
))
3189 error (_("Unable to seek to end of file!"));
3192 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf32_External_Sym
);
3194 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf64_External_Sym
);
3196 if (num_dynamic_syms
< 1)
3198 error (_("Unable to determine the number of symbols to load\n"));
3202 dynamic_symbols
= GET_ELF_SYMBOLS (file
, offset
, num_dynamic_syms
);
3206 /* Similarly find a string table. */
3207 if (dynamic_strings
== NULL
)
3209 for (i
= 0, entry
= dynamic_segment
;
3213 unsigned long offset
;
3216 if (entry
->d_tag
!= DT_STRTAB
)
3219 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
3221 /* Since we do not know how big the string table is,
3222 we default to reading in the entire file (!) and
3223 processing that. This is overkill, I know, but it
3226 offset
= entry
->d_un
.d_val
- loadaddr
;
3227 if (fseek (file
, 0, SEEK_END
))
3228 error (_("Unable to seek to end of file\n"));
3229 str_tab_len
= ftell (file
) - offset
;
3231 if (str_tab_len
< 1)
3234 (_("Unable to determine the length of the dynamic string table\n"));
3238 GET_DATA_ALLOC (offset
, str_tab_len
, dynamic_strings
, char *,
3239 "dynamic string table");
3245 /* And find the syminfo section if available. */
3246 if (dynamic_syminfo
== NULL
)
3248 unsigned int syminsz
= 0;
3250 for (i
= 0, entry
= dynamic_segment
;
3254 if (entry
->d_tag
== DT_SYMINENT
)
3256 /* Note: these braces are necessary to avoid a syntax
3257 error from the SunOS4 C compiler. */
3258 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
3260 else if (entry
->d_tag
== DT_SYMINSZ
)
3261 syminsz
= entry
->d_un
.d_val
;
3262 else if (entry
->d_tag
== DT_SYMINFO
)
3263 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
3266 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
3268 Elf_External_Syminfo
* extsyminfo
;
3269 Elf_Internal_Syminfo
* syminfo
;
3271 /* There is a syminfo section. Read the data. */
3272 GET_DATA_ALLOC (dynamic_syminfo_offset
, syminsz
, extsyminfo
,
3273 Elf_External_Syminfo
*, "symbol information");
3275 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
3276 if (dynamic_syminfo
== NULL
)
3278 error (_("Out of memory\n"));
3282 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
3283 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
3286 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
3287 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
3294 if (do_dynamic
&& dynamic_addr
)
3295 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3296 dynamic_addr
, (long) dynamic_size
);
3298 printf (_(" Tag Type Name/Value\n"));
3300 for (i
= 0, entry
= dynamic_segment
;
3309 print_vma (entry
->d_tag
, FULL_HEX
);
3310 dtype
= get_dynamic_type (entry
->d_tag
);
3311 printf (" (%s)%*s", dtype
,
3312 ((is_32bit_elf
? 27 : 19)
3313 - (int) strlen (dtype
)),
3317 switch (entry
->d_tag
)
3321 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
3328 if (entry
->d_tag
== DT_AUXILIARY
)
3329 printf (_("Auxiliary library"));
3331 printf (_("Filter library"));
3333 if (dynamic_strings
)
3334 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
3338 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3347 printf (_("Flags:"));
3348 if (entry
->d_un
.d_val
== 0)
3349 printf (_(" None\n"));
3352 unsigned long int val
= entry
->d_un
.d_val
;
3353 if (val
& DTF_1_PARINIT
)
3355 printf (" PARINIT");
3356 val
^= DTF_1_PARINIT
;
3359 printf (" %lx", val
);
3368 printf (_("Flags:"));
3369 if (entry
->d_un
.d_val
== 0)
3370 printf (_(" None\n"));
3373 unsigned long int val
= entry
->d_un
.d_val
;
3374 if (val
& DF_P1_LAZYLOAD
)
3376 printf (" LAZYLOAD");
3377 val
^= DF_P1_LAZYLOAD
;
3379 if (val
& DF_P1_GROUPPERM
)
3381 printf (" GROUPPERM");
3382 val
^= DF_P1_GROUPPERM
;
3385 printf (" %lx", val
);
3394 printf (_("Flags:"));
3395 if (entry
->d_un
.d_val
== 0)
3396 printf (_(" None\n"));
3399 unsigned long int val
= entry
->d_un
.d_val
;
3405 if (val
& DF_1_GLOBAL
)
3410 if (val
& DF_1_GROUP
)
3415 if (val
& DF_1_NODELETE
)
3417 printf (" NODELETE");
3418 val
^= DF_1_NODELETE
;
3420 if (val
& DF_1_LOADFLTR
)
3422 printf (" LOADFLTR");
3423 val
^= DF_1_LOADFLTR
;
3425 if (val
& DF_1_INITFIRST
)
3427 printf (" INITFIRST");
3428 val
^= DF_1_INITFIRST
;
3430 if (val
& DF_1_NOOPEN
)
3435 if (val
& DF_1_ORIGIN
)
3440 if (val
& DF_1_DIRECT
)
3445 if (val
& DF_1_TRANS
)
3450 if (val
& DF_1_INTERPOSE
)
3452 printf (" INTERPOSE");
3453 val
^= DF_1_INTERPOSE
;
3456 printf (" %lx", val
);
3464 puts (get_dynamic_type (entry
->d_un
.d_val
));
3483 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
3489 if (dynamic_strings
== NULL
)
3492 name
= dynamic_strings
+ entry
->d_un
.d_val
;
3496 switch (entry
->d_tag
)
3499 printf (_("Shared library: [%s]"), name
);
3501 if (strcmp (name
, program_interpreter
) == 0)
3502 printf (_(" program interpreter"));
3506 printf (_("Library soname: [%s]"), name
);
3510 printf (_("Library rpath: [%s]"), name
);
3514 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3519 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3535 case DT_INIT_ARRAYSZ
:
3536 case DT_FINI_ARRAYSZ
:
3539 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
3540 printf (" (bytes)\n");
3550 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
3563 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
3567 name
= dynamic_strings
+ entry
->d_un
.d_val
;
3571 printf (_("Not needed object: [%s]\n"), name
);
3576 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3582 /* The value of this entry is ignored. */
3586 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
3587 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
3592 switch (elf_header
.e_machine
)
3595 case EM_MIPS_RS4_BE
:
3596 dynamic_segment_mips_val (entry
);
3599 dynamic_segment_parisc_val (entry
);
3602 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3614 get_ver_flags (flags
)
3617 static char buff
[32];
3624 if (flags
& VER_FLG_BASE
)
3625 strcat (buff
, "BASE ");
3627 if (flags
& VER_FLG_WEAK
)
3629 if (flags
& VER_FLG_BASE
)
3630 strcat (buff
, "| ");
3632 strcat (buff
, "WEAK ");
3635 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
3636 strcat (buff
, "| <unknown>");
3641 /* Display the contents of the version sections. */
3643 process_version_sections (file
)
3646 Elf32_Internal_Shdr
* section
;
3653 for (i
= 0, section
= section_headers
;
3654 i
< elf_header
.e_shnum
;
3657 switch (section
->sh_type
)
3659 case SHT_GNU_verdef
:
3661 Elf_External_Verdef
* edefs
;
3668 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3669 SECTION_NAME (section
), section
->sh_info
);
3671 printf (_(" Addr: 0x"));
3672 printf_vma (section
->sh_addr
);
3673 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3674 (unsigned long) section
->sh_offset
, section
->sh_link
,
3675 SECTION_NAME (section_headers
+ section
->sh_link
));
3677 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
3678 edefs
, Elf_External_Verdef
*,
3679 "version definition section");
3681 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
3684 Elf_External_Verdef
* edef
;
3685 Elf_Internal_Verdef ent
;
3686 Elf_External_Verdaux
* eaux
;
3687 Elf_Internal_Verdaux aux
;
3691 vstart
= ((char *) edefs
) + idx
;
3693 edef
= (Elf_External_Verdef
*) vstart
;
3695 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
3696 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
3697 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
3698 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
3699 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
3700 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
3701 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
3703 printf (_(" %#06x: Rev: %d Flags: %s"),
3704 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
3706 printf (_(" Index: %d Cnt: %d "),
3707 ent
.vd_ndx
, ent
.vd_cnt
);
3709 vstart
+= ent
.vd_aux
;
3711 eaux
= (Elf_External_Verdaux
*) vstart
;
3713 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
3714 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
3716 if (dynamic_strings
)
3717 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
3719 printf (_("Name index: %ld\n"), aux
.vda_name
);
3721 isum
= idx
+ ent
.vd_aux
;
3723 for (j
= 1; j
< ent
.vd_cnt
; j
++)
3725 isum
+= aux
.vda_next
;
3726 vstart
+= aux
.vda_next
;
3728 eaux
= (Elf_External_Verdaux
*) vstart
;
3730 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
3731 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
3733 if (dynamic_strings
)
3734 printf (_(" %#06x: Parent %d: %s\n"),
3735 isum
, j
, dynamic_strings
+ aux
.vda_name
);
3737 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3738 isum
, j
, aux
.vda_name
);
3748 case SHT_GNU_verneed
:
3750 Elf_External_Verneed
* eneed
;
3756 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3757 SECTION_NAME (section
), section
->sh_info
);
3759 printf (_(" Addr: 0x"));
3760 printf_vma (section
->sh_addr
);
3761 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3762 (unsigned long) section
->sh_offset
, section
->sh_link
,
3763 SECTION_NAME (section_headers
+ section
->sh_link
));
3765 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
3766 eneed
, Elf_External_Verneed
*,
3767 "version need section");
3769 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
3771 Elf_External_Verneed
* entry
;
3772 Elf_Internal_Verneed ent
;
3777 vstart
= ((char *) eneed
) + idx
;
3779 entry
= (Elf_External_Verneed
*) vstart
;
3781 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
3782 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
3783 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
3784 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
3785 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
3787 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
3789 if (dynamic_strings
)
3790 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
3792 printf (_(" File: %lx"), ent
.vn_file
);
3794 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
3796 vstart
+= ent
.vn_aux
;
3798 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
3800 Elf_External_Vernaux
* eaux
;
3801 Elf_Internal_Vernaux aux
;
3803 eaux
= (Elf_External_Vernaux
*) vstart
;
3805 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
3806 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
3807 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
3808 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
3809 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
3811 if (dynamic_strings
)
3812 printf (_(" %#06x: Name: %s"),
3813 isum
, dynamic_strings
+ aux
.vna_name
);
3815 printf (_(" %#06x: Name index: %lx"),
3816 isum
, aux
.vna_name
);
3818 printf (_(" Flags: %s Version: %d\n"),
3819 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
3821 isum
+= aux
.vna_next
;
3822 vstart
+= aux
.vna_next
;
3832 case SHT_GNU_versym
:
3834 Elf32_Internal_Shdr
* link_section
;
3837 unsigned char * edata
;
3838 unsigned short * data
;
3840 Elf_Internal_Sym
* symbols
;
3841 Elf32_Internal_Shdr
* string_sec
;
3843 link_section
= section_headers
+ section
->sh_link
;
3844 total
= section
->sh_size
/ section
->sh_entsize
;
3848 symbols
= GET_ELF_SYMBOLS (file
, link_section
->sh_offset
,
3849 link_section
->sh_size
/ link_section
->sh_entsize
);
3851 string_sec
= section_headers
+ link_section
->sh_link
;
3853 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
3854 strtab
, char *, "version string table");
3856 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3857 SECTION_NAME (section
), total
);
3859 printf (_(" Addr: "));
3860 printf_vma (section
->sh_addr
);
3861 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3862 (unsigned long) section
->sh_offset
, section
->sh_link
,
3863 SECTION_NAME (link_section
));
3865 GET_DATA_ALLOC (version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
3867 total
* sizeof (short), edata
,
3868 unsigned char *, "version symbol data");
3870 data
= (unsigned short *) malloc (total
* sizeof (short));
3872 for (cnt
= total
; cnt
--;)
3873 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
3878 for (cnt
= 0; cnt
< total
; cnt
+= 4)
3883 printf (" %03x:", cnt
);
3885 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
3886 switch (data
[cnt
+ j
])
3889 fputs (_(" 0 (*local*) "), stdout
);
3893 fputs (_(" 1 (*global*) "), stdout
);
3897 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
3898 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
3900 if (symbols
[cnt
+ j
].st_shndx
< SHN_LORESERVE
3901 && section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
3904 /* We must test both. */
3905 Elf_Internal_Verneed ivn
;
3906 unsigned long offset
;
3908 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
3913 Elf_External_Verneed evn
;
3914 Elf_External_Vernaux evna
;
3915 Elf_Internal_Vernaux ivna
;
3916 unsigned long vna_off
;
3918 GET_DATA (offset
, evn
, "version need");
3920 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
3921 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
3923 vna_off
= offset
+ ivn
.vn_aux
;
3927 GET_DATA (vna_off
, evna
,
3928 "version need aux (1)");
3930 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
3931 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
3933 vna_off
+= ivna
.vna_next
;
3935 while (ivna
.vna_other
!= data
[cnt
+ j
]
3936 && ivna
.vna_next
!= 0);
3938 if (ivna
.vna_other
== data
[cnt
+ j
])
3940 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
3942 name
= strtab
+ ivna
.vna_name
;
3943 nn
+= printf ("(%s%-*s",
3945 12 - (int) strlen (name
),
3949 else if (ivn
.vn_next
== 0)
3951 if (data
[cnt
+ j
] != 0x8001)
3953 Elf_Internal_Verdef ivd
;
3954 Elf_External_Verdef evd
;
3956 offset
= version_info
3957 [DT_VERSIONTAGIDX (DT_VERDEF
)]
3962 GET_DATA (offset
, evd
,
3963 "version definition");
3965 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
3966 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
3968 offset
+= ivd
.vd_next
;
3971 != (data
[cnt
+ j
] & 0x7fff)
3972 && ivd
.vd_next
!= 0);
3975 == (data
[cnt
+ j
] & 0x7fff))
3977 Elf_External_Verdaux evda
;
3978 Elf_Internal_Verdaux ivda
;
3980 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
3982 GET_DATA (offset
+ ivd
.vd_aux
, evda
,
3983 "version definition aux");
3986 BYTE_GET (evda
.vda_name
);
3988 name
= strtab
+ ivda
.vda_name
;
3992 12 - (int) strlen (name
),
4000 offset
+= ivn
.vn_next
;
4002 while (ivn
.vn_next
);
4004 else if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
4006 Elf_Internal_Verneed ivn
;
4007 unsigned long offset
;
4009 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
4014 Elf_Internal_Vernaux ivna
;
4015 Elf_External_Verneed evn
;
4016 Elf_External_Vernaux evna
;
4017 unsigned long a_off
;
4019 GET_DATA (offset
, evn
, "version need");
4021 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4022 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4024 a_off
= offset
+ ivn
.vn_aux
;
4028 GET_DATA (a_off
, evna
,
4029 "version need aux (2)");
4031 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4032 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4034 a_off
+= ivna
.vna_next
;
4036 while (ivna
.vna_other
!= data
[cnt
+ j
]
4037 && ivna
.vna_next
!= 0);
4039 if (ivna
.vna_other
== data
[cnt
+ j
])
4041 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4043 name
= strtab
+ ivna
.vna_name
;
4044 nn
+= printf ("(%s%-*s",
4046 12 - (int) strlen (name
),
4051 offset
+= ivn
.vn_next
;
4053 while (ivn
.vn_next
);
4055 else if (data
[cnt
+ j
] != 0x8001)
4057 Elf_Internal_Verdef ivd
;
4058 Elf_External_Verdef evd
;
4059 unsigned long offset
;
4061 offset
= version_info
4062 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
4066 GET_DATA (offset
, evd
, "version def");
4068 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
4069 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
4071 offset
+= ivd
.vd_next
;
4073 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
4074 && ivd
.vd_next
!= 0);
4076 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
4078 Elf_External_Verdaux evda
;
4079 Elf_Internal_Verdaux ivda
;
4081 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
4083 GET_DATA (offset
- ivd
.vd_next
+ ivd
.vd_aux
,
4084 evda
, "version def aux");
4086 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
4088 name
= strtab
+ ivda
.vda_name
;
4089 nn
+= printf ("(%s%-*s",
4091 12 - (int) strlen (name
),
4097 printf ("%*c", 18 - nn
, ' ');
4115 printf (_("\nNo version information found in this file.\n"));
4121 get_symbol_binding (binding
)
4122 unsigned int binding
;
4124 static char buff
[32];
4128 case STB_LOCAL
: return "LOCAL";
4129 case STB_GLOBAL
: return "GLOBAL";
4130 case STB_WEAK
: return "WEAK";
4132 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
4133 sprintf (buff
, _("<processor specific>: %d"), binding
);
4134 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
4135 sprintf (buff
, _("<OS specific>: %d"), binding
);
4137 sprintf (buff
, _("<unknown>: %d"), binding
);
4143 get_symbol_type (type
)
4146 static char buff
[32];
4150 case STT_NOTYPE
: return "NOTYPE";
4151 case STT_OBJECT
: return "OBJECT";
4152 case STT_FUNC
: return "FUNC";
4153 case STT_SECTION
: return "SECTION";
4154 case STT_FILE
: return "FILE";
4155 case STT_COMMON
: return "COMMON";
4157 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
4159 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
4160 return "THUMB_FUNC";
4162 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
4165 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
4166 return "PARISC_MILLI";
4168 sprintf (buff
, _("<processor specific>: %d"), type
);
4170 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
4172 if (elf_header
.e_machine
== EM_PARISC
)
4174 if (type
== STT_HP_OPAQUE
)
4176 if (type
== STT_HP_STUB
)
4180 sprintf (buff
, _("<OS specific>: %d"), type
);
4183 sprintf (buff
, _("<unknown>: %d"), type
);
4189 get_symbol_visibility (visibility
)
4190 unsigned int visibility
;
4194 case STV_DEFAULT
: return "DEFAULT";
4195 case STV_INTERNAL
: return "INTERNAL";
4196 case STV_HIDDEN
: return "HIDDEN";
4197 case STV_PROTECTED
: return "PROTECTED";
4203 get_symbol_index_type (type
)
4208 case SHN_UNDEF
: return "UND";
4209 case SHN_ABS
: return "ABS";
4210 case SHN_COMMON
: return "COM";
4212 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
4214 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
4216 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
4220 static char buff
[32];
4222 sprintf (buff
, "%3d", type
);
4229 get_dynamic_data (file
, number
)
4231 unsigned int number
;
4236 e_data
= (char *) malloc (number
* 4);
4240 error (_("Out of memory\n"));
4244 if (fread (e_data
, 4, number
, file
) != number
)
4246 error (_("Unable to read in dynamic data\n"));
4250 i_data
= (int *) malloc (number
* sizeof (* i_data
));
4254 error (_("Out of memory\n"));
4260 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
4267 /* Dump the symbol table */
4269 process_symbol_table (file
)
4272 Elf32_Internal_Shdr
* section
;
4277 int * buckets
= NULL
;
4278 int * chains
= NULL
;
4280 if (! do_syms
&& !do_histogram
)
4283 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
4286 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
4288 error (_("Unable to seek to start of dynamic information"));
4292 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
4294 error (_("Failed to read in number of buckets\n"));
4298 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
4300 error (_("Failed to read in number of chains\n"));
4304 nbuckets
= byte_get (nb
, 4);
4305 nchains
= byte_get (nc
, 4);
4307 buckets
= get_dynamic_data (file
, nbuckets
);
4308 chains
= get_dynamic_data (file
, nchains
);
4310 if (buckets
== NULL
|| chains
== NULL
)
4315 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
4320 printf (_("\nSymbol table for image:\n"));
4322 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4324 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4326 for (hn
= 0; hn
< nbuckets
; hn
++)
4331 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
4333 Elf_Internal_Sym
* psym
;
4335 psym
= dynamic_symbols
+ si
;
4337 printf (" %3d %3d: ", si
, hn
);
4338 print_vma (psym
->st_value
, LONG_HEX
);
4340 print_vma (psym
->st_size
, DEC_5
);
4342 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
4343 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
4344 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
4345 printf (" %3.3s", get_symbol_index_type (psym
->st_shndx
));
4346 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
4350 else if (do_syms
&& !do_using_dynamic
)
4354 for (i
= 0, section
= section_headers
;
4355 i
< elf_header
.e_shnum
;
4360 Elf_Internal_Sym
* symtab
;
4361 Elf_Internal_Sym
* psym
;
4364 if ( section
->sh_type
!= SHT_SYMTAB
4365 && section
->sh_type
!= SHT_DYNSYM
)
4368 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4369 SECTION_NAME (section
),
4370 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
4372 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4374 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4376 symtab
= GET_ELF_SYMBOLS (file
, section
->sh_offset
,
4377 section
->sh_size
/ section
->sh_entsize
);
4381 if (section
->sh_link
== elf_header
.e_shstrndx
)
4382 strtab
= string_table
;
4385 Elf32_Internal_Shdr
* string_sec
;
4387 string_sec
= section_headers
+ section
->sh_link
;
4389 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
4390 strtab
, char *, "string table");
4393 for (si
= 0, psym
= symtab
;
4394 si
< section
->sh_size
/ section
->sh_entsize
;
4397 printf ("%6d: ", si
);
4398 print_vma (psym
->st_value
, LONG_HEX
);
4400 print_vma (psym
->st_size
, DEC_5
);
4401 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
4402 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
4403 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
4404 printf (" %4s", get_symbol_index_type (psym
->st_shndx
));
4405 printf (" %s", strtab
+ psym
->st_name
);
4407 if (section
->sh_type
== SHT_DYNSYM
&&
4408 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
4410 unsigned char data
[2];
4411 unsigned short vers_data
;
4412 unsigned long offset
;
4416 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
4419 GET_DATA (offset
+ si
* sizeof (vers_data
), data
,
4422 vers_data
= byte_get (data
, 2);
4424 is_nobits
= psym
->st_shndx
< SHN_LORESERVE
?
4425 (section_headers
[psym
->st_shndx
].sh_type
== SHT_NOBITS
)
4428 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
4430 if ((vers_data
& 0x8000) || vers_data
> 1)
4432 if (is_nobits
|| ! check_def
)
4434 Elf_External_Verneed evn
;
4435 Elf_Internal_Verneed ivn
;
4436 Elf_Internal_Vernaux ivna
;
4438 /* We must test both. */
4439 offset
= version_info
4440 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
4444 unsigned long vna_off
;
4446 GET_DATA (offset
, evn
, "version need");
4448 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4449 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4451 vna_off
= offset
+ ivn
.vn_aux
;
4455 Elf_External_Vernaux evna
;
4457 GET_DATA (vna_off
, evna
,
4458 "version need aux (3)");
4460 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4461 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4462 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4464 vna_off
+= ivna
.vna_next
;
4466 while (ivna
.vna_other
!= vers_data
4467 && ivna
.vna_next
!= 0);
4469 if (ivna
.vna_other
== vers_data
)
4472 offset
+= ivn
.vn_next
;
4474 while (ivn
.vn_next
!= 0);
4476 if (ivna
.vna_other
== vers_data
)
4479 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
4482 else if (! is_nobits
)
4483 error (_("bad dynamic symbol"));
4490 if (vers_data
!= 0x8001)
4492 Elf_Internal_Verdef ivd
;
4493 Elf_Internal_Verdaux ivda
;
4494 Elf_External_Verdaux evda
;
4495 unsigned long offset
;
4498 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
4503 Elf_External_Verdef evd
;
4505 GET_DATA (offset
, evd
, "version def");
4507 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
4508 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
4509 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
4511 offset
+= ivd
.vd_next
;
4513 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
4514 && ivd
.vd_next
!= 0);
4516 offset
-= ivd
.vd_next
;
4517 offset
+= ivd
.vd_aux
;
4519 GET_DATA (offset
, evda
, "version def aux");
4521 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
4523 if (psym
->st_name
!= ivda
.vda_name
)
4524 printf ((vers_data
& 0x8000)
4526 strtab
+ ivda
.vda_name
);
4536 if (strtab
!= string_table
)
4542 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4544 if (do_histogram
&& buckets
!= NULL
)
4551 int nzero_counts
= 0;
4554 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4556 printf (_(" Length Number %% of total Coverage\n"));
4558 lengths
= (int *) calloc (nbuckets
, sizeof (int));
4559 if (lengths
== NULL
)
4561 error (_("Out of memory"));
4564 for (hn
= 0; hn
< nbuckets
; ++hn
)
4569 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
4572 if (maxlength
< ++lengths
[hn
])
4577 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
4580 error (_("Out of memory"));
4584 for (hn
= 0; hn
< nbuckets
; ++hn
)
4585 ++ counts
[lengths
[hn
]];
4589 printf (" 0 %-10d (%5.1f%%)\n",
4590 counts
[0], (counts
[0] * 100.0) / nbuckets
);
4591 for (si
= 1; si
<= maxlength
; ++si
)
4593 nzero_counts
+= counts
[si
] * si
;
4594 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4595 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
4596 (nzero_counts
* 100.0) / nsyms
);
4604 if (buckets
!= NULL
)
4614 process_syminfo (file
)
4615 FILE * file ATTRIBUTE_UNUSED
;
4619 if (dynamic_syminfo
== NULL
4621 /* No syminfo, this is ok. */
4624 /* There better should be a dynamic symbol section. */
4625 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
4629 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4630 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
4632 printf (_(" Num: Name BoundTo Flags\n"));
4633 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
4635 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
4637 printf ("%4d: %-30s ", i
,
4638 dynamic_strings
+ dynamic_symbols
[i
].st_name
);
4640 switch (dynamic_syminfo
[i
].si_boundto
)
4642 case SYMINFO_BT_SELF
:
4643 fputs ("SELF ", stdout
);
4645 case SYMINFO_BT_PARENT
:
4646 fputs ("PARENT ", stdout
);
4649 if (dynamic_syminfo
[i
].si_boundto
> 0
4650 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
4653 + dynamic_segment
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
4655 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
4659 if (flags
& SYMINFO_FLG_DIRECT
)
4661 if (flags
& SYMINFO_FLG_PASSTHRU
)
4662 printf (" PASSTHRU");
4663 if (flags
& SYMINFO_FLG_COPY
)
4665 if (flags
& SYMINFO_FLG_LAZYLOAD
)
4666 printf (" LAZYLOAD");
4674 #ifdef SUPPORT_DISASSEMBLY
4676 disassemble_section (section
, file
)
4677 Elf32_Internal_Shdr
* section
;
4680 printf (_("\nAssembly dump of section %s\n"),
4681 SECTION_NAME (section
));
4683 /* XXX -- to be done --- XXX */
4690 dump_section (section
, file
)
4691 Elf32_Internal_Shdr
* section
;
4694 bfd_size_type bytes
;
4696 unsigned char * data
;
4697 unsigned char * start
;
4699 bytes
= section
->sh_size
;
4703 printf (_("\nSection '%s' has no data to dump.\n"),
4704 SECTION_NAME (section
));
4708 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
4710 addr
= section
->sh_addr
;
4712 GET_DATA_ALLOC (section
->sh_offset
, bytes
, start
, unsigned char *,
4723 lbytes
= (bytes
> 16 ? 16 : bytes
);
4725 printf (" 0x%8.8lx ", (unsigned long) addr
);
4727 switch (elf_header
.e_ident
[EI_DATA
])
4731 for (j
= 15; j
>= 0; j
--)
4734 printf ("%2.2x", data
[j
]);
4744 for (j
= 0; j
< 16; j
++)
4747 printf ("%2.2x", data
[j
]);
4757 for (j
= 0; j
< lbytes
; j
++)
4760 if (k
>= ' ' && k
< 0x80)
4779 static unsigned long int
4780 read_leb128 (data
, length_return
, sign
)
4781 unsigned char * data
;
4782 int * length_return
;
4785 unsigned long int result
= 0;
4786 unsigned int num_read
= 0;
4795 result
|= (byte
& 0x7f) << shift
;
4800 while (byte
& 0x80);
4802 if (length_return
!= NULL
)
4803 * length_return
= num_read
;
4805 if (sign
&& (shift
< 32) && (byte
& 0x40))
4806 result
|= -1 << shift
;
4811 typedef struct State_Machine_Registers
4813 unsigned long address
;
4816 unsigned int column
;
4820 /* This variable hold the number of the last entry seen
4821 in the File Table. */
4822 unsigned int last_file_entry
;
4825 static SMR state_machine_regs
;
4828 reset_state_machine (is_stmt
)
4831 state_machine_regs
.address
= 0;
4832 state_machine_regs
.file
= 1;
4833 state_machine_regs
.line
= 1;
4834 state_machine_regs
.column
= 0;
4835 state_machine_regs
.is_stmt
= is_stmt
;
4836 state_machine_regs
.basic_block
= 0;
4837 state_machine_regs
.end_sequence
= 0;
4838 state_machine_regs
.last_file_entry
= 0;
4841 /* Handled an extend line op. Returns true if this is the end
4844 process_extended_line_op (data
, is_stmt
, pointer_size
)
4845 unsigned char * data
;
4849 unsigned char op_code
;
4852 unsigned char * name
;
4855 len
= read_leb128 (data
, & bytes_read
, 0);
4860 warn (_("badly formed extended line op encountered!"));
4865 op_code
= * data
++;
4867 printf (_(" Extended opcode %d: "), op_code
);
4871 case DW_LNE_end_sequence
:
4872 printf (_("End of Sequence\n\n"));
4873 reset_state_machine (is_stmt
);
4876 case DW_LNE_set_address
:
4877 adr
= byte_get (data
, pointer_size
);
4878 printf (_("set Address to 0x%lx\n"), adr
);
4879 state_machine_regs
.address
= adr
;
4882 case DW_LNE_define_file
:
4883 printf (_(" define new File Table entry\n"));
4884 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4886 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
4888 data
+= strlen (data
) + 1;
4889 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4891 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4893 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4894 printf (_("%s\n\n"), name
);
4898 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
4905 /* Size of pointers in the .debug_line section. This information is not
4906 really present in that section. It's obtained before dumping the debug
4907 sections by doing some pre-scan of the .debug_info section. */
4908 static int debug_line_pointer_size
= 4;
4911 display_debug_lines (section
, start
, file
)
4912 Elf32_Internal_Shdr
* section
;
4913 unsigned char * start
;
4914 FILE * file ATTRIBUTE_UNUSED
;
4916 DWARF2_External_LineInfo
* external
;
4917 DWARF2_Internal_LineInfo info
;
4918 unsigned char * standard_opcodes
;
4919 unsigned char * data
= start
;
4920 unsigned char * end
= start
+ section
->sh_size
;
4921 unsigned char * end_of_sequence
;
4924 printf (_("\nDump of debug contents of section %s:\n\n"),
4925 SECTION_NAME (section
));
4929 external
= (DWARF2_External_LineInfo
*) data
;
4931 /* Check the length of the block. */
4932 info
.li_length
= BYTE_GET (external
->li_length
);
4933 if (info
.li_length
> section
->sh_size
)
4936 (_("The line info appears to be corrupt - the section is too small\n"));
4940 /* Check its version number. */
4941 info
.li_version
= BYTE_GET (external
->li_version
);
4942 if (info
.li_version
!= 2)
4944 warn (_("Only DWARF version 2 line info is currently supported.\n"));
4948 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
4949 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
4950 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
4951 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
4952 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
4953 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
4955 /* Sign extend the line base field. */
4956 info
.li_line_base
<<= 24;
4957 info
.li_line_base
>>= 24;
4959 printf (_(" Length: %ld\n"), info
.li_length
);
4960 printf (_(" DWARF Version: %d\n"), info
.li_version
);
4961 printf (_(" Prolgue Length: %d\n"), info
.li_prologue_length
);
4962 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
4963 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
4964 printf (_(" Line Base: %d\n"), info
.li_line_base
);
4965 printf (_(" Line Range: %d\n"), info
.li_line_range
);
4966 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
4968 end_of_sequence
= data
+ info
.li_length
+ sizeof (info
.li_length
);
4970 reset_state_machine (info
.li_default_is_stmt
);
4972 /* Display the contents of the Opcodes table. */
4973 standard_opcodes
= data
+ sizeof (* external
);
4975 printf (_("\n Opcodes:\n"));
4977 for (i
= 1; i
< info
.li_opcode_base
; i
++)
4978 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
4980 /* Display the contents of the Directory table. */
4981 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
4984 printf (_("\n The Directory Table is empty.\n"));
4987 printf (_("\n The Directory Table:\n"));
4991 printf (_(" %s\n"), data
);
4993 data
+= strlen (data
) + 1;
4997 /* Skip the NUL at the end of the table. */
5000 /* Display the contents of the File Name table. */
5002 printf (_("\n The File Name Table is empty.\n"));
5005 printf (_("\n The File Name Table:\n"));
5006 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5013 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5016 data
+= strlen (data
) + 1;
5018 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5020 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5022 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5024 printf (_("%s\n"), name
);
5028 /* Skip the NUL at the end of the table. */
5031 /* Now display the statements. */
5032 printf (_("\n Line Number Statements:\n"));
5035 while (data
< end_of_sequence
)
5037 unsigned char op_code
;
5041 op_code
= * data
++;
5045 case DW_LNS_extended_op
:
5046 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
5047 debug_line_pointer_size
);
5051 printf (_(" Copy\n"));
5054 case DW_LNS_advance_pc
:
5055 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
5057 state_machine_regs
.address
+= adv
;
5058 printf (_(" Advance PC by %d to %lx\n"), adv
,
5059 state_machine_regs
.address
);
5062 case DW_LNS_advance_line
:
5063 adv
= read_leb128 (data
, & bytes_read
, 1);
5065 state_machine_regs
.line
+= adv
;
5066 printf (_(" Advance Line by %d to %d\n"), adv
,
5067 state_machine_regs
.line
);
5070 case DW_LNS_set_file
:
5071 adv
= read_leb128 (data
, & bytes_read
, 0);
5073 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5075 state_machine_regs
.file
= adv
;
5078 case DW_LNS_set_column
:
5079 adv
= read_leb128 (data
, & bytes_read
, 0);
5081 printf (_(" Set column to %d\n"), adv
);
5082 state_machine_regs
.column
= adv
;
5085 case DW_LNS_negate_stmt
:
5086 adv
= state_machine_regs
.is_stmt
;
5088 printf (_(" Set is_stmt to %d\n"), adv
);
5089 state_machine_regs
.is_stmt
= adv
;
5092 case DW_LNS_set_basic_block
:
5093 printf (_(" Set basic block\n"));
5094 state_machine_regs
.basic_block
= 1;
5097 case DW_LNS_const_add_pc
:
5098 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
5099 * info
.li_min_insn_length
);
5100 state_machine_regs
.address
+= adv
;
5101 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
5102 state_machine_regs
.address
);
5105 case DW_LNS_fixed_advance_pc
:
5106 adv
= byte_get (data
, 2);
5108 state_machine_regs
.address
+= adv
;
5109 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5110 adv
, state_machine_regs
.address
);
5114 op_code
-= info
.li_opcode_base
;
5115 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
5116 state_machine_regs
.address
+= adv
;
5117 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5118 op_code
, adv
, state_machine_regs
.address
);
5119 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
5120 state_machine_regs
.line
+= adv
;
5121 printf (_(" and Line by %d to %d\n"),
5122 adv
, state_machine_regs
.line
);
5133 display_debug_pubnames (section
, start
, file
)
5134 Elf32_Internal_Shdr
* section
;
5135 unsigned char * start
;
5136 FILE * file ATTRIBUTE_UNUSED
;
5138 DWARF2_External_PubNames
* external
;
5139 DWARF2_Internal_PubNames pubnames
;
5140 unsigned char * end
;
5142 end
= start
+ section
->sh_size
;
5144 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
5148 unsigned char * data
;
5149 unsigned long offset
;
5151 external
= (DWARF2_External_PubNames
*) start
;
5153 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
5154 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
5155 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
5156 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
5158 data
= start
+ sizeof (* external
);
5159 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
5161 if (pubnames
.pn_version
!= 2)
5163 warn (_("Only DWARF 2 pubnames are currently supported"));
5167 printf (_(" Length: %ld\n"),
5168 pubnames
.pn_length
);
5169 printf (_(" Version: %d\n"),
5170 pubnames
.pn_version
);
5171 printf (_(" Offset into .debug_info section: %ld\n"),
5172 pubnames
.pn_offset
);
5173 printf (_(" Size of area in .debug_info section: %ld\n"),
5176 printf (_("\n Offset\tName\n"));
5180 offset
= byte_get (data
, 4);
5185 printf (" %ld\t\t%s\n", offset
, data
);
5186 data
+= strlen (data
) + 1;
5189 while (offset
!= 0);
5202 case DW_TAG_padding
: return "DW_TAG_padding";
5203 case DW_TAG_array_type
: return "DW_TAG_array_type";
5204 case DW_TAG_class_type
: return "DW_TAG_class_type";
5205 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
5206 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
5207 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
5208 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
5209 case DW_TAG_label
: return "DW_TAG_label";
5210 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
5211 case DW_TAG_member
: return "DW_TAG_member";
5212 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
5213 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
5214 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
5215 case DW_TAG_string_type
: return "DW_TAG_string_type";
5216 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
5217 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
5218 case DW_TAG_typedef
: return "DW_TAG_typedef";
5219 case DW_TAG_union_type
: return "DW_TAG_union_type";
5220 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
5221 case DW_TAG_variant
: return "DW_TAG_variant";
5222 case DW_TAG_common_block
: return "DW_TAG_common_block";
5223 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
5224 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
5225 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
5226 case DW_TAG_module
: return "DW_TAG_module";
5227 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
5228 case DW_TAG_set_type
: return "DW_TAG_set_type";
5229 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
5230 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
5231 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
5232 case DW_TAG_base_type
: return "DW_TAG_base_type";
5233 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
5234 case DW_TAG_const_type
: return "DW_TAG_const_type";
5235 case DW_TAG_constant
: return "DW_TAG_constant";
5236 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
5237 case DW_TAG_file_type
: return "DW_TAG_file_type";
5238 case DW_TAG_friend
: return "DW_TAG_friend";
5239 case DW_TAG_namelist
: return "DW_TAG_namelist";
5240 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
5241 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
5242 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
5243 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
5244 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
5245 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
5246 case DW_TAG_try_block
: return "DW_TAG_try_block";
5247 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
5248 case DW_TAG_variable
: return "DW_TAG_variable";
5249 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
5250 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
5251 case DW_TAG_format_label
: return "DW_TAG_format_label";
5252 case DW_TAG_function_template
: return "DW_TAG_function_template";
5253 case DW_TAG_class_template
: return "DW_TAG_class_template";
5256 static char buffer
[100];
5258 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
5265 get_AT_name (attribute
)
5266 unsigned long attribute
;
5270 case DW_AT_sibling
: return "DW_AT_sibling";
5271 case DW_AT_location
: return "DW_AT_location";
5272 case DW_AT_name
: return "DW_AT_name";
5273 case DW_AT_ordering
: return "DW_AT_ordering";
5274 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
5275 case DW_AT_byte_size
: return "DW_AT_byte_size";
5276 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
5277 case DW_AT_bit_size
: return "DW_AT_bit_size";
5278 case DW_AT_element_list
: return "DW_AT_element_list";
5279 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
5280 case DW_AT_low_pc
: return "DW_AT_low_pc";
5281 case DW_AT_high_pc
: return "DW_AT_high_pc";
5282 case DW_AT_language
: return "DW_AT_language";
5283 case DW_AT_member
: return "DW_AT_member";
5284 case DW_AT_discr
: return "DW_AT_discr";
5285 case DW_AT_discr_value
: return "DW_AT_discr_value";
5286 case DW_AT_visibility
: return "DW_AT_visibility";
5287 case DW_AT_import
: return "DW_AT_import";
5288 case DW_AT_string_length
: return "DW_AT_string_length";
5289 case DW_AT_common_reference
: return "DW_AT_common_reference";
5290 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
5291 case DW_AT_const_value
: return "DW_AT_const_value";
5292 case DW_AT_containing_type
: return "DW_AT_containing_type";
5293 case DW_AT_default_value
: return "DW_AT_default_value";
5294 case DW_AT_inline
: return "DW_AT_inline";
5295 case DW_AT_is_optional
: return "DW_AT_is_optional";
5296 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
5297 case DW_AT_producer
: return "DW_AT_producer";
5298 case DW_AT_prototyped
: return "DW_AT_prototyped";
5299 case DW_AT_return_addr
: return "DW_AT_return_addr";
5300 case DW_AT_start_scope
: return "DW_AT_start_scope";
5301 case DW_AT_stride_size
: return "DW_AT_stride_size";
5302 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
5303 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
5304 case DW_AT_accessibility
: return "DW_AT_accessibility";
5305 case DW_AT_address_class
: return "DW_AT_address_class";
5306 case DW_AT_artificial
: return "DW_AT_artificial";
5307 case DW_AT_base_types
: return "DW_AT_base_types";
5308 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
5309 case DW_AT_count
: return "DW_AT_count";
5310 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
5311 case DW_AT_decl_column
: return "DW_AT_decl_column";
5312 case DW_AT_decl_file
: return "DW_AT_decl_file";
5313 case DW_AT_decl_line
: return "DW_AT_decl_line";
5314 case DW_AT_declaration
: return "DW_AT_declaration";
5315 case DW_AT_discr_list
: return "DW_AT_discr_list";
5316 case DW_AT_encoding
: return "DW_AT_encoding";
5317 case DW_AT_external
: return "DW_AT_external";
5318 case DW_AT_frame_base
: return "DW_AT_frame_base";
5319 case DW_AT_friend
: return "DW_AT_friend";
5320 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
5321 case DW_AT_macro_info
: return "DW_AT_macro_info";
5322 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
5323 case DW_AT_priority
: return "DW_AT_priority";
5324 case DW_AT_segment
: return "DW_AT_segment";
5325 case DW_AT_specification
: return "DW_AT_specification";
5326 case DW_AT_static_link
: return "DW_AT_static_link";
5327 case DW_AT_type
: return "DW_AT_type";
5328 case DW_AT_use_location
: return "DW_AT_use_location";
5329 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
5330 case DW_AT_virtuality
: return "DW_AT_virtuality";
5331 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
5332 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
5333 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
5334 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
5335 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
5336 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
5337 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
5338 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
5339 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
5340 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
5341 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
5342 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
5343 case DW_AT_sf_names
: return "DW_AT_sf_names";
5344 case DW_AT_src_info
: return "DW_AT_src_info";
5345 case DW_AT_mac_info
: return "DW_AT_mac_info";
5346 case DW_AT_src_coords
: return "DW_AT_src_coords";
5347 case DW_AT_body_begin
: return "DW_AT_body_begin";
5348 case DW_AT_body_end
: return "DW_AT_body_end";
5351 static char buffer
[100];
5353 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
5360 get_FORM_name (form
)
5365 case DW_FORM_addr
: return "DW_FORM_addr";
5366 case DW_FORM_block2
: return "DW_FORM_block2";
5367 case DW_FORM_block4
: return "DW_FORM_block4";
5368 case DW_FORM_data2
: return "DW_FORM_data2";
5369 case DW_FORM_data4
: return "DW_FORM_data4";
5370 case DW_FORM_data8
: return "DW_FORM_data8";
5371 case DW_FORM_string
: return "DW_FORM_string";
5372 case DW_FORM_block
: return "DW_FORM_block";
5373 case DW_FORM_block1
: return "DW_FORM_block1";
5374 case DW_FORM_data1
: return "DW_FORM_data1";
5375 case DW_FORM_flag
: return "DW_FORM_flag";
5376 case DW_FORM_sdata
: return "DW_FORM_sdata";
5377 case DW_FORM_strp
: return "DW_FORM_strp";
5378 case DW_FORM_udata
: return "DW_FORM_udata";
5379 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
5380 case DW_FORM_ref1
: return "DW_FORM_ref1";
5381 case DW_FORM_ref2
: return "DW_FORM_ref2";
5382 case DW_FORM_ref4
: return "DW_FORM_ref4";
5383 case DW_FORM_ref8
: return "DW_FORM_ref8";
5384 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
5385 case DW_FORM_indirect
: return "DW_FORM_indirect";
5388 static char buffer
[100];
5390 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
5396 /* FIXME: There are better and more effiecint ways to handle
5397 these structures. For now though, I just want something that
5398 is simple to implement. */
5399 typedef struct abbrev_attr
5401 unsigned long attribute
;
5403 struct abbrev_attr
* next
;
5407 typedef struct abbrev_entry
5409 unsigned long entry
;
5412 struct abbrev_attr
* first_attr
;
5413 struct abbrev_attr
* last_attr
;
5414 struct abbrev_entry
* next
;
5418 static abbrev_entry
* first_abbrev
= NULL
;
5419 static abbrev_entry
* last_abbrev
= NULL
;
5422 free_abbrevs
PARAMS ((void))
5424 abbrev_entry
* abbrev
;
5426 for (abbrev
= first_abbrev
; abbrev
;)
5428 abbrev_entry
* next
= abbrev
->next
;
5431 for (attr
= abbrev
->first_attr
; attr
;)
5433 abbrev_attr
* next
= attr
->next
;
5443 last_abbrev
= first_abbrev
= NULL
;
5447 add_abbrev (number
, tag
, children
)
5448 unsigned long number
;
5452 abbrev_entry
* entry
;
5454 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
5460 entry
->entry
= number
;
5462 entry
->children
= children
;
5463 entry
->first_attr
= NULL
;
5464 entry
->last_attr
= NULL
;
5467 if (first_abbrev
== NULL
)
5468 first_abbrev
= entry
;
5470 last_abbrev
->next
= entry
;
5472 last_abbrev
= entry
;
5476 add_abbrev_attr (attribute
, form
)
5477 unsigned long attribute
;
5482 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
5488 attr
->attribute
= attribute
;
5492 if (last_abbrev
->first_attr
== NULL
)
5493 last_abbrev
->first_attr
= attr
;
5495 last_abbrev
->last_attr
->next
= attr
;
5497 last_abbrev
->last_attr
= attr
;
5500 /* Processes the (partial) contents of a .debug_abbrev section.
5501 Returns NULL if the end of the section was encountered.
5502 Returns the address after the last byte read if the end of
5503 an abbreviation set was found. */
5505 static unsigned char *
5506 process_abbrev_section (start
, end
)
5507 unsigned char * start
;
5508 unsigned char * end
;
5510 if (first_abbrev
!= NULL
)
5516 unsigned long entry
;
5518 unsigned long attribute
;
5521 entry
= read_leb128 (start
, & bytes_read
, 0);
5522 start
+= bytes_read
;
5524 /* A single zero is supposed to end the section according
5525 to the standard. If there's more, then signal that to
5528 return start
== end
? NULL
: start
;
5530 tag
= read_leb128 (start
, & bytes_read
, 0);
5531 start
+= bytes_read
;
5533 children
= * start
++;
5535 add_abbrev (entry
, tag
, children
);
5541 attribute
= read_leb128 (start
, & bytes_read
, 0);
5542 start
+= bytes_read
;
5544 form
= read_leb128 (start
, & bytes_read
, 0);
5545 start
+= bytes_read
;
5548 add_abbrev_attr (attribute
, form
);
5550 while (attribute
!= 0);
5558 display_debug_abbrev (section
, start
, file
)
5559 Elf32_Internal_Shdr
* section
;
5560 unsigned char * start
;
5561 FILE * file ATTRIBUTE_UNUSED
;
5563 abbrev_entry
* entry
;
5564 unsigned char * end
= start
+ section
->sh_size
;
5566 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
5570 start
= process_abbrev_section (start
, end
);
5572 printf (_(" Number TAG\n"));
5574 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
5578 printf (_(" %ld %s [%s]\n"),
5580 get_TAG_name (entry
->tag
),
5581 entry
->children
? _("has children") : _("no children"));
5583 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
5585 printf (_(" %-18s %s\n"),
5586 get_AT_name (attr
->attribute
),
5587 get_FORM_name (attr
->form
));
5599 static unsigned char *
5600 display_block (data
, length
)
5601 unsigned char * data
;
5602 unsigned long length
;
5604 printf (_(" %lu byte block: "), length
);
5607 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
5613 decode_location_expression (data
, pointer_size
, length
)
5614 unsigned char * data
;
5615 unsigned int pointer_size
;
5616 unsigned long length
;
5620 unsigned long uvalue
;
5621 unsigned char *end
= data
+ length
;
5630 printf ("DW_OP_addr: %lx",
5631 (unsigned long) byte_get (data
, pointer_size
));
5632 data
+= pointer_size
;
5635 printf ("DW_OP_deref");
5638 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
5641 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
5644 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
5648 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
5652 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
5656 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
5660 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
5661 (unsigned long) byte_get (data
+ 4, 4));
5665 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
5666 (long) byte_get (data
+ 4, 4));
5670 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
5674 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
5678 printf ("DW_OP_dup");
5681 printf ("DW_OP_drop");
5684 printf ("DW_OP_over");
5687 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
5690 printf ("DW_OP_swap");
5693 printf ("DW_OP_rot");
5696 printf ("DW_OP_xderef");
5699 printf ("DW_OP_abs");
5702 printf ("DW_OP_and");
5705 printf ("DW_OP_div");
5708 printf ("DW_OP_minus");
5711 printf ("DW_OP_mod");
5714 printf ("DW_OP_mul");
5717 printf ("DW_OP_neg");
5720 printf ("DW_OP_not");
5723 printf ("DW_OP_or");
5726 printf ("DW_OP_plus");
5728 case DW_OP_plus_uconst
:
5729 printf ("DW_OP_plus_uconst: %lu",
5730 read_leb128 (data
, &bytes_read
, 0));
5734 printf ("DW_OP_shl");
5737 printf ("DW_OP_shr");
5740 printf ("DW_OP_shra");
5743 printf ("DW_OP_xor");
5746 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
5750 printf ("DW_OP_eq");
5753 printf ("DW_OP_ge");
5756 printf ("DW_OP_gt");
5759 printf ("DW_OP_le");
5762 printf ("DW_OP_lt");
5765 printf ("DW_OP_ne");
5768 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
5804 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
5839 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
5874 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
5875 read_leb128 (data
, &bytes_read
, 1));
5880 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
5884 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
5888 uvalue
= read_leb128 (data
, &bytes_read
, 0);
5890 printf ("DW_OP_bregx: %lu %ld", uvalue
,
5891 read_leb128 (data
, &bytes_read
, 1));
5895 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
5898 case DW_OP_deref_size
:
5899 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
5901 case DW_OP_xderef_size
:
5902 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
5905 printf ("DW_OP_nop");
5909 if (op
>= DW_OP_lo_user
5910 && op
<= DW_OP_hi_user
)
5911 printf (_("(User defined location op)"));
5913 printf (_("(Unknown location op)"));
5914 /* No way to tell where the next op is, so just bail. */
5921 static unsigned char *
5922 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
5923 unsigned long attribute
;
5925 unsigned char * data
;
5926 unsigned long cu_offset
;
5927 unsigned long pointer_size
;
5929 unsigned long uvalue
= 0;
5930 unsigned char * block_start
= NULL
;
5933 printf (" %-18s:", get_AT_name (attribute
));
5940 case DW_FORM_ref_addr
:
5942 uvalue
= byte_get (data
, pointer_size
);
5943 data
+= pointer_size
;
5949 uvalue
= byte_get (data
++, 1);
5954 uvalue
= byte_get (data
, 2);
5960 uvalue
= byte_get (data
, 4);
5965 uvalue
= read_leb128 (data
, & bytes_read
, 1);
5969 case DW_FORM_ref_udata
:
5971 uvalue
= read_leb128 (data
, & bytes_read
, 0);
5978 case DW_FORM_ref_addr
:
5979 printf (" <#%lx>", uvalue
);
5985 case DW_FORM_ref_udata
:
5986 printf (" <%lx>", uvalue
+ cu_offset
);
5990 printf (" %#lx", uvalue
);
5998 printf (" %ld", uvalue
);
6003 uvalue
= byte_get (data
, 4);
6004 printf (" %lx", uvalue
);
6005 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
6009 case DW_FORM_string
:
6010 printf (" %s", data
);
6011 data
+= strlen (data
) + 1;
6015 uvalue
= read_leb128 (data
, & bytes_read
, 0);
6016 block_start
= data
+ bytes_read
;
6017 data
= display_block (block_start
, uvalue
);
6020 case DW_FORM_block1
:
6021 uvalue
= byte_get (data
, 1);
6022 block_start
= data
+ 1;
6023 data
= display_block (block_start
, uvalue
);
6026 case DW_FORM_block2
:
6027 uvalue
= byte_get (data
, 2);
6028 block_start
= data
+ 2;
6029 data
= display_block (block_start
, uvalue
);
6032 case DW_FORM_block4
:
6033 uvalue
= byte_get (data
, 4);
6034 block_start
= data
+ 4;
6035 data
= display_block (block_start
, uvalue
);
6039 case DW_FORM_indirect
:
6040 warn (_("Unable to handle FORM: %d"), form
);
6044 warn (_("Unrecognised form: %d"), form
);
6048 /* For some attributes we can display futher information. */
6057 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
6058 case DW_INL_inlined
: printf (_("(inlined)")); break;
6059 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
6060 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
6061 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
6065 case DW_AT_language
:
6068 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
6069 case DW_LANG_C89
: printf ("(ANSI C)"); break;
6070 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
6071 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
6072 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
6073 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
6074 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
6075 case DW_LANG_Ada83
: printf ("(Ada)"); break;
6076 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
6077 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
6078 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
6079 default: printf ("(Unknown: %lx)", uvalue
); break;
6083 case DW_AT_encoding
:
6086 case DW_ATE_void
: printf ("(void)"); break;
6087 case DW_ATE_address
: printf ("(machine address)"); break;
6088 case DW_ATE_boolean
: printf ("(boolean)"); break;
6089 case DW_ATE_complex_float
: printf ("(complex float)"); break;
6090 case DW_ATE_float
: printf ("(float)"); break;
6091 case DW_ATE_signed
: printf ("(signed)"); break;
6092 case DW_ATE_signed_char
: printf ("(signed char)"); break;
6093 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
6094 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
6096 if (uvalue
>= DW_ATE_lo_user
6097 && uvalue
<= DW_ATE_hi_user
)
6098 printf ("(user defined type)");
6100 printf ("(unknown type)");
6105 case DW_AT_accessibility
:
6108 case DW_ACCESS_public
: printf ("(public)"); break;
6109 case DW_ACCESS_protected
: printf ("(protected)"); break;
6110 case DW_ACCESS_private
: printf ("(private)"); break;
6111 default: printf ("(unknown accessibility)"); break;
6115 case DW_AT_visibility
:
6118 case DW_VIS_local
: printf ("(local)"); break;
6119 case DW_VIS_exported
: printf ("(exported)"); break;
6120 case DW_VIS_qualified
: printf ("(qualified)"); break;
6121 default: printf ("(unknown visibility)"); break;
6125 case DW_AT_virtuality
:
6128 case DW_VIRTUALITY_none
: printf ("(none)"); break;
6129 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
6130 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
6131 default: printf ("(unknown virtuality)"); break;
6135 case DW_AT_identifier_case
:
6138 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
6139 case DW_ID_up_case
: printf ("(up_case)"); break;
6140 case DW_ID_down_case
: printf ("(down_case)"); break;
6141 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
6142 default: printf ("(unknown case)"); break;
6146 case DW_AT_calling_convention
:
6149 case DW_CC_normal
: printf ("(normal)"); break;
6150 case DW_CC_program
: printf ("(program)"); break;
6151 case DW_CC_nocall
: printf ("(nocall)"); break;
6153 if (uvalue
>= DW_CC_lo_user
6154 && uvalue
<= DW_CC_hi_user
)
6155 printf ("(user defined)");
6157 printf ("(unknown convention)");
6161 case DW_AT_frame_base
:
6162 case DW_AT_location
:
6163 case DW_AT_data_member_location
:
6164 case DW_AT_vtable_elem_location
:
6168 decode_location_expression (block_start
, pointer_size
, uvalue
);
6182 display_debug_info (section
, start
, file
)
6183 Elf32_Internal_Shdr
* section
;
6184 unsigned char * start
;
6187 unsigned char * end
= start
+ section
->sh_size
;
6188 unsigned char * section_begin
= start
;
6190 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6194 DWARF2_External_CompUnit
* external
;
6195 DWARF2_Internal_CompUnit compunit
;
6196 unsigned char * tags
;
6199 unsigned long cu_offset
;
6201 external
= (DWARF2_External_CompUnit
*) start
;
6203 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
6204 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
6205 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
6206 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
6208 tags
= start
+ sizeof (* external
);
6209 cu_offset
= start
- section_begin
;
6210 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
6212 if (compunit
.cu_version
!= 2)
6214 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6218 printf (_(" Compilation Unit:\n"));
6219 printf (_(" Length: %ld\n"), compunit
.cu_length
);
6220 printf (_(" Version: %d\n"), compunit
.cu_version
);
6221 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
6222 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
6224 if (first_abbrev
!= NULL
)
6227 /* Read in the abbrevs used by this compilation unit. */
6230 Elf32_Internal_Shdr
* sec
;
6231 unsigned char * begin
;
6233 /* Locate the .debug_abbrev section and process it. */
6234 for (i
= 0, sec
= section_headers
;
6235 i
< elf_header
.e_shnum
;
6237 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
6240 if (i
== -1 || sec
->sh_size
== 0)
6242 warn (_("Unable to locate .debug_abbrev section!\n"));
6246 GET_DATA_ALLOC (sec
->sh_offset
, sec
->sh_size
, begin
, unsigned char *,
6247 "debug_abbrev section data");
6249 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
6250 begin
+ sec
->sh_size
);
6256 while (tags
< start
)
6259 unsigned long abbrev_number
;
6260 abbrev_entry
* entry
;
6263 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
6266 /* A null DIE marks the end of a list of children. */
6267 if (abbrev_number
== 0)
6273 /* Scan through the abbreviation list until we reach the
6275 for (entry
= first_abbrev
;
6276 entry
&& entry
->entry
!= abbrev_number
;
6277 entry
= entry
->next
)
6282 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6287 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6288 level
, tags
- section_begin
- bytes_read
,
6290 get_TAG_name (entry
->tag
));
6292 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6293 tags
= read_and_display_attr (attr
->attribute
,
6296 compunit
.cu_pointer_size
);
6298 if (entry
->children
)
6309 display_debug_aranges (section
, start
, file
)
6310 Elf32_Internal_Shdr
* section
;
6311 unsigned char * start
;
6312 FILE * file ATTRIBUTE_UNUSED
;
6314 unsigned char * end
= start
+ section
->sh_size
;
6316 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6320 DWARF2_External_ARange
* external
;
6321 DWARF2_Internal_ARange arange
;
6322 unsigned char * ranges
;
6323 unsigned long length
;
6324 unsigned long address
;
6327 external
= (DWARF2_External_ARange
*) start
;
6329 arange
.ar_length
= BYTE_GET (external
->ar_length
);
6330 arange
.ar_version
= BYTE_GET (external
->ar_version
);
6331 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
6332 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
6333 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
6335 printf (_(" Length: %ld\n"), arange
.ar_length
);
6336 printf (_(" Version: %d\n"), arange
.ar_version
);
6337 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
6338 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
6339 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
6341 printf (_("\n Address Length\n"));
6343 ranges
= start
+ sizeof (* external
);
6345 /* Must pad to an alignment boundary that is twice the pointer size. */
6346 excess
= sizeof (*external
) % (2 * arange
.ar_pointer_size
);
6348 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
6352 address
= byte_get (ranges
, arange
.ar_pointer_size
);
6354 ranges
+= arange
.ar_pointer_size
;
6356 length
= byte_get (ranges
, arange
.ar_pointer_size
);
6358 ranges
+= arange
.ar_pointer_size
;
6360 /* A pair of zeros marks the end of the list. */
6361 if (address
== 0 && length
== 0)
6364 printf (" %8.8lx %lu\n", address
, length
);
6367 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
6377 display_debug_not_supported (section
, start
, file
)
6378 Elf32_Internal_Shdr
* section
;
6379 unsigned char * start ATTRIBUTE_UNUSED
;
6380 FILE * file ATTRIBUTE_UNUSED
;
6382 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6383 SECTION_NAME (section
));
6388 /* Pre-scan the .debug_info section to record the size of address.
6389 When dumping the .debug_line, we use that size information, assuming
6390 that all compilation units have the same address size. */
6392 prescan_debug_info (section
, start
, file
)
6393 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
6394 unsigned char * start
;
6395 FILE * file ATTRIBUTE_UNUSED
;
6397 DWARF2_External_CompUnit
* external
;
6399 external
= (DWARF2_External_CompUnit
*) start
;
6401 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
6405 /* A structure containing the name of a debug section and a pointer
6406 to a function that can decode it. The third field is a prescan
6407 function to be run over the section before displaying any of the
6412 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
6413 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
6417 { ".debug_info", display_debug_info
, prescan_debug_info
},
6418 { ".debug_abbrev", display_debug_abbrev
, NULL
},
6419 { ".debug_line", display_debug_lines
, NULL
},
6420 { ".debug_aranges", display_debug_aranges
, NULL
},
6421 { ".debug_pubnames", display_debug_pubnames
, NULL
},
6422 { ".debug_macinfo", display_debug_not_supported
, NULL
},
6423 { ".debug_frame", display_debug_not_supported
, NULL
},
6424 { ".debug_str", display_debug_not_supported
, NULL
},
6425 { ".debug_static_func", display_debug_not_supported
, NULL
},
6426 { ".debug_static_vars", display_debug_not_supported
, NULL
},
6427 { ".debug_types", display_debug_not_supported
, NULL
},
6428 { ".debug_weaknames", display_debug_not_supported
, NULL
}
6432 display_debug_section (section
, file
)
6433 Elf32_Internal_Shdr
* section
;
6436 char * name
= SECTION_NAME (section
);
6437 bfd_size_type length
;
6438 unsigned char * start
;
6441 length
= section
->sh_size
;
6444 printf (_("\nSection '%s' has no debugging data.\n"), name
);
6448 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
6449 "debug section data");
6451 /* See if we know how to display the contents of this section. */
6452 for (i
= NUM_ELEM (debug_displays
); i
--;)
6453 if (strcmp (debug_displays
[i
].name
, name
) == 0)
6455 debug_displays
[i
].display (section
, start
, file
);
6460 printf (_("Unrecognised debug section: %s\n"), name
);
6464 /* If we loaded in the abbrev section at some point,
6465 we must release it here. */
6466 if (first_abbrev
!= NULL
)
6473 process_section_contents (file
)
6476 Elf32_Internal_Shdr
* section
;
6482 /* Pre-scan the debug sections to find some debug information not
6483 present in some of them. For the .debug_line, we must find out the
6484 size of address (specified in .debug_info and .debug_aranges). */
6485 for (i
= 0, section
= section_headers
;
6486 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
6489 char * name
= SECTION_NAME (section
);
6492 if (section
->sh_size
== 0)
6495 /* See if there is some pre-scan operation for this section. */
6496 for (j
= NUM_ELEM (debug_displays
); j
--;)
6497 if (strcmp (debug_displays
[j
].name
, name
) == 0)
6499 if (debug_displays
[j
].prescan
!= NULL
)
6501 bfd_size_type length
;
6502 unsigned char * start
;
6504 length
= section
->sh_size
;
6505 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
6506 "debug section data");
6508 debug_displays
[j
].prescan (section
, start
, file
);
6516 for (i
= 0, section
= section_headers
;
6517 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
6520 #ifdef SUPPORT_DISASSEMBLY
6521 if (dump_sects
[i
] & DISASS_DUMP
)
6522 disassemble_section (section
, file
);
6524 if (dump_sects
[i
] & HEX_DUMP
)
6525 dump_section (section
, file
);
6527 if (dump_sects
[i
] & DEBUG_DUMP
)
6528 display_debug_section (section
, file
);
6531 if (i
< num_dump_sects
)
6532 warn (_("Some sections were not dumped because they do not exist!\n"));
6538 process_mips_fpe_exception (mask
)
6544 if (mask
& OEX_FPU_INEX
)
6545 fputs ("INEX", stdout
), first
= 0;
6546 if (mask
& OEX_FPU_UFLO
)
6547 printf ("%sUFLO", first
? "" : "|"), first
= 0;
6548 if (mask
& OEX_FPU_OFLO
)
6549 printf ("%sOFLO", first
? "" : "|"), first
= 0;
6550 if (mask
& OEX_FPU_DIV0
)
6551 printf ("%sDIV0", first
? "" : "|"), first
= 0;
6552 if (mask
& OEX_FPU_INVAL
)
6553 printf ("%sINVAL", first
? "" : "|");
6556 fputs ("0", stdout
);
6560 process_mips_specific (file
)
6563 Elf_Internal_Dyn
* entry
;
6564 size_t liblist_offset
= 0;
6565 size_t liblistno
= 0;
6566 size_t conflictsno
= 0;
6567 size_t options_offset
= 0;
6568 size_t conflicts_offset
= 0;
6570 /* We have a lot of special sections. Thanks SGI! */
6571 if (dynamic_segment
== NULL
)
6572 /* No information available. */
6575 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
6576 switch (entry
->d_tag
)
6578 case DT_MIPS_LIBLIST
:
6579 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
6581 case DT_MIPS_LIBLISTNO
:
6582 liblistno
= entry
->d_un
.d_val
;
6584 case DT_MIPS_OPTIONS
:
6585 options_offset
= entry
->d_un
.d_val
- loadaddr
;
6587 case DT_MIPS_CONFLICT
:
6588 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
6590 case DT_MIPS_CONFLICTNO
:
6591 conflictsno
= entry
->d_un
.d_val
;
6597 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
6599 Elf32_External_Lib
* elib
;
6602 GET_DATA_ALLOC (liblist_offset
, liblistno
* sizeof (Elf32_External_Lib
),
6603 elib
, Elf32_External_Lib
*, "liblist");
6605 printf ("\nSection '.liblist' contains %lu entries:\n",
6606 (unsigned long) liblistno
);
6607 fputs (" Library Time Stamp Checksum Version Flags\n",
6610 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
6617 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
6618 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
6619 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
6620 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
6621 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
6623 tmp
= gmtime (&time
);
6624 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
6625 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6626 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6628 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt
,
6629 dynamic_strings
+ liblist
.l_name
, timebuf
,
6630 liblist
.l_checksum
, liblist
.l_version
);
6632 if (liblist
.l_flags
== 0)
6643 { " EXACT_MATCH", LL_EXACT_MATCH
},
6644 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
6645 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
6646 { " EXPORTS", LL_EXPORTS
},
6647 { " DELAY_LOAD", LL_DELAY_LOAD
},
6648 { " DELTA", LL_DELTA
}
6650 int flags
= liblist
.l_flags
;
6654 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
6656 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
6658 fputs (l_flags_vals
[fcnt
].name
, stdout
);
6659 flags
^= l_flags_vals
[fcnt
].bit
;
6662 printf (" %#x", (unsigned int) flags
);
6671 if (options_offset
!= 0)
6673 Elf_External_Options
* eopt
;
6674 Elf_Internal_Shdr
* sect
= section_headers
;
6675 Elf_Internal_Options
* iopt
;
6676 Elf_Internal_Options
* option
;
6680 /* Find the section header so that we get the size. */
6681 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
6684 GET_DATA_ALLOC (options_offset
, sect
->sh_size
, eopt
,
6685 Elf_External_Options
*, "options");
6687 iopt
= (Elf_Internal_Options
*) malloc ((sect
->sh_size
/ sizeof (eopt
))
6691 error (_("Out of memory"));
6698 while (offset
< sect
->sh_size
)
6700 Elf_External_Options
* eoption
;
6702 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
6704 option
->kind
= BYTE_GET (eoption
->kind
);
6705 option
->size
= BYTE_GET (eoption
->size
);
6706 option
->section
= BYTE_GET (eoption
->section
);
6707 option
->info
= BYTE_GET (eoption
->info
);
6709 offset
+= option
->size
;
6715 printf (_("\nSection '%s' contains %d entries:\n"),
6716 string_table
+ sect
->sh_name
, cnt
);
6724 switch (option
->kind
)
6727 /* This shouldn't happen. */
6728 printf (" NULL %d %lx", option
->section
, option
->info
);
6731 printf (" REGINFO ");
6732 if (elf_header
.e_machine
== EM_MIPS
)
6735 Elf32_External_RegInfo
*ereg
;
6736 Elf32_RegInfo reginfo
;
6738 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
6739 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
6740 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
6741 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
6742 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
6743 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
6744 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
6746 printf ("GPR %08lx GP 0x%lx\n",
6748 (unsigned long) reginfo
.ri_gp_value
);
6749 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6750 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
6751 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
6756 Elf64_External_RegInfo
* ereg
;
6757 Elf64_Internal_RegInfo reginfo
;
6759 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
6760 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
6761 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
6762 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
6763 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
6764 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
6765 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
6767 printf ("GPR %08lx GP 0x",
6768 reginfo
.ri_gprmask
);
6769 printf_vma (reginfo
.ri_gp_value
);
6772 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6773 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
6774 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
6778 case ODK_EXCEPTIONS
:
6779 fputs (" EXCEPTIONS fpe_min(", stdout
);
6780 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
6781 fputs (") fpe_max(", stdout
);
6782 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
6783 fputs (")", stdout
);
6785 if (option
->info
& OEX_PAGE0
)
6786 fputs (" PAGE0", stdout
);
6787 if (option
->info
& OEX_SMM
)
6788 fputs (" SMM", stdout
);
6789 if (option
->info
& OEX_FPDBUG
)
6790 fputs (" FPDBUG", stdout
);
6791 if (option
->info
& OEX_DISMISS
)
6792 fputs (" DISMISS", stdout
);
6795 fputs (" PAD ", stdout
);
6796 if (option
->info
& OPAD_PREFIX
)
6797 fputs (" PREFIX", stdout
);
6798 if (option
->info
& OPAD_POSTFIX
)
6799 fputs (" POSTFIX", stdout
);
6800 if (option
->info
& OPAD_SYMBOL
)
6801 fputs (" SYMBOL", stdout
);
6804 fputs (" HWPATCH ", stdout
);
6805 if (option
->info
& OHW_R4KEOP
)
6806 fputs (" R4KEOP", stdout
);
6807 if (option
->info
& OHW_R8KPFETCH
)
6808 fputs (" R8KPFETCH", stdout
);
6809 if (option
->info
& OHW_R5KEOP
)
6810 fputs (" R5KEOP", stdout
);
6811 if (option
->info
& OHW_R5KCVTL
)
6812 fputs (" R5KCVTL", stdout
);
6815 fputs (" FILL ", stdout
);
6816 /* XXX Print content of info word? */
6819 fputs (" TAGS ", stdout
);
6820 /* XXX Print content of info word? */
6823 fputs (" HWAND ", stdout
);
6824 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
6825 fputs (" R4KEOP_CHECKED", stdout
);
6826 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
6827 fputs (" R4KEOP_CLEAN", stdout
);
6830 fputs (" HWOR ", stdout
);
6831 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
6832 fputs (" R4KEOP_CHECKED", stdout
);
6833 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
6834 fputs (" R4KEOP_CLEAN", stdout
);
6837 printf (" GP_GROUP %#06lx self-contained %#06lx",
6838 option
->info
& OGP_GROUP
,
6839 (option
->info
& OGP_SELF
) >> 16);
6842 printf (" IDENT %#06lx self-contained %#06lx",
6843 option
->info
& OGP_GROUP
,
6844 (option
->info
& OGP_SELF
) >> 16);
6847 /* This shouldn't happen. */
6848 printf (" %3d ??? %d %lx",
6849 option
->kind
, option
->section
, option
->info
);
6853 len
= sizeof (*eopt
);
6854 while (len
< option
->size
)
6855 if (((char *) option
)[len
] >= ' '
6856 && ((char *) option
)[len
] < 0x7f)
6857 printf ("%c", ((char *) option
)[len
++]);
6859 printf ("\\%03o", ((char *) option
)[len
++]);
6861 fputs ("\n", stdout
);
6868 if (conflicts_offset
!= 0 && conflictsno
!= 0)
6870 Elf32_External_Conflict
* econf32
;
6871 Elf64_External_Conflict
* econf64
;
6872 Elf32_Conflict
* iconf
;
6875 if (dynamic_symbols
== NULL
)
6877 error (_("conflict list with without table"));
6881 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (*iconf
));
6884 error (_("Out of memory"));
6890 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (*econf32
),
6891 econf32
, Elf32_External_Conflict
*, "conflict");
6893 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
6894 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
6898 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (*econf64
),
6899 econf64
, Elf64_External_Conflict
*, "conflict");
6901 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
6902 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
6905 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno
);
6906 puts (_(" Num: Index Value Name"));
6908 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
6910 Elf_Internal_Sym
* psym
= &dynamic_symbols
[iconf
[cnt
]];
6912 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
6913 print_vma (psym
->st_value
, FULL_HEX
);
6914 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
6924 get_note_type (e_type
)
6927 static char buff
[64];
6931 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
6932 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
6933 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
6934 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
6935 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
6936 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
6937 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
6938 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
6939 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
6940 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
6941 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
6943 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
6948 /* Note that by the ELF standard, the name field is already null byte
6949 terminated, and namesz includes the terminating null byte.
6950 I.E. the value of namesz for the name "FSF" is 4.
6952 If the value of namesz is zero, there is no name present. */
6954 process_note (pnote
)
6955 Elf32_Internal_Note
* pnote
;
6957 printf (" %s\t\t0x%08lx\t%s\n",
6958 pnote
->namesz
? pnote
->namedata
: "(NONE)",
6959 pnote
->descsz
, get_note_type (pnote
->type
));
6965 process_corefile_note_segment (file
, offset
, length
)
6970 Elf_External_Note
* pnotes
;
6971 Elf_External_Note
* external
;
6977 GET_DATA_ALLOC (offset
, length
, pnotes
, Elf_External_Note
*, "notes");
6981 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
6982 (unsigned long) offset
, (unsigned long) length
);
6983 printf (_(" Owner\t\tData size\tDescription\n"));
6985 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
6987 Elf32_Internal_Note inote
;
6990 inote
.type
= BYTE_GET (external
->type
);
6991 inote
.namesz
= BYTE_GET (external
->namesz
);
6992 inote
.namedata
= external
->name
;
6993 inote
.descsz
= BYTE_GET (external
->descsz
);
6994 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
6995 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
6997 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
6999 /* Verify that name is null terminated. It appears that at least
7000 one version of Linux (RedHat 6.0) generates corefiles that don't
7001 comply with the ELF spec by failing to include the null byte in
7003 if (inote
.namedata
[inote
.namesz
] != '\0')
7005 temp
= malloc (inote
.namesz
+ 1);
7009 error (_("Out of memory\n"));
7014 strncpy (temp
, inote
.namedata
, inote
.namesz
);
7015 temp
[inote
.namesz
] = 0;
7017 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
7018 inote
.namedata
= temp
;
7021 res
&= process_note (& inote
);
7036 process_corefile_note_segments (file
)
7039 Elf_Internal_Phdr
* program_headers
;
7040 Elf_Internal_Phdr
* segment
;
7044 program_headers
= (Elf_Internal_Phdr
*) malloc
7045 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
7047 if (program_headers
== NULL
)
7049 error (_("Out of memory\n"));
7054 i
= get_32bit_program_headers (file
, program_headers
);
7056 i
= get_64bit_program_headers (file
, program_headers
);
7060 free (program_headers
);
7064 for (i
= 0, segment
= program_headers
;
7065 i
< elf_header
.e_phnum
;
7068 if (segment
->p_type
== PT_NOTE
)
7069 res
&= process_corefile_note_segment (file
,
7070 (bfd_vma
) segment
->p_offset
,
7071 (bfd_vma
) segment
->p_filesz
);
7074 free (program_headers
);
7080 process_corefile_contents (file
)
7083 /* If we have not been asked to display the notes then do nothing. */
7087 /* If file is not a core file then exit. */
7088 if (elf_header
.e_type
!= ET_CORE
)
7091 /* No program headers means no NOTE segment. */
7092 if (elf_header
.e_phnum
== 0)
7094 printf (_("No note segments present in the core file.\n"));
7098 return process_corefile_note_segments (file
);
7102 process_arch_specific (file
)
7108 switch (elf_header
.e_machine
)
7111 case EM_MIPS_RS4_BE
:
7112 return process_mips_specific (file
);
7121 get_file_header (file
)
7124 /* Read in the identity array. */
7125 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
7128 /* Determine how to read the rest of the header. */
7129 switch (elf_header
.e_ident
[EI_DATA
])
7131 default: /* fall through */
7132 case ELFDATANONE
: /* fall through */
7133 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
7134 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
7137 /* For now we only support 32 bit and 64 bit ELF files. */
7138 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
7140 /* Read in the rest of the header. */
7143 Elf32_External_Ehdr ehdr32
;
7145 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
7148 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
7149 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
7150 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
7151 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
7152 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
7153 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
7154 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
7155 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
7156 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
7157 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
7158 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
7159 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
7160 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
7164 Elf64_External_Ehdr ehdr64
;
7166 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7167 we will not be able to cope with the 64bit data found in
7168 64 ELF files. Detect this now and abort before we start
7169 overwritting things. */
7170 if (sizeof (bfd_vma
) < 8)
7172 error (_("This instance of readelf has been built without support for a\n"));
7173 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7177 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
7180 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
7181 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
7182 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
7183 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
7184 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
7185 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
7186 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
7187 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
7188 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
7189 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
7190 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
7191 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
7192 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
7199 process_file (file_name
)
7203 struct stat statbuf
;
7206 if (stat (file_name
, & statbuf
) < 0)
7208 error (_("Cannot stat input file %s.\n"), file_name
);
7212 file
= fopen (file_name
, "rb");
7215 error (_("Input file %s not found.\n"), file_name
);
7219 if (! get_file_header (file
))
7221 error (_("%s: Failed to read file header\n"), file_name
);
7226 /* Initialise per file variables. */
7227 for (i
= NUM_ELEM (version_info
); i
--;)
7228 version_info
[i
] = 0;
7230 for (i
= NUM_ELEM (dynamic_info
); i
--;)
7231 dynamic_info
[i
] = 0;
7233 /* Process the file. */
7235 printf (_("\nFile: %s\n"), file_name
);
7237 if (! process_file_header ())
7243 process_section_headers (file
);
7245 process_program_headers (file
);
7247 process_dynamic_segment (file
);
7249 process_relocs (file
);
7251 process_symbol_table (file
);
7253 process_syminfo (file
);
7255 process_version_sections (file
);
7257 process_section_contents (file
);
7259 process_corefile_contents (file
);
7261 process_arch_specific (file
);
7265 if (section_headers
)
7267 free (section_headers
);
7268 section_headers
= NULL
;
7273 free (string_table
);
7274 string_table
= NULL
;
7277 if (dynamic_strings
)
7279 free (dynamic_strings
);
7280 dynamic_strings
= NULL
;
7283 if (dynamic_symbols
)
7285 free (dynamic_symbols
);
7286 dynamic_symbols
= NULL
;
7287 num_dynamic_syms
= 0;
7290 if (dynamic_syminfo
)
7292 free (dynamic_syminfo
);
7293 dynamic_syminfo
= NULL
;
7297 #ifdef SUPPORT_DISASSEMBLY
7298 /* Needed by the i386 disassembler. For extra credit, someone could
7299 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7303 print_address (unsigned int addr
, FILE * outfile
)
7305 fprintf (outfile
,"0x%8.8x", addr
);
7308 /* Needed by the i386 disassembler. */
7310 db_task_printsym (unsigned int addr
)
7312 print_address (addr
, stderr
);
7321 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7322 setlocale (LC_MESSAGES
, "");
7324 bindtextdomain (PACKAGE
, LOCALEDIR
);
7325 textdomain (PACKAGE
);
7327 parse_args (argc
, argv
);
7329 if (optind
< (argc
- 1))
7332 while (optind
< argc
)
7333 process_file (argv
[optind
++]);
7335 if (dump_sects
!= NULL
)