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
:
588 warn (_("Don't know about relocations on this machine architecture\n"));
593 /* Display the contents of the relocation data found at the specified offset. */
595 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
597 unsigned long rel_offset
;
598 unsigned long rel_size
;
599 Elf_Internal_Sym
* symtab
;
605 Elf_Internal_Rel
* rels
;
606 Elf_Internal_Rela
* relas
;
609 if (is_rela
== UNKNOWN
)
610 is_rela
= guess_is_rela (elf_header
.e_machine
);
616 Elf32_External_Rela
* erelas
;
618 GET_DATA_ALLOC (rel_offset
, rel_size
, erelas
,
619 Elf32_External_Rela
*, "relocs");
621 rel_size
= rel_size
/ sizeof (Elf32_External_Rela
);
623 relas
= (Elf_Internal_Rela
*)
624 malloc (rel_size
* sizeof (Elf_Internal_Rela
));
628 error(_("out of memory parsing relocs"));
632 for (i
= 0; i
< rel_size
; i
++)
634 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
635 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
636 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
641 rels
= (Elf_Internal_Rel
*) relas
;
645 Elf64_External_Rela
* erelas
;
647 GET_DATA_ALLOC (rel_offset
, rel_size
, erelas
,
648 Elf64_External_Rela
*, "relocs");
650 rel_size
= rel_size
/ sizeof (Elf64_External_Rela
);
652 relas
= (Elf_Internal_Rela
*)
653 malloc (rel_size
* sizeof (Elf_Internal_Rela
));
657 error(_("out of memory parsing relocs"));
661 for (i
= 0; i
< rel_size
; i
++)
663 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
664 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
665 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
670 rels
= (Elf_Internal_Rel
*) relas
;
677 Elf32_External_Rel
* erels
;
679 GET_DATA_ALLOC (rel_offset
, rel_size
, erels
,
680 Elf32_External_Rel
*, "relocs");
682 rel_size
= rel_size
/ sizeof (Elf32_External_Rel
);
684 rels
= (Elf_Internal_Rel
*)
685 malloc (rel_size
* sizeof (Elf_Internal_Rel
));
689 error(_("out of memory parsing relocs"));
693 for (i
= 0; i
< rel_size
; i
++)
695 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
696 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
701 relas
= (Elf_Internal_Rela
*) rels
;
705 Elf64_External_Rel
* erels
;
707 GET_DATA_ALLOC (rel_offset
, rel_size
, erels
,
708 Elf64_External_Rel
*, "relocs");
710 rel_size
= rel_size
/ sizeof (Elf64_External_Rel
);
712 rels
= (Elf_Internal_Rel
*)
713 malloc (rel_size
* sizeof (Elf_Internal_Rel
));
717 error(_("out of memory parsing relocs"));
721 for (i
= 0; i
< rel_size
; i
++)
723 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
724 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
729 relas
= (Elf_Internal_Rela
*) rels
;
735 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
738 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
740 for (i
= 0; i
< rel_size
; i
++)
745 bfd_vma symtab_index
;
750 offset
= relas
[i
].r_offset
;
751 info
= relas
[i
].r_info
;
755 offset
= rels
[i
].r_offset
;
756 info
= rels
[i
].r_info
;
761 type
= ELF32_R_TYPE (info
);
762 symtab_index
= ELF32_R_SYM (info
);
766 if (elf_header
.e_machine
== EM_SPARCV9
)
767 type
= ELF64_R_TYPE_ID (info
);
769 type
= ELF64_R_TYPE (info
);
770 /* The #ifdef BFD64 below is to prevent a compile time warning.
771 We know that if we do not have a 64 bit data type that we
772 will never execute this code anyway. */
774 symtab_index
= ELF64_R_SYM (info
);
778 #ifdef _bfd_int64_low
779 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
781 printf (" %8.8lx %5.5lx ", offset
, info
);
784 switch (elf_header
.e_machine
)
791 rtype
= elf_m32r_reloc_type (type
);
796 rtype
= elf_i386_reloc_type (type
);
800 rtype
= elf_m68k_reloc_type (type
);
804 rtype
= elf_i960_reloc_type (type
);
808 rtype
= elf_avr_reloc_type (type
);
815 rtype
= elf_sparc_reloc_type (type
);
819 rtype
= v850_reloc_type (type
);
823 rtype
= elf_d10v_reloc_type (type
);
827 rtype
= elf_d30v_reloc_type (type
);
831 rtype
= elf_sh_reloc_type (type
);
834 case EM_CYGNUS_MN10300
:
835 rtype
= elf_mn10300_reloc_type (type
);
838 case EM_CYGNUS_MN10200
:
839 rtype
= elf_mn10200_reloc_type (type
);
843 rtype
= elf_fr30_reloc_type (type
);
847 rtype
= elf_mcore_reloc_type (type
);
851 rtype
= elf_ppc_reloc_type (type
);
856 rtype
= elf_mips_reloc_type (type
);
860 rtype
= elf_alpha_reloc_type (type
);
864 rtype
= elf_arm_reloc_type (type
);
868 rtype
= elf_arc_reloc_type (type
);
872 rtype
= elf_hppa_reloc_type (type
);
876 rtype
= elf_pj_reloc_type (type
);
879 rtype
= elf_ia64_reloc_type (type
);
884 #ifdef _bfd_int64_low
885 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type
));
887 printf (_("unrecognised: %-7lx"), type
);
890 printf ("%-21.21s", rtype
);
896 if (symtab_index
>= nsyms
)
897 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
900 Elf_Internal_Sym
* psym
;
902 psym
= symtab
+ symtab_index
;
905 print_vma (psym
->st_value
, LONG_HEX
);
908 if (psym
->st_name
== 0)
910 SECTION_NAME (section_headers
+ psym
->st_shndx
));
911 else if (strtab
== NULL
)
912 printf (_("<string table index %3ld>"), psym
->st_name
);
914 printf ("%-25.25s", strtab
+ psym
->st_name
);
917 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
923 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
924 print_vma (relas
[i
].r_addend
, LONG_HEX
);
927 if (elf_header
.e_machine
== EM_SPARCV9
928 && !strcmp (rtype
, "R_SPARC_OLO10"))
929 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
940 get_mips_dynamic_type (type
)
945 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
946 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
947 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
948 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
949 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
950 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
951 case DT_MIPS_MSYM
: return "MIPS_MSYM";
952 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
953 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
954 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
955 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
956 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
957 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
958 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
959 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
960 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
961 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
962 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
963 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
964 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
965 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
966 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
967 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
968 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
969 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
970 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
971 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
972 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
973 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
974 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
975 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
976 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
977 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
978 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
979 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
980 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
981 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
982 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
983 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
984 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
985 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
986 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
987 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
994 get_sparc64_dynamic_type (type
)
999 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1006 get_parisc_dynamic_type (type
)
1011 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1012 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1013 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1014 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1015 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1016 case DT_HP_PREINIT
: return "HP_PREINIT";
1017 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1018 case DT_HP_NEEDED
: return "HP_NEEDED";
1019 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1020 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1021 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1022 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1023 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1030 get_dynamic_type (type
)
1033 static char buff
[32];
1037 case DT_NULL
: return "NULL";
1038 case DT_NEEDED
: return "NEEDED";
1039 case DT_PLTRELSZ
: return "PLTRELSZ";
1040 case DT_PLTGOT
: return "PLTGOT";
1041 case DT_HASH
: return "HASH";
1042 case DT_STRTAB
: return "STRTAB";
1043 case DT_SYMTAB
: return "SYMTAB";
1044 case DT_RELA
: return "RELA";
1045 case DT_RELASZ
: return "RELASZ";
1046 case DT_RELAENT
: return "RELAENT";
1047 case DT_STRSZ
: return "STRSZ";
1048 case DT_SYMENT
: return "SYMENT";
1049 case DT_INIT
: return "INIT";
1050 case DT_FINI
: return "FINI";
1051 case DT_SONAME
: return "SONAME";
1052 case DT_RPATH
: return "RPATH";
1053 case DT_SYMBOLIC
: return "SYMBOLIC";
1054 case DT_REL
: return "REL";
1055 case DT_RELSZ
: return "RELSZ";
1056 case DT_RELENT
: return "RELENT";
1057 case DT_PLTREL
: return "PLTREL";
1058 case DT_DEBUG
: return "DEBUG";
1059 case DT_TEXTREL
: return "TEXTREL";
1060 case DT_JMPREL
: return "JMPREL";
1061 case DT_BIND_NOW
: return "BIND_NOW";
1062 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1063 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1064 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1065 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1066 case DT_RUNPATH
: return "RUNPATH";
1067 case DT_FLAGS
: return "FLAGS";
1069 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1070 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1072 case DT_PLTPADSZ
: return "PLTPADSZ";
1073 case DT_MOVEENT
: return "MOVEENT";
1074 case DT_MOVESZ
: return "MOVESZ";
1075 case DT_FEATURE_1
: return "FEATURE_1";
1076 case DT_POSFLAG_1
: return "POSFLAG_1";
1077 case DT_SYMINSZ
: return "SYMINSZ";
1078 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1080 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1081 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1083 case DT_VERSYM
: return "VERSYM";
1085 case DT_RELACOUNT
: return "RELACOUNT";
1086 case DT_RELCOUNT
: return "RELCOUNT";
1087 case DT_FLAGS_1
: return "FLAGS_1";
1088 case DT_VERDEF
: return "VERDEF";
1089 case DT_VERDEFNUM
: return "VERDEFNUM";
1090 case DT_VERNEED
: return "VERNEED";
1091 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1093 case DT_AUXILIARY
: return "AUXILARY";
1094 case DT_USED
: return "USED";
1095 case DT_FILTER
: return "FILTER";
1098 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1100 const char * result
;
1102 switch (elf_header
.e_machine
)
1105 case EM_MIPS_RS4_BE
:
1106 result
= get_mips_dynamic_type (type
);
1109 result
= get_sparc64_dynamic_type (type
);
1119 sprintf (buff
, _("Processor Specific: %lx"), type
);
1121 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1123 const char * result
;
1125 switch (elf_header
.e_machine
)
1128 result
= get_parisc_dynamic_type (type
);
1138 sprintf (buff
, _("Operating System specific: %lx"), type
);
1141 sprintf (buff
, _("<unknown>: %lx"), type
);
1148 get_file_type (e_type
)
1151 static char buff
[32];
1155 case ET_NONE
: return _("NONE (None)");
1156 case ET_REL
: return _("REL (Relocatable file)");
1157 case ET_EXEC
: return _("EXEC (Executable file)");
1158 case ET_DYN
: return _("DYN (Shared object file)");
1159 case ET_CORE
: return _("CORE (Core file)");
1162 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1163 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1164 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1165 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1167 sprintf (buff
, _("<unknown>: %x"), e_type
);
1173 get_machine_name (e_machine
)
1176 static char buff
[64]; /* XXX */
1180 case EM_NONE
: return _("None");
1181 case EM_M32
: return "WE32100";
1182 case EM_SPARC
: return "Sparc";
1183 case EM_386
: return "Intel 80386";
1184 case EM_68K
: return "MC68000";
1185 case EM_88K
: return "MC88000";
1186 case EM_486
: return "Intel 80486";
1187 case EM_860
: return "Intel 80860";
1188 case EM_MIPS
: return "MIPS R3000";
1189 case EM_S370
: return "IBM System/370";
1190 case EM_MIPS_RS4_BE
: return "MIPS R4000 big-endian";
1191 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1192 case EM_PARISC
: return "HPPA";
1193 case EM_PPC_OLD
: return "Power PC (old)";
1194 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1195 case EM_960
: return "Intel 90860";
1196 case EM_PPC
: return "PowerPC";
1197 case EM_V800
: return "NEC V800";
1198 case EM_FR20
: return "Fujitsu FR20";
1199 case EM_RH32
: return "TRW RH32";
1200 case EM_MCORE
: return "MCORE";
1201 case EM_ARM
: return "ARM";
1202 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1203 case EM_SH
: return "Hitachi SH";
1204 case EM_SPARCV9
: return "Sparc v9";
1205 case EM_TRICORE
: return "Siemens Tricore";
1206 case EM_ARC
: return "Argonaut RISC Core";
1207 case EM_H8_300
: return "Hitachi H8/300";
1208 case EM_H8_300H
: return "Hitachi H8/300H";
1209 case EM_H8S
: return "Hitachi H8S";
1210 case EM_H8_500
: return "Hitachi H8/500";
1211 case EM_IA_64
: return "Intel IA-64";
1212 case EM_MIPS_X
: return "Stanford MIPS-X";
1213 case EM_COLDFIRE
: return "Motorola Coldfire";
1214 case EM_68HC12
: return "Motorola M68HC12";
1215 case EM_ALPHA
: return "Alpha";
1216 case EM_CYGNUS_D10V
: return "d10v";
1217 case EM_CYGNUS_D30V
: return "d30v";
1218 case EM_CYGNUS_ARC
: return "Arc";
1219 case EM_CYGNUS_M32R
: return "Mitsubishi M32r";
1220 case EM_CYGNUS_V850
: return "NEC v850";
1221 case EM_CYGNUS_MN10300
: return "mn10300";
1222 case EM_CYGNUS_MN10200
: return "mn10200";
1223 case EM_CYGNUS_FR30
: return "Fujitsu FR30";
1224 case EM_PJ
: return "picoJava";
1225 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1226 case EM_PCP
: return "Siemens PCP";
1227 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1228 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1229 case EM_STARCORE
: return "Motorola Star*Core processor";
1230 case EM_ME16
: return "Toyota ME16 processor";
1231 case EM_ST100
: return "STMicroelectronics ST100 processor";
1232 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1233 case EM_FX66
: return "Siemens FX66 microcontroller";
1234 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1235 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1236 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1237 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1238 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1239 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1240 case EM_SVX
: return "Silicon Graphics SVx";
1241 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1242 case EM_VAX
: return "Digital VAX";
1243 case EM_AVR
: return "AVR";
1245 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1251 decode_ARM_machine_flags (e_flags
, buf
)
1258 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1259 e_flags
&= ~ EF_ARM_EABIMASK
;
1261 /* Handle "generic" ARM flags. */
1262 if (e_flags
& EF_ARM_RELEXEC
)
1264 strcat (buf
, ", relocatable executable");
1265 e_flags
&= ~ EF_ARM_RELEXEC
;
1268 if (e_flags
& EF_ARM_HASENTRY
)
1270 strcat (buf
, ", has entry point");
1271 e_flags
&= ~ EF_ARM_HASENTRY
;
1274 /* Now handle EABI specific flags. */
1278 strcat (buf
, ", <unknown EABI>");
1283 case EF_ARM_EABI_VER1
:
1288 /* Process flags one bit at a time. */
1289 flag
= e_flags
& - e_flags
;
1294 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_INTERWORK. */
1295 strcat (buf
, ", sorted symbol tables");
1305 case EF_ARM_EABI_UNKNOWN
:
1310 /* Process flags one bit at a time. */
1311 flag
= e_flags
& - e_flags
;
1317 strcat (buf
, ", interworking enabled");
1321 strcat (buf
, ", uses APCS/26");
1325 strcat (buf
, ", uses APCS/float");
1329 strcat (buf
, ", position independent");
1333 strcat (buf
, ", 8 bit structure alignment");
1337 strcat (buf
, ", uses new ABI");
1341 strcat (buf
, ", uses old ABI");
1345 strcat (buf
, ", software FP");
1356 strcat (buf
,", <unknown>");
1360 get_machine_flags (e_flags
, e_machine
)
1364 static char buf
[1024];
1376 decode_ARM_machine_flags (e_flags
, buf
);
1380 if (e_flags
& EF_CPU32
)
1381 strcat (buf
, ", cpu32");
1385 if (e_flags
& EF_PPC_EMB
)
1386 strcat (buf
, ", emb");
1388 if (e_flags
& EF_PPC_RELOCATABLE
)
1389 strcat (buf
, ", relocatable");
1391 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1392 strcat (buf
, ", relocatable-lib");
1395 case EM_CYGNUS_V850
:
1396 switch (e_flags
& EF_V850_ARCH
)
1399 strcat (buf
, ", v850e");
1402 strcat (buf
, ", v850ea");
1405 strcat (buf
, ", v850");
1408 strcat (buf
, ", unknown v850 architecture variant");
1413 case EM_CYGNUS_M32R
:
1414 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1415 strcat (buf
, ", m32r");
1420 case EM_MIPS_RS4_BE
:
1421 if (e_flags
& EF_MIPS_NOREORDER
)
1422 strcat (buf
, ", noreorder");
1424 if (e_flags
& EF_MIPS_PIC
)
1425 strcat (buf
, ", pic");
1427 if (e_flags
& EF_MIPS_CPIC
)
1428 strcat (buf
, ", cpic");
1430 if (e_flags
& EF_MIPS_ABI2
)
1431 strcat (buf
, ", abi2");
1433 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_1
)
1434 strcat (buf
, ", mips1");
1436 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_2
)
1437 strcat (buf
, ", mips2");
1439 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_3
)
1440 strcat (buf
, ", mips3");
1442 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_4
)
1443 strcat (buf
, ", mips4");
1447 if (e_flags
& EF_SPARC_32PLUS
)
1448 strcat (buf
, ", v8+");
1450 if (e_flags
& EF_SPARC_SUN_US1
)
1451 strcat (buf
, ", ultrasparcI");
1453 if (e_flags
& EF_SPARC_SUN_US3
)
1454 strcat (buf
, ", ultrasparcIII");
1456 if (e_flags
& EF_SPARC_HAL_R1
)
1457 strcat (buf
, ", halr1");
1459 if (e_flags
& EF_SPARC_LEDATA
)
1460 strcat (buf
, ", ledata");
1462 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1463 strcat (buf
, ", tso");
1465 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1466 strcat (buf
, ", pso");
1468 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1469 strcat (buf
, ", rmo");
1473 switch (e_flags
& EF_PARISC_ARCH
)
1475 case EFA_PARISC_1_0
:
1476 strcpy (buf
, ", PA-RISC 1.0");
1478 case EFA_PARISC_1_1
:
1479 strcpy (buf
, ", PA-RISC 1.1");
1481 case EFA_PARISC_2_0
:
1482 strcpy (buf
, ", PA-RISC 2.0");
1487 if (e_flags
& EF_PARISC_TRAPNIL
)
1488 strcat (buf
, ", trapnil");
1489 if (e_flags
& EF_PARISC_EXT
)
1490 strcat (buf
, ", ext");
1491 if (e_flags
& EF_PARISC_LSB
)
1492 strcat (buf
, ", lsb");
1493 if (e_flags
& EF_PARISC_WIDE
)
1494 strcat (buf
, ", wide");
1495 if (e_flags
& EF_PARISC_NO_KABP
)
1496 strcat (buf
, ", no kabp");
1497 if (e_flags
& EF_PARISC_LAZYSWAP
)
1498 strcat (buf
, ", lazyswap");
1502 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1503 strcat (buf
, ", new calling convention");
1505 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1506 strcat (buf
, ", gnu calling convention");
1515 get_mips_segment_type (type
)
1520 case PT_MIPS_REGINFO
:
1522 case PT_MIPS_RTPROC
:
1524 case PT_MIPS_OPTIONS
:
1534 get_parisc_segment_type (type
)
1539 case PT_HP_TLS
: return "HP_TLS";
1540 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1541 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1542 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1543 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1544 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1545 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1546 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1547 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1548 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1549 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1550 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1551 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1552 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1561 get_segment_type (p_type
)
1562 unsigned long p_type
;
1564 static char buff
[32];
1568 case PT_NULL
: return "NULL";
1569 case PT_LOAD
: return "LOAD";
1570 case PT_DYNAMIC
: return "DYNAMIC";
1571 case PT_INTERP
: return "INTERP";
1572 case PT_NOTE
: return "NOTE";
1573 case PT_SHLIB
: return "SHLIB";
1574 case PT_PHDR
: return "PHDR";
1577 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1579 const char * result
;
1581 switch (elf_header
.e_machine
)
1584 case EM_MIPS_RS4_BE
:
1585 result
= get_mips_segment_type (p_type
);
1588 result
= get_parisc_segment_type (p_type
);
1598 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1600 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1602 const char * result
;
1604 switch (elf_header
.e_machine
)
1607 result
= get_parisc_segment_type (p_type
);
1617 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1620 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1627 get_mips_section_type_name (sh_type
)
1628 unsigned int sh_type
;
1632 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1633 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1634 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1635 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1636 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1637 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1638 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1639 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1640 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1641 case SHT_MIPS_RELD
: return "MIPS_RELD";
1642 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
1643 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
1644 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1645 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
1646 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
1647 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
1648 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
1649 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
1650 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
1651 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
1652 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
1653 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
1654 case SHT_MIPS_LINE
: return "MIPS_LINE";
1655 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
1656 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
1657 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
1658 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
1659 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
1660 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
1661 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1662 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
1663 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
1664 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
1665 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
1666 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
1667 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
1668 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
1669 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
1670 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
1678 get_parisc_section_type_name (sh_type
)
1679 unsigned int sh_type
;
1683 case SHT_PARISC_EXT
: return "PARISC_EXT";
1684 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
1685 case SHT_PARISC_DOC
: return "PARISC_DOC";
1693 get_section_type_name (sh_type
)
1694 unsigned int sh_type
;
1696 static char buff
[32];
1700 case SHT_NULL
: return "NULL";
1701 case SHT_PROGBITS
: return "PROGBITS";
1702 case SHT_SYMTAB
: return "SYMTAB";
1703 case SHT_STRTAB
: return "STRTAB";
1704 case SHT_RELA
: return "RELA";
1705 case SHT_HASH
: return "HASH";
1706 case SHT_DYNAMIC
: return "DYNAMIC";
1707 case SHT_NOTE
: return "NOTE";
1708 case SHT_NOBITS
: return "NOBITS";
1709 case SHT_REL
: return "REL";
1710 case SHT_SHLIB
: return "SHLIB";
1711 case SHT_DYNSYM
: return "DYNSYM";
1712 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
1713 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
1714 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1715 case SHT_GNU_verdef
: return "VERDEF";
1716 case SHT_GNU_verneed
: return "VERNEED";
1717 case SHT_GNU_versym
: return "VERSYM";
1718 case 0x6ffffff0: return "VERSYM";
1719 case 0x6ffffffc: return "VERDEF";
1720 case 0x7ffffffd: return "AUXILIARY";
1721 case 0x7fffffff: return "FILTER";
1724 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
1726 const char * result
;
1728 switch (elf_header
.e_machine
)
1731 case EM_MIPS_RS4_BE
:
1732 result
= get_mips_section_type_name (sh_type
);
1735 result
= get_parisc_section_type_name (sh_type
);
1745 sprintf (buff
, "SHT_LOPROC+%x", sh_type
- SHT_LOPROC
);
1747 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
1748 sprintf (buff
, "SHT_LOOS+%x", sh_type
- SHT_LOOS
);
1749 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
1750 sprintf (buff
, "SHT_LOUSER+%x", sh_type
- SHT_LOUSER
);
1752 sprintf (buff
, _("<unknown>: %x"), sh_type
);
1758 struct option options
[] =
1760 {"all", no_argument
, 0, 'a'},
1761 {"file-header", no_argument
, 0, 'h'},
1762 {"program-headers", no_argument
, 0, 'l'},
1763 {"headers", no_argument
, 0, 'e'},
1764 {"histogram", no_argument
, 0, 'I'},
1765 {"segments", no_argument
, 0, 'l'},
1766 {"sections", no_argument
, 0, 'S'},
1767 {"section-headers", no_argument
, 0, 'S'},
1768 {"symbols", no_argument
, 0, 's'},
1769 {"syms", no_argument
, 0, 's'},
1770 {"relocs", no_argument
, 0, 'r'},
1771 {"notes", no_argument
, 0, 'n'},
1772 {"dynamic", no_argument
, 0, 'd'},
1773 {"arch-specific", no_argument
, 0, 'A'},
1774 {"version-info", no_argument
, 0, 'V'},
1775 {"use-dynamic", no_argument
, 0, 'D'},
1776 {"hex-dump", required_argument
, 0, 'x'},
1777 {"debug-dump", optional_argument
, 0, 'w'},
1778 #ifdef SUPPORT_DISASSEMBLY
1779 {"instruction-dump", required_argument
, 0, 'i'},
1782 {"version", no_argument
, 0, 'v'},
1783 {"help", no_argument
, 0, 'H'},
1784 {0, no_argument
, 0, 0}
1790 fprintf (stdout
, _("Usage: readelf {options} elf-file(s)\n"));
1791 fprintf (stdout
, _(" Options are:\n"));
1792 fprintf (stdout
, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1793 fprintf (stdout
, _(" -h or --file-header Display the ELF file header\n"));
1794 fprintf (stdout
, _(" -l or --program-headers or --segments\n"));
1795 fprintf (stdout
, _(" Display the program headers\n"));
1796 fprintf (stdout
, _(" -S or --section-headers or --sections\n"));
1797 fprintf (stdout
, _(" Display the sections' header\n"));
1798 fprintf (stdout
, _(" -e or --headers Equivalent to: -h -l -S\n"));
1799 fprintf (stdout
, _(" -s or --syms or --symbols Display the symbol table\n"));
1800 fprintf (stdout
, _(" -n or --notes Display the core notes (if present)\n"));
1801 fprintf (stdout
, _(" -r or --relocs Display the relocations (if present)\n"));
1802 fprintf (stdout
, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1803 fprintf (stdout
, _(" -V or --version-info Display the version sections (if present)\n"));
1804 fprintf (stdout
, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1805 fprintf (stdout
, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1806 fprintf (stdout
, _(" -x <number> or --hex-dump=<number>\n"));
1807 fprintf (stdout
, _(" Dump the contents of section <number>\n"));
1808 fprintf (stdout
, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1809 fprintf (stdout
, _(" Display the contents of DWARF2 debug sections\n"));
1810 #ifdef SUPPORT_DISASSEMBLY
1811 fprintf (stdout
, _(" -i <number> or --instruction-dump=<number>\n"));
1812 fprintf (stdout
, _(" Disassemble the contents of section <number>\n"));
1814 fprintf (stdout
, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1815 fprintf (stdout
, _(" -v or --version Display the version number of readelf\n"));
1816 fprintf (stdout
, _(" -H or --help Display this information\n"));
1817 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
1823 request_dump (section
, type
)
1824 unsigned int section
;
1827 if (section
>= num_dump_sects
)
1829 char * new_dump_sects
;
1831 new_dump_sects
= (char *) calloc (section
+ 1, 1);
1833 if (new_dump_sects
== NULL
)
1834 error (_("Out of memory allocating dump request table."));
1837 /* Copy current flag settings. */
1838 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
1842 dump_sects
= new_dump_sects
;
1843 num_dump_sects
= section
+ 1;
1848 dump_sects
[section
] |= type
;
1854 parse_args (argc
, argv
)
1863 while ((c
= getopt_long
1864 (argc
, argv
, "ersahnldSDAIw::x:i:vV", options
, NULL
)) != EOF
)
1899 do_using_dynamic
++;
1927 section
= strtoul (optarg
, & cp
, 0);
1928 if (! * cp
&& section
>= 0)
1930 request_dump (section
, HEX_DUMP
);
1950 do_debug_abbrevs
= 1;
1960 do_debug_pubnames
= 1;
1965 do_debug_aranges
= 1;
1969 warn (_("Unrecognised debug option '%s'\n"), optarg
);
1974 #ifdef SUPPORT_DISASSEMBLY
1977 section
= strtoul (optarg
, & cp
, 0);
1978 if (! * cp
&& section
>= 0)
1980 request_dump (section
, DISASS_DUMP
);
1986 print_version (program_name
);
1993 /* xgettext:c-format */
1994 error (_("Invalid option '-%c'\n"), c
);
2001 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_sections
2002 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2003 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2007 warn (_("Nothing to do.\n"));
2013 get_elf_class (elf_class
)
2014 unsigned char elf_class
;
2016 static char buff
[32];
2020 case ELFCLASSNONE
: return _("none");
2021 case ELFCLASS32
: return _("ELF32");
2022 case ELFCLASS64
: return _("ELF64");
2024 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2030 get_data_encoding (encoding
)
2031 unsigned char encoding
;
2033 static char buff
[32];
2037 case ELFDATANONE
: return _("none");
2038 case ELFDATA2LSB
: return _("2's complement, little endian");
2039 case ELFDATA2MSB
: return _("2's complement, big endian");
2041 sprintf (buff
, _("<unknown: %x>"), encoding
);
2047 get_osabi_name (osabi
)
2048 unsigned char osabi
;
2050 static char buff
[32];
2054 case ELFOSABI_SYSV
: return _("UNIX - System V");
2055 case ELFOSABI_HPUX
: return _("UNIX - HP-UX");
2056 case ELFOSABI_LINUX
: return _("UNIX - Linux");
2057 case ELFOSABI_STANDALONE
: return _("Standalone App");
2058 case ELFOSABI_ARM
: return _("ARM");
2060 sprintf (buff
, _("<unknown: %x>"), osabi
);
2065 /* Decode the data held in 'elf_header'. */
2067 process_file_header ()
2069 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2070 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2071 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2072 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2075 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2083 printf (_("ELF Header:\n"));
2084 printf (_(" Magic: "));
2085 for (i
= 0; i
< EI_NIDENT
; i
++)
2086 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2088 printf (_(" Class: %s\n"),
2089 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2090 printf (_(" Data: %s\n"),
2091 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2092 printf (_(" Version: %d %s\n"),
2093 elf_header
.e_ident
[EI_VERSION
],
2094 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2096 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2099 printf (_(" OS/ABI: %s\n"),
2100 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2101 printf (_(" ABI Version: %d\n"),
2102 elf_header
.e_ident
[EI_ABIVERSION
]);
2103 printf (_(" Type: %s\n"),
2104 get_file_type (elf_header
.e_type
));
2105 printf (_(" Machine: %s\n"),
2106 get_machine_name (elf_header
.e_machine
));
2107 printf (_(" Version: 0x%lx\n"),
2108 (unsigned long) elf_header
.e_version
);
2110 printf (_(" Entry point address: "));
2111 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2112 printf (_("\n Start of program headers: "));
2113 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2114 printf (_(" (bytes into file)\n Start of section headers: "));
2115 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2116 printf (_(" (bytes into file)\n"));
2118 printf (_(" Flags: 0x%lx%s\n"),
2119 (unsigned long) elf_header
.e_flags
,
2120 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2121 printf (_(" Size of this header: %ld (bytes)\n"),
2122 (long) elf_header
.e_ehsize
);
2123 printf (_(" Size of program headers: %ld (bytes)\n"),
2124 (long) elf_header
.e_phentsize
);
2125 printf (_(" Number of program headers: %ld\n"),
2126 (long) elf_header
.e_phnum
);
2127 printf (_(" Size of section headers: %ld (bytes)\n"),
2128 (long) elf_header
.e_shentsize
);
2129 printf (_(" Number of section headers: %ld\n"),
2130 (long) elf_header
.e_shnum
);
2131 printf (_(" Section header string table index: %ld\n"),
2132 (long) elf_header
.e_shstrndx
);
2140 get_32bit_program_headers (file
, program_headers
)
2142 Elf_Internal_Phdr
* program_headers
;
2144 Elf32_External_Phdr
* phdrs
;
2145 Elf32_External_Phdr
* external
;
2146 Elf32_Internal_Phdr
* internal
;
2149 GET_DATA_ALLOC (elf_header
.e_phoff
,
2150 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2151 phdrs
, Elf32_External_Phdr
*, "program headers");
2153 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2154 i
< elf_header
.e_phnum
;
2155 i
++, internal
++, external
++)
2157 internal
->p_type
= BYTE_GET (external
->p_type
);
2158 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2159 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2160 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2161 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2162 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2163 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2164 internal
->p_align
= BYTE_GET (external
->p_align
);
2173 get_64bit_program_headers (file
, program_headers
)
2175 Elf_Internal_Phdr
* program_headers
;
2177 Elf64_External_Phdr
* phdrs
;
2178 Elf64_External_Phdr
* external
;
2179 Elf64_Internal_Phdr
* internal
;
2182 GET_DATA_ALLOC (elf_header
.e_phoff
,
2183 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2184 phdrs
, Elf64_External_Phdr
*, "program headers");
2186 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2187 i
< elf_header
.e_phnum
;
2188 i
++, internal
++, external
++)
2190 internal
->p_type
= BYTE_GET (external
->p_type
);
2191 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2192 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2193 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2194 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2195 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2196 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2197 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2206 process_program_headers (file
)
2209 Elf_Internal_Phdr
* program_headers
;
2210 Elf_Internal_Phdr
* segment
;
2213 if (elf_header
.e_phnum
== 0)
2216 printf (_("\nThere are no program headers in this file.\n"));
2220 if (do_segments
&& !do_header
)
2222 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2223 printf (_("Entry point "));
2224 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2225 printf (_("\nThere are %d program headers, starting at offset "),
2226 elf_header
.e_phnum
);
2227 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2231 program_headers
= (Elf_Internal_Phdr
*) malloc
2232 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2234 if (program_headers
== NULL
)
2236 error (_("Out of memory\n"));
2241 i
= get_32bit_program_headers (file
, program_headers
);
2243 i
= get_64bit_program_headers (file
, program_headers
);
2247 free (program_headers
);
2254 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2258 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2262 (_(" Type Offset VirtAddr PhysAddr\n"));
2264 (_(" FileSiz MemSiz Flags Align\n"));
2272 for (i
= 0, segment
= program_headers
;
2273 i
< elf_header
.e_phnum
;
2278 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2282 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2283 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2284 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2285 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2286 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2288 (segment
->p_flags
& PF_R
? 'R' : ' '),
2289 (segment
->p_flags
& PF_W
? 'W' : ' '),
2290 (segment
->p_flags
& PF_X
? 'E' : ' '));
2291 printf ("%#lx", (unsigned long) segment
->p_align
);
2295 print_vma (segment
->p_offset
, FULL_HEX
);
2297 print_vma (segment
->p_vaddr
, FULL_HEX
);
2299 print_vma (segment
->p_paddr
, FULL_HEX
);
2301 print_vma (segment
->p_filesz
, FULL_HEX
);
2303 print_vma (segment
->p_memsz
, FULL_HEX
);
2305 (segment
->p_flags
& PF_R
? 'R' : ' '),
2306 (segment
->p_flags
& PF_W
? 'W' : ' '),
2307 (segment
->p_flags
& PF_X
? 'E' : ' '));
2308 print_vma (segment
->p_align
, HEX
);
2312 switch (segment
->p_type
)
2316 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2317 - (segment
->p_offset
& 0xfffff000);
2322 error (_("more than one dynamic segment\n"));
2324 dynamic_addr
= segment
->p_offset
;
2325 dynamic_size
= segment
->p_filesz
;
2329 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2330 error (_("Unable to find program interpreter name\n"));
2333 program_interpreter
[0] = 0;
2334 fscanf (file
, "%63s", program_interpreter
);
2337 printf (_("\n [Requesting program interpreter: %s]"),
2338 program_interpreter
);
2344 putc ('\n', stdout
);
2353 if (do_segments
&& section_headers
!= NULL
)
2355 printf (_("\n Section to Segment mapping:\n"));
2356 printf (_(" Segment Sections...\n"));
2358 assert (string_table
!= NULL
);
2360 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2363 Elf_Internal_Shdr
* section
;
2365 segment
= program_headers
+ i
;
2366 section
= section_headers
;
2368 printf (" %2.2d ", i
);
2370 for (j
= 0; j
< elf_header
.e_shnum
; j
++, section
++)
2372 if (section
->sh_size
> 0
2373 /* Compare allocated sections by VMA, unallocated
2374 sections by file offset. */
2375 && (section
->sh_flags
& SHF_ALLOC
2376 ? (section
->sh_addr
>= segment
->p_vaddr
2377 && section
->sh_addr
+ section
->sh_size
2378 <= segment
->p_vaddr
+ segment
->p_memsz
)
2379 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2380 && (section
->sh_offset
+ section
->sh_size
2381 <= segment
->p_offset
+ segment
->p_filesz
))))
2382 printf ("%s ", SECTION_NAME (section
));
2389 free (program_headers
);
2396 get_32bit_section_headers (file
)
2399 Elf32_External_Shdr
* shdrs
;
2400 Elf32_Internal_Shdr
* internal
;
2403 GET_DATA_ALLOC (elf_header
.e_shoff
,
2404 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2405 shdrs
, Elf32_External_Shdr
*, "section headers");
2407 section_headers
= (Elf_Internal_Shdr
*) malloc
2408 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2410 if (section_headers
== NULL
)
2412 error (_("Out of memory\n"));
2416 for (i
= 0, internal
= section_headers
;
2417 i
< elf_header
.e_shnum
;
2420 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2421 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2422 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2423 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2424 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2425 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2426 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2427 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2428 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2429 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2438 get_64bit_section_headers (file
)
2441 Elf64_External_Shdr
* shdrs
;
2442 Elf64_Internal_Shdr
* internal
;
2445 GET_DATA_ALLOC (elf_header
.e_shoff
,
2446 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2447 shdrs
, Elf64_External_Shdr
*, "section headers");
2449 section_headers
= (Elf_Internal_Shdr
*) malloc
2450 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2452 if (section_headers
== NULL
)
2454 error (_("Out of memory\n"));
2458 for (i
= 0, internal
= section_headers
;
2459 i
< elf_header
.e_shnum
;
2462 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2463 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2464 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2465 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2466 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2467 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2468 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2469 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2470 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2471 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2479 static Elf_Internal_Sym
*
2480 get_32bit_elf_symbols (file
, offset
, number
)
2482 unsigned long offset
;
2483 unsigned long number
;
2485 Elf32_External_Sym
* esyms
;
2486 Elf_Internal_Sym
* isyms
;
2487 Elf_Internal_Sym
* psym
;
2490 GET_DATA_ALLOC (offset
, number
* sizeof (Elf32_External_Sym
),
2491 esyms
, Elf32_External_Sym
*, "symbols");
2493 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2497 error (_("Out of memory\n"));
2503 for (j
= 0, psym
= isyms
;
2507 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2508 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
2509 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
2510 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2511 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2512 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2520 static Elf_Internal_Sym
*
2521 get_64bit_elf_symbols (file
, offset
, number
)
2523 unsigned long offset
;
2524 unsigned long number
;
2526 Elf64_External_Sym
* esyms
;
2527 Elf_Internal_Sym
* isyms
;
2528 Elf_Internal_Sym
* psym
;
2531 GET_DATA_ALLOC (offset
, number
* sizeof (Elf64_External_Sym
),
2532 esyms
, Elf64_External_Sym
*, "symbols");
2534 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2538 error (_("Out of memory\n"));
2544 for (j
= 0, psym
= isyms
;
2548 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2549 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2550 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2551 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2552 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
2553 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
2562 get_elf_section_flags (sh_flags
)
2565 static char buff
[32];
2573 flag
= sh_flags
& - sh_flags
;
2578 case SHF_WRITE
: strcat (buff
, "W"); break;
2579 case SHF_ALLOC
: strcat (buff
, "A"); break;
2580 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
2581 case SHF_MERGE
: strcat (buff
, "M"); break;
2582 case SHF_STRINGS
: strcat (buff
, "S"); break;
2583 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
2584 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
2585 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
2588 if (flag
& SHF_MASKOS
)
2591 sh_flags
&= ~ SHF_MASKOS
;
2593 else if (flag
& SHF_MASKPROC
)
2596 sh_flags
&= ~ SHF_MASKPROC
;
2608 process_section_headers (file
)
2611 Elf_Internal_Shdr
* section
;
2614 section_headers
= NULL
;
2616 if (elf_header
.e_shnum
== 0)
2619 printf (_("\nThere are no sections in this file.\n"));
2624 if (do_sections
&& !do_header
)
2625 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2626 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
2630 if (! get_32bit_section_headers (file
))
2633 else if (! get_64bit_section_headers (file
))
2636 /* Read in the string table, so that we have names to display. */
2637 section
= section_headers
+ elf_header
.e_shstrndx
;
2639 if (section
->sh_size
!= 0)
2641 unsigned long string_table_offset
;
2643 string_table_offset
= section
->sh_offset
;
2645 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2646 string_table
, char *, "string table");
2649 /* Scan the sections for the dynamic symbol table
2650 and dynamic string table and debug sections. */
2651 dynamic_symbols
= NULL
;
2652 dynamic_strings
= NULL
;
2653 dynamic_syminfo
= NULL
;
2655 for (i
= 0, section
= section_headers
;
2656 i
< elf_header
.e_shnum
;
2659 char * name
= SECTION_NAME (section
);
2661 if (section
->sh_type
== SHT_DYNSYM
)
2663 if (dynamic_symbols
!= NULL
)
2665 error (_("File contains multiple dynamic symbol tables\n"));
2669 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
2671 GET_ELF_SYMBOLS (file
, section
->sh_offset
, num_dynamic_syms
);
2673 else if (section
->sh_type
== SHT_STRTAB
2674 && strcmp (name
, ".dynstr") == 0)
2676 if (dynamic_strings
!= NULL
)
2678 error (_("File contains multiple dynamic string tables\n"));
2682 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2683 dynamic_strings
, char *, "dynamic strings");
2685 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
2686 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
)
2687 && strncmp (name
, ".debug_", 7) == 0)
2692 || (do_debug_info
&& (strcmp (name
, "info") == 0))
2693 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
2694 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
2695 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
2696 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
2698 request_dump (i
, DEBUG_DUMP
);
2705 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
2709 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2712 printf (_(" [Nr] Name Type Address Offset\n"));
2713 printf (_(" Size EntSize Flags Link Info Align\n"));
2716 for (i
= 0, section
= section_headers
;
2717 i
< elf_header
.e_shnum
;
2720 printf (" [%2d] %-17.17s %-15.15s ",
2722 SECTION_NAME (section
),
2723 get_section_type_name (section
->sh_type
));
2727 print_vma (section
->sh_addr
, LONG_HEX
);
2729 printf ( " %6.6lx %6.6lx %2.2lx",
2730 (unsigned long) section
->sh_offset
,
2731 (unsigned long) section
->sh_size
,
2732 (unsigned long) section
->sh_entsize
);
2734 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
2736 printf (" %2ld %3lx %ld\n",
2737 (unsigned long) section
->sh_link
,
2738 (unsigned long) section
->sh_info
,
2739 (unsigned long) section
->sh_addralign
);
2744 print_vma (section
->sh_addr
, LONG_HEX
);
2745 printf (" %8.8lx", section
->sh_offset
);
2747 print_vma (section
->sh_size
, LONG_HEX
);
2749 print_vma (section
->sh_entsize
, LONG_HEX
);
2751 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
2753 printf (" %2ld %3lx %ld\n",
2754 (unsigned long) section
->sh_link
,
2755 (unsigned long) section
->sh_info
,
2756 (unsigned long) section
->sh_addralign
);
2760 printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2761 printf (_(" I (info), L (link order), O (extra OS processing required)\n"));
2762 printf (_(" o (os specific), p (processor specific) x (unknown)\n"));
2767 /* Process the reloc section. */
2769 process_relocs (file
)
2772 unsigned long rel_size
;
2773 unsigned long rel_offset
;
2779 if (do_using_dynamic
)
2781 int is_rela
= FALSE
;
2786 if (dynamic_info
[DT_REL
])
2788 rel_offset
= dynamic_info
[DT_REL
];
2789 rel_size
= dynamic_info
[DT_RELSZ
];
2792 else if (dynamic_info
[DT_RELA
])
2794 rel_offset
= dynamic_info
[DT_RELA
];
2795 rel_size
= dynamic_info
[DT_RELASZ
];
2798 else if (dynamic_info
[DT_JMPREL
])
2800 rel_offset
= dynamic_info
[DT_JMPREL
];
2801 rel_size
= dynamic_info
[DT_PLTRELSZ
];
2803 switch (dynamic_info
[DT_PLTREL
])
2820 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2821 rel_offset
, rel_size
);
2823 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
2824 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
2827 printf (_("\nThere are no dynamic relocations in this file.\n"));
2831 Elf32_Internal_Shdr
* section
;
2835 for (i
= 0, section
= section_headers
;
2836 i
< elf_header
.e_shnum
;
2839 if ( section
->sh_type
!= SHT_RELA
2840 && section
->sh_type
!= SHT_REL
)
2843 rel_offset
= section
->sh_offset
;
2844 rel_size
= section
->sh_size
;
2848 Elf32_Internal_Shdr
* strsec
;
2849 Elf32_Internal_Shdr
* symsec
;
2850 Elf_Internal_Sym
* symtab
;
2853 unsigned long nsyms
;
2855 printf (_("\nRelocation section "));
2857 if (string_table
== NULL
)
2858 printf ("%d", section
->sh_name
);
2860 printf ("'%s'", SECTION_NAME (section
));
2862 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2863 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
2865 symsec
= section_headers
+ section
->sh_link
;
2867 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
2868 symtab
= GET_ELF_SYMBOLS (file
, symsec
->sh_offset
, nsyms
);
2873 strsec
= section_headers
+ symsec
->sh_link
;
2875 GET_DATA_ALLOC (strsec
->sh_offset
, strsec
->sh_size
, strtab
,
2876 char *, "string table");
2878 is_rela
= section
->sh_type
== SHT_RELA
;
2880 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
);
2890 printf (_("\nThere are no relocations in this file.\n"));
2898 dynamic_segment_mips_val (entry
)
2899 Elf_Internal_Dyn
* entry
;
2901 switch (entry
->d_tag
)
2904 if (entry
->d_un
.d_val
== 0)
2908 static const char * opts
[] =
2910 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2911 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2912 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2913 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2918 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
2919 if (entry
->d_un
.d_val
& (1 << cnt
))
2921 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
2928 case DT_MIPS_IVERSION
:
2929 if (dynamic_strings
!= NULL
)
2930 printf ("Interface Version: %s\n",
2931 dynamic_strings
+ entry
->d_un
.d_val
);
2933 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
2936 case DT_MIPS_TIME_STAMP
:
2941 time_t time
= entry
->d_un
.d_val
;
2942 tmp
= gmtime (&time
);
2943 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
2944 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
2945 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
2946 printf ("Time Stamp: %s\n", timebuf
);
2950 case DT_MIPS_RLD_VERSION
:
2951 case DT_MIPS_LOCAL_GOTNO
:
2952 case DT_MIPS_CONFLICTNO
:
2953 case DT_MIPS_LIBLISTNO
:
2954 case DT_MIPS_SYMTABNO
:
2955 case DT_MIPS_UNREFEXTNO
:
2956 case DT_MIPS_HIPAGENO
:
2957 case DT_MIPS_DELTA_CLASS_NO
:
2958 case DT_MIPS_DELTA_INSTANCE_NO
:
2959 case DT_MIPS_DELTA_RELOC_NO
:
2960 case DT_MIPS_DELTA_SYM_NO
:
2961 case DT_MIPS_DELTA_CLASSSYM_NO
:
2962 case DT_MIPS_COMPACT_SIZE
:
2963 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
2967 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
2973 dynamic_segment_parisc_val (entry
)
2974 Elf_Internal_Dyn
* entry
;
2976 switch (entry
->d_tag
)
2978 case DT_HP_DLD_FLAGS
:
2987 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
2988 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
2989 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
2990 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
2991 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
2992 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
2993 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
2994 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
2995 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
2996 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
2997 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
3001 bfd_vma val
= entry
->d_un
.d_val
;
3003 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
3004 if (val
& flags
[cnt
].bit
)
3008 fputs (flags
[cnt
].str
, stdout
);
3010 val
^= flags
[cnt
].bit
;
3013 if (val
!= 0 || first
)
3017 print_vma (val
, HEX
);
3023 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
3029 get_32bit_dynamic_segment (file
)
3032 Elf32_External_Dyn
* edyn
;
3033 Elf_Internal_Dyn
* entry
;
3036 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
3037 edyn
, Elf32_External_Dyn
*, "dynamic segment");
3039 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3040 how large this .dynamic is now. We can do this even before the byte
3041 swapping since the DT_NULL tag is recognizable. */
3043 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3046 dynamic_segment
= (Elf_Internal_Dyn
*)
3047 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3049 if (dynamic_segment
== NULL
)
3051 error (_("Out of memory\n"));
3056 for (i
= 0, entry
= dynamic_segment
;
3060 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
3061 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
3070 get_64bit_dynamic_segment (file
)
3073 Elf64_External_Dyn
* edyn
;
3074 Elf_Internal_Dyn
* entry
;
3077 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
3078 edyn
, Elf64_External_Dyn
*, "dynamic segment");
3080 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3081 how large this .dynamic is now. We can do this even before the byte
3082 swapping since the DT_NULL tag is recognizable. */
3084 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
3087 dynamic_segment
= (Elf_Internal_Dyn
*)
3088 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
3090 if (dynamic_segment
== NULL
)
3092 error (_("Out of memory\n"));
3097 for (i
= 0, entry
= dynamic_segment
;
3101 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
3102 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
3111 get_dynamic_flags (flags
)
3114 static char buff
[64];
3119 flag
= flags
& - flags
;
3124 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
3125 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
3126 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
3127 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
3128 default: strcat (buff
, "unknown "); break;
3134 /* Parse and display the contents of the dynamic segment. */
3136 process_dynamic_segment (file
)
3139 Elf_Internal_Dyn
* entry
;
3142 if (dynamic_size
== 0)
3145 printf (_("\nThere is no dynamic segment in this file.\n"));
3152 if (! get_32bit_dynamic_segment (file
))
3155 else if (! get_64bit_dynamic_segment (file
))
3158 /* Find the appropriate symbol table. */
3159 if (dynamic_symbols
== NULL
)
3161 for (i
= 0, entry
= dynamic_segment
;
3165 unsigned long offset
;
3167 if (entry
->d_tag
!= DT_SYMTAB
)
3170 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
3172 /* Since we do not know how big the symbol table is,
3173 we default to reading in the entire file (!) and
3174 processing that. This is overkill, I know, but it
3176 offset
= entry
->d_un
.d_val
- loadaddr
;
3178 if (fseek (file
, 0, SEEK_END
))
3179 error (_("Unable to seek to end of file!"));
3182 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf32_External_Sym
);
3184 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf64_External_Sym
);
3186 if (num_dynamic_syms
< 1)
3188 error (_("Unable to determine the number of symbols to load\n"));
3192 dynamic_symbols
= GET_ELF_SYMBOLS (file
, offset
, num_dynamic_syms
);
3196 /* Similarly find a string table. */
3197 if (dynamic_strings
== NULL
)
3199 for (i
= 0, entry
= dynamic_segment
;
3203 unsigned long offset
;
3206 if (entry
->d_tag
!= DT_STRTAB
)
3209 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
3211 /* Since we do not know how big the string table is,
3212 we default to reading in the entire file (!) and
3213 processing that. This is overkill, I know, but it
3216 offset
= entry
->d_un
.d_val
- loadaddr
;
3217 if (fseek (file
, 0, SEEK_END
))
3218 error (_("Unable to seek to end of file\n"));
3219 str_tab_len
= ftell (file
) - offset
;
3221 if (str_tab_len
< 1)
3224 (_("Unable to determine the length of the dynamic string table\n"));
3228 GET_DATA_ALLOC (offset
, str_tab_len
, dynamic_strings
, char *,
3229 "dynamic string table");
3235 /* And find the syminfo section if available. */
3236 if (dynamic_syminfo
== NULL
)
3238 unsigned int syminsz
= 0;
3240 for (i
= 0, entry
= dynamic_segment
;
3244 if (entry
->d_tag
== DT_SYMINENT
)
3246 /* Note: these braces are necessary to avoid a syntax
3247 error from the SunOS4 C compiler. */
3248 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
3250 else if (entry
->d_tag
== DT_SYMINSZ
)
3251 syminsz
= entry
->d_un
.d_val
;
3252 else if (entry
->d_tag
== DT_SYMINFO
)
3253 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
3256 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
3258 Elf_External_Syminfo
* extsyminfo
;
3259 Elf_Internal_Syminfo
* syminfo
;
3261 /* There is a syminfo section. Read the data. */
3262 GET_DATA_ALLOC (dynamic_syminfo_offset
, syminsz
, extsyminfo
,
3263 Elf_External_Syminfo
*, "symbol information");
3265 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
3266 if (dynamic_syminfo
== NULL
)
3268 error (_("Out of memory\n"));
3272 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
3273 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
3276 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
3277 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
3284 if (do_dynamic
&& dynamic_addr
)
3285 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3286 dynamic_addr
, (long) dynamic_size
);
3288 printf (_(" Tag Type Name/Value\n"));
3290 for (i
= 0, entry
= dynamic_segment
;
3299 print_vma (entry
->d_tag
, FULL_HEX
);
3300 dtype
= get_dynamic_type (entry
->d_tag
);
3301 printf (" (%s)%*s", dtype
,
3302 ((is_32bit_elf
? 27 : 19)
3303 - (int) strlen (dtype
)),
3307 switch (entry
->d_tag
)
3311 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
3318 if (entry
->d_tag
== DT_AUXILIARY
)
3319 printf (_("Auxiliary library"));
3321 printf (_("Filter library"));
3323 if (dynamic_strings
)
3324 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
3328 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3337 printf (_("Flags:"));
3338 if (entry
->d_un
.d_val
== 0)
3339 printf (_(" None\n"));
3342 unsigned long int val
= entry
->d_un
.d_val
;
3343 if (val
& DTF_1_PARINIT
)
3345 printf (" PARINIT");
3346 val
^= DTF_1_PARINIT
;
3349 printf (" %lx", val
);
3358 printf (_("Flags:"));
3359 if (entry
->d_un
.d_val
== 0)
3360 printf (_(" None\n"));
3363 unsigned long int val
= entry
->d_un
.d_val
;
3364 if (val
& DF_P1_LAZYLOAD
)
3366 printf (" LAZYLOAD");
3367 val
^= DF_P1_LAZYLOAD
;
3369 if (val
& DF_P1_GROUPPERM
)
3371 printf (" GROUPPERM");
3372 val
^= DF_P1_GROUPPERM
;
3375 printf (" %lx", val
);
3384 printf (_("Flags:"));
3385 if (entry
->d_un
.d_val
== 0)
3386 printf (_(" None\n"));
3389 unsigned long int val
= entry
->d_un
.d_val
;
3395 if (val
& DF_1_GLOBAL
)
3400 if (val
& DF_1_GROUP
)
3405 if (val
& DF_1_NODELETE
)
3407 printf (" NODELETE");
3408 val
^= DF_1_NODELETE
;
3410 if (val
& DF_1_LOADFLTR
)
3412 printf (" LOADFLTR");
3413 val
^= DF_1_LOADFLTR
;
3415 if (val
& DF_1_INITFIRST
)
3417 printf (" INITFIRST");
3418 val
^= DF_1_INITFIRST
;
3420 if (val
& DF_1_NOOPEN
)
3425 if (val
& DF_1_ORIGIN
)
3430 if (val
& DF_1_DIRECT
)
3435 if (val
& DF_1_TRANS
)
3440 if (val
& DF_1_INTERPOSE
)
3442 printf (" INTERPOSE");
3443 val
^= DF_1_INTERPOSE
;
3446 printf (" %lx", val
);
3454 puts (get_dynamic_type (entry
->d_un
.d_val
));
3473 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
3479 if (dynamic_strings
== NULL
)
3482 name
= dynamic_strings
+ entry
->d_un
.d_val
;
3486 switch (entry
->d_tag
)
3489 printf (_("Shared library: [%s]"), name
);
3491 if (strcmp (name
, program_interpreter
) == 0)
3492 printf (_(" program interpreter"));
3496 printf (_("Library soname: [%s]"), name
);
3500 printf (_("Library rpath: [%s]"), name
);
3504 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3509 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3525 case DT_INIT_ARRAYSZ
:
3526 case DT_FINI_ARRAYSZ
:
3529 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
3530 printf (" (bytes)\n");
3540 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
3553 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
3557 name
= dynamic_strings
+ entry
->d_un
.d_val
;
3561 printf (_("Not needed object: [%s]\n"), name
);
3566 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3572 /* The value of this entry is ignored. */
3576 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
3577 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
3582 switch (elf_header
.e_machine
)
3585 case EM_MIPS_RS4_BE
:
3586 dynamic_segment_mips_val (entry
);
3589 dynamic_segment_parisc_val (entry
);
3592 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3604 get_ver_flags (flags
)
3607 static char buff
[32];
3614 if (flags
& VER_FLG_BASE
)
3615 strcat (buff
, "BASE ");
3617 if (flags
& VER_FLG_WEAK
)
3619 if (flags
& VER_FLG_BASE
)
3620 strcat (buff
, "| ");
3622 strcat (buff
, "WEAK ");
3625 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
3626 strcat (buff
, "| <unknown>");
3631 /* Display the contents of the version sections. */
3633 process_version_sections (file
)
3636 Elf32_Internal_Shdr
* section
;
3643 for (i
= 0, section
= section_headers
;
3644 i
< elf_header
.e_shnum
;
3647 switch (section
->sh_type
)
3649 case SHT_GNU_verdef
:
3651 Elf_External_Verdef
* edefs
;
3658 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3659 SECTION_NAME (section
), section
->sh_info
);
3661 printf (_(" Addr: 0x"));
3662 printf_vma (section
->sh_addr
);
3663 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3664 (unsigned long) section
->sh_offset
, section
->sh_link
,
3665 SECTION_NAME (section_headers
+ section
->sh_link
));
3667 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
3668 edefs
, Elf_External_Verdef
*,
3669 "version definition section");
3671 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
3674 Elf_External_Verdef
* edef
;
3675 Elf_Internal_Verdef ent
;
3676 Elf_External_Verdaux
* eaux
;
3677 Elf_Internal_Verdaux aux
;
3681 vstart
= ((char *) edefs
) + idx
;
3683 edef
= (Elf_External_Verdef
*) vstart
;
3685 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
3686 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
3687 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
3688 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
3689 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
3690 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
3691 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
3693 printf (_(" %#06x: Rev: %d Flags: %s"),
3694 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
3696 printf (_(" Index: %d Cnt: %d "),
3697 ent
.vd_ndx
, ent
.vd_cnt
);
3699 vstart
+= ent
.vd_aux
;
3701 eaux
= (Elf_External_Verdaux
*) vstart
;
3703 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
3704 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
3706 if (dynamic_strings
)
3707 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
3709 printf (_("Name index: %ld\n"), aux
.vda_name
);
3711 isum
= idx
+ ent
.vd_aux
;
3713 for (j
= 1; j
< ent
.vd_cnt
; j
++)
3715 isum
+= aux
.vda_next
;
3716 vstart
+= aux
.vda_next
;
3718 eaux
= (Elf_External_Verdaux
*) vstart
;
3720 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
3721 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
3723 if (dynamic_strings
)
3724 printf (_(" %#06x: Parent %d: %s\n"),
3725 isum
, j
, dynamic_strings
+ aux
.vda_name
);
3727 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3728 isum
, j
, aux
.vda_name
);
3738 case SHT_GNU_verneed
:
3740 Elf_External_Verneed
* eneed
;
3746 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3747 SECTION_NAME (section
), section
->sh_info
);
3749 printf (_(" Addr: 0x"));
3750 printf_vma (section
->sh_addr
);
3751 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3752 (unsigned long) section
->sh_offset
, section
->sh_link
,
3753 SECTION_NAME (section_headers
+ section
->sh_link
));
3755 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
3756 eneed
, Elf_External_Verneed
*,
3757 "version need section");
3759 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
3761 Elf_External_Verneed
* entry
;
3762 Elf_Internal_Verneed ent
;
3767 vstart
= ((char *) eneed
) + idx
;
3769 entry
= (Elf_External_Verneed
*) vstart
;
3771 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
3772 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
3773 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
3774 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
3775 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
3777 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
3779 if (dynamic_strings
)
3780 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
3782 printf (_(" File: %lx"), ent
.vn_file
);
3784 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
3786 vstart
+= ent
.vn_aux
;
3788 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
3790 Elf_External_Vernaux
* eaux
;
3791 Elf_Internal_Vernaux aux
;
3793 eaux
= (Elf_External_Vernaux
*) vstart
;
3795 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
3796 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
3797 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
3798 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
3799 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
3801 if (dynamic_strings
)
3802 printf (_(" %#06x: Name: %s"),
3803 isum
, dynamic_strings
+ aux
.vna_name
);
3805 printf (_(" %#06x: Name index: %lx"),
3806 isum
, aux
.vna_name
);
3808 printf (_(" Flags: %s Version: %d\n"),
3809 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
3811 isum
+= aux
.vna_next
;
3812 vstart
+= aux
.vna_next
;
3822 case SHT_GNU_versym
:
3824 Elf32_Internal_Shdr
* link_section
;
3827 unsigned char * edata
;
3828 unsigned short * data
;
3830 Elf_Internal_Sym
* symbols
;
3831 Elf32_Internal_Shdr
* string_sec
;
3833 link_section
= section_headers
+ section
->sh_link
;
3834 total
= section
->sh_size
/ section
->sh_entsize
;
3838 symbols
= GET_ELF_SYMBOLS (file
, link_section
->sh_offset
,
3839 link_section
->sh_size
/ link_section
->sh_entsize
);
3841 string_sec
= section_headers
+ link_section
->sh_link
;
3843 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
3844 strtab
, char *, "version string table");
3846 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3847 SECTION_NAME (section
), total
);
3849 printf (_(" Addr: "));
3850 printf_vma (section
->sh_addr
);
3851 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3852 (unsigned long) section
->sh_offset
, section
->sh_link
,
3853 SECTION_NAME (link_section
));
3855 GET_DATA_ALLOC (version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
3857 total
* sizeof (short), edata
,
3858 unsigned char *, "version symbol data");
3860 data
= (unsigned short *) malloc (total
* sizeof (short));
3862 for (cnt
= total
; cnt
--;)
3863 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
3868 for (cnt
= 0; cnt
< total
; cnt
+= 4)
3873 printf (" %03x:", cnt
);
3875 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
3876 switch (data
[cnt
+ j
])
3879 fputs (_(" 0 (*local*) "), stdout
);
3883 fputs (_(" 1 (*global*) "), stdout
);
3887 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
3888 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
3890 if (symbols
[cnt
+ j
].st_shndx
< SHN_LORESERVE
3891 && section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
3894 /* We must test both. */
3895 Elf_Internal_Verneed ivn
;
3896 unsigned long offset
;
3898 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
3903 Elf_External_Verneed evn
;
3904 Elf_External_Vernaux evna
;
3905 Elf_Internal_Vernaux ivna
;
3906 unsigned long vna_off
;
3908 GET_DATA (offset
, evn
, "version need");
3910 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
3911 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
3913 vna_off
= offset
+ ivn
.vn_aux
;
3917 GET_DATA (vna_off
, evna
,
3918 "version need aux (1)");
3920 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
3921 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
3923 vna_off
+= ivna
.vna_next
;
3925 while (ivna
.vna_other
!= data
[cnt
+ j
]
3926 && ivna
.vna_next
!= 0);
3928 if (ivna
.vna_other
== data
[cnt
+ j
])
3930 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
3932 name
= strtab
+ ivna
.vna_name
;
3933 nn
+= printf ("(%s%-*s",
3935 12 - (int) strlen (name
),
3939 else if (ivn
.vn_next
== 0)
3941 if (data
[cnt
+ j
] != 0x8001)
3943 Elf_Internal_Verdef ivd
;
3944 Elf_External_Verdef evd
;
3946 offset
= version_info
3947 [DT_VERSIONTAGIDX (DT_VERDEF
)]
3952 GET_DATA (offset
, evd
,
3953 "version definition");
3955 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
3956 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
3958 offset
+= ivd
.vd_next
;
3961 != (data
[cnt
+ j
] & 0x7fff)
3962 && ivd
.vd_next
!= 0);
3965 == (data
[cnt
+ j
] & 0x7fff))
3967 Elf_External_Verdaux evda
;
3968 Elf_Internal_Verdaux ivda
;
3970 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
3972 GET_DATA (offset
+ ivd
.vd_aux
, evda
,
3973 "version definition aux");
3976 BYTE_GET (evda
.vda_name
);
3978 name
= strtab
+ ivda
.vda_name
;
3982 12 - (int) strlen (name
),
3990 offset
+= ivn
.vn_next
;
3992 while (ivn
.vn_next
);
3994 else if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
3996 Elf_Internal_Verneed ivn
;
3997 unsigned long offset
;
3999 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
4004 Elf_Internal_Vernaux ivna
;
4005 Elf_External_Verneed evn
;
4006 Elf_External_Vernaux evna
;
4007 unsigned long a_off
;
4009 GET_DATA (offset
, evn
, "version need");
4011 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4012 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4014 a_off
= offset
+ ivn
.vn_aux
;
4018 GET_DATA (a_off
, evna
,
4019 "version need aux (2)");
4021 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4022 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4024 a_off
+= ivna
.vna_next
;
4026 while (ivna
.vna_other
!= data
[cnt
+ j
]
4027 && ivna
.vna_next
!= 0);
4029 if (ivna
.vna_other
== data
[cnt
+ j
])
4031 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4033 name
= strtab
+ ivna
.vna_name
;
4034 nn
+= printf ("(%s%-*s",
4036 12 - (int) strlen (name
),
4041 offset
+= ivn
.vn_next
;
4043 while (ivn
.vn_next
);
4045 else if (data
[cnt
+ j
] != 0x8001)
4047 Elf_Internal_Verdef ivd
;
4048 Elf_External_Verdef evd
;
4049 unsigned long offset
;
4051 offset
= version_info
4052 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
4056 GET_DATA (offset
, evd
, "version def");
4058 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
4059 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
4061 offset
+= ivd
.vd_next
;
4063 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
4064 && ivd
.vd_next
!= 0);
4066 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
4068 Elf_External_Verdaux evda
;
4069 Elf_Internal_Verdaux ivda
;
4071 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
4073 GET_DATA (offset
- ivd
.vd_next
+ ivd
.vd_aux
,
4074 evda
, "version def aux");
4076 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
4078 name
= strtab
+ ivda
.vda_name
;
4079 nn
+= printf ("(%s%-*s",
4081 12 - (int) strlen (name
),
4087 printf ("%*c", 18 - nn
, ' ');
4105 printf (_("\nNo version information found in this file.\n"));
4111 get_symbol_binding (binding
)
4112 unsigned int binding
;
4114 static char buff
[32];
4118 case STB_LOCAL
: return "LOCAL";
4119 case STB_GLOBAL
: return "GLOBAL";
4120 case STB_WEAK
: return "WEAK";
4122 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
4123 sprintf (buff
, _("<processor specific>: %d"), binding
);
4124 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
4125 sprintf (buff
, _("<OS specific>: %d"), binding
);
4127 sprintf (buff
, _("<unknown>: %d"), binding
);
4133 get_symbol_type (type
)
4136 static char buff
[32];
4140 case STT_NOTYPE
: return "NOTYPE";
4141 case STT_OBJECT
: return "OBJECT";
4142 case STT_FUNC
: return "FUNC";
4143 case STT_SECTION
: return "SECTION";
4144 case STT_FILE
: return "FILE";
4145 case STT_COMMON
: return "COMMON";
4147 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
4149 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
4150 return "THUMB_FUNC";
4152 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
4155 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
4156 return "PARISC_MILLI";
4158 sprintf (buff
, _("<processor specific>: %d"), type
);
4160 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
4162 if (elf_header
.e_machine
== EM_PARISC
)
4164 if (type
== STT_HP_OPAQUE
)
4166 if (type
== STT_HP_STUB
)
4170 sprintf (buff
, _("<OS specific>: %d"), type
);
4173 sprintf (buff
, _("<unknown>: %d"), type
);
4179 get_symbol_visibility (visibility
)
4180 unsigned int visibility
;
4184 case STV_DEFAULT
: return "DEFAULT";
4185 case STV_INTERNAL
: return "INTERNAL";
4186 case STV_HIDDEN
: return "HIDDEN";
4187 case STV_PROTECTED
: return "PROTECTED";
4193 get_symbol_index_type (type
)
4198 case SHN_UNDEF
: return "UND";
4199 case SHN_ABS
: return "ABS";
4200 case SHN_COMMON
: return "COM";
4202 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
4204 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
4206 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
4210 static char buff
[32];
4212 sprintf (buff
, "%3d", type
);
4219 get_dynamic_data (file
, number
)
4221 unsigned int number
;
4226 e_data
= (char *) malloc (number
* 4);
4230 error (_("Out of memory\n"));
4234 if (fread (e_data
, 4, number
, file
) != number
)
4236 error (_("Unable to read in dynamic data\n"));
4240 i_data
= (int *) malloc (number
* sizeof (* i_data
));
4244 error (_("Out of memory\n"));
4250 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
4257 /* Dump the symbol table */
4259 process_symbol_table (file
)
4262 Elf32_Internal_Shdr
* section
;
4267 int * buckets
= NULL
;
4268 int * chains
= NULL
;
4270 if (! do_syms
&& !do_histogram
)
4273 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
4276 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
4278 error (_("Unable to seek to start of dynamic information"));
4282 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
4284 error (_("Failed to read in number of buckets\n"));
4288 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
4290 error (_("Failed to read in number of chains\n"));
4294 nbuckets
= byte_get (nb
, 4);
4295 nchains
= byte_get (nc
, 4);
4297 buckets
= get_dynamic_data (file
, nbuckets
);
4298 chains
= get_dynamic_data (file
, nchains
);
4300 if (buckets
== NULL
|| chains
== NULL
)
4305 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
4310 printf (_("\nSymbol table for image:\n"));
4312 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4314 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4316 for (hn
= 0; hn
< nbuckets
; hn
++)
4321 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
4323 Elf_Internal_Sym
* psym
;
4325 psym
= dynamic_symbols
+ si
;
4327 printf (" %3d %3d: ", si
, hn
);
4328 print_vma (psym
->st_value
, LONG_HEX
);
4330 print_vma (psym
->st_size
, DEC_5
);
4332 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
4333 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
4334 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
4335 printf (" %3.3s", get_symbol_index_type (psym
->st_shndx
));
4336 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
4340 else if (do_syms
&& !do_using_dynamic
)
4344 for (i
= 0, section
= section_headers
;
4345 i
< elf_header
.e_shnum
;
4350 Elf_Internal_Sym
* symtab
;
4351 Elf_Internal_Sym
* psym
;
4354 if ( section
->sh_type
!= SHT_SYMTAB
4355 && section
->sh_type
!= SHT_DYNSYM
)
4358 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4359 SECTION_NAME (section
),
4360 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
4362 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4364 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4366 symtab
= GET_ELF_SYMBOLS (file
, section
->sh_offset
,
4367 section
->sh_size
/ section
->sh_entsize
);
4371 if (section
->sh_link
== elf_header
.e_shstrndx
)
4372 strtab
= string_table
;
4375 Elf32_Internal_Shdr
* string_sec
;
4377 string_sec
= section_headers
+ section
->sh_link
;
4379 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
4380 strtab
, char *, "string table");
4383 for (si
= 0, psym
= symtab
;
4384 si
< section
->sh_size
/ section
->sh_entsize
;
4387 printf ("%6d: ", si
);
4388 print_vma (psym
->st_value
, LONG_HEX
);
4390 print_vma (psym
->st_size
, DEC_5
);
4391 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
4392 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
4393 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
4394 printf (" %4s", get_symbol_index_type (psym
->st_shndx
));
4395 printf (" %s", strtab
+ psym
->st_name
);
4397 if (section
->sh_type
== SHT_DYNSYM
&&
4398 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
4400 unsigned char data
[2];
4401 unsigned short vers_data
;
4402 unsigned long offset
;
4406 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
4409 GET_DATA (offset
+ si
* sizeof (vers_data
), data
,
4412 vers_data
= byte_get (data
, 2);
4414 is_nobits
= psym
->st_shndx
< SHN_LORESERVE
?
4415 (section_headers
[psym
->st_shndx
].sh_type
== SHT_NOBITS
)
4418 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
4420 if ((vers_data
& 0x8000) || vers_data
> 1)
4422 if (is_nobits
|| ! check_def
)
4424 Elf_External_Verneed evn
;
4425 Elf_Internal_Verneed ivn
;
4426 Elf_Internal_Vernaux ivna
;
4428 /* We must test both. */
4429 offset
= version_info
4430 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
4434 unsigned long vna_off
;
4436 GET_DATA (offset
, evn
, "version need");
4438 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4439 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4441 vna_off
= offset
+ ivn
.vn_aux
;
4445 Elf_External_Vernaux evna
;
4447 GET_DATA (vna_off
, evna
,
4448 "version need aux (3)");
4450 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4451 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4452 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4454 vna_off
+= ivna
.vna_next
;
4456 while (ivna
.vna_other
!= vers_data
4457 && ivna
.vna_next
!= 0);
4459 if (ivna
.vna_other
== vers_data
)
4462 offset
+= ivn
.vn_next
;
4464 while (ivn
.vn_next
!= 0);
4466 if (ivna
.vna_other
== vers_data
)
4469 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
4472 else if (! is_nobits
)
4473 error (_("bad dynamic symbol"));
4480 if (vers_data
!= 0x8001)
4482 Elf_Internal_Verdef ivd
;
4483 Elf_Internal_Verdaux ivda
;
4484 Elf_External_Verdaux evda
;
4485 unsigned long offset
;
4488 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
4493 Elf_External_Verdef evd
;
4495 GET_DATA (offset
, evd
, "version def");
4497 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
4498 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
4499 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
4501 offset
+= ivd
.vd_next
;
4503 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
4504 && ivd
.vd_next
!= 0);
4506 offset
-= ivd
.vd_next
;
4507 offset
+= ivd
.vd_aux
;
4509 GET_DATA (offset
, evda
, "version def aux");
4511 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
4513 if (psym
->st_name
!= ivda
.vda_name
)
4514 printf ((vers_data
& 0x8000)
4516 strtab
+ ivda
.vda_name
);
4526 if (strtab
!= string_table
)
4532 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4534 if (do_histogram
&& buckets
!= NULL
)
4541 int nzero_counts
= 0;
4544 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4546 printf (_(" Length Number %% of total Coverage\n"));
4548 lengths
= (int *) calloc (nbuckets
, sizeof (int));
4549 if (lengths
== NULL
)
4551 error (_("Out of memory"));
4554 for (hn
= 0; hn
< nbuckets
; ++hn
)
4559 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
4562 if (maxlength
< ++lengths
[hn
])
4567 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
4570 error (_("Out of memory"));
4574 for (hn
= 0; hn
< nbuckets
; ++hn
)
4575 ++ counts
[lengths
[hn
]];
4579 printf (" 0 %-10d (%5.1f%%)\n",
4580 counts
[0], (counts
[0] * 100.0) / nbuckets
);
4581 for (si
= 1; si
<= maxlength
; ++si
)
4583 nzero_counts
+= counts
[si
] * si
;
4584 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4585 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
4586 (nzero_counts
* 100.0) / nsyms
);
4594 if (buckets
!= NULL
)
4604 process_syminfo (file
)
4605 FILE * file ATTRIBUTE_UNUSED
;
4609 if (dynamic_syminfo
== NULL
4611 /* No syminfo, this is ok. */
4614 /* There better should be a dynamic symbol section. */
4615 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
4619 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4620 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
4622 printf (_(" Num: Name BoundTo Flags\n"));
4623 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
4625 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
4627 printf ("%4d: %-30s ", i
,
4628 dynamic_strings
+ dynamic_symbols
[i
].st_name
);
4630 switch (dynamic_syminfo
[i
].si_boundto
)
4632 case SYMINFO_BT_SELF
:
4633 fputs ("SELF ", stdout
);
4635 case SYMINFO_BT_PARENT
:
4636 fputs ("PARENT ", stdout
);
4639 if (dynamic_syminfo
[i
].si_boundto
> 0
4640 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
4643 + dynamic_segment
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
4645 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
4649 if (flags
& SYMINFO_FLG_DIRECT
)
4651 if (flags
& SYMINFO_FLG_PASSTHRU
)
4652 printf (" PASSTHRU");
4653 if (flags
& SYMINFO_FLG_COPY
)
4655 if (flags
& SYMINFO_FLG_LAZYLOAD
)
4656 printf (" LAZYLOAD");
4664 #ifdef SUPPORT_DISASSEMBLY
4666 disassemble_section (section
, file
)
4667 Elf32_Internal_Shdr
* section
;
4670 printf (_("\nAssembly dump of section %s\n"),
4671 SECTION_NAME (section
));
4673 /* XXX -- to be done --- XXX */
4680 dump_section (section
, file
)
4681 Elf32_Internal_Shdr
* section
;
4684 bfd_size_type bytes
;
4686 unsigned char * data
;
4687 unsigned char * start
;
4689 bytes
= section
->sh_size
;
4693 printf (_("\nSection '%s' has no data to dump.\n"),
4694 SECTION_NAME (section
));
4698 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
4700 addr
= section
->sh_addr
;
4702 GET_DATA_ALLOC (section
->sh_offset
, bytes
, start
, unsigned char *,
4713 lbytes
= (bytes
> 16 ? 16 : bytes
);
4715 printf (" 0x%8.8lx ", (unsigned long) addr
);
4717 switch (elf_header
.e_ident
[EI_DATA
])
4721 for (j
= 15; j
>= 0; j
--)
4724 printf ("%2.2x", data
[j
]);
4734 for (j
= 0; j
< 16; j
++)
4737 printf ("%2.2x", data
[j
]);
4747 for (j
= 0; j
< lbytes
; j
++)
4750 if (k
>= ' ' && k
< 0x80)
4769 static unsigned long int
4770 read_leb128 (data
, length_return
, sign
)
4771 unsigned char * data
;
4772 int * length_return
;
4775 unsigned long int result
= 0;
4776 unsigned int num_read
= 0;
4785 result
|= (byte
& 0x7f) << shift
;
4790 while (byte
& 0x80);
4792 if (length_return
!= NULL
)
4793 * length_return
= num_read
;
4795 if (sign
&& (shift
< 32) && (byte
& 0x40))
4796 result
|= -1 << shift
;
4801 typedef struct State_Machine_Registers
4803 unsigned long address
;
4806 unsigned int column
;
4810 /* This variable hold the number of the last entry seen
4811 in the File Table. */
4812 unsigned int last_file_entry
;
4815 static SMR state_machine_regs
;
4818 reset_state_machine (is_stmt
)
4821 state_machine_regs
.address
= 0;
4822 state_machine_regs
.file
= 1;
4823 state_machine_regs
.line
= 1;
4824 state_machine_regs
.column
= 0;
4825 state_machine_regs
.is_stmt
= is_stmt
;
4826 state_machine_regs
.basic_block
= 0;
4827 state_machine_regs
.end_sequence
= 0;
4828 state_machine_regs
.last_file_entry
= 0;
4831 /* Handled an extend line op. Returns true if this is the end
4834 process_extended_line_op (data
, is_stmt
, pointer_size
)
4835 unsigned char * data
;
4839 unsigned char op_code
;
4842 unsigned char * name
;
4845 len
= read_leb128 (data
, & bytes_read
, 0);
4850 warn (_("badly formed extended line op encountered!"));
4855 op_code
= * data
++;
4857 printf (_(" Extended opcode %d: "), op_code
);
4861 case DW_LNE_end_sequence
:
4862 printf (_("End of Sequence\n\n"));
4863 reset_state_machine (is_stmt
);
4866 case DW_LNE_set_address
:
4867 adr
= byte_get (data
, pointer_size
);
4868 printf (_("set Address to 0x%lx\n"), adr
);
4869 state_machine_regs
.address
= adr
;
4872 case DW_LNE_define_file
:
4873 printf (_(" define new File Table entry\n"));
4874 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4876 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
4878 data
+= strlen (data
) + 1;
4879 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4881 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4883 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4884 printf (_("%s\n\n"), name
);
4888 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
4895 /* Size of pointers in the .debug_line section. This information is not
4896 really present in that section. It's obtained before dumping the debug
4897 sections by doing some pre-scan of the .debug_info section. */
4898 static int debug_line_pointer_size
= 4;
4901 display_debug_lines (section
, start
, file
)
4902 Elf32_Internal_Shdr
* section
;
4903 unsigned char * start
;
4904 FILE * file ATTRIBUTE_UNUSED
;
4906 DWARF2_External_LineInfo
* external
;
4907 DWARF2_Internal_LineInfo info
;
4908 unsigned char * standard_opcodes
;
4909 unsigned char * data
= start
;
4910 unsigned char * end
= start
+ section
->sh_size
;
4911 unsigned char * end_of_sequence
;
4914 printf (_("\nDump of debug contents of section %s:\n\n"),
4915 SECTION_NAME (section
));
4919 external
= (DWARF2_External_LineInfo
*) data
;
4921 /* Check the length of the block. */
4922 info
.li_length
= BYTE_GET (external
->li_length
);
4923 if (info
.li_length
> section
->sh_size
)
4926 (_("The line info appears to be corrupt - the section is too small\n"));
4930 /* Check its version number. */
4931 info
.li_version
= BYTE_GET (external
->li_version
);
4932 if (info
.li_version
!= 2)
4934 warn (_("Only DWARF version 2 line info is currently supported.\n"));
4938 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
4939 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
4940 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
4941 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
4942 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
4943 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
4945 /* Sign extend the line base field. */
4946 info
.li_line_base
<<= 24;
4947 info
.li_line_base
>>= 24;
4949 printf (_(" Length: %ld\n"), info
.li_length
);
4950 printf (_(" DWARF Version: %d\n"), info
.li_version
);
4951 printf (_(" Prolgue Length: %d\n"), info
.li_prologue_length
);
4952 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
4953 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
4954 printf (_(" Line Base: %d\n"), info
.li_line_base
);
4955 printf (_(" Line Range: %d\n"), info
.li_line_range
);
4956 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
4958 end_of_sequence
= data
+ info
.li_length
+ sizeof (info
.li_length
);
4960 reset_state_machine (info
.li_default_is_stmt
);
4962 /* Display the contents of the Opcodes table. */
4963 standard_opcodes
= data
+ sizeof (* external
);
4965 printf (_("\n Opcodes:\n"));
4967 for (i
= 1; i
< info
.li_opcode_base
; i
++)
4968 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
4970 /* Display the contents of the Directory table. */
4971 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
4974 printf (_("\n The Directory Table is empty.\n"));
4977 printf (_("\n The Directory Table:\n"));
4981 printf (_(" %s\n"), data
);
4983 data
+= strlen (data
) + 1;
4987 /* Skip the NUL at the end of the table. */
4990 /* Display the contents of the File Name table. */
4992 printf (_("\n The File Name Table is empty.\n"));
4995 printf (_("\n The File Name Table:\n"));
4996 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5003 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5006 data
+= strlen (data
) + 1;
5008 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5010 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5012 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5014 printf (_("%s\n"), name
);
5018 /* Skip the NUL at the end of the table. */
5021 /* Now display the statements. */
5022 printf (_("\n Line Number Statements:\n"));
5025 while (data
< end_of_sequence
)
5027 unsigned char op_code
;
5031 op_code
= * data
++;
5035 case DW_LNS_extended_op
:
5036 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
5037 debug_line_pointer_size
);
5041 printf (_(" Copy\n"));
5044 case DW_LNS_advance_pc
:
5045 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
5047 state_machine_regs
.address
+= adv
;
5048 printf (_(" Advance PC by %d to %lx\n"), adv
,
5049 state_machine_regs
.address
);
5052 case DW_LNS_advance_line
:
5053 adv
= read_leb128 (data
, & bytes_read
, 1);
5055 state_machine_regs
.line
+= adv
;
5056 printf (_(" Advance Line by %d to %d\n"), adv
,
5057 state_machine_regs
.line
);
5060 case DW_LNS_set_file
:
5061 adv
= read_leb128 (data
, & bytes_read
, 0);
5063 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5065 state_machine_regs
.file
= adv
;
5068 case DW_LNS_set_column
:
5069 adv
= read_leb128 (data
, & bytes_read
, 0);
5071 printf (_(" Set column to %d\n"), adv
);
5072 state_machine_regs
.column
= adv
;
5075 case DW_LNS_negate_stmt
:
5076 adv
= state_machine_regs
.is_stmt
;
5078 printf (_(" Set is_stmt to %d\n"), adv
);
5079 state_machine_regs
.is_stmt
= adv
;
5082 case DW_LNS_set_basic_block
:
5083 printf (_(" Set basic block\n"));
5084 state_machine_regs
.basic_block
= 1;
5087 case DW_LNS_const_add_pc
:
5088 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
5089 * info
.li_min_insn_length
);
5090 state_machine_regs
.address
+= adv
;
5091 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
5092 state_machine_regs
.address
);
5095 case DW_LNS_fixed_advance_pc
:
5096 adv
= byte_get (data
, 2);
5098 state_machine_regs
.address
+= adv
;
5099 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5100 adv
, state_machine_regs
.address
);
5104 op_code
-= info
.li_opcode_base
;
5105 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
5106 state_machine_regs
.address
+= adv
;
5107 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5108 op_code
, adv
, state_machine_regs
.address
);
5109 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
5110 state_machine_regs
.line
+= adv
;
5111 printf (_(" and Line by %d to %d\n"),
5112 adv
, state_machine_regs
.line
);
5123 display_debug_pubnames (section
, start
, file
)
5124 Elf32_Internal_Shdr
* section
;
5125 unsigned char * start
;
5126 FILE * file ATTRIBUTE_UNUSED
;
5128 DWARF2_External_PubNames
* external
;
5129 DWARF2_Internal_PubNames pubnames
;
5130 unsigned char * end
;
5132 end
= start
+ section
->sh_size
;
5134 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
5138 unsigned char * data
;
5139 unsigned long offset
;
5141 external
= (DWARF2_External_PubNames
*) start
;
5143 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
5144 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
5145 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
5146 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
5148 data
= start
+ sizeof (* external
);
5149 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
5151 if (pubnames
.pn_version
!= 2)
5153 warn (_("Only DWARF 2 pubnames are currently supported"));
5157 printf (_(" Length: %ld\n"),
5158 pubnames
.pn_length
);
5159 printf (_(" Version: %d\n"),
5160 pubnames
.pn_version
);
5161 printf (_(" Offset into .debug_info section: %ld\n"),
5162 pubnames
.pn_offset
);
5163 printf (_(" Size of area in .debug_info section: %ld\n"),
5166 printf (_("\n Offset\tName\n"));
5170 offset
= byte_get (data
, 4);
5175 printf (" %ld\t\t%s\n", offset
, data
);
5176 data
+= strlen (data
) + 1;
5179 while (offset
!= 0);
5192 case DW_TAG_padding
: return "DW_TAG_padding";
5193 case DW_TAG_array_type
: return "DW_TAG_array_type";
5194 case DW_TAG_class_type
: return "DW_TAG_class_type";
5195 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
5196 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
5197 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
5198 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
5199 case DW_TAG_label
: return "DW_TAG_label";
5200 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
5201 case DW_TAG_member
: return "DW_TAG_member";
5202 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
5203 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
5204 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
5205 case DW_TAG_string_type
: return "DW_TAG_string_type";
5206 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
5207 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
5208 case DW_TAG_typedef
: return "DW_TAG_typedef";
5209 case DW_TAG_union_type
: return "DW_TAG_union_type";
5210 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
5211 case DW_TAG_variant
: return "DW_TAG_variant";
5212 case DW_TAG_common_block
: return "DW_TAG_common_block";
5213 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
5214 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
5215 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
5216 case DW_TAG_module
: return "DW_TAG_module";
5217 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
5218 case DW_TAG_set_type
: return "DW_TAG_set_type";
5219 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
5220 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
5221 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
5222 case DW_TAG_base_type
: return "DW_TAG_base_type";
5223 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
5224 case DW_TAG_const_type
: return "DW_TAG_const_type";
5225 case DW_TAG_constant
: return "DW_TAG_constant";
5226 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
5227 case DW_TAG_file_type
: return "DW_TAG_file_type";
5228 case DW_TAG_friend
: return "DW_TAG_friend";
5229 case DW_TAG_namelist
: return "DW_TAG_namelist";
5230 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
5231 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
5232 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
5233 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
5234 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
5235 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
5236 case DW_TAG_try_block
: return "DW_TAG_try_block";
5237 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
5238 case DW_TAG_variable
: return "DW_TAG_variable";
5239 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
5240 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
5241 case DW_TAG_format_label
: return "DW_TAG_format_label";
5242 case DW_TAG_function_template
: return "DW_TAG_function_template";
5243 case DW_TAG_class_template
: return "DW_TAG_class_template";
5246 static char buffer
[100];
5248 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
5255 get_AT_name (attribute
)
5256 unsigned long attribute
;
5260 case DW_AT_sibling
: return "DW_AT_sibling";
5261 case DW_AT_location
: return "DW_AT_location";
5262 case DW_AT_name
: return "DW_AT_name";
5263 case DW_AT_ordering
: return "DW_AT_ordering";
5264 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
5265 case DW_AT_byte_size
: return "DW_AT_byte_size";
5266 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
5267 case DW_AT_bit_size
: return "DW_AT_bit_size";
5268 case DW_AT_element_list
: return "DW_AT_element_list";
5269 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
5270 case DW_AT_low_pc
: return "DW_AT_low_pc";
5271 case DW_AT_high_pc
: return "DW_AT_high_pc";
5272 case DW_AT_language
: return "DW_AT_language";
5273 case DW_AT_member
: return "DW_AT_member";
5274 case DW_AT_discr
: return "DW_AT_discr";
5275 case DW_AT_discr_value
: return "DW_AT_discr_value";
5276 case DW_AT_visibility
: return "DW_AT_visibility";
5277 case DW_AT_import
: return "DW_AT_import";
5278 case DW_AT_string_length
: return "DW_AT_string_length";
5279 case DW_AT_common_reference
: return "DW_AT_common_reference";
5280 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
5281 case DW_AT_const_value
: return "DW_AT_const_value";
5282 case DW_AT_containing_type
: return "DW_AT_containing_type";
5283 case DW_AT_default_value
: return "DW_AT_default_value";
5284 case DW_AT_inline
: return "DW_AT_inline";
5285 case DW_AT_is_optional
: return "DW_AT_is_optional";
5286 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
5287 case DW_AT_producer
: return "DW_AT_producer";
5288 case DW_AT_prototyped
: return "DW_AT_prototyped";
5289 case DW_AT_return_addr
: return "DW_AT_return_addr";
5290 case DW_AT_start_scope
: return "DW_AT_start_scope";
5291 case DW_AT_stride_size
: return "DW_AT_stride_size";
5292 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
5293 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
5294 case DW_AT_accessibility
: return "DW_AT_accessibility";
5295 case DW_AT_address_class
: return "DW_AT_address_class";
5296 case DW_AT_artificial
: return "DW_AT_artificial";
5297 case DW_AT_base_types
: return "DW_AT_base_types";
5298 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
5299 case DW_AT_count
: return "DW_AT_count";
5300 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
5301 case DW_AT_decl_column
: return "DW_AT_decl_column";
5302 case DW_AT_decl_file
: return "DW_AT_decl_file";
5303 case DW_AT_decl_line
: return "DW_AT_decl_line";
5304 case DW_AT_declaration
: return "DW_AT_declaration";
5305 case DW_AT_discr_list
: return "DW_AT_discr_list";
5306 case DW_AT_encoding
: return "DW_AT_encoding";
5307 case DW_AT_external
: return "DW_AT_external";
5308 case DW_AT_frame_base
: return "DW_AT_frame_base";
5309 case DW_AT_friend
: return "DW_AT_friend";
5310 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
5311 case DW_AT_macro_info
: return "DW_AT_macro_info";
5312 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
5313 case DW_AT_priority
: return "DW_AT_priority";
5314 case DW_AT_segment
: return "DW_AT_segment";
5315 case DW_AT_specification
: return "DW_AT_specification";
5316 case DW_AT_static_link
: return "DW_AT_static_link";
5317 case DW_AT_type
: return "DW_AT_type";
5318 case DW_AT_use_location
: return "DW_AT_use_location";
5319 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
5320 case DW_AT_virtuality
: return "DW_AT_virtuality";
5321 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
5322 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
5323 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
5324 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
5325 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
5326 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
5327 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
5328 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
5329 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
5330 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
5331 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
5332 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
5333 case DW_AT_sf_names
: return "DW_AT_sf_names";
5334 case DW_AT_src_info
: return "DW_AT_src_info";
5335 case DW_AT_mac_info
: return "DW_AT_mac_info";
5336 case DW_AT_src_coords
: return "DW_AT_src_coords";
5337 case DW_AT_body_begin
: return "DW_AT_body_begin";
5338 case DW_AT_body_end
: return "DW_AT_body_end";
5341 static char buffer
[100];
5343 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
5350 get_FORM_name (form
)
5355 case DW_FORM_addr
: return "DW_FORM_addr";
5356 case DW_FORM_block2
: return "DW_FORM_block2";
5357 case DW_FORM_block4
: return "DW_FORM_block4";
5358 case DW_FORM_data2
: return "DW_FORM_data2";
5359 case DW_FORM_data4
: return "DW_FORM_data4";
5360 case DW_FORM_data8
: return "DW_FORM_data8";
5361 case DW_FORM_string
: return "DW_FORM_string";
5362 case DW_FORM_block
: return "DW_FORM_block";
5363 case DW_FORM_block1
: return "DW_FORM_block1";
5364 case DW_FORM_data1
: return "DW_FORM_data1";
5365 case DW_FORM_flag
: return "DW_FORM_flag";
5366 case DW_FORM_sdata
: return "DW_FORM_sdata";
5367 case DW_FORM_strp
: return "DW_FORM_strp";
5368 case DW_FORM_udata
: return "DW_FORM_udata";
5369 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
5370 case DW_FORM_ref1
: return "DW_FORM_ref1";
5371 case DW_FORM_ref2
: return "DW_FORM_ref2";
5372 case DW_FORM_ref4
: return "DW_FORM_ref4";
5373 case DW_FORM_ref8
: return "DW_FORM_ref8";
5374 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
5375 case DW_FORM_indirect
: return "DW_FORM_indirect";
5378 static char buffer
[100];
5380 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
5386 /* FIXME: There are better and more effiecint ways to handle
5387 these structures. For now though, I just want something that
5388 is simple to implement. */
5389 typedef struct abbrev_attr
5391 unsigned long attribute
;
5393 struct abbrev_attr
* next
;
5397 typedef struct abbrev_entry
5399 unsigned long entry
;
5402 struct abbrev_attr
* first_attr
;
5403 struct abbrev_attr
* last_attr
;
5404 struct abbrev_entry
* next
;
5408 static abbrev_entry
* first_abbrev
= NULL
;
5409 static abbrev_entry
* last_abbrev
= NULL
;
5412 free_abbrevs
PARAMS ((void))
5414 abbrev_entry
* abbrev
;
5416 for (abbrev
= first_abbrev
; abbrev
;)
5418 abbrev_entry
* next
= abbrev
->next
;
5421 for (attr
= abbrev
->first_attr
; attr
;)
5423 abbrev_attr
* next
= attr
->next
;
5433 last_abbrev
= first_abbrev
= NULL
;
5437 add_abbrev (number
, tag
, children
)
5438 unsigned long number
;
5442 abbrev_entry
* entry
;
5444 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
5450 entry
->entry
= number
;
5452 entry
->children
= children
;
5453 entry
->first_attr
= NULL
;
5454 entry
->last_attr
= NULL
;
5457 if (first_abbrev
== NULL
)
5458 first_abbrev
= entry
;
5460 last_abbrev
->next
= entry
;
5462 last_abbrev
= entry
;
5466 add_abbrev_attr (attribute
, form
)
5467 unsigned long attribute
;
5472 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
5478 attr
->attribute
= attribute
;
5482 if (last_abbrev
->first_attr
== NULL
)
5483 last_abbrev
->first_attr
= attr
;
5485 last_abbrev
->last_attr
->next
= attr
;
5487 last_abbrev
->last_attr
= attr
;
5490 /* Processes the (partial) contents of a .debug_abbrev section.
5491 Returns NULL if the end of the section was encountered.
5492 Returns the address after the last byte read if the end of
5493 an abbreviation set was found. */
5495 static unsigned char *
5496 process_abbrev_section (start
, end
)
5497 unsigned char * start
;
5498 unsigned char * end
;
5500 if (first_abbrev
!= NULL
)
5506 unsigned long entry
;
5508 unsigned long attribute
;
5511 entry
= read_leb128 (start
, & bytes_read
, 0);
5512 start
+= bytes_read
;
5514 /* A single zero is supposed to end the section according
5515 to the standard. If there's more, then signal that to
5518 return start
== end
? NULL
: start
;
5520 tag
= read_leb128 (start
, & bytes_read
, 0);
5521 start
+= bytes_read
;
5523 children
= * start
++;
5525 add_abbrev (entry
, tag
, children
);
5531 attribute
= read_leb128 (start
, & bytes_read
, 0);
5532 start
+= bytes_read
;
5534 form
= read_leb128 (start
, & bytes_read
, 0);
5535 start
+= bytes_read
;
5538 add_abbrev_attr (attribute
, form
);
5540 while (attribute
!= 0);
5548 display_debug_abbrev (section
, start
, file
)
5549 Elf32_Internal_Shdr
* section
;
5550 unsigned char * start
;
5551 FILE * file ATTRIBUTE_UNUSED
;
5553 abbrev_entry
* entry
;
5554 unsigned char * end
= start
+ section
->sh_size
;
5556 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
5560 start
= process_abbrev_section (start
, end
);
5562 printf (_(" Number TAG\n"));
5564 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
5568 printf (_(" %ld %s [%s]\n"),
5570 get_TAG_name (entry
->tag
),
5571 entry
->children
? _("has children") : _("no children"));
5573 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
5575 printf (_(" %-18s %s\n"),
5576 get_AT_name (attr
->attribute
),
5577 get_FORM_name (attr
->form
));
5589 static unsigned char *
5590 display_block (data
, length
)
5591 unsigned char * data
;
5592 unsigned long length
;
5594 printf (_(" %lu byte block: "), length
);
5597 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
5603 decode_location_expression (data
, pointer_size
, length
)
5604 unsigned char * data
;
5605 unsigned int pointer_size
;
5606 unsigned long length
;
5610 unsigned long uvalue
;
5611 unsigned char *end
= data
+ length
;
5620 printf ("DW_OP_addr: %lx",
5621 (unsigned long) byte_get (data
, pointer_size
));
5622 data
+= pointer_size
;
5625 printf ("DW_OP_deref");
5628 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
5631 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
5634 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
5638 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
5642 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
5646 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
5650 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
5651 (unsigned long) byte_get (data
+ 4, 4));
5655 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
5656 (long) byte_get (data
+ 4, 4));
5660 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
5664 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
5668 printf ("DW_OP_dup");
5671 printf ("DW_OP_drop");
5674 printf ("DW_OP_over");
5677 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
5680 printf ("DW_OP_swap");
5683 printf ("DW_OP_rot");
5686 printf ("DW_OP_xderef");
5689 printf ("DW_OP_abs");
5692 printf ("DW_OP_and");
5695 printf ("DW_OP_div");
5698 printf ("DW_OP_minus");
5701 printf ("DW_OP_mod");
5704 printf ("DW_OP_mul");
5707 printf ("DW_OP_neg");
5710 printf ("DW_OP_not");
5713 printf ("DW_OP_or");
5716 printf ("DW_OP_plus");
5718 case DW_OP_plus_uconst
:
5719 printf ("DW_OP_plus_uconst: %lu",
5720 read_leb128 (data
, &bytes_read
, 0));
5724 printf ("DW_OP_shl");
5727 printf ("DW_OP_shr");
5730 printf ("DW_OP_shra");
5733 printf ("DW_OP_xor");
5736 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
5740 printf ("DW_OP_eq");
5743 printf ("DW_OP_ge");
5746 printf ("DW_OP_gt");
5749 printf ("DW_OP_le");
5752 printf ("DW_OP_lt");
5755 printf ("DW_OP_ne");
5758 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
5794 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
5829 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
5864 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
5865 read_leb128 (data
, &bytes_read
, 1));
5870 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
5874 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
5878 uvalue
= read_leb128 (data
, &bytes_read
, 0);
5880 printf ("DW_OP_bregx: %lu %ld", uvalue
,
5881 read_leb128 (data
, &bytes_read
, 1));
5885 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
5888 case DW_OP_deref_size
:
5889 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
5891 case DW_OP_xderef_size
:
5892 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
5895 printf ("DW_OP_nop");
5899 if (op
>= DW_OP_lo_user
5900 && op
<= DW_OP_hi_user
)
5901 printf (_("(User defined location op)"));
5903 printf (_("(Unknown location op)"));
5904 /* No way to tell where the next op is, so just bail. */
5911 static unsigned char *
5912 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
5913 unsigned long attribute
;
5915 unsigned char * data
;
5916 unsigned long cu_offset
;
5917 unsigned long pointer_size
;
5919 unsigned long uvalue
= 0;
5920 unsigned char * block_start
= NULL
;
5923 printf (" %-18s:", get_AT_name (attribute
));
5927 case DW_FORM_ref_addr
:
5929 uvalue
= byte_get (data
, pointer_size
);
5930 data
+= pointer_size
;
5936 uvalue
= byte_get (data
++, 1);
5941 uvalue
= byte_get (data
, 2);
5947 uvalue
= byte_get (data
, 4);
5952 uvalue
= read_leb128 (data
, & bytes_read
, 1);
5956 case DW_FORM_ref_udata
:
5958 uvalue
= read_leb128 (data
, & bytes_read
, 0);
5965 case DW_FORM_ref_addr
:
5966 printf (" <#%lx>", uvalue
);
5972 case DW_FORM_ref_udata
:
5973 printf (" <%lx>", uvalue
+ cu_offset
);
5977 printf (" %#lx", uvalue
);
5985 printf (" %ld", uvalue
);
5990 uvalue
= byte_get (data
, 4);
5991 printf (" %lx", uvalue
);
5992 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
5996 case DW_FORM_string
:
5997 printf (" %s", data
);
5998 data
+= strlen (data
) + 1;
6002 uvalue
= read_leb128 (data
, & bytes_read
, 0);
6003 block_start
= data
+ bytes_read
;
6004 data
= display_block (block_start
, uvalue
);
6007 case DW_FORM_block1
:
6008 uvalue
= byte_get (data
, 1);
6009 block_start
= data
+ 1;
6010 data
= display_block (block_start
, uvalue
);
6013 case DW_FORM_block2
:
6014 uvalue
= byte_get (data
, 2);
6015 block_start
= data
+ 2;
6016 data
= display_block (block_start
, uvalue
);
6019 case DW_FORM_block4
:
6020 uvalue
= byte_get (data
, 4);
6021 block_start
= data
+ 4;
6022 data
= display_block (block_start
, uvalue
);
6026 case DW_FORM_indirect
:
6027 warn (_("Unable to handle FORM: %d"), form
);
6031 warn (_("Unrecognised form: %d"), form
);
6035 /* For some attributes we can display futher information. */
6044 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
6045 case DW_INL_inlined
: printf (_("(inlined)")); break;
6046 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
6047 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
6048 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
6052 case DW_AT_language
:
6055 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
6056 case DW_LANG_C89
: printf ("(ANSI C)"); break;
6057 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
6058 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
6059 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
6060 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
6061 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
6062 case DW_LANG_Ada83
: printf ("(Ada)"); break;
6063 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
6064 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
6065 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
6066 default: printf ("(Unknown: %lx)", uvalue
); break;
6070 case DW_AT_encoding
:
6073 case DW_ATE_void
: printf ("(void)"); break;
6074 case DW_ATE_address
: printf ("(machine address)"); break;
6075 case DW_ATE_boolean
: printf ("(boolean)"); break;
6076 case DW_ATE_complex_float
: printf ("(complex float)"); break;
6077 case DW_ATE_float
: printf ("(float)"); break;
6078 case DW_ATE_signed
: printf ("(signed)"); break;
6079 case DW_ATE_signed_char
: printf ("(signed char)"); break;
6080 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
6081 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
6083 if (uvalue
>= DW_ATE_lo_user
6084 && uvalue
<= DW_ATE_hi_user
)
6085 printf ("(user defined type)");
6087 printf ("(unknown type)");
6092 case DW_AT_accessibility
:
6095 case DW_ACCESS_public
: printf ("(public)"); break;
6096 case DW_ACCESS_protected
: printf ("(protected)"); break;
6097 case DW_ACCESS_private
: printf ("(private)"); break;
6098 default: printf ("(unknown accessibility)"); break;
6102 case DW_AT_visibility
:
6105 case DW_VIS_local
: printf ("(local)"); break;
6106 case DW_VIS_exported
: printf ("(exported)"); break;
6107 case DW_VIS_qualified
: printf ("(qualified)"); break;
6108 default: printf ("(unknown visibility)"); break;
6112 case DW_AT_virtuality
:
6115 case DW_VIRTUALITY_none
: printf ("(none)"); break;
6116 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
6117 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
6118 default: printf ("(unknown virtuality)"); break;
6122 case DW_AT_identifier_case
:
6125 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
6126 case DW_ID_up_case
: printf ("(up_case)"); break;
6127 case DW_ID_down_case
: printf ("(down_case)"); break;
6128 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
6129 default: printf ("(unknown case)"); break;
6133 case DW_AT_calling_convention
:
6136 case DW_CC_normal
: printf ("(normal)"); break;
6137 case DW_CC_program
: printf ("(program)"); break;
6138 case DW_CC_nocall
: printf ("(nocall)"); break;
6140 if (uvalue
>= DW_CC_lo_user
6141 && uvalue
<= DW_CC_hi_user
)
6142 printf ("(user defined)");
6144 printf ("(unknown convention)");
6148 case DW_AT_frame_base
:
6149 case DW_AT_location
:
6150 case DW_AT_data_member_location
:
6151 case DW_AT_vtable_elem_location
:
6155 decode_location_expression (block_start
, pointer_size
, uvalue
);
6169 display_debug_info (section
, start
, file
)
6170 Elf32_Internal_Shdr
* section
;
6171 unsigned char * start
;
6174 unsigned char * end
= start
+ section
->sh_size
;
6175 unsigned char * section_begin
= start
;
6177 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6181 DWARF2_External_CompUnit
* external
;
6182 DWARF2_Internal_CompUnit compunit
;
6183 unsigned char * tags
;
6186 unsigned long cu_offset
;
6188 external
= (DWARF2_External_CompUnit
*) start
;
6190 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
6191 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
6192 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
6193 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
6195 tags
= start
+ sizeof (* external
);
6196 cu_offset
= start
- section_begin
;
6197 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
6199 if (compunit
.cu_version
!= 2)
6201 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6205 printf (_(" Compilation Unit:\n"));
6206 printf (_(" Length: %ld\n"), compunit
.cu_length
);
6207 printf (_(" Version: %d\n"), compunit
.cu_version
);
6208 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
6209 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
6211 if (first_abbrev
!= NULL
)
6214 /* Read in the abbrevs used by this compilation unit. */
6217 Elf32_Internal_Shdr
* sec
;
6218 unsigned char * begin
;
6220 /* Locate the .debug_abbrev section and process it. */
6221 for (i
= 0, sec
= section_headers
;
6222 i
< elf_header
.e_shnum
;
6224 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
6227 if (i
== -1 || sec
->sh_size
== 0)
6229 warn (_("Unable to locate .debug_abbrev section!\n"));
6233 GET_DATA_ALLOC (sec
->sh_offset
, sec
->sh_size
, begin
, unsigned char *,
6234 "debug_abbrev section data");
6236 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
6237 begin
+ sec
->sh_size
);
6243 while (tags
< start
)
6246 unsigned long abbrev_number
;
6247 abbrev_entry
* entry
;
6250 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
6253 /* A null DIE marks the end of a list of children. */
6254 if (abbrev_number
== 0)
6260 /* Scan through the abbreviation list until we reach the
6262 for (entry
= first_abbrev
;
6263 entry
&& entry
->entry
!= abbrev_number
;
6264 entry
= entry
->next
)
6269 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6274 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6275 level
, tags
- section_begin
- bytes_read
,
6277 get_TAG_name (entry
->tag
));
6279 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6280 tags
= read_and_display_attr (attr
->attribute
,
6283 compunit
.cu_pointer_size
);
6285 if (entry
->children
)
6296 display_debug_aranges (section
, start
, file
)
6297 Elf32_Internal_Shdr
* section
;
6298 unsigned char * start
;
6299 FILE * file ATTRIBUTE_UNUSED
;
6301 unsigned char * end
= start
+ section
->sh_size
;
6303 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6307 DWARF2_External_ARange
* external
;
6308 DWARF2_Internal_ARange arange
;
6309 unsigned char * ranges
;
6310 unsigned long length
;
6311 unsigned long address
;
6314 external
= (DWARF2_External_ARange
*) start
;
6316 arange
.ar_length
= BYTE_GET (external
->ar_length
);
6317 arange
.ar_version
= BYTE_GET (external
->ar_version
);
6318 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
6319 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
6320 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
6322 printf (_(" Length: %ld\n"), arange
.ar_length
);
6323 printf (_(" Version: %d\n"), arange
.ar_version
);
6324 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
6325 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
6326 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
6328 printf (_("\n Address Length\n"));
6330 ranges
= start
+ sizeof (* external
);
6332 /* Must pad to an alignment boundary that is twice the pointer size. */
6333 excess
= sizeof (*external
) % (2 * arange
.ar_pointer_size
);
6335 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
6339 address
= byte_get (ranges
, arange
.ar_pointer_size
);
6341 ranges
+= arange
.ar_pointer_size
;
6343 length
= byte_get (ranges
, arange
.ar_pointer_size
);
6345 ranges
+= arange
.ar_pointer_size
;
6347 /* A pair of zeros marks the end of the list. */
6348 if (address
== 0 && length
== 0)
6351 printf (" %8.8lx %lu\n", address
, length
);
6354 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
6364 display_debug_not_supported (section
, start
, file
)
6365 Elf32_Internal_Shdr
* section
;
6366 unsigned char * start ATTRIBUTE_UNUSED
;
6367 FILE * file ATTRIBUTE_UNUSED
;
6369 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6370 SECTION_NAME (section
));
6375 /* Pre-scan the .debug_info section to record the size of address.
6376 When dumping the .debug_line, we use that size information, assuming
6377 that all compilation units have the same address size. */
6379 prescan_debug_info (section
, start
, file
)
6380 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
6381 unsigned char * start
;
6382 FILE * file ATTRIBUTE_UNUSED
;
6384 DWARF2_External_CompUnit
* external
;
6386 external
= (DWARF2_External_CompUnit
*) start
;
6388 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
6392 /* A structure containing the name of a debug section and a pointer
6393 to a function that can decode it. The third field is a prescan
6394 function to be run over the section before displaying any of the
6399 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
6400 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
6404 { ".debug_info", display_debug_info
, prescan_debug_info
},
6405 { ".debug_abbrev", display_debug_abbrev
, NULL
},
6406 { ".debug_line", display_debug_lines
, NULL
},
6407 { ".debug_aranges", display_debug_aranges
, NULL
},
6408 { ".debug_pubnames", display_debug_pubnames
, NULL
},
6409 { ".debug_macinfo", display_debug_not_supported
, NULL
},
6410 { ".debug_frame", display_debug_not_supported
, NULL
},
6411 { ".debug_str", display_debug_not_supported
, NULL
},
6412 { ".debug_static_func", display_debug_not_supported
, NULL
},
6413 { ".debug_static_vars", display_debug_not_supported
, NULL
},
6414 { ".debug_types", display_debug_not_supported
, NULL
},
6415 { ".debug_weaknames", display_debug_not_supported
, NULL
}
6419 display_debug_section (section
, file
)
6420 Elf32_Internal_Shdr
* section
;
6423 char * name
= SECTION_NAME (section
);
6424 bfd_size_type length
;
6425 unsigned char * start
;
6428 length
= section
->sh_size
;
6431 printf (_("\nSection '%s' has no debugging data.\n"), name
);
6435 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
6436 "debug section data");
6438 /* See if we know how to display the contents of this section. */
6439 for (i
= NUM_ELEM (debug_displays
); i
--;)
6440 if (strcmp (debug_displays
[i
].name
, name
) == 0)
6442 debug_displays
[i
].display (section
, start
, file
);
6447 printf (_("Unrecognised debug section: %s\n"), name
);
6451 /* If we loaded in the abbrev section at some point,
6452 we must release it here. */
6453 if (first_abbrev
!= NULL
)
6460 process_section_contents (file
)
6463 Elf32_Internal_Shdr
* section
;
6469 /* Pre-scan the debug sections to find some debug information not
6470 present in some of them. For the .debug_line, we must find out the
6471 size of address (specified in .debug_info and .debug_aranges). */
6472 for (i
= 0, section
= section_headers
;
6473 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
6476 char * name
= SECTION_NAME (section
);
6479 if (section
->sh_size
== 0)
6482 /* See if there is some pre-scan operation for this section. */
6483 for (j
= NUM_ELEM (debug_displays
); j
--;)
6484 if (strcmp (debug_displays
[j
].name
, name
) == 0)
6486 if (debug_displays
[j
].prescan
!= NULL
)
6488 bfd_size_type length
;
6489 unsigned char * start
;
6491 length
= section
->sh_size
;
6492 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
6493 "debug section data");
6495 debug_displays
[j
].prescan (section
, start
, file
);
6503 for (i
= 0, section
= section_headers
;
6504 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
6507 #ifdef SUPPORT_DISASSEMBLY
6508 if (dump_sects
[i
] & DISASS_DUMP
)
6509 disassemble_section (section
, file
);
6511 if (dump_sects
[i
] & HEX_DUMP
)
6512 dump_section (section
, file
);
6514 if (dump_sects
[i
] & DEBUG_DUMP
)
6515 display_debug_section (section
, file
);
6518 if (i
< num_dump_sects
)
6519 warn (_("Some sections were not dumped because they do not exist!\n"));
6525 process_mips_fpe_exception (mask
)
6531 if (mask
& OEX_FPU_INEX
)
6532 fputs ("INEX", stdout
), first
= 0;
6533 if (mask
& OEX_FPU_UFLO
)
6534 printf ("%sUFLO", first
? "" : "|"), first
= 0;
6535 if (mask
& OEX_FPU_OFLO
)
6536 printf ("%sOFLO", first
? "" : "|"), first
= 0;
6537 if (mask
& OEX_FPU_DIV0
)
6538 printf ("%sDIV0", first
? "" : "|"), first
= 0;
6539 if (mask
& OEX_FPU_INVAL
)
6540 printf ("%sINVAL", first
? "" : "|");
6543 fputs ("0", stdout
);
6547 process_mips_specific (file
)
6550 Elf_Internal_Dyn
* entry
;
6551 size_t liblist_offset
= 0;
6552 size_t liblistno
= 0;
6553 size_t conflictsno
= 0;
6554 size_t options_offset
= 0;
6555 size_t conflicts_offset
= 0;
6557 /* We have a lot of special sections. Thanks SGI! */
6558 if (dynamic_segment
== NULL
)
6559 /* No information available. */
6562 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
6563 switch (entry
->d_tag
)
6565 case DT_MIPS_LIBLIST
:
6566 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
6568 case DT_MIPS_LIBLISTNO
:
6569 liblistno
= entry
->d_un
.d_val
;
6571 case DT_MIPS_OPTIONS
:
6572 options_offset
= entry
->d_un
.d_val
- loadaddr
;
6574 case DT_MIPS_CONFLICT
:
6575 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
6577 case DT_MIPS_CONFLICTNO
:
6578 conflictsno
= entry
->d_un
.d_val
;
6584 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
6586 Elf32_External_Lib
* elib
;
6589 GET_DATA_ALLOC (liblist_offset
, liblistno
* sizeof (Elf32_External_Lib
),
6590 elib
, Elf32_External_Lib
*, "liblist");
6592 printf ("\nSection '.liblist' contains %lu entries:\n",
6593 (unsigned long) liblistno
);
6594 fputs (" Library Time Stamp Checksum Version Flags\n",
6597 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
6604 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
6605 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
6606 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
6607 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
6608 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
6610 tmp
= gmtime (&time
);
6611 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
6612 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6613 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6615 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt
,
6616 dynamic_strings
+ liblist
.l_name
, timebuf
,
6617 liblist
.l_checksum
, liblist
.l_version
);
6619 if (liblist
.l_flags
== 0)
6630 { " EXACT_MATCH", LL_EXACT_MATCH
},
6631 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
6632 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
6633 { " EXPORTS", LL_EXPORTS
},
6634 { " DELAY_LOAD", LL_DELAY_LOAD
},
6635 { " DELTA", LL_DELTA
}
6637 int flags
= liblist
.l_flags
;
6641 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
6643 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
6645 fputs (l_flags_vals
[fcnt
].name
, stdout
);
6646 flags
^= l_flags_vals
[fcnt
].bit
;
6649 printf (" %#x", (unsigned int) flags
);
6658 if (options_offset
!= 0)
6660 Elf_External_Options
* eopt
;
6661 Elf_Internal_Shdr
* sect
= section_headers
;
6662 Elf_Internal_Options
* iopt
;
6663 Elf_Internal_Options
* option
;
6667 /* Find the section header so that we get the size. */
6668 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
6671 GET_DATA_ALLOC (options_offset
, sect
->sh_size
, eopt
,
6672 Elf_External_Options
*, "options");
6674 iopt
= (Elf_Internal_Options
*) malloc ((sect
->sh_size
/ sizeof (eopt
))
6678 error (_("Out of memory"));
6685 while (offset
< sect
->sh_size
)
6687 Elf_External_Options
* eoption
;
6689 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
6691 option
->kind
= BYTE_GET (eoption
->kind
);
6692 option
->size
= BYTE_GET (eoption
->size
);
6693 option
->section
= BYTE_GET (eoption
->section
);
6694 option
->info
= BYTE_GET (eoption
->info
);
6696 offset
+= option
->size
;
6702 printf (_("\nSection '%s' contains %d entries:\n"),
6703 string_table
+ sect
->sh_name
, cnt
);
6711 switch (option
->kind
)
6714 /* This shouldn't happen. */
6715 printf (" NULL %d %lx", option
->section
, option
->info
);
6718 printf (" REGINFO ");
6719 if (elf_header
.e_machine
== EM_MIPS
)
6722 Elf32_External_RegInfo
*ereg
;
6723 Elf32_RegInfo reginfo
;
6725 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
6726 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
6727 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
6728 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
6729 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
6730 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
6731 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
6733 printf ("GPR %08lx GP 0x%lx\n",
6735 (unsigned long) reginfo
.ri_gp_value
);
6736 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6737 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
6738 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
6743 Elf64_External_RegInfo
* ereg
;
6744 Elf64_Internal_RegInfo reginfo
;
6746 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
6747 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
6748 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
6749 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
6750 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
6751 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
6752 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
6754 printf ("GPR %08lx GP 0x",
6755 reginfo
.ri_gprmask
);
6756 printf_vma (reginfo
.ri_gp_value
);
6759 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6760 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
6761 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
6765 case ODK_EXCEPTIONS
:
6766 fputs (" EXCEPTIONS fpe_min(", stdout
);
6767 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
6768 fputs (") fpe_max(", stdout
);
6769 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
6770 fputs (")", stdout
);
6772 if (option
->info
& OEX_PAGE0
)
6773 fputs (" PAGE0", stdout
);
6774 if (option
->info
& OEX_SMM
)
6775 fputs (" SMM", stdout
);
6776 if (option
->info
& OEX_FPDBUG
)
6777 fputs (" FPDBUG", stdout
);
6778 if (option
->info
& OEX_DISMISS
)
6779 fputs (" DISMISS", stdout
);
6782 fputs (" PAD ", stdout
);
6783 if (option
->info
& OPAD_PREFIX
)
6784 fputs (" PREFIX", stdout
);
6785 if (option
->info
& OPAD_POSTFIX
)
6786 fputs (" POSTFIX", stdout
);
6787 if (option
->info
& OPAD_SYMBOL
)
6788 fputs (" SYMBOL", stdout
);
6791 fputs (" HWPATCH ", stdout
);
6792 if (option
->info
& OHW_R4KEOP
)
6793 fputs (" R4KEOP", stdout
);
6794 if (option
->info
& OHW_R8KPFETCH
)
6795 fputs (" R8KPFETCH", stdout
);
6796 if (option
->info
& OHW_R5KEOP
)
6797 fputs (" R5KEOP", stdout
);
6798 if (option
->info
& OHW_R5KCVTL
)
6799 fputs (" R5KCVTL", stdout
);
6802 fputs (" FILL ", stdout
);
6803 /* XXX Print content of info word? */
6806 fputs (" TAGS ", stdout
);
6807 /* XXX Print content of info word? */
6810 fputs (" HWAND ", stdout
);
6811 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
6812 fputs (" R4KEOP_CHECKED", stdout
);
6813 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
6814 fputs (" R4KEOP_CLEAN", stdout
);
6817 fputs (" HWOR ", stdout
);
6818 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
6819 fputs (" R4KEOP_CHECKED", stdout
);
6820 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
6821 fputs (" R4KEOP_CLEAN", stdout
);
6824 printf (" GP_GROUP %#06lx self-contained %#06lx",
6825 option
->info
& OGP_GROUP
,
6826 (option
->info
& OGP_SELF
) >> 16);
6829 printf (" IDENT %#06lx self-contained %#06lx",
6830 option
->info
& OGP_GROUP
,
6831 (option
->info
& OGP_SELF
) >> 16);
6834 /* This shouldn't happen. */
6835 printf (" %3d ??? %d %lx",
6836 option
->kind
, option
->section
, option
->info
);
6840 len
= sizeof (*eopt
);
6841 while (len
< option
->size
)
6842 if (((char *) option
)[len
] >= ' '
6843 && ((char *) option
)[len
] < 0x7f)
6844 printf ("%c", ((char *) option
)[len
++]);
6846 printf ("\\%03o", ((char *) option
)[len
++]);
6848 fputs ("\n", stdout
);
6855 if (conflicts_offset
!= 0 && conflictsno
!= 0)
6857 Elf32_External_Conflict
* econf32
;
6858 Elf64_External_Conflict
* econf64
;
6859 Elf32_Conflict
* iconf
;
6862 if (dynamic_symbols
== NULL
)
6864 error (_("conflict list with without table"));
6868 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (*iconf
));
6871 error (_("Out of memory"));
6877 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (*econf32
),
6878 econf32
, Elf32_External_Conflict
*, "conflict");
6880 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
6881 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
6885 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (*econf64
),
6886 econf64
, Elf64_External_Conflict
*, "conflict");
6888 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
6889 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
6892 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno
);
6893 puts (_(" Num: Index Value Name"));
6895 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
6897 Elf_Internal_Sym
* psym
= &dynamic_symbols
[iconf
[cnt
]];
6899 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
6900 print_vma (psym
->st_value
, FULL_HEX
);
6901 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
6911 get_note_type (e_type
)
6914 static char buff
[64];
6918 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
6919 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
6920 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
6921 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
6922 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
6923 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
6924 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
6925 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
6926 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
6927 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
6928 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
6930 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
6935 /* Note that by the ELF standard, the name field is already null byte
6936 terminated, and namesz includes the terminating null byte.
6937 I.E. the value of namesz for the name "FSF" is 4.
6939 If the value of namesz is zero, there is no name present. */
6941 process_note (pnote
)
6942 Elf32_Internal_Note
* pnote
;
6944 printf (" %s\t\t0x%08lx\t%s\n",
6945 pnote
->namesz
? pnote
->namedata
: "(NONE)",
6946 pnote
->descsz
, get_note_type (pnote
->type
));
6952 process_corefile_note_segment (file
, offset
, length
)
6957 Elf_External_Note
* pnotes
;
6958 Elf_External_Note
* external
;
6964 GET_DATA_ALLOC (offset
, length
, pnotes
, Elf_External_Note
*, "notes");
6968 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
6969 (unsigned long) offset
, (unsigned long) length
);
6970 printf (_(" Owner\t\tData size\tDescription\n"));
6972 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
6974 Elf32_Internal_Note inote
;
6977 inote
.type
= BYTE_GET (external
->type
);
6978 inote
.namesz
= BYTE_GET (external
->namesz
);
6979 inote
.namedata
= external
->name
;
6980 inote
.descsz
= BYTE_GET (external
->descsz
);
6981 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
6982 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
6984 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
6986 /* Verify that name is null terminated. It appears that at least
6987 one version of Linux (RedHat 6.0) generates corefiles that don't
6988 comply with the ELF spec by failing to include the null byte in
6990 if (inote
.namedata
[inote
.namesz
] != '\0')
6992 temp
= malloc (inote
.namesz
+ 1);
6996 error (_("Out of memory\n"));
7001 strncpy (temp
, inote
.namedata
, inote
.namesz
);
7002 temp
[inote
.namesz
] = 0;
7004 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
7005 inote
.namedata
= temp
;
7008 res
&= process_note (& inote
);
7023 process_corefile_note_segments (file
)
7026 Elf_Internal_Phdr
* program_headers
;
7027 Elf_Internal_Phdr
* segment
;
7031 program_headers
= (Elf_Internal_Phdr
*) malloc
7032 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
7034 if (program_headers
== NULL
)
7036 error (_("Out of memory\n"));
7041 i
= get_32bit_program_headers (file
, program_headers
);
7043 i
= get_64bit_program_headers (file
, program_headers
);
7047 free (program_headers
);
7051 for (i
= 0, segment
= program_headers
;
7052 i
< elf_header
.e_phnum
;
7055 if (segment
->p_type
== PT_NOTE
)
7056 res
&= process_corefile_note_segment (file
,
7057 (bfd_vma
) segment
->p_offset
,
7058 (bfd_vma
) segment
->p_filesz
);
7061 free (program_headers
);
7067 process_corefile_contents (file
)
7070 /* If we have not been asked to display the notes then do nothing. */
7074 /* If file is not a core file then exit. */
7075 if (elf_header
.e_type
!= ET_CORE
)
7078 /* No program headers means no NOTE segment. */
7079 if (elf_header
.e_phnum
== 0)
7081 printf (_("No note segments present in the core file.\n"));
7085 return process_corefile_note_segments (file
);
7089 process_arch_specific (file
)
7095 switch (elf_header
.e_machine
)
7098 case EM_MIPS_RS4_BE
:
7099 return process_mips_specific (file
);
7108 get_file_header (file
)
7111 /* Read in the identity array. */
7112 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
7115 /* Determine how to read the rest of the header. */
7116 switch (elf_header
.e_ident
[EI_DATA
])
7118 default: /* fall through */
7119 case ELFDATANONE
: /* fall through */
7120 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
7121 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
7124 /* For now we only support 32 bit and 64 bit ELF files. */
7125 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
7127 /* Read in the rest of the header. */
7130 Elf32_External_Ehdr ehdr32
;
7132 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
7135 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
7136 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
7137 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
7138 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
7139 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
7140 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
7141 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
7142 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
7143 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
7144 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
7145 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
7146 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
7147 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
7151 Elf64_External_Ehdr ehdr64
;
7153 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7154 we will not be able to cope with the 64bit data found in
7155 64 ELF files. Detect this now and abort before we start
7156 overwritting things. */
7157 if (sizeof (bfd_vma
) < 8)
7159 error (_("This instance of readelf has been built without support for a\n"));
7160 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7164 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
7167 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
7168 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
7169 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
7170 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
7171 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
7172 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
7173 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
7174 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
7175 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
7176 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
7177 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
7178 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
7179 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
7186 process_file (file_name
)
7190 struct stat statbuf
;
7193 if (stat (file_name
, & statbuf
) < 0)
7195 error (_("Cannot stat input file %s.\n"), file_name
);
7199 file
= fopen (file_name
, "rb");
7202 error (_("Input file %s not found.\n"), file_name
);
7206 if (! get_file_header (file
))
7208 error (_("%s: Failed to read file header\n"), file_name
);
7213 /* Initialise per file variables. */
7214 for (i
= NUM_ELEM (version_info
); i
--;)
7215 version_info
[i
] = 0;
7217 for (i
= NUM_ELEM (dynamic_info
); i
--;)
7218 dynamic_info
[i
] = 0;
7220 /* Process the file. */
7222 printf (_("\nFile: %s\n"), file_name
);
7224 if (! process_file_header ())
7230 process_section_headers (file
);
7232 process_program_headers (file
);
7234 process_dynamic_segment (file
);
7236 process_relocs (file
);
7238 process_symbol_table (file
);
7240 process_syminfo (file
);
7242 process_version_sections (file
);
7244 process_section_contents (file
);
7246 process_corefile_contents (file
);
7248 process_arch_specific (file
);
7252 if (section_headers
)
7254 free (section_headers
);
7255 section_headers
= NULL
;
7260 free (string_table
);
7261 string_table
= NULL
;
7264 if (dynamic_strings
)
7266 free (dynamic_strings
);
7267 dynamic_strings
= NULL
;
7270 if (dynamic_symbols
)
7272 free (dynamic_symbols
);
7273 dynamic_symbols
= NULL
;
7274 num_dynamic_syms
= 0;
7277 if (dynamic_syminfo
)
7279 free (dynamic_syminfo
);
7280 dynamic_syminfo
= NULL
;
7284 #ifdef SUPPORT_DISASSEMBLY
7285 /* Needed by the i386 disassembler. For extra credit, someone could
7286 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7290 print_address (unsigned int addr
, FILE * outfile
)
7292 fprintf (outfile
,"0x%8.8x", addr
);
7295 /* Needed by the i386 disassembler. */
7297 db_task_printsym (unsigned int addr
)
7299 print_address (addr
, stderr
);
7308 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7309 setlocale (LC_MESSAGES
, "");
7311 bindtextdomain (PACKAGE
, LOCALEDIR
);
7312 textdomain (PACKAGE
);
7314 parse_args (argc
, argv
);
7316 if (optind
< (argc
- 1))
7319 while (optind
< argc
)
7320 process_file (argv
[optind
++]);
7322 if (dump_sects
!= NULL
)