1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
56 #include "elf/alpha.h"
59 #include "elf/sparc.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
70 #include "elf/mcore.h"
78 #include "elf/x86-64.h"
80 #include "elf/xstormy16.h"
85 char * program_name
= "readelf";
86 unsigned int dynamic_addr
;
87 bfd_size_type dynamic_size
;
88 unsigned int rela_addr
;
89 unsigned int rela_size
;
90 char * dynamic_strings
;
92 unsigned long string_table_length
;
93 unsigned long num_dynamic_syms
;
94 Elf_Internal_Sym
* dynamic_symbols
;
95 Elf_Internal_Syminfo
* dynamic_syminfo
;
96 unsigned long dynamic_syminfo_offset
;
97 unsigned int dynamic_syminfo_nent
;
98 char program_interpreter
[64];
99 int dynamic_info
[DT_JMPREL
+ 1];
100 int version_info
[16];
102 Elf_Internal_Ehdr elf_header
;
103 Elf_Internal_Shdr
* section_headers
;
104 Elf_Internal_Dyn
* dynamic_segment
;
105 Elf_Internal_Shdr
* symtab_shndx_hdr
;
113 int do_using_dynamic
;
121 int do_debug_abbrevs
;
123 int do_debug_pubnames
;
124 int do_debug_aranges
;
126 int do_debug_frames_interp
;
127 int do_debug_macinfo
;
133 /* A dynamic array of flags indicating which sections require dumping. */
134 char * dump_sects
= NULL
;
135 unsigned int num_dump_sects
= 0;
137 #define HEX_DUMP (1 << 0)
138 #define DISASS_DUMP (1 << 1)
139 #define DEBUG_DUMP (1 << 2)
141 /* How to rpint a vma value. */
142 typedef enum print_mode
154 /* Forward declarations for dumb compilers. */
155 static void print_vma
PARAMS ((bfd_vma
, print_mode
));
156 static bfd_vma (* byte_get
) PARAMS ((unsigned char *, int));
157 static bfd_vma byte_get_little_endian
PARAMS ((unsigned char *, int));
158 static bfd_vma byte_get_big_endian
PARAMS ((unsigned char *, int));
159 static const char * get_mips_dynamic_type
PARAMS ((unsigned long));
160 static const char * get_sparc64_dynamic_type
PARAMS ((unsigned long));
161 static const char * get_parisc_dynamic_type
PARAMS ((unsigned long));
162 static const char * get_dynamic_type
PARAMS ((unsigned long));
163 static int slurp_rela_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**, unsigned long *));
164 static int slurp_rel_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel
**, unsigned long *));
165 static int dump_relocations
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*, unsigned long, char *, int));
166 static char * get_file_type
PARAMS ((unsigned));
167 static char * get_machine_name
PARAMS ((unsigned));
168 static void decode_ARM_machine_flags
PARAMS ((unsigned, char []));
169 static char * get_machine_flags
PARAMS ((unsigned, unsigned));
170 static const char * get_mips_segment_type
PARAMS ((unsigned long));
171 static const char * get_parisc_segment_type
PARAMS ((unsigned long));
172 static const char * get_ia64_segment_type
PARAMS ((unsigned long));
173 static const char * get_segment_type
PARAMS ((unsigned long));
174 static const char * get_mips_section_type_name
PARAMS ((unsigned int));
175 static const char * get_parisc_section_type_name
PARAMS ((unsigned int));
176 static const char * get_ia64_section_type_name
PARAMS ((unsigned int));
177 static const char * get_section_type_name
PARAMS ((unsigned int));
178 static const char * get_symbol_binding
PARAMS ((unsigned int));
179 static const char * get_symbol_type
PARAMS ((unsigned int));
180 static const char * get_symbol_visibility
PARAMS ((unsigned int));
181 static const char * get_symbol_index_type
PARAMS ((unsigned int));
182 static const char * get_dynamic_flags
PARAMS ((bfd_vma
));
183 static void usage
PARAMS ((void));
184 static void parse_args
PARAMS ((int, char **));
185 static int process_file_header
PARAMS ((void));
186 static int process_program_headers
PARAMS ((FILE *));
187 static int process_section_headers
PARAMS ((FILE *));
188 static int process_unwind
PARAMS ((FILE *));
189 static void dynamic_segment_mips_val
PARAMS ((Elf_Internal_Dyn
*));
190 static void dynamic_segment_parisc_val
PARAMS ((Elf_Internal_Dyn
*));
191 static int process_dynamic_segment
PARAMS ((FILE *));
192 static int process_symbol_table
PARAMS ((FILE *));
193 static int process_syminfo
PARAMS ((FILE *));
194 static int process_section_contents
PARAMS ((FILE *));
195 static void process_mips_fpe_exception
PARAMS ((int));
196 static int process_mips_specific
PARAMS ((FILE *));
197 static int process_file
PARAMS ((char *));
198 static int process_relocs
PARAMS ((FILE *));
199 static int process_version_sections
PARAMS ((FILE *));
200 static char * get_ver_flags
PARAMS ((unsigned int));
201 static int get_32bit_section_headers
PARAMS ((FILE *, unsigned int));
202 static int get_64bit_section_headers
PARAMS ((FILE *, unsigned int));
203 static int get_32bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
204 static int get_64bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
205 static int get_file_header
PARAMS ((FILE *));
206 static Elf_Internal_Sym
* get_32bit_elf_symbols
PARAMS ((FILE *, Elf_Internal_Shdr
*));
207 static Elf_Internal_Sym
* get_64bit_elf_symbols
PARAMS ((FILE *, Elf_Internal_Shdr
*));
208 static const char * get_elf_section_flags
PARAMS ((bfd_vma
));
209 static int * get_dynamic_data
PARAMS ((FILE *, unsigned int));
210 static int get_32bit_dynamic_segment
PARAMS ((FILE *));
211 static int get_64bit_dynamic_segment
PARAMS ((FILE *));
212 #ifdef SUPPORT_DISASSEMBLY
213 static int disassemble_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
215 static int dump_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
216 static int display_debug_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
217 static int display_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
218 static int display_debug_not_supported
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
219 static int prescan_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
220 static int display_debug_lines
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
221 static int display_debug_pubnames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
222 static int display_debug_abbrev
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
223 static int display_debug_aranges
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
224 static int display_debug_frames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
225 static int display_debug_macinfo
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
226 static int display_debug_str
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
227 static unsigned char * process_abbrev_section
PARAMS ((unsigned char *, unsigned char *));
228 static void load_debug_str
PARAMS ((FILE *));
229 static void free_debug_str
PARAMS ((void));
230 static const char * fetch_indirect_string
PARAMS ((unsigned long));
231 static unsigned long read_leb128
PARAMS ((unsigned char *, int *, int));
232 static int process_extended_line_op
PARAMS ((unsigned char *, int, int));
233 static void reset_state_machine
PARAMS ((int));
234 static char * get_TAG_name
PARAMS ((unsigned long));
235 static char * get_AT_name
PARAMS ((unsigned long));
236 static char * get_FORM_name
PARAMS ((unsigned long));
237 static void free_abbrevs
PARAMS ((void));
238 static void add_abbrev
PARAMS ((unsigned long, unsigned long, int));
239 static void add_abbrev_attr
PARAMS ((unsigned long, unsigned long));
240 static unsigned char * read_and_display_attr
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
241 static unsigned char * read_and_display_attr_value
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
242 static unsigned char * display_block
PARAMS ((unsigned char *, unsigned long));
243 static void decode_location_expression
PARAMS ((unsigned char *, unsigned int, unsigned long));
244 static void request_dump
PARAMS ((unsigned int, int));
245 static const char * get_elf_class
PARAMS ((unsigned int));
246 static const char * get_data_encoding
PARAMS ((unsigned int));
247 static const char * get_osabi_name
PARAMS ((unsigned int));
248 static int guess_is_rela
PARAMS ((unsigned long));
249 static char * get_note_type
PARAMS ((unsigned int));
250 static int process_note
PARAMS ((Elf32_Internal_Note
*));
251 static int process_corefile_note_segment
PARAMS ((FILE *, bfd_vma
, bfd_vma
));
252 static int process_corefile_note_segments
PARAMS ((FILE *));
253 static int process_corefile_contents
PARAMS ((FILE *));
254 static int process_arch_specific
PARAMS ((FILE *));
256 typedef int Elf32_Word
;
264 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
265 ((X)->sh_name >= string_table_length \
266 ? "<corrupt>" : string_table + (X)->sh_name))
268 /* Given st_shndx I, map to section_headers index. */
269 #define SECTION_HEADER_INDEX(I) \
270 ((I) < SHN_LORESERVE \
272 : ((I) <= SHN_HIRESERVE \
274 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
276 /* Reverse of the above. */
277 #define SECTION_HEADER_NUM(N) \
278 ((N) < SHN_LORESERVE \
280 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
282 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
284 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
286 #define BYTE_GET(field) byte_get (field, sizeof (field))
288 /* If we can support a 64 bit data type then BFD64 should be defined
289 and sizeof (bfd_vma) == 8. In this case when translating from an
290 external 8 byte field to an internal field, we can assume that the
291 internal field is also 8 bytes wide and so we can extract all the data.
292 If, however, BFD64 is not defined, then we must assume that the
293 internal data structure only has 4 byte wide fields that are the
294 equivalent of the 8 byte wide external counterparts, and so we must
295 truncate the data. */
297 #define BYTE_GET8(field) byte_get (field, -8)
299 #define BYTE_GET8(field) byte_get (field, 8)
302 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
304 #define GET_ELF_SYMBOLS(file, section) \
305 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
306 : get_64bit_elf_symbols (file, section))
310 error
VPARAMS ((const char *message
, ...))
312 VA_OPEN (args
, message
);
313 VA_FIXEDARG (args
, const char *, message
);
315 fprintf (stderr
, _("%s: Error: "), program_name
);
316 vfprintf (stderr
, message
, args
);
321 warn
VPARAMS ((const char *message
, ...))
323 VA_OPEN (args
, message
);
324 VA_FIXEDARG (args
, const char *, message
);
326 fprintf (stderr
, _("%s: Warning: "), program_name
);
327 vfprintf (stderr
, message
, args
);
331 static PTR get_data
PARAMS ((PTR
, FILE *, long, size_t, const char *));
334 get_data (var
, file
, offset
, size
, reason
)
346 if (fseek (file
, offset
, SEEK_SET
))
348 error (_("Unable to seek to %x for %s\n"), offset
, reason
);
355 mvar
= (PTR
) malloc (size
);
359 error (_("Out of memory allocating %d bytes for %s\n"),
365 if (fread (mvar
, size
, 1, file
) != 1)
367 error (_("Unable to read in %d bytes of %s\n"), size
, reason
);
377 byte_get_little_endian (field
, size
)
378 unsigned char * field
;
387 return ((unsigned int) (field
[0]))
388 | (((unsigned int) (field
[1])) << 8);
392 /* We want to extract data from an 8 byte wide field and
393 place it into a 4 byte wide field. Since this is a little
394 endian source we can juts use the 4 byte extraction code. */
398 return ((unsigned long) (field
[0]))
399 | (((unsigned long) (field
[1])) << 8)
400 | (((unsigned long) (field
[2])) << 16)
401 | (((unsigned long) (field
[3])) << 24);
406 /* This is a special case, generated by the BYTE_GET8 macro.
407 It means that we are loading an 8 byte value from a field
408 in an external structure into an 8 byte value in a field
409 in an internal strcuture. */
410 return ((bfd_vma
) (field
[0]))
411 | (((bfd_vma
) (field
[1])) << 8)
412 | (((bfd_vma
) (field
[2])) << 16)
413 | (((bfd_vma
) (field
[3])) << 24)
414 | (((bfd_vma
) (field
[4])) << 32)
415 | (((bfd_vma
) (field
[5])) << 40)
416 | (((bfd_vma
) (field
[6])) << 48)
417 | (((bfd_vma
) (field
[7])) << 56);
420 error (_("Unhandled data length: %d\n"), size
);
425 /* Print a VMA value. */
427 print_vma (vma
, mode
)
437 case FULL_HEX
: printf ("0x"); /* drop through */
438 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
439 case PREFIX_HEX
: printf ("0x"); /* drop through */
440 case HEX
: printf ("%lx", (unsigned long) vma
); break;
441 case DEC
: printf ("%ld", (unsigned long) vma
); break;
442 case DEC_5
: printf ("%5ld", (long) vma
); break;
443 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
464 #if BFD_HOST_64BIT_LONG
467 if (_bfd_int64_high (vma
))
468 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
470 printf ("%lx", _bfd_int64_low (vma
));
475 #if BFD_HOST_64BIT_LONG
478 if (_bfd_int64_high (vma
))
480 printf ("++%ld", _bfd_int64_low (vma
));
482 printf ("%ld", _bfd_int64_low (vma
));
487 #if BFD_HOST_64BIT_LONG
488 printf ("%5ld", vma
);
490 if (_bfd_int64_high (vma
))
492 printf ("++%ld", _bfd_int64_low (vma
));
494 printf ("%5ld", _bfd_int64_low (vma
));
499 #if BFD_HOST_64BIT_LONG
502 if (_bfd_int64_high (vma
))
504 printf ("++%lu", _bfd_int64_low (vma
));
506 printf ("%lu", _bfd_int64_low (vma
));
515 byte_get_big_endian (field
, size
)
516 unsigned char * field
;
525 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
528 return ((unsigned long) (field
[3]))
529 | (((unsigned long) (field
[2])) << 8)
530 | (((unsigned long) (field
[1])) << 16)
531 | (((unsigned long) (field
[0])) << 24);
535 /* Although we are extracing data from an 8 byte wide field, we
536 are returning only 4 bytes of data. */
537 return ((unsigned long) (field
[7]))
538 | (((unsigned long) (field
[6])) << 8)
539 | (((unsigned long) (field
[5])) << 16)
540 | (((unsigned long) (field
[4])) << 24);
544 /* This is a special case, generated by the BYTE_GET8 macro.
545 It means that we are loading an 8 byte value from a field
546 in an external structure into an 8 byte value in a field
547 in an internal strcuture. */
548 return ((bfd_vma
) (field
[7]))
549 | (((bfd_vma
) (field
[6])) << 8)
550 | (((bfd_vma
) (field
[5])) << 16)
551 | (((bfd_vma
) (field
[4])) << 24)
552 | (((bfd_vma
) (field
[3])) << 32)
553 | (((bfd_vma
) (field
[2])) << 40)
554 | (((bfd_vma
) (field
[1])) << 48)
555 | (((bfd_vma
) (field
[0])) << 56);
559 error (_("Unhandled data length: %d\n"), size
);
564 /* Guess the relocation size commonly used by the specific machines. */
567 guess_is_rela (e_machine
)
568 unsigned long e_machine
;
572 /* Targets that use REL relocations. */
585 /* Targets that use RELA relocations. */
599 case EM_CYGNUS_MN10200
:
601 case EM_CYGNUS_MN10300
:
638 warn (_("Don't know about relocations on this machine architecture\n"));
644 slurp_rela_relocs (file
, rel_offset
, rel_size
, relasp
, nrelasp
)
646 unsigned long rel_offset
;
647 unsigned long rel_size
;
648 Elf_Internal_Rela
**relasp
;
649 unsigned long *nrelasp
;
651 Elf_Internal_Rela
*relas
;
652 unsigned long nrelas
;
657 Elf32_External_Rela
* erelas
;
659 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
,
660 rel_size
, _("relocs"));
664 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
666 relas
= (Elf_Internal_Rela
*)
667 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
671 error(_("out of memory parsing relocs"));
675 for (i
= 0; i
< nrelas
; i
++)
677 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
678 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
679 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
686 Elf64_External_Rela
* erelas
;
688 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
,
689 rel_size
, _("relocs"));
693 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
695 relas
= (Elf_Internal_Rela
*)
696 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
700 error(_("out of memory parsing relocs"));
704 for (i
= 0; i
< nrelas
; i
++)
706 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
707 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
708 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
719 slurp_rel_relocs (file
, rel_offset
, rel_size
, relsp
, nrelsp
)
721 unsigned long rel_offset
;
722 unsigned long rel_size
;
723 Elf_Internal_Rel
**relsp
;
724 unsigned long *nrelsp
;
726 Elf_Internal_Rel
*rels
;
732 Elf32_External_Rel
* erels
;
734 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
,
735 rel_size
, _("relocs"));
739 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
741 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
745 error(_("out of memory parsing relocs"));
749 for (i
= 0; i
< nrels
; i
++)
751 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
752 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
759 Elf64_External_Rel
* erels
;
761 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
,
762 rel_size
, _("relocs"));
766 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
768 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
772 error(_("out of memory parsing relocs"));
776 for (i
= 0; i
< nrels
; i
++)
778 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
779 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
789 /* Display the contents of the relocation data found at the specified offset. */
791 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
793 unsigned long rel_offset
;
794 unsigned long rel_size
;
795 Elf_Internal_Sym
* symtab
;
801 Elf_Internal_Rel
* rels
;
802 Elf_Internal_Rela
* relas
;
805 if (is_rela
== UNKNOWN
)
806 is_rela
= guess_is_rela (elf_header
.e_machine
);
810 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &relas
, &rel_size
))
815 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
823 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
826 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
832 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
835 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
838 for (i
= 0; i
< rel_size
; i
++)
843 bfd_vma symtab_index
;
848 offset
= relas
[i
].r_offset
;
849 info
= relas
[i
].r_info
;
853 offset
= rels
[i
].r_offset
;
854 info
= rels
[i
].r_info
;
859 type
= ELF32_R_TYPE (info
);
860 symtab_index
= ELF32_R_SYM (info
);
864 if (elf_header
.e_machine
== EM_SPARCV9
)
865 type
= ELF64_R_TYPE_ID (info
);
867 type
= ELF64_R_TYPE (info
);
868 /* The #ifdef BFD64 below is to prevent a compile time warning.
869 We know that if we do not have a 64 bit data type that we
870 will never execute this code anyway. */
872 symtab_index
= ELF64_R_SYM (info
);
878 #ifdef _bfd_int64_low
879 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
881 printf ("%8.8lx %8.8lx ", offset
, info
);
886 #ifdef _bfd_int64_low
887 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
888 _bfd_int64_high (offset
),
889 _bfd_int64_low (offset
),
890 _bfd_int64_high (info
),
891 _bfd_int64_low (info
));
893 printf ("%16.16lx %16.16lx ", offset
, info
);
897 switch (elf_header
.e_machine
)
905 rtype
= elf_m32r_reloc_type (type
);
910 rtype
= elf_i386_reloc_type (type
);
914 rtype
= elf_m68k_reloc_type (type
);
918 rtype
= elf_i960_reloc_type (type
);
923 rtype
= elf_avr_reloc_type (type
);
930 rtype
= elf_sparc_reloc_type (type
);
935 rtype
= v850_reloc_type (type
);
940 rtype
= elf_d10v_reloc_type (type
);
945 rtype
= elf_d30v_reloc_type (type
);
949 rtype
= elf_sh_reloc_type (type
);
953 case EM_CYGNUS_MN10300
:
954 rtype
= elf_mn10300_reloc_type (type
);
958 case EM_CYGNUS_MN10200
:
959 rtype
= elf_mn10200_reloc_type (type
);
964 rtype
= elf_fr30_reloc_type (type
);
968 rtype
= elf_mcore_reloc_type (type
);
972 rtype
= elf_mmix_reloc_type (type
);
977 rtype
= elf_ppc_reloc_type (type
);
982 rtype
= elf_mips_reloc_type (type
);
986 rtype
= elf_alpha_reloc_type (type
);
990 rtype
= elf_arm_reloc_type (type
);
994 rtype
= elf_arc_reloc_type (type
);
998 rtype
= elf_hppa_reloc_type (type
);
1004 rtype
= elf_h8_reloc_type (type
);
1009 rtype
= elf_pj_reloc_type (type
);
1012 rtype
= elf_ia64_reloc_type (type
);
1016 rtype
= elf_cris_reloc_type (type
);
1020 rtype
= elf_i860_reloc_type (type
);
1024 rtype
= elf_x86_64_reloc_type (type
);
1029 rtype
= elf_s390_reloc_type (type
);
1033 rtype
= elf_xstormy16_reloc_type (type
);
1038 #ifdef _bfd_int64_low
1039 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type
));
1041 printf (_("unrecognised: %-7lx"), type
);
1044 printf ("%-21.21s", rtype
);
1048 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1049 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1052 Elf_Internal_Sym
* psym
;
1054 psym
= symtab
+ symtab_index
;
1057 print_vma (psym
->st_value
, LONG_HEX
);
1060 if (psym
->st_name
== 0)
1062 SECTION_NAME (SECTION_HEADER (psym
->st_shndx
)));
1063 else if (strtab
== NULL
)
1064 printf (_("<string table index %3ld>"), psym
->st_name
);
1066 printf ("%-25.25s", strtab
+ psym
->st_name
);
1069 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
1074 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
1075 print_vma (relas
[i
].r_addend
, LONG_HEX
);
1078 if (elf_header
.e_machine
== EM_SPARCV9
1079 && !strcmp (rtype
, "R_SPARC_OLO10"))
1080 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1094 get_mips_dynamic_type (type
)
1099 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1100 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1101 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1102 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1103 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1104 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1105 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1106 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1107 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1108 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1109 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1110 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1111 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1112 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1113 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1114 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1115 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1116 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1117 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1118 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1119 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1120 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1121 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1122 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1123 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1124 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1125 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1126 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1127 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1128 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1129 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1130 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1131 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1132 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1133 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1134 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1135 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1136 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1137 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1138 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1139 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1140 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1141 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1148 get_sparc64_dynamic_type (type
)
1153 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1160 get_parisc_dynamic_type (type
)
1165 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1166 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1167 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1168 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1169 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1170 case DT_HP_PREINIT
: return "HP_PREINIT";
1171 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1172 case DT_HP_NEEDED
: return "HP_NEEDED";
1173 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1174 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1175 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1176 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1177 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1184 get_dynamic_type (type
)
1187 static char buff
[32];
1191 case DT_NULL
: return "NULL";
1192 case DT_NEEDED
: return "NEEDED";
1193 case DT_PLTRELSZ
: return "PLTRELSZ";
1194 case DT_PLTGOT
: return "PLTGOT";
1195 case DT_HASH
: return "HASH";
1196 case DT_STRTAB
: return "STRTAB";
1197 case DT_SYMTAB
: return "SYMTAB";
1198 case DT_RELA
: return "RELA";
1199 case DT_RELASZ
: return "RELASZ";
1200 case DT_RELAENT
: return "RELAENT";
1201 case DT_STRSZ
: return "STRSZ";
1202 case DT_SYMENT
: return "SYMENT";
1203 case DT_INIT
: return "INIT";
1204 case DT_FINI
: return "FINI";
1205 case DT_SONAME
: return "SONAME";
1206 case DT_RPATH
: return "RPATH";
1207 case DT_SYMBOLIC
: return "SYMBOLIC";
1208 case DT_REL
: return "REL";
1209 case DT_RELSZ
: return "RELSZ";
1210 case DT_RELENT
: return "RELENT";
1211 case DT_PLTREL
: return "PLTREL";
1212 case DT_DEBUG
: return "DEBUG";
1213 case DT_TEXTREL
: return "TEXTREL";
1214 case DT_JMPREL
: return "JMPREL";
1215 case DT_BIND_NOW
: return "BIND_NOW";
1216 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1217 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1218 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1219 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1220 case DT_RUNPATH
: return "RUNPATH";
1221 case DT_FLAGS
: return "FLAGS";
1223 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1224 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1226 case DT_CHECKSUM
: return "CHECKSUM";
1227 case DT_PLTPADSZ
: return "PLTPADSZ";
1228 case DT_MOVEENT
: return "MOVEENT";
1229 case DT_MOVESZ
: return "MOVESZ";
1230 case DT_FEATURE
: return "FEATURE";
1231 case DT_POSFLAG_1
: return "POSFLAG_1";
1232 case DT_SYMINSZ
: return "SYMINSZ";
1233 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1235 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1236 case DT_CONFIG
: return "CONFIG";
1237 case DT_DEPAUDIT
: return "DEPAUDIT";
1238 case DT_AUDIT
: return "AUDIT";
1239 case DT_PLTPAD
: return "PLTPAD";
1240 case DT_MOVETAB
: return "MOVETAB";
1241 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1243 case DT_VERSYM
: return "VERSYM";
1245 case DT_RELACOUNT
: return "RELACOUNT";
1246 case DT_RELCOUNT
: return "RELCOUNT";
1247 case DT_FLAGS_1
: return "FLAGS_1";
1248 case DT_VERDEF
: return "VERDEF";
1249 case DT_VERDEFNUM
: return "VERDEFNUM";
1250 case DT_VERNEED
: return "VERNEED";
1251 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1253 case DT_AUXILIARY
: return "AUXILIARY";
1254 case DT_USED
: return "USED";
1255 case DT_FILTER
: return "FILTER";
1258 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1260 const char * result
;
1262 switch (elf_header
.e_machine
)
1265 case EM_MIPS_RS3_LE
:
1266 result
= get_mips_dynamic_type (type
);
1269 result
= get_sparc64_dynamic_type (type
);
1279 sprintf (buff
, _("Processor Specific: %lx"), type
);
1281 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1283 const char * result
;
1285 switch (elf_header
.e_machine
)
1288 result
= get_parisc_dynamic_type (type
);
1298 sprintf (buff
, _("Operating System specific: %lx"), type
);
1301 sprintf (buff
, _("<unknown>: %lx"), type
);
1308 get_file_type (e_type
)
1311 static char buff
[32];
1315 case ET_NONE
: return _("NONE (None)");
1316 case ET_REL
: return _("REL (Relocatable file)");
1317 case ET_EXEC
: return _("EXEC (Executable file)");
1318 case ET_DYN
: return _("DYN (Shared object file)");
1319 case ET_CORE
: return _("CORE (Core file)");
1322 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1323 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1324 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1325 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1327 sprintf (buff
, _("<unknown>: %x"), e_type
);
1333 get_machine_name (e_machine
)
1336 static char buff
[64]; /* XXX */
1340 case EM_NONE
: return _("None");
1341 case EM_M32
: return "WE32100";
1342 case EM_SPARC
: return "Sparc";
1343 case EM_386
: return "Intel 80386";
1344 case EM_68K
: return "MC68000";
1345 case EM_88K
: return "MC88000";
1346 case EM_486
: return "Intel 80486";
1347 case EM_860
: return "Intel 80860";
1348 case EM_MIPS
: return "MIPS R3000";
1349 case EM_S370
: return "IBM System/370";
1350 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1351 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1352 case EM_PARISC
: return "HPPA";
1353 case EM_PPC_OLD
: return "Power PC (old)";
1354 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1355 case EM_960
: return "Intel 90860";
1356 case EM_PPC
: return "PowerPC";
1357 case EM_V800
: return "NEC V800";
1358 case EM_FR20
: return "Fujitsu FR20";
1359 case EM_RH32
: return "TRW RH32";
1360 case EM_MCORE
: return "MCORE";
1361 case EM_ARM
: return "ARM";
1362 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1363 case EM_SH
: return "Hitachi SH";
1364 case EM_SPARCV9
: return "Sparc v9";
1365 case EM_TRICORE
: return "Siemens Tricore";
1366 case EM_ARC
: return "ARC";
1367 case EM_H8_300
: return "Hitachi H8/300";
1368 case EM_H8_300H
: return "Hitachi H8/300H";
1369 case EM_H8S
: return "Hitachi H8S";
1370 case EM_H8_500
: return "Hitachi H8/500";
1371 case EM_IA_64
: return "Intel IA-64";
1372 case EM_MIPS_X
: return "Stanford MIPS-X";
1373 case EM_COLDFIRE
: return "Motorola Coldfire";
1374 case EM_68HC12
: return "Motorola M68HC12";
1375 case EM_ALPHA
: return "Alpha";
1376 case EM_CYGNUS_D10V
:
1377 case EM_D10V
: return "d10v";
1378 case EM_CYGNUS_D30V
:
1379 case EM_D30V
: return "d30v";
1380 case EM_CYGNUS_M32R
:
1381 case EM_M32R
: return "Mitsubishi M32r";
1382 case EM_CYGNUS_V850
:
1383 case EM_V850
: return "NEC v850";
1384 case EM_CYGNUS_MN10300
:
1385 case EM_MN10300
: return "mn10300";
1386 case EM_CYGNUS_MN10200
:
1387 case EM_MN10200
: return "mn10200";
1388 case EM_CYGNUS_FR30
:
1389 case EM_FR30
: return "Fujitsu FR30";
1391 case EM_PJ
: return "picoJava";
1392 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1393 case EM_PCP
: return "Siemens PCP";
1394 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1395 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1396 case EM_STARCORE
: return "Motorola Star*Core processor";
1397 case EM_ME16
: return "Toyota ME16 processor";
1398 case EM_ST100
: return "STMicroelectronics ST100 processor";
1399 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1400 case EM_FX66
: return "Siemens FX66 microcontroller";
1401 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1402 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1403 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1404 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1405 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1406 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1407 case EM_SVX
: return "Silicon Graphics SVx";
1408 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1409 case EM_VAX
: return "Digital VAX";
1411 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1412 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1413 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1414 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1415 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1416 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1417 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1418 case EM_PRISM
: return "SiTera Prism";
1419 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1421 case EM_S390
: return "IBM S/390";
1422 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1424 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1430 decode_ARM_machine_flags (e_flags
, buf
)
1437 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1438 e_flags
&= ~ EF_ARM_EABIMASK
;
1440 /* Handle "generic" ARM flags. */
1441 if (e_flags
& EF_ARM_RELEXEC
)
1443 strcat (buf
, ", relocatable executable");
1444 e_flags
&= ~ EF_ARM_RELEXEC
;
1447 if (e_flags
& EF_ARM_HASENTRY
)
1449 strcat (buf
, ", has entry point");
1450 e_flags
&= ~ EF_ARM_HASENTRY
;
1453 /* Now handle EABI specific flags. */
1457 strcat (buf
, ", <unrecognised EABI>");
1462 case EF_ARM_EABI_VER1
:
1463 strcat (buf
, ", Version1 EABI");
1468 /* Process flags one bit at a time. */
1469 flag
= e_flags
& - e_flags
;
1474 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1475 strcat (buf
, ", sorted symbol tables");
1485 case EF_ARM_EABI_VER2
:
1486 strcat (buf
, ", Version2 EABI");
1491 /* Process flags one bit at a time. */
1492 flag
= e_flags
& - e_flags
;
1497 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1498 strcat (buf
, ", sorted symbol tables");
1501 case EF_ARM_DYNSYMSUSESEGIDX
:
1502 strcat (buf
, ", dynamic symbols use segment index");
1505 case EF_ARM_MAPSYMSFIRST
:
1506 strcat (buf
, ", mapping symbols precede others");
1516 case EF_ARM_EABI_UNKNOWN
:
1517 strcat (buf
, ", GNU EABI");
1522 /* Process flags one bit at a time. */
1523 flag
= e_flags
& - e_flags
;
1528 case EF_ARM_INTERWORK
:
1529 strcat (buf
, ", interworking enabled");
1532 case EF_ARM_APCS_26
:
1533 strcat (buf
, ", uses APCS/26");
1536 case EF_ARM_APCS_FLOAT
:
1537 strcat (buf
, ", uses APCS/float");
1541 strcat (buf
, ", position independent");
1545 strcat (buf
, ", 8 bit structure alignment");
1548 case EF_ARM_NEW_ABI
:
1549 strcat (buf
, ", uses new ABI");
1552 case EF_ARM_OLD_ABI
:
1553 strcat (buf
, ", uses old ABI");
1556 case EF_ARM_SOFT_FLOAT
:
1557 strcat (buf
, ", software FP");
1568 strcat (buf
,", <unknown>");
1572 get_machine_flags (e_flags
, e_machine
)
1576 static char buf
[1024];
1588 decode_ARM_machine_flags (e_flags
, buf
);
1592 if (e_flags
& EF_CPU32
)
1593 strcat (buf
, ", cpu32");
1597 if (e_flags
& EF_PPC_EMB
)
1598 strcat (buf
, ", emb");
1600 if (e_flags
& EF_PPC_RELOCATABLE
)
1601 strcat (buf
, ", relocatable");
1603 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1604 strcat (buf
, ", relocatable-lib");
1608 case EM_CYGNUS_V850
:
1609 switch (e_flags
& EF_V850_ARCH
)
1612 strcat (buf
, ", v850e");
1615 strcat (buf
, ", v850ea");
1618 strcat (buf
, ", v850");
1621 strcat (buf
, ", unknown v850 architecture variant");
1627 case EM_CYGNUS_M32R
:
1628 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1629 strcat (buf
, ", m32r");
1634 case EM_MIPS_RS3_LE
:
1635 if (e_flags
& EF_MIPS_NOREORDER
)
1636 strcat (buf
, ", noreorder");
1638 if (e_flags
& EF_MIPS_PIC
)
1639 strcat (buf
, ", pic");
1641 if (e_flags
& EF_MIPS_CPIC
)
1642 strcat (buf
, ", cpic");
1644 if (e_flags
& EF_MIPS_UCODE
)
1645 strcat (buf
, ", ugen_reserved");
1647 if (e_flags
& EF_MIPS_ABI2
)
1648 strcat (buf
, ", abi2");
1650 if (e_flags
& EF_MIPS_32BITMODE
)
1651 strcat (buf
, ", 32bitmode");
1653 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_1
)
1654 strcat (buf
, ", mips1");
1656 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_2
)
1657 strcat (buf
, ", mips2");
1659 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_3
)
1660 strcat (buf
, ", mips3");
1662 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_4
)
1663 strcat (buf
, ", mips4");
1665 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_5
)
1666 strcat (buf
, ", mips5");
1668 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_32
)
1669 strcat (buf
, ", mips32");
1671 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_64
)
1672 strcat (buf
, ", mips64");
1674 switch ((e_flags
& EF_MIPS_MACH
))
1676 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1677 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1678 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1679 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1680 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1681 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1682 default: strcat (buf
, " UNKNOWN"); break;
1687 if (e_flags
& EF_SPARC_32PLUS
)
1688 strcat (buf
, ", v8+");
1690 if (e_flags
& EF_SPARC_SUN_US1
)
1691 strcat (buf
, ", ultrasparcI");
1693 if (e_flags
& EF_SPARC_SUN_US3
)
1694 strcat (buf
, ", ultrasparcIII");
1696 if (e_flags
& EF_SPARC_HAL_R1
)
1697 strcat (buf
, ", halr1");
1699 if (e_flags
& EF_SPARC_LEDATA
)
1700 strcat (buf
, ", ledata");
1702 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1703 strcat (buf
, ", tso");
1705 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1706 strcat (buf
, ", pso");
1708 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1709 strcat (buf
, ", rmo");
1713 switch (e_flags
& EF_PARISC_ARCH
)
1715 case EFA_PARISC_1_0
:
1716 strcpy (buf
, ", PA-RISC 1.0");
1718 case EFA_PARISC_1_1
:
1719 strcpy (buf
, ", PA-RISC 1.1");
1721 case EFA_PARISC_2_0
:
1722 strcpy (buf
, ", PA-RISC 2.0");
1727 if (e_flags
& EF_PARISC_TRAPNIL
)
1728 strcat (buf
, ", trapnil");
1729 if (e_flags
& EF_PARISC_EXT
)
1730 strcat (buf
, ", ext");
1731 if (e_flags
& EF_PARISC_LSB
)
1732 strcat (buf
, ", lsb");
1733 if (e_flags
& EF_PARISC_WIDE
)
1734 strcat (buf
, ", wide");
1735 if (e_flags
& EF_PARISC_NO_KABP
)
1736 strcat (buf
, ", no kabp");
1737 if (e_flags
& EF_PARISC_LAZYSWAP
)
1738 strcat (buf
, ", lazyswap");
1743 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1744 strcat (buf
, ", new calling convention");
1746 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1747 strcat (buf
, ", gnu calling convention");
1751 if ((e_flags
& EF_IA_64_ABI64
))
1752 strcat (buf
, ", 64-bit");
1754 strcat (buf
, ", 32-bit");
1755 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1756 strcat (buf
, ", reduced fp model");
1757 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1758 strcat (buf
, ", no function descriptors, constant gp");
1759 else if ((e_flags
& EF_IA_64_CONS_GP
))
1760 strcat (buf
, ", constant gp");
1761 if ((e_flags
& EF_IA_64_ABSOLUTE
))
1762 strcat (buf
, ", absolute");
1771 get_mips_segment_type (type
)
1776 case PT_MIPS_REGINFO
:
1778 case PT_MIPS_RTPROC
:
1780 case PT_MIPS_OPTIONS
:
1790 get_parisc_segment_type (type
)
1795 case PT_HP_TLS
: return "HP_TLS";
1796 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1797 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1798 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1799 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1800 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1801 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1802 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1803 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1804 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1805 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1806 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1807 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1808 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1817 get_ia64_segment_type (type
)
1822 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
1823 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
1832 get_segment_type (p_type
)
1833 unsigned long p_type
;
1835 static char buff
[32];
1839 case PT_NULL
: return "NULL";
1840 case PT_LOAD
: return "LOAD";
1841 case PT_DYNAMIC
: return "DYNAMIC";
1842 case PT_INTERP
: return "INTERP";
1843 case PT_NOTE
: return "NOTE";
1844 case PT_SHLIB
: return "SHLIB";
1845 case PT_PHDR
: return "PHDR";
1847 case PT_GNU_EH_FRAME
:
1848 return "GNU_EH_FRAME";
1851 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1853 const char * result
;
1855 switch (elf_header
.e_machine
)
1858 case EM_MIPS_RS3_LE
:
1859 result
= get_mips_segment_type (p_type
);
1862 result
= get_parisc_segment_type (p_type
);
1865 result
= get_ia64_segment_type (p_type
);
1875 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1877 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1879 const char * result
;
1881 switch (elf_header
.e_machine
)
1884 result
= get_parisc_segment_type (p_type
);
1894 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1897 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1904 get_mips_section_type_name (sh_type
)
1905 unsigned int sh_type
;
1909 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1910 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1911 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1912 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1913 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1914 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1915 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1916 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1917 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1918 case SHT_MIPS_RELD
: return "MIPS_RELD";
1919 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
1920 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
1921 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1922 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
1923 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
1924 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
1925 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
1926 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
1927 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
1928 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
1929 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
1930 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
1931 case SHT_MIPS_LINE
: return "MIPS_LINE";
1932 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
1933 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
1934 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
1935 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
1936 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
1937 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
1938 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1939 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
1940 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
1941 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
1942 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
1943 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
1944 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
1945 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
1946 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
1947 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
1955 get_parisc_section_type_name (sh_type
)
1956 unsigned int sh_type
;
1960 case SHT_PARISC_EXT
: return "PARISC_EXT";
1961 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
1962 case SHT_PARISC_DOC
: return "PARISC_DOC";
1970 get_ia64_section_type_name (sh_type
)
1971 unsigned int sh_type
;
1975 case SHT_IA_64_EXT
: return "IA_64_EXT";
1976 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
1984 get_section_type_name (sh_type
)
1985 unsigned int sh_type
;
1987 static char buff
[32];
1991 case SHT_NULL
: return "NULL";
1992 case SHT_PROGBITS
: return "PROGBITS";
1993 case SHT_SYMTAB
: return "SYMTAB";
1994 case SHT_STRTAB
: return "STRTAB";
1995 case SHT_RELA
: return "RELA";
1996 case SHT_HASH
: return "HASH";
1997 case SHT_DYNAMIC
: return "DYNAMIC";
1998 case SHT_NOTE
: return "NOTE";
1999 case SHT_NOBITS
: return "NOBITS";
2000 case SHT_REL
: return "REL";
2001 case SHT_SHLIB
: return "SHLIB";
2002 case SHT_DYNSYM
: return "DYNSYM";
2003 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2004 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2005 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2006 case SHT_GROUP
: return "GROUP";
2007 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2008 case SHT_GNU_verdef
: return "VERDEF";
2009 case SHT_GNU_verneed
: return "VERNEED";
2010 case SHT_GNU_versym
: return "VERSYM";
2011 case 0x6ffffff0: return "VERSYM";
2012 case 0x6ffffffc: return "VERDEF";
2013 case 0x7ffffffd: return "AUXILIARY";
2014 case 0x7fffffff: return "FILTER";
2017 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2019 const char * result
;
2021 switch (elf_header
.e_machine
)
2024 case EM_MIPS_RS3_LE
:
2025 result
= get_mips_section_type_name (sh_type
);
2028 result
= get_parisc_section_type_name (sh_type
);
2031 result
= get_ia64_section_type_name (sh_type
);
2041 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2043 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2044 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2045 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2046 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2048 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2054 struct option options
[] =
2056 {"all", no_argument
, 0, 'a'},
2057 {"file-header", no_argument
, 0, 'h'},
2058 {"program-headers", no_argument
, 0, 'l'},
2059 {"headers", no_argument
, 0, 'e'},
2060 {"histogram", no_argument
, 0, 'I'},
2061 {"segments", no_argument
, 0, 'l'},
2062 {"sections", no_argument
, 0, 'S'},
2063 {"section-headers", no_argument
, 0, 'S'},
2064 {"symbols", no_argument
, 0, 's'},
2065 {"syms", no_argument
, 0, 's'},
2066 {"relocs", no_argument
, 0, 'r'},
2067 {"notes", no_argument
, 0, 'n'},
2068 {"dynamic", no_argument
, 0, 'd'},
2069 {"arch-specific", no_argument
, 0, 'A'},
2070 {"version-info", no_argument
, 0, 'V'},
2071 {"use-dynamic", no_argument
, 0, 'D'},
2072 {"hex-dump", required_argument
, 0, 'x'},
2073 {"debug-dump", optional_argument
, 0, 'w'},
2074 {"unwind", no_argument
, 0, 'u'},
2075 #ifdef SUPPORT_DISASSEMBLY
2076 {"instruction-dump", required_argument
, 0, 'i'},
2079 {"version", no_argument
, 0, 'v'},
2080 {"wide", no_argument
, 0, 'W'},
2081 {"help", no_argument
, 0, 'H'},
2082 {0, no_argument
, 0, 0}
2088 fprintf (stdout
, _("Usage: readelf {options} elf-file(s)\n"));
2089 fprintf (stdout
, _(" Options are:\n"));
2090 fprintf (stdout
, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2091 fprintf (stdout
, _(" -h or --file-header Display the ELF file header\n"));
2092 fprintf (stdout
, _(" -l or --program-headers or --segments\n"));
2093 fprintf (stdout
, _(" Display the program headers\n"));
2094 fprintf (stdout
, _(" -S or --section-headers or --sections\n"));
2095 fprintf (stdout
, _(" Display the sections' header\n"));
2096 fprintf (stdout
, _(" -e or --headers Equivalent to: -h -l -S\n"));
2097 fprintf (stdout
, _(" -s or --syms or --symbols Display the symbol table\n"));
2098 fprintf (stdout
, _(" -n or --notes Display the core notes (if present)\n"));
2099 fprintf (stdout
, _(" -r or --relocs Display the relocations (if present)\n"));
2100 fprintf (stdout
, _(" -u or --unwind Display the unwind info (if present)\n"));
2101 fprintf (stdout
, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2102 fprintf (stdout
, _(" -V or --version-info Display the version sections (if present)\n"));
2103 fprintf (stdout
, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2104 fprintf (stdout
, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2105 fprintf (stdout
, _(" -x <number> or --hex-dump=<number>\n"));
2106 fprintf (stdout
, _(" Dump the contents of section <number>\n"));
2107 fprintf (stdout
, _(" -w[liaprmfs] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n"));
2108 fprintf (stdout
, _(" Display the contents of DWARF2 debug sections\n"));
2109 #ifdef SUPPORT_DISASSEMBLY
2110 fprintf (stdout
, _(" -i <number> or --instruction-dump=<number>\n"));
2111 fprintf (stdout
, _(" Disassemble the contents of section <number>\n"));
2113 fprintf (stdout
, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2114 fprintf (stdout
, _(" -v or --version Display the version number of readelf\n"));
2115 fprintf (stdout
, _(" -W or --wide Don't split lines to fit into 80 columns\n"));
2116 fprintf (stdout
, _(" -H or --help Display this information\n"));
2117 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2123 request_dump (section
, type
)
2124 unsigned int section
;
2127 if (section
>= num_dump_sects
)
2129 char * new_dump_sects
;
2131 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2133 if (new_dump_sects
== NULL
)
2134 error (_("Out of memory allocating dump request table."));
2137 /* Copy current flag settings. */
2138 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2142 dump_sects
= new_dump_sects
;
2143 num_dump_sects
= section
+ 1;
2148 dump_sects
[section
] |= type
;
2154 parse_args (argc
, argv
)
2163 while ((c
= getopt_long
2164 (argc
, argv
, "ersuahnldSDAIw::x:i:vVW", options
, NULL
)) != EOF
)
2200 do_using_dynamic
++;
2231 section
= strtoul (optarg
, & cp
, 0);
2232 if (! * cp
&& section
>= 0)
2234 request_dump (section
, HEX_DUMP
);
2244 unsigned int index
= 0;
2248 while (optarg
[index
])
2249 switch (optarg
[index
++])
2258 do_debug_abbrevs
= 1;
2268 do_debug_pubnames
= 1;
2273 do_debug_aranges
= 1;
2277 do_debug_frames_interp
= 1;
2279 do_debug_frames
= 1;
2284 do_debug_macinfo
= 1;
2293 warn (_("Unrecognised debug option '%s'\n"), optarg
);
2298 #ifdef SUPPORT_DISASSEMBLY
2301 section
= strtoul (optarg
, & cp
, 0);
2302 if (! * cp
&& section
>= 0)
2304 request_dump (section
, DISASS_DUMP
);
2310 print_version (program_name
);
2320 /* xgettext:c-format */
2321 error (_("Invalid option '-%c'\n"), c
);
2328 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2329 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2330 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2334 warn (_("Nothing to do.\n"));
2340 get_elf_class (elf_class
)
2341 unsigned int elf_class
;
2343 static char buff
[32];
2347 case ELFCLASSNONE
: return _("none");
2348 case ELFCLASS32
: return "ELF32";
2349 case ELFCLASS64
: return "ELF64";
2351 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2357 get_data_encoding (encoding
)
2358 unsigned int encoding
;
2360 static char buff
[32];
2364 case ELFDATANONE
: return _("none");
2365 case ELFDATA2LSB
: return _("2's complement, little endian");
2366 case ELFDATA2MSB
: return _("2's complement, big endian");
2368 sprintf (buff
, _("<unknown: %x>"), encoding
);
2374 get_osabi_name (osabi
)
2377 static char buff
[32];
2381 case ELFOSABI_NONE
: return "UNIX - System V";
2382 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2383 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2384 case ELFOSABI_LINUX
: return "UNIX - Linux";
2385 case ELFOSABI_HURD
: return "GNU/Hurd";
2386 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2387 case ELFOSABI_AIX
: return "UNIX - AIX";
2388 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2389 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2390 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2391 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2392 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2393 case ELFOSABI_STANDALONE
: return _("Standalone App");
2394 case ELFOSABI_ARM
: return "ARM";
2396 sprintf (buff
, _("<unknown: %x>"), osabi
);
2401 /* Decode the data held in 'elf_header'. */
2403 process_file_header ()
2405 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2406 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2407 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2408 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2411 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2419 printf (_("ELF Header:\n"));
2420 printf (_(" Magic: "));
2421 for (i
= 0; i
< EI_NIDENT
; i
++)
2422 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2424 printf (_(" Class: %s\n"),
2425 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2426 printf (_(" Data: %s\n"),
2427 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2428 printf (_(" Version: %d %s\n"),
2429 elf_header
.e_ident
[EI_VERSION
],
2430 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2432 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2435 printf (_(" OS/ABI: %s\n"),
2436 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2437 printf (_(" ABI Version: %d\n"),
2438 elf_header
.e_ident
[EI_ABIVERSION
]);
2439 printf (_(" Type: %s\n"),
2440 get_file_type (elf_header
.e_type
));
2441 printf (_(" Machine: %s\n"),
2442 get_machine_name (elf_header
.e_machine
));
2443 printf (_(" Version: 0x%lx\n"),
2444 (unsigned long) elf_header
.e_version
);
2446 printf (_(" Entry point address: "));
2447 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2448 printf (_("\n Start of program headers: "));
2449 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2450 printf (_(" (bytes into file)\n Start of section headers: "));
2451 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2452 printf (_(" (bytes into file)\n"));
2454 printf (_(" Flags: 0x%lx%s\n"),
2455 (unsigned long) elf_header
.e_flags
,
2456 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2457 printf (_(" Size of this header: %ld (bytes)\n"),
2458 (long) elf_header
.e_ehsize
);
2459 printf (_(" Size of program headers: %ld (bytes)\n"),
2460 (long) elf_header
.e_phentsize
);
2461 printf (_(" Number of program headers: %ld\n"),
2462 (long) elf_header
.e_phnum
);
2463 printf (_(" Size of section headers: %ld (bytes)\n"),
2464 (long) elf_header
.e_shentsize
);
2465 printf (_(" Number of section headers: %ld"),
2466 (long) elf_header
.e_shnum
);
2467 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2468 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2469 putc ('\n', stdout
);
2470 printf (_(" Section header string table index: %ld"),
2471 (long) elf_header
.e_shstrndx
);
2472 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2473 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2474 putc ('\n', stdout
);
2477 if (section_headers
!= NULL
)
2479 if (elf_header
.e_shnum
== 0)
2480 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2481 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2482 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2483 free (section_headers
);
2484 section_headers
= NULL
;
2492 get_32bit_program_headers (file
, program_headers
)
2494 Elf_Internal_Phdr
* program_headers
;
2496 Elf32_External_Phdr
* phdrs
;
2497 Elf32_External_Phdr
* external
;
2498 Elf32_Internal_Phdr
* internal
;
2501 phdrs
= ((Elf32_External_Phdr
*)
2502 get_data (NULL
, file
, elf_header
.e_phoff
,
2503 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2504 _("program headers")));
2508 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2509 i
< elf_header
.e_phnum
;
2510 i
++, internal
++, external
++)
2512 internal
->p_type
= BYTE_GET (external
->p_type
);
2513 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2514 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2515 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2516 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2517 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2518 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2519 internal
->p_align
= BYTE_GET (external
->p_align
);
2528 get_64bit_program_headers (file
, program_headers
)
2530 Elf_Internal_Phdr
* program_headers
;
2532 Elf64_External_Phdr
* phdrs
;
2533 Elf64_External_Phdr
* external
;
2534 Elf64_Internal_Phdr
* internal
;
2537 phdrs
= ((Elf64_External_Phdr
*)
2538 get_data (NULL
, file
, elf_header
.e_phoff
,
2539 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2540 _("program headers")));
2544 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2545 i
< elf_header
.e_phnum
;
2546 i
++, internal
++, external
++)
2548 internal
->p_type
= BYTE_GET (external
->p_type
);
2549 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2550 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2551 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2552 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2553 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2554 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2555 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2564 process_program_headers (file
)
2567 Elf_Internal_Phdr
* program_headers
;
2568 Elf_Internal_Phdr
* segment
;
2571 if (elf_header
.e_phnum
== 0)
2574 printf (_("\nThere are no program headers in this file.\n"));
2578 if (do_segments
&& !do_header
)
2580 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2581 printf (_("Entry point "));
2582 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2583 printf (_("\nThere are %d program headers, starting at offset "),
2584 elf_header
.e_phnum
);
2585 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2589 program_headers
= (Elf_Internal_Phdr
*) malloc
2590 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2592 if (program_headers
== NULL
)
2594 error (_("Out of memory\n"));
2599 i
= get_32bit_program_headers (file
, program_headers
);
2601 i
= get_64bit_program_headers (file
, program_headers
);
2605 free (program_headers
);
2612 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2616 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2619 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2623 (_(" Type Offset VirtAddr PhysAddr\n"));
2625 (_(" FileSiz MemSiz Flags Align\n"));
2633 for (i
= 0, segment
= program_headers
;
2634 i
< elf_header
.e_phnum
;
2639 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2643 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2644 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2645 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2646 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2647 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2649 (segment
->p_flags
& PF_R
? 'R' : ' '),
2650 (segment
->p_flags
& PF_W
? 'W' : ' '),
2651 (segment
->p_flags
& PF_X
? 'E' : ' '));
2652 printf ("%#lx", (unsigned long) segment
->p_align
);
2656 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
2657 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2660 print_vma (segment
->p_offset
, FULL_HEX
);
2664 print_vma (segment
->p_vaddr
, FULL_HEX
);
2666 print_vma (segment
->p_paddr
, FULL_HEX
);
2669 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
2670 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
2673 print_vma (segment
->p_filesz
, FULL_HEX
);
2677 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
2678 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
2681 print_vma (segment
->p_offset
, FULL_HEX
);
2685 (segment
->p_flags
& PF_R
? 'R' : ' '),
2686 (segment
->p_flags
& PF_W
? 'W' : ' '),
2687 (segment
->p_flags
& PF_X
? 'E' : ' '));
2689 if ((unsigned long) segment
->p_align
== segment
->p_align
)
2690 printf ("%#lx", (unsigned long) segment
->p_align
);
2693 print_vma (segment
->p_align
, PREFIX_HEX
);
2698 print_vma (segment
->p_offset
, FULL_HEX
);
2700 print_vma (segment
->p_vaddr
, FULL_HEX
);
2702 print_vma (segment
->p_paddr
, FULL_HEX
);
2704 print_vma (segment
->p_filesz
, FULL_HEX
);
2706 print_vma (segment
->p_memsz
, FULL_HEX
);
2708 (segment
->p_flags
& PF_R
? 'R' : ' '),
2709 (segment
->p_flags
& PF_W
? 'W' : ' '),
2710 (segment
->p_flags
& PF_X
? 'E' : ' '));
2711 print_vma (segment
->p_align
, HEX
);
2715 switch (segment
->p_type
)
2719 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2720 - (segment
->p_offset
& 0xfffff000);
2725 error (_("more than one dynamic segment\n"));
2727 dynamic_addr
= segment
->p_offset
;
2728 dynamic_size
= segment
->p_filesz
;
2732 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2733 error (_("Unable to find program interpreter name\n"));
2736 program_interpreter
[0] = 0;
2737 fscanf (file
, "%63s", program_interpreter
);
2740 printf (_("\n [Requesting program interpreter: %s]"),
2741 program_interpreter
);
2747 putc ('\n', stdout
);
2756 if (do_segments
&& section_headers
!= NULL
)
2758 printf (_("\n Section to Segment mapping:\n"));
2759 printf (_(" Segment Sections...\n"));
2761 assert (string_table
!= NULL
);
2763 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2766 Elf_Internal_Shdr
* section
;
2768 segment
= program_headers
+ i
;
2769 section
= section_headers
;
2771 printf (" %2.2d ", i
);
2773 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
2775 if (section
->sh_size
> 0
2776 /* Compare allocated sections by VMA, unallocated
2777 sections by file offset. */
2778 && (section
->sh_flags
& SHF_ALLOC
2779 ? (section
->sh_addr
>= segment
->p_vaddr
2780 && section
->sh_addr
+ section
->sh_size
2781 <= segment
->p_vaddr
+ segment
->p_memsz
)
2782 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2783 && (section
->sh_offset
+ section
->sh_size
2784 <= segment
->p_offset
+ segment
->p_filesz
))))
2785 printf ("%s ", SECTION_NAME (section
));
2792 free (program_headers
);
2799 get_32bit_section_headers (file
, num
)
2803 Elf32_External_Shdr
* shdrs
;
2804 Elf32_Internal_Shdr
* internal
;
2807 shdrs
= ((Elf32_External_Shdr
*)
2808 get_data (NULL
, file
, elf_header
.e_shoff
,
2809 elf_header
.e_shentsize
* num
,
2810 _("section headers")));
2814 section_headers
= ((Elf_Internal_Shdr
*)
2815 malloc (num
* sizeof (Elf_Internal_Shdr
)));
2817 if (section_headers
== NULL
)
2819 error (_("Out of memory\n"));
2823 for (i
= 0, internal
= section_headers
;
2827 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2828 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2829 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2830 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2831 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2832 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2833 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2834 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2835 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2836 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2845 get_64bit_section_headers (file
, num
)
2849 Elf64_External_Shdr
* shdrs
;
2850 Elf64_Internal_Shdr
* internal
;
2853 shdrs
= ((Elf64_External_Shdr
*)
2854 get_data (NULL
, file
, elf_header
.e_shoff
,
2855 elf_header
.e_shentsize
* num
,
2856 _("section headers")));
2860 section_headers
= ((Elf_Internal_Shdr
*)
2861 malloc (num
* sizeof (Elf_Internal_Shdr
)));
2863 if (section_headers
== NULL
)
2865 error (_("Out of memory\n"));
2869 for (i
= 0, internal
= section_headers
;
2873 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2874 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2875 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2876 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2877 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2878 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2879 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2880 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2881 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2882 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2890 static Elf_Internal_Sym
*
2891 get_32bit_elf_symbols (file
, section
)
2893 Elf_Internal_Shdr
*section
;
2895 unsigned long number
;
2896 Elf32_External_Sym
* esyms
;
2897 Elf_External_Sym_Shndx
*shndx
;
2898 Elf_Internal_Sym
* isyms
;
2899 Elf_Internal_Sym
* psym
;
2902 esyms
= ((Elf32_External_Sym
*)
2903 get_data (NULL
, file
, section
->sh_offset
,
2904 section
->sh_size
, _("symbols")));
2909 if (symtab_shndx_hdr
!= NULL
2910 && (symtab_shndx_hdr
->sh_link
2911 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
2913 shndx
= ((Elf_External_Sym_Shndx
*)
2914 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
2915 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
2923 number
= section
->sh_size
/ section
->sh_entsize
;
2924 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2928 error (_("Out of memory\n"));
2935 for (j
= 0, psym
= isyms
;
2939 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2940 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
2941 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
2942 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2943 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
2945 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
2946 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2947 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2957 static Elf_Internal_Sym
*
2958 get_64bit_elf_symbols (file
, section
)
2960 Elf_Internal_Shdr
*section
;
2962 unsigned long number
;
2963 Elf64_External_Sym
* esyms
;
2964 Elf_External_Sym_Shndx
*shndx
;
2965 Elf_Internal_Sym
* isyms
;
2966 Elf_Internal_Sym
* psym
;
2969 esyms
= ((Elf64_External_Sym
*)
2970 get_data (NULL
, file
, section
->sh_offset
,
2971 section
->sh_size
, _("symbols")));
2976 if (symtab_shndx_hdr
!= NULL
2977 && (symtab_shndx_hdr
->sh_link
2978 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
2980 shndx
= ((Elf_External_Sym_Shndx
*)
2981 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
2982 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
2990 number
= section
->sh_size
/ section
->sh_entsize
;
2991 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2995 error (_("Out of memory\n"));
3002 for (j
= 0, psym
= isyms
;
3006 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3007 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3008 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3009 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3010 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3012 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3013 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3014 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3025 get_elf_section_flags (sh_flags
)
3028 static char buff
[32];
3036 flag
= sh_flags
& - sh_flags
;
3041 case SHF_WRITE
: strcat (buff
, "W"); break;
3042 case SHF_ALLOC
: strcat (buff
, "A"); break;
3043 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3044 case SHF_MERGE
: strcat (buff
, "M"); break;
3045 case SHF_STRINGS
: strcat (buff
, "S"); break;
3046 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3047 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3048 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3049 case SHF_GROUP
: strcat (buff
, "G"); break;
3052 if (flag
& SHF_MASKOS
)
3055 sh_flags
&= ~ SHF_MASKOS
;
3057 else if (flag
& SHF_MASKPROC
)
3060 sh_flags
&= ~ SHF_MASKPROC
;
3072 process_section_headers (file
)
3075 Elf_Internal_Shdr
* section
;
3078 section_headers
= NULL
;
3080 if (elf_header
.e_shnum
== 0)
3083 printf (_("\nThere are no sections in this file.\n"));
3088 if (do_sections
&& !do_header
)
3089 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3090 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3094 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3097 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3100 /* Read in the string table, so that we have names to display. */
3101 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3103 if (section
->sh_size
!= 0)
3105 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3106 section
->sh_size
, _("string table"));
3108 string_table_length
= section
->sh_size
;
3111 /* Scan the sections for the dynamic symbol table
3112 and dynamic string table and debug sections. */
3113 dynamic_symbols
= NULL
;
3114 dynamic_strings
= NULL
;
3115 dynamic_syminfo
= NULL
;
3117 for (i
= 0, section
= section_headers
;
3118 i
< elf_header
.e_shnum
;
3121 char * name
= SECTION_NAME (section
);
3123 if (section
->sh_type
== SHT_DYNSYM
)
3125 if (dynamic_symbols
!= NULL
)
3127 error (_("File contains multiple dynamic symbol tables\n"));
3131 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3132 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3134 else if (section
->sh_type
== SHT_STRTAB
3135 && strcmp (name
, ".dynstr") == 0)
3137 if (dynamic_strings
!= NULL
)
3139 error (_("File contains multiple dynamic string tables\n"));
3143 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3145 _("dynamic strings"));
3147 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3149 if (symtab_shndx_hdr
!= NULL
)
3151 error (_("File contains multiple symtab shndx tables\n"));
3154 symtab_shndx_hdr
= section
;
3156 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3157 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3158 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
)
3159 && strncmp (name
, ".debug_", 7) == 0)
3164 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3165 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3166 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3167 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3168 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3169 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3170 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3171 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3173 request_dump (i
, DEBUG_DUMP
);
3175 /* linkonce section to be combined with .debug_info at link time. */
3176 else if ((do_debugging
|| do_debug_info
)
3177 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3178 request_dump (i
, DEBUG_DUMP
);
3179 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3180 request_dump (i
, DEBUG_DUMP
);
3186 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
3190 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3193 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3196 printf (_(" [Nr] Name Type Address Offset\n"));
3197 printf (_(" Size EntSize Flags Link Info Align\n"));
3200 for (i
= 0, section
= section_headers
;
3201 i
< elf_header
.e_shnum
;
3204 printf (" [%2u] %-17.17s %-15.15s ",
3205 SECTION_HEADER_NUM (i
),
3206 SECTION_NAME (section
),
3207 get_section_type_name (section
->sh_type
));
3211 print_vma (section
->sh_addr
, LONG_HEX
);
3213 printf ( " %6.6lx %6.6lx %2.2lx",
3214 (unsigned long) section
->sh_offset
,
3215 (unsigned long) section
->sh_size
,
3216 (unsigned long) section
->sh_entsize
);
3218 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3220 printf ("%2ld %3lx %2ld\n",
3221 (unsigned long) section
->sh_link
,
3222 (unsigned long) section
->sh_info
,
3223 (unsigned long) section
->sh_addralign
);
3227 print_vma (section
->sh_addr
, LONG_HEX
);
3229 if ((long) section
->sh_offset
== section
->sh_offset
)
3230 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3234 print_vma (section
->sh_offset
, LONG_HEX
);
3237 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3238 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3242 print_vma (section
->sh_size
, LONG_HEX
);
3245 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3246 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3250 print_vma (section
->sh_entsize
, LONG_HEX
);
3253 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3255 printf ("%2ld %3lx ",
3256 (unsigned long) section
->sh_link
,
3257 (unsigned long) section
->sh_info
);
3259 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3260 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3263 print_vma (section
->sh_addralign
, DEC
);
3270 print_vma (section
->sh_addr
, LONG_HEX
);
3271 if ((long) section
->sh_offset
== section
->sh_offset
)
3272 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3276 print_vma (section
->sh_offset
, LONG_HEX
);
3279 print_vma (section
->sh_size
, LONG_HEX
);
3281 print_vma (section
->sh_entsize
, LONG_HEX
);
3283 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3285 printf (" %2ld %3lx %ld\n",
3286 (unsigned long) section
->sh_link
,
3287 (unsigned long) section
->sh_info
,
3288 (unsigned long) section
->sh_addralign
);
3292 printf (_("Key to Flags:\n\
3293 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3294 I (info), L (link order), G (group), x (unknown)\n\
3295 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3300 /* Process the reloc section. */
3302 process_relocs (file
)
3305 unsigned long rel_size
;
3306 unsigned long rel_offset
;
3312 if (do_using_dynamic
)
3314 int is_rela
= FALSE
;
3319 if (dynamic_info
[DT_REL
])
3321 rel_offset
= dynamic_info
[DT_REL
];
3322 rel_size
= dynamic_info
[DT_RELSZ
];
3325 else if (dynamic_info
[DT_RELA
])
3327 rel_offset
= dynamic_info
[DT_RELA
];
3328 rel_size
= dynamic_info
[DT_RELASZ
];
3331 else if (dynamic_info
[DT_JMPREL
])
3333 rel_offset
= dynamic_info
[DT_JMPREL
];
3334 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3336 switch (dynamic_info
[DT_PLTREL
])
3353 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3354 rel_offset
, rel_size
);
3356 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3357 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
3360 printf (_("\nThere are no dynamic relocations in this file.\n"));
3364 Elf32_Internal_Shdr
* section
;
3368 for (i
= 0, section
= section_headers
;
3369 i
< elf_header
.e_shnum
;
3372 if ( section
->sh_type
!= SHT_RELA
3373 && section
->sh_type
!= SHT_REL
)
3376 rel_offset
= section
->sh_offset
;
3377 rel_size
= section
->sh_size
;
3381 Elf32_Internal_Shdr
* strsec
;
3382 Elf_Internal_Sym
* symtab
;
3385 unsigned long nsyms
;
3387 printf (_("\nRelocation section "));
3389 if (string_table
== NULL
)
3390 printf ("%d", section
->sh_name
);
3392 printf ("'%s'", SECTION_NAME (section
));
3394 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3395 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3400 if (section
->sh_link
)
3402 Elf32_Internal_Shdr
* symsec
;
3404 symsec
= SECTION_HEADER (section
->sh_link
);
3405 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3406 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
3411 strsec
= SECTION_HEADER (symsec
->sh_link
);
3413 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3417 is_rela
= section
->sh_type
== SHT_RELA
;
3419 dump_relocations (file
, rel_offset
, rel_size
,
3420 symtab
, nsyms
, strtab
, is_rela
);
3432 printf (_("\nThere are no relocations in this file.\n"));
3438 #include "unwind-ia64.h"
3440 /* An absolute address consists of a section and an offset. If the
3441 section is NULL, the offset itself is the address, otherwise, the
3442 address equals to LOAD_ADDRESS(section) + offset. */
3446 unsigned short section
;
3452 struct unw_table_entry
3454 struct absaddr start
;
3456 struct absaddr info
;
3458 *table
; /* Unwind table. */
3459 unsigned long table_len
; /* Length of unwind table. */
3460 unsigned char * info
; /* Unwind info. */
3461 unsigned long info_size
; /* Size of unwind info. */
3462 bfd_vma info_addr
; /* starting address of unwind info. */
3463 bfd_vma seg_base
; /* Starting address of segment. */
3464 Elf_Internal_Sym
* symtab
; /* The symbol table. */
3465 unsigned long nsyms
; /* Number of symbols. */
3466 char * strtab
; /* The string table. */
3467 unsigned long strtab_size
; /* Size of string table. */
3470 static void find_symbol_for_address
PARAMS ((struct unw_aux_info
*,
3471 struct absaddr
, const char **,
3473 static void dump_ia64_unwind
PARAMS ((struct unw_aux_info
*));
3474 static int slurp_ia64_unwind_table
PARAMS ((FILE *, struct unw_aux_info
*,
3475 Elf32_Internal_Shdr
*));
3478 find_symbol_for_address (aux
, addr
, symname
, offset
)
3479 struct unw_aux_info
*aux
;
3480 struct absaddr addr
;
3481 const char **symname
;
3484 bfd_vma dist
= (bfd_vma
) 0x100000;
3485 Elf_Internal_Sym
*sym
, *best
= NULL
;
3488 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3490 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3491 && sym
->st_name
!= 0
3492 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3493 && addr
.offset
>= sym
->st_value
3494 && addr
.offset
- sym
->st_value
< dist
)
3497 dist
= addr
.offset
- sym
->st_value
;
3504 *symname
= (best
->st_name
>= aux
->strtab_size
3505 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3510 *offset
= addr
.offset
;
3514 dump_ia64_unwind (aux
)
3515 struct unw_aux_info
*aux
;
3518 struct unw_table_entry
* tp
;
3521 addr_size
= is_32bit_elf
? 4 : 8;
3523 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3527 const unsigned char * dp
;
3528 const unsigned char * head
;
3529 const char * procname
;
3531 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3533 fputs ("\n<", stdout
);
3537 fputs (procname
, stdout
);
3540 printf ("+%lx", (unsigned long) offset
);
3543 fputs (">: [", stdout
);
3544 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3545 fputc ('-', stdout
);
3546 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3547 printf ("), info at +0x%lx\n",
3548 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3550 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3551 stamp
= BYTE_GET8 ((unsigned char *) head
);
3553 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3554 (unsigned) UNW_VER (stamp
),
3555 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3556 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3557 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3558 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3560 if (UNW_VER (stamp
) != 1)
3562 printf ("\tUnknown version.\n");
3567 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3568 dp
= unw_decode (dp
, in_body
, & in_body
);
3573 slurp_ia64_unwind_table (file
, aux
, sec
)
3575 struct unw_aux_info
*aux
;
3576 Elf32_Internal_Shdr
*sec
;
3578 unsigned long size
, addr_size
, nrelas
, i
;
3579 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
3580 struct unw_table_entry
*tep
;
3581 Elf32_Internal_Shdr
*relsec
;
3582 Elf_Internal_Rela
*rela
, *rp
;
3583 unsigned char *table
, *tp
;
3584 Elf_Internal_Sym
*sym
;
3585 const char *relname
;
3588 addr_size
= is_32bit_elf
? 4 : 8;
3590 /* First, find the starting address of the segment that includes
3593 if (elf_header
.e_phnum
)
3595 prog_hdrs
= (Elf_Internal_Phdr
*)
3596 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3599 result
= get_32bit_program_headers (file
, prog_hdrs
);
3601 result
= get_64bit_program_headers (file
, prog_hdrs
);
3609 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
3611 if (seg
->p_type
!= PT_LOAD
)
3614 if (sec
->sh_addr
>= seg
->p_vaddr
3615 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3617 aux
->seg_base
= seg
->p_vaddr
;
3625 /* Second, build the unwind table from the contents of the unwind section: */
3626 size
= sec
->sh_size
;
3627 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3628 size
, _("unwind table"));
3632 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3633 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++ tep
)
3635 tep
->start
.section
= SHN_UNDEF
;
3636 tep
->end
.section
= SHN_UNDEF
;
3637 tep
->info
.section
= SHN_UNDEF
;
3640 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3641 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3642 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3646 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3647 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3648 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3650 tep
->start
.offset
+= aux
->seg_base
;
3651 tep
->end
.offset
+= aux
->seg_base
;
3652 tep
->info
.offset
+= aux
->seg_base
;
3656 /* Third, apply any relocations to the unwind table: */
3658 for (relsec
= section_headers
;
3659 relsec
< section_headers
+ elf_header
.e_shnum
;
3662 if (relsec
->sh_type
!= SHT_RELA
3663 || SECTION_HEADER (relsec
->sh_info
) != sec
)
3666 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
3670 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
3674 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
3675 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
3677 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3679 warn (_("Skipping unexpected symbol type %u\n"),
3680 ELF32_ST_TYPE (sym
->st_info
));
3686 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
3687 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
3689 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3691 warn (_("Skipping unexpected symbol type %u\n"),
3692 ELF64_ST_TYPE (sym
->st_info
));
3697 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
3699 warn (_("Skipping unexpected relocation type %s\n"), relname
);
3703 i
= rp
->r_offset
/ (3 * addr_size
);
3705 switch (rp
->r_offset
/addr_size
% 3)
3708 aux
->table
[i
].start
.section
= sym
->st_shndx
;
3709 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
3712 aux
->table
[i
].end
.section
= sym
->st_shndx
;
3713 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
3716 aux
->table
[i
].info
.section
= sym
->st_shndx
;
3717 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
3727 aux
->table_len
= size
/ (3 * addr_size
);
3732 process_unwind (file
)
3735 Elf32_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
3736 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
3737 struct unw_aux_info aux
;
3742 if (elf_header
.e_machine
!= EM_IA_64
)
3744 printf (_("\nThere are no unwind sections in this file.\n"));
3748 memset (& aux
, 0, sizeof (aux
));
3750 addr_size
= is_32bit_elf
? 4 : 8;
3752 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
3754 if (sec
->sh_type
== SHT_SYMTAB
)
3756 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
3757 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
3759 strsec
= SECTION_HEADER (sec
->sh_link
);
3760 aux
.strtab_size
= strsec
->sh_size
;
3761 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3762 aux
.strtab_size
, _("string table"));
3764 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3769 printf (_("\nThere are no unwind sections in this file.\n"));
3771 while (unwcount
-- > 0)
3776 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
3777 i
< elf_header
.e_shnum
; ++i
, ++sec
)
3778 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3785 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
3787 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
3790 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3791 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
3792 suffix
= SECTION_NAME (unwsec
) + len
;
3793 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3795 if (strncmp (SECTION_NAME (sec
),
3796 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
3797 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3802 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3803 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3804 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
3805 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
3807 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
3809 suffix
= SECTION_NAME (unwsec
) + len
;
3810 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3812 if (strncmp (SECTION_NAME (sec
),
3813 ELF_STRING_ia64_unwind_info
, len2
) == 0
3814 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3818 if (i
== elf_header
.e_shnum
)
3820 printf (_("\nCould not find unwind info section for "));
3822 if (string_table
== NULL
)
3823 printf ("%d", unwsec
->sh_name
);
3825 printf ("'%s'", SECTION_NAME (unwsec
));
3829 aux
.info_size
= sec
->sh_size
;
3830 aux
.info_addr
= sec
->sh_addr
;
3831 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3832 aux
.info_size
, _("unwind info"));
3834 printf (_("\nUnwind section "));
3836 if (string_table
== NULL
)
3837 printf ("%d", unwsec
->sh_name
);
3839 printf ("'%s'", SECTION_NAME (unwsec
));
3841 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3842 (unsigned long) unwsec
->sh_offset
,
3843 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
3845 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
3847 if (aux
.table_len
> 0)
3848 dump_ia64_unwind (& aux
);
3851 free ((char *) aux
.table
);
3853 free ((char *) aux
.info
);
3862 free ((char *) aux
.strtab
);
3868 dynamic_segment_mips_val (entry
)
3869 Elf_Internal_Dyn
* entry
;
3871 switch (entry
->d_tag
)
3874 if (entry
->d_un
.d_val
== 0)
3878 static const char * opts
[] =
3880 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3881 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3882 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3883 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3888 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
3889 if (entry
->d_un
.d_val
& (1 << cnt
))
3891 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
3898 case DT_MIPS_IVERSION
:
3899 if (dynamic_strings
!= NULL
)
3900 printf ("Interface Version: %s\n",
3901 dynamic_strings
+ entry
->d_un
.d_val
);
3903 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3906 case DT_MIPS_TIME_STAMP
:
3911 time_t time
= entry
->d_un
.d_val
;
3912 tmp
= gmtime (&time
);
3913 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
3914 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
3915 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
3916 printf ("Time Stamp: %s\n", timebuf
);
3920 case DT_MIPS_RLD_VERSION
:
3921 case DT_MIPS_LOCAL_GOTNO
:
3922 case DT_MIPS_CONFLICTNO
:
3923 case DT_MIPS_LIBLISTNO
:
3924 case DT_MIPS_SYMTABNO
:
3925 case DT_MIPS_UNREFEXTNO
:
3926 case DT_MIPS_HIPAGENO
:
3927 case DT_MIPS_DELTA_CLASS_NO
:
3928 case DT_MIPS_DELTA_INSTANCE_NO
:
3929 case DT_MIPS_DELTA_RELOC_NO
:
3930 case DT_MIPS_DELTA_SYM_NO
:
3931 case DT_MIPS_DELTA_CLASSSYM_NO
:
3932 case DT_MIPS_COMPACT_SIZE
:
3933 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3937 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
3943 dynamic_segment_parisc_val (entry
)
3944 Elf_Internal_Dyn
* entry
;
3946 switch (entry
->d_tag
)
3948 case DT_HP_DLD_FLAGS
:
3957 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
3958 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
3959 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
3960 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
3961 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
3962 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
3963 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
3964 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
3965 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
3966 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
3967 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
3971 bfd_vma val
= entry
->d_un
.d_val
;
3973 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
3974 if (val
& flags
[cnt
].bit
)
3978 fputs (flags
[cnt
].str
, stdout
);
3980 val
^= flags
[cnt
].bit
;
3983 if (val
!= 0 || first
)
3987 print_vma (val
, HEX
);
3993 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
3999 get_32bit_dynamic_segment (file
)
4002 Elf32_External_Dyn
* edyn
;
4003 Elf_Internal_Dyn
* entry
;
4006 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4007 dynamic_size
, _("dynamic segment"));
4011 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4012 how large this .dynamic is now. We can do this even before the byte
4013 swapping since the DT_NULL tag is recognizable. */
4015 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4018 dynamic_segment
= (Elf_Internal_Dyn
*)
4019 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4021 if (dynamic_segment
== NULL
)
4023 error (_("Out of memory\n"));
4028 for (i
= 0, entry
= dynamic_segment
;
4032 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4033 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4042 get_64bit_dynamic_segment (file
)
4045 Elf64_External_Dyn
* edyn
;
4046 Elf_Internal_Dyn
* entry
;
4049 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4050 dynamic_size
, _("dynamic segment"));
4054 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4055 how large this .dynamic is now. We can do this even before the byte
4056 swapping since the DT_NULL tag is recognizable. */
4058 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4061 dynamic_segment
= (Elf_Internal_Dyn
*)
4062 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4064 if (dynamic_segment
== NULL
)
4066 error (_("Out of memory\n"));
4071 for (i
= 0, entry
= dynamic_segment
;
4075 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4076 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4085 get_dynamic_flags (flags
)
4088 static char buff
[64];
4093 flag
= flags
& - flags
;
4098 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
4099 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
4100 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
4101 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
4102 default: strcat (buff
, "unknown "); break;
4108 /* Parse and display the contents of the dynamic segment. */
4110 process_dynamic_segment (file
)
4113 Elf_Internal_Dyn
* entry
;
4116 if (dynamic_size
== 0)
4119 printf (_("\nThere is no dynamic segment in this file.\n"));
4126 if (! get_32bit_dynamic_segment (file
))
4129 else if (! get_64bit_dynamic_segment (file
))
4132 /* Find the appropriate symbol table. */
4133 if (dynamic_symbols
== NULL
)
4135 for (i
= 0, entry
= dynamic_segment
;
4139 Elf32_Internal_Shdr section
;
4141 if (entry
->d_tag
!= DT_SYMTAB
)
4144 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4146 /* Since we do not know how big the symbol table is,
4147 we default to reading in the entire file (!) and
4148 processing that. This is overkill, I know, but it
4150 section
.sh_offset
= entry
->d_un
.d_val
- loadaddr
;
4152 if (fseek (file
, 0, SEEK_END
))
4153 error (_("Unable to seek to end of file!"));
4155 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4157 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4159 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4161 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4162 if (num_dynamic_syms
< 1)
4164 error (_("Unable to determine the number of symbols to load\n"));
4168 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4172 /* Similarly find a string table. */
4173 if (dynamic_strings
== NULL
)
4175 for (i
= 0, entry
= dynamic_segment
;
4179 unsigned long offset
;
4182 if (entry
->d_tag
!= DT_STRTAB
)
4185 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4187 /* Since we do not know how big the string table is,
4188 we default to reading in the entire file (!) and
4189 processing that. This is overkill, I know, but it
4192 offset
= entry
->d_un
.d_val
- loadaddr
;
4193 if (fseek (file
, 0, SEEK_END
))
4194 error (_("Unable to seek to end of file\n"));
4195 str_tab_len
= ftell (file
) - offset
;
4197 if (str_tab_len
< 1)
4200 (_("Unable to determine the length of the dynamic string table\n"));
4204 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
4205 _("dynamic string table"));
4210 /* And find the syminfo section if available. */
4211 if (dynamic_syminfo
== NULL
)
4213 unsigned int syminsz
= 0;
4215 for (i
= 0, entry
= dynamic_segment
;
4219 if (entry
->d_tag
== DT_SYMINENT
)
4221 /* Note: these braces are necessary to avoid a syntax
4222 error from the SunOS4 C compiler. */
4223 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4225 else if (entry
->d_tag
== DT_SYMINSZ
)
4226 syminsz
= entry
->d_un
.d_val
;
4227 else if (entry
->d_tag
== DT_SYMINFO
)
4228 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
4231 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4233 Elf_External_Syminfo
* extsyminfo
;
4234 Elf_Internal_Syminfo
* syminfo
;
4236 /* There is a syminfo section. Read the data. */
4237 extsyminfo
= ((Elf_External_Syminfo
*)
4238 get_data (NULL
, file
, dynamic_syminfo_offset
,
4239 syminsz
, _("symbol information")));
4243 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4244 if (dynamic_syminfo
== NULL
)
4246 error (_("Out of memory\n"));
4250 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4251 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4254 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4255 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4262 if (do_dynamic
&& dynamic_addr
)
4263 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4264 dynamic_addr
, (long) dynamic_size
);
4266 printf (_(" Tag Type Name/Value\n"));
4268 for (i
= 0, entry
= dynamic_segment
;
4277 print_vma (entry
->d_tag
, FULL_HEX
);
4278 dtype
= get_dynamic_type (entry
->d_tag
);
4279 printf (" (%s)%*s", dtype
,
4280 ((is_32bit_elf
? 27 : 19)
4281 - (int) strlen (dtype
)),
4285 switch (entry
->d_tag
)
4289 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
4299 switch (entry
->d_tag
)
4302 printf (_("Auxiliary library"));
4306 printf (_("Filter library"));
4310 printf (_("Configuration file"));
4314 printf (_("Dependency audit library"));
4318 printf (_("Audit library"));
4322 if (dynamic_strings
)
4323 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4327 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4336 printf (_("Flags:"));
4337 if (entry
->d_un
.d_val
== 0)
4338 printf (_(" None\n"));
4341 unsigned long int val
= entry
->d_un
.d_val
;
4342 if (val
& DTF_1_PARINIT
)
4344 printf (" PARINIT");
4345 val
^= DTF_1_PARINIT
;
4347 if (val
& DTF_1_CONFEXP
)
4349 printf (" CONFEXP");
4350 val
^= DTF_1_CONFEXP
;
4353 printf (" %lx", val
);
4362 printf (_("Flags:"));
4363 if (entry
->d_un
.d_val
== 0)
4364 printf (_(" None\n"));
4367 unsigned long int val
= entry
->d_un
.d_val
;
4368 if (val
& DF_P1_LAZYLOAD
)
4370 printf (" LAZYLOAD");
4371 val
^= DF_P1_LAZYLOAD
;
4373 if (val
& DF_P1_GROUPPERM
)
4375 printf (" GROUPPERM");
4376 val
^= DF_P1_GROUPPERM
;
4379 printf (" %lx", val
);
4388 printf (_("Flags:"));
4389 if (entry
->d_un
.d_val
== 0)
4390 printf (_(" None\n"));
4393 unsigned long int val
= entry
->d_un
.d_val
;
4399 if (val
& DF_1_GLOBAL
)
4404 if (val
& DF_1_GROUP
)
4409 if (val
& DF_1_NODELETE
)
4411 printf (" NODELETE");
4412 val
^= DF_1_NODELETE
;
4414 if (val
& DF_1_LOADFLTR
)
4416 printf (" LOADFLTR");
4417 val
^= DF_1_LOADFLTR
;
4419 if (val
& DF_1_INITFIRST
)
4421 printf (" INITFIRST");
4422 val
^= DF_1_INITFIRST
;
4424 if (val
& DF_1_NOOPEN
)
4429 if (val
& DF_1_ORIGIN
)
4434 if (val
& DF_1_DIRECT
)
4439 if (val
& DF_1_TRANS
)
4444 if (val
& DF_1_INTERPOSE
)
4446 printf (" INTERPOSE");
4447 val
^= DF_1_INTERPOSE
;
4449 if (val
& DF_1_NODEFLIB
)
4451 printf (" NODEFLIB");
4452 val
^= DF_1_NODEFLIB
;
4454 if (val
& DF_1_NODUMP
)
4459 if (val
& DF_1_CONLFAT
)
4461 printf (" CONLFAT");
4462 val
^= DF_1_CONLFAT
;
4465 printf (" %lx", val
);
4473 puts (get_dynamic_type (entry
->d_un
.d_val
));
4493 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4499 if (dynamic_strings
== NULL
)
4502 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4506 switch (entry
->d_tag
)
4509 printf (_("Shared library: [%s]"), name
);
4511 if (strcmp (name
, program_interpreter
) == 0)
4512 printf (_(" program interpreter"));
4516 printf (_("Library soname: [%s]"), name
);
4520 printf (_("Library rpath: [%s]"), name
);
4524 printf (_("Library runpath: [%s]"), name
);
4528 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4533 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4549 case DT_INIT_ARRAYSZ
:
4550 case DT_FINI_ARRAYSZ
:
4553 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4554 printf (" (bytes)\n");
4564 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4577 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4581 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4585 printf (_("Not needed object: [%s]\n"), name
);
4590 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4596 /* The value of this entry is ignored. */
4600 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
4601 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
4606 switch (elf_header
.e_machine
)
4609 case EM_MIPS_RS3_LE
:
4610 dynamic_segment_mips_val (entry
);
4613 dynamic_segment_parisc_val (entry
);
4616 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4628 get_ver_flags (flags
)
4631 static char buff
[32];
4638 if (flags
& VER_FLG_BASE
)
4639 strcat (buff
, "BASE ");
4641 if (flags
& VER_FLG_WEAK
)
4643 if (flags
& VER_FLG_BASE
)
4644 strcat (buff
, "| ");
4646 strcat (buff
, "WEAK ");
4649 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
4650 strcat (buff
, "| <unknown>");
4655 /* Display the contents of the version sections. */
4657 process_version_sections (file
)
4660 Elf32_Internal_Shdr
* section
;
4667 for (i
= 0, section
= section_headers
;
4668 i
< elf_header
.e_shnum
;
4671 switch (section
->sh_type
)
4673 case SHT_GNU_verdef
:
4675 Elf_External_Verdef
* edefs
;
4682 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4683 SECTION_NAME (section
), section
->sh_info
);
4685 printf (_(" Addr: 0x"));
4686 printf_vma (section
->sh_addr
);
4687 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4688 (unsigned long) section
->sh_offset
, section
->sh_link
,
4689 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
4691 edefs
= ((Elf_External_Verdef
*)
4692 get_data (NULL
, file
, section
->sh_offset
,
4694 _("version definition section")));
4698 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
4701 Elf_External_Verdef
* edef
;
4702 Elf_Internal_Verdef ent
;
4703 Elf_External_Verdaux
* eaux
;
4704 Elf_Internal_Verdaux aux
;
4708 vstart
= ((char *) edefs
) + idx
;
4710 edef
= (Elf_External_Verdef
*) vstart
;
4712 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
4713 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
4714 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
4715 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
4716 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
4717 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
4718 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
4720 printf (_(" %#06x: Rev: %d Flags: %s"),
4721 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
4723 printf (_(" Index: %d Cnt: %d "),
4724 ent
.vd_ndx
, ent
.vd_cnt
);
4726 vstart
+= ent
.vd_aux
;
4728 eaux
= (Elf_External_Verdaux
*) vstart
;
4730 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4731 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4733 if (dynamic_strings
)
4734 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
4736 printf (_("Name index: %ld\n"), aux
.vda_name
);
4738 isum
= idx
+ ent
.vd_aux
;
4740 for (j
= 1; j
< ent
.vd_cnt
; j
++)
4742 isum
+= aux
.vda_next
;
4743 vstart
+= aux
.vda_next
;
4745 eaux
= (Elf_External_Verdaux
*) vstart
;
4747 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4748 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4750 if (dynamic_strings
)
4751 printf (_(" %#06x: Parent %d: %s\n"),
4752 isum
, j
, dynamic_strings
+ aux
.vda_name
);
4754 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4755 isum
, j
, aux
.vda_name
);
4765 case SHT_GNU_verneed
:
4767 Elf_External_Verneed
* eneed
;
4773 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4774 SECTION_NAME (section
), section
->sh_info
);
4776 printf (_(" Addr: 0x"));
4777 printf_vma (section
->sh_addr
);
4778 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4779 (unsigned long) section
->sh_offset
, section
->sh_link
,
4780 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
4782 eneed
= ((Elf_External_Verneed
*)
4783 get_data (NULL
, file
, section
->sh_offset
,
4784 section
->sh_size
, _("version need section")));
4788 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
4790 Elf_External_Verneed
* entry
;
4791 Elf_Internal_Verneed ent
;
4796 vstart
= ((char *) eneed
) + idx
;
4798 entry
= (Elf_External_Verneed
*) vstart
;
4800 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
4801 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
4802 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
4803 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
4804 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
4806 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
4808 if (dynamic_strings
)
4809 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
4811 printf (_(" File: %lx"), ent
.vn_file
);
4813 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
4815 vstart
+= ent
.vn_aux
;
4817 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
4819 Elf_External_Vernaux
* eaux
;
4820 Elf_Internal_Vernaux aux
;
4822 eaux
= (Elf_External_Vernaux
*) vstart
;
4824 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
4825 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
4826 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
4827 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
4828 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
4830 if (dynamic_strings
)
4831 printf (_(" %#06x: Name: %s"),
4832 isum
, dynamic_strings
+ aux
.vna_name
);
4834 printf (_(" %#06x: Name index: %lx"),
4835 isum
, aux
.vna_name
);
4837 printf (_(" Flags: %s Version: %d\n"),
4838 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
4840 isum
+= aux
.vna_next
;
4841 vstart
+= aux
.vna_next
;
4851 case SHT_GNU_versym
:
4853 Elf32_Internal_Shdr
* link_section
;
4856 unsigned char * edata
;
4857 unsigned short * data
;
4859 Elf_Internal_Sym
* symbols
;
4860 Elf32_Internal_Shdr
* string_sec
;
4862 link_section
= SECTION_HEADER (section
->sh_link
);
4863 total
= section
->sh_size
/ section
->sh_entsize
;
4867 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
4869 string_sec
= SECTION_HEADER (link_section
->sh_link
);
4871 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
4872 string_sec
->sh_size
,
4873 _("version string table"));
4877 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4878 SECTION_NAME (section
), total
);
4880 printf (_(" Addr: "));
4881 printf_vma (section
->sh_addr
);
4882 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4883 (unsigned long) section
->sh_offset
, section
->sh_link
,
4884 SECTION_NAME (link_section
));
4888 get_data (NULL
, file
,
4889 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
4890 total
* sizeof (short), _("version symbol data")));
4897 data
= (unsigned short *) malloc (total
* sizeof (short));
4899 for (cnt
= total
; cnt
--;)
4900 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
4905 for (cnt
= 0; cnt
< total
; cnt
+= 4)
4908 int check_def
, check_need
;
4911 printf (" %03x:", cnt
);
4913 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
4914 switch (data
[cnt
+ j
])
4917 fputs (_(" 0 (*local*) "), stdout
);
4921 fputs (_(" 1 (*global*) "), stdout
);
4925 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
4926 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
4930 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
4933 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
4940 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
4942 Elf_Internal_Verneed ivn
;
4943 unsigned long offset
;
4945 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
4950 Elf_Internal_Vernaux ivna
;
4951 Elf_External_Verneed evn
;
4952 Elf_External_Vernaux evna
;
4953 unsigned long a_off
;
4955 get_data (&evn
, file
, offset
, sizeof (evn
),
4958 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4959 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4961 a_off
= offset
+ ivn
.vn_aux
;
4965 get_data (&evna
, file
, a_off
, sizeof (evna
),
4966 _("version need aux (2)"));
4968 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4969 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4971 a_off
+= ivna
.vna_next
;
4973 while (ivna
.vna_other
!= data
[cnt
+ j
]
4974 && ivna
.vna_next
!= 0);
4976 if (ivna
.vna_other
== data
[cnt
+ j
])
4978 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4980 name
= strtab
+ ivna
.vna_name
;
4981 nn
+= printf ("(%s%-*s",
4983 12 - (int) strlen (name
),
4989 offset
+= ivn
.vn_next
;
4991 while (ivn
.vn_next
);
4994 if (check_def
&& data
[cnt
+ j
] != 0x8001
4995 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
4997 Elf_Internal_Verdef ivd
;
4998 Elf_External_Verdef evd
;
4999 unsigned long offset
;
5001 offset
= version_info
5002 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
5006 get_data (&evd
, file
, offset
, sizeof (evd
),
5009 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5010 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5012 offset
+= ivd
.vd_next
;
5014 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5015 && ivd
.vd_next
!= 0);
5017 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5019 Elf_External_Verdaux evda
;
5020 Elf_Internal_Verdaux ivda
;
5022 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5024 get_data (&evda
, file
,
5025 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5026 sizeof (evda
), _("version def aux"));
5028 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5030 name
= strtab
+ ivda
.vda_name
;
5031 nn
+= printf ("(%s%-*s",
5033 12 - (int) strlen (name
),
5039 printf ("%*c", 18 - nn
, ' ');
5057 printf (_("\nNo version information found in this file.\n"));
5063 get_symbol_binding (binding
)
5064 unsigned int binding
;
5066 static char buff
[32];
5070 case STB_LOCAL
: return "LOCAL";
5071 case STB_GLOBAL
: return "GLOBAL";
5072 case STB_WEAK
: return "WEAK";
5074 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5075 sprintf (buff
, _("<processor specific>: %d"), binding
);
5076 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5077 sprintf (buff
, _("<OS specific>: %d"), binding
);
5079 sprintf (buff
, _("<unknown>: %d"), binding
);
5085 get_symbol_type (type
)
5088 static char buff
[32];
5092 case STT_NOTYPE
: return "NOTYPE";
5093 case STT_OBJECT
: return "OBJECT";
5094 case STT_FUNC
: return "FUNC";
5095 case STT_SECTION
: return "SECTION";
5096 case STT_FILE
: return "FILE";
5097 case STT_COMMON
: return "COMMON";
5099 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5101 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5102 return "THUMB_FUNC";
5104 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5107 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5108 return "PARISC_MILLI";
5110 sprintf (buff
, _("<processor specific>: %d"), type
);
5112 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5114 if (elf_header
.e_machine
== EM_PARISC
)
5116 if (type
== STT_HP_OPAQUE
)
5118 if (type
== STT_HP_STUB
)
5122 sprintf (buff
, _("<OS specific>: %d"), type
);
5125 sprintf (buff
, _("<unknown>: %d"), type
);
5131 get_symbol_visibility (visibility
)
5132 unsigned int visibility
;
5136 case STV_DEFAULT
: return "DEFAULT";
5137 case STV_INTERNAL
: return "INTERNAL";
5138 case STV_HIDDEN
: return "HIDDEN";
5139 case STV_PROTECTED
: return "PROTECTED";
5145 get_symbol_index_type (type
)
5150 case SHN_UNDEF
: return "UND";
5151 case SHN_ABS
: return "ABS";
5152 case SHN_COMMON
: return "COM";
5154 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5156 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5158 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5162 static char buff
[32];
5164 sprintf (buff
, "%3d", type
);
5171 get_dynamic_data (file
, number
)
5173 unsigned int number
;
5175 unsigned char * e_data
;
5178 e_data
= (unsigned char *) malloc (number
* 4);
5182 error (_("Out of memory\n"));
5186 if (fread (e_data
, 4, number
, file
) != number
)
5188 error (_("Unable to read in dynamic data\n"));
5192 i_data
= (int *) malloc (number
* sizeof (* i_data
));
5196 error (_("Out of memory\n"));
5202 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5209 /* Dump the symbol table. */
5211 process_symbol_table (file
)
5214 Elf32_Internal_Shdr
* section
;
5215 unsigned char nb
[4];
5216 unsigned char nc
[4];
5219 int * buckets
= NULL
;
5220 int * chains
= NULL
;
5222 if (! do_syms
&& !do_histogram
)
5225 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5228 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
5230 error (_("Unable to seek to start of dynamic information"));
5234 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5236 error (_("Failed to read in number of buckets\n"));
5240 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5242 error (_("Failed to read in number of chains\n"));
5246 nbuckets
= byte_get (nb
, 4);
5247 nchains
= byte_get (nc
, 4);
5249 buckets
= get_dynamic_data (file
, nbuckets
);
5250 chains
= get_dynamic_data (file
, nchains
);
5252 if (buckets
== NULL
|| chains
== NULL
)
5257 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5262 printf (_("\nSymbol table for image:\n"));
5264 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5266 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5268 for (hn
= 0; hn
< nbuckets
; hn
++)
5273 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5275 Elf_Internal_Sym
* psym
;
5277 psym
= dynamic_symbols
+ si
;
5279 printf (" %3d %3d: ", si
, hn
);
5280 print_vma (psym
->st_value
, LONG_HEX
);
5282 print_vma (psym
->st_size
, DEC_5
);
5284 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5285 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5286 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5287 printf (" %3.3s", get_symbol_index_type (psym
->st_shndx
));
5288 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
5292 else if (do_syms
&& !do_using_dynamic
)
5296 for (i
= 0, section
= section_headers
;
5297 i
< elf_header
.e_shnum
;
5302 Elf_Internal_Sym
* symtab
;
5303 Elf_Internal_Sym
* psym
;
5306 if ( section
->sh_type
!= SHT_SYMTAB
5307 && section
->sh_type
!= SHT_DYNSYM
)
5310 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5311 SECTION_NAME (section
),
5312 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5314 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5316 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5318 symtab
= GET_ELF_SYMBOLS (file
, section
);
5322 if (section
->sh_link
== elf_header
.e_shstrndx
)
5323 strtab
= string_table
;
5326 Elf32_Internal_Shdr
* string_sec
;
5328 string_sec
= SECTION_HEADER (section
->sh_link
);
5330 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5331 string_sec
->sh_size
,
5335 for (si
= 0, psym
= symtab
;
5336 si
< section
->sh_size
/ section
->sh_entsize
;
5339 printf ("%6d: ", si
);
5340 print_vma (psym
->st_value
, LONG_HEX
);
5342 print_vma (psym
->st_size
, DEC_5
);
5343 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5344 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5345 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5346 printf (" %4s", get_symbol_index_type (psym
->st_shndx
));
5347 printf (" %s", strtab
+ psym
->st_name
);
5349 if (section
->sh_type
== SHT_DYNSYM
&&
5350 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5352 unsigned char data
[2];
5353 unsigned short vers_data
;
5354 unsigned long offset
;
5358 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5361 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5362 sizeof (data
), _("version data"));
5364 vers_data
= byte_get (data
, 2);
5366 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
5369 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5371 if ((vers_data
& 0x8000) || vers_data
> 1)
5373 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5374 && (is_nobits
|| ! check_def
))
5376 Elf_External_Verneed evn
;
5377 Elf_Internal_Verneed ivn
;
5378 Elf_Internal_Vernaux ivna
;
5380 /* We must test both. */
5381 offset
= version_info
5382 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
5386 unsigned long vna_off
;
5388 get_data (&evn
, file
, offset
, sizeof (evn
),
5391 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5392 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5394 vna_off
= offset
+ ivn
.vn_aux
;
5398 Elf_External_Vernaux evna
;
5400 get_data (&evna
, file
, vna_off
,
5402 _("version need aux (3)"));
5404 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5405 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5406 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5408 vna_off
+= ivna
.vna_next
;
5410 while (ivna
.vna_other
!= vers_data
5411 && ivna
.vna_next
!= 0);
5413 if (ivna
.vna_other
== vers_data
)
5416 offset
+= ivn
.vn_next
;
5418 while (ivn
.vn_next
!= 0);
5420 if (ivna
.vna_other
== vers_data
)
5423 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5426 else if (! is_nobits
)
5427 error (_("bad dynamic symbol"));
5434 if (vers_data
!= 0x8001
5435 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5437 Elf_Internal_Verdef ivd
;
5438 Elf_Internal_Verdaux ivda
;
5439 Elf_External_Verdaux evda
;
5440 unsigned long offset
;
5443 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5448 Elf_External_Verdef evd
;
5450 get_data (&evd
, file
, offset
, sizeof (evd
),
5453 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5454 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5455 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5457 offset
+= ivd
.vd_next
;
5459 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5460 && ivd
.vd_next
!= 0);
5462 offset
-= ivd
.vd_next
;
5463 offset
+= ivd
.vd_aux
;
5465 get_data (&evda
, file
, offset
, sizeof (evda
),
5466 _("version def aux"));
5468 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5470 if (psym
->st_name
!= ivda
.vda_name
)
5471 printf ((vers_data
& 0x8000)
5473 strtab
+ ivda
.vda_name
);
5483 if (strtab
!= string_table
)
5489 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5491 if (do_histogram
&& buckets
!= NULL
)
5498 int nzero_counts
= 0;
5501 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5503 printf (_(" Length Number %% of total Coverage\n"));
5505 lengths
= (int *) calloc (nbuckets
, sizeof (int));
5506 if (lengths
== NULL
)
5508 error (_("Out of memory"));
5511 for (hn
= 0; hn
< nbuckets
; ++hn
)
5516 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5519 if (maxlength
< ++lengths
[hn
])
5524 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
5527 error (_("Out of memory"));
5531 for (hn
= 0; hn
< nbuckets
; ++hn
)
5532 ++ counts
[lengths
[hn
]];
5536 printf (" 0 %-10d (%5.1f%%)\n",
5537 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5538 for (si
= 1; si
<= maxlength
; ++si
)
5540 nzero_counts
+= counts
[si
] * si
;
5541 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5542 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5543 (nzero_counts
* 100.0) / nsyms
);
5551 if (buckets
!= NULL
)
5561 process_syminfo (file
)
5562 FILE * file ATTRIBUTE_UNUSED
;
5566 if (dynamic_syminfo
== NULL
5568 /* No syminfo, this is ok. */
5571 /* There better should be a dynamic symbol section. */
5572 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5576 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5577 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5579 printf (_(" Num: Name BoundTo Flags\n"));
5580 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5582 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5584 printf ("%4d: %-30s ", i
,
5585 dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5587 switch (dynamic_syminfo
[i
].si_boundto
)
5589 case SYMINFO_BT_SELF
:
5590 fputs ("SELF ", stdout
);
5592 case SYMINFO_BT_PARENT
:
5593 fputs ("PARENT ", stdout
);
5596 if (dynamic_syminfo
[i
].si_boundto
> 0
5597 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
5600 + dynamic_segment
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
5602 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
5606 if (flags
& SYMINFO_FLG_DIRECT
)
5608 if (flags
& SYMINFO_FLG_PASSTHRU
)
5609 printf (" PASSTHRU");
5610 if (flags
& SYMINFO_FLG_COPY
)
5612 if (flags
& SYMINFO_FLG_LAZYLOAD
)
5613 printf (" LAZYLOAD");
5621 #ifdef SUPPORT_DISASSEMBLY
5623 disassemble_section (section
, file
)
5624 Elf32_Internal_Shdr
* section
;
5627 printf (_("\nAssembly dump of section %s\n"),
5628 SECTION_NAME (section
));
5630 /* XXX -- to be done --- XXX */
5637 dump_section (section
, file
)
5638 Elf32_Internal_Shdr
* section
;
5641 bfd_size_type bytes
;
5643 unsigned char * data
;
5644 unsigned char * start
;
5646 bytes
= section
->sh_size
;
5650 printf (_("\nSection '%s' has no data to dump.\n"),
5651 SECTION_NAME (section
));
5655 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
5657 addr
= section
->sh_addr
;
5659 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
5672 lbytes
= (bytes
> 16 ? 16 : bytes
);
5674 printf (" 0x%8.8lx ", (unsigned long) addr
);
5676 switch (elf_header
.e_ident
[EI_DATA
])
5680 for (j
= 15; j
>= 0; j
--)
5683 printf ("%2.2x", data
[j
]);
5693 for (j
= 0; j
< 16; j
++)
5696 printf ("%2.2x", data
[j
]);
5706 for (j
= 0; j
< lbytes
; j
++)
5709 if (k
>= ' ' && k
< 0x80)
5728 static unsigned long int
5729 read_leb128 (data
, length_return
, sign
)
5730 unsigned char * data
;
5731 int * length_return
;
5734 unsigned long int result
= 0;
5735 unsigned int num_read
= 0;
5744 result
|= (byte
& 0x7f) << shift
;
5749 while (byte
& 0x80);
5751 if (length_return
!= NULL
)
5752 * length_return
= num_read
;
5754 if (sign
&& (shift
< 32) && (byte
& 0x40))
5755 result
|= -1 << shift
;
5760 typedef struct State_Machine_Registers
5762 unsigned long address
;
5765 unsigned int column
;
5769 /* This variable hold the number of the last entry seen
5770 in the File Table. */
5771 unsigned int last_file_entry
;
5774 static SMR state_machine_regs
;
5777 reset_state_machine (is_stmt
)
5780 state_machine_regs
.address
= 0;
5781 state_machine_regs
.file
= 1;
5782 state_machine_regs
.line
= 1;
5783 state_machine_regs
.column
= 0;
5784 state_machine_regs
.is_stmt
= is_stmt
;
5785 state_machine_regs
.basic_block
= 0;
5786 state_machine_regs
.end_sequence
= 0;
5787 state_machine_regs
.last_file_entry
= 0;
5790 /* Handled an extend line op. Returns true if this is the end
5793 process_extended_line_op (data
, is_stmt
, pointer_size
)
5794 unsigned char * data
;
5798 unsigned char op_code
;
5801 unsigned char * name
;
5804 len
= read_leb128 (data
, & bytes_read
, 0);
5809 warn (_("badly formed extended line op encountered!\n"));
5814 op_code
= * data
++;
5816 printf (_(" Extended opcode %d: "), op_code
);
5820 case DW_LNE_end_sequence
:
5821 printf (_("End of Sequence\n\n"));
5822 reset_state_machine (is_stmt
);
5825 case DW_LNE_set_address
:
5826 adr
= byte_get (data
, pointer_size
);
5827 printf (_("set Address to 0x%lx\n"), adr
);
5828 state_machine_regs
.address
= adr
;
5831 case DW_LNE_define_file
:
5832 printf (_(" define new File Table entry\n"));
5833 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5835 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5837 data
+= strlen ((char *) data
) + 1;
5838 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5840 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5842 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5843 printf (_("%s\n\n"), name
);
5847 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
5854 /* Size of pointers in the .debug_line section. This information is not
5855 really present in that section. It's obtained before dumping the debug
5856 sections by doing some pre-scan of the .debug_info section. */
5857 static int debug_line_pointer_size
= 4;
5860 display_debug_lines (section
, start
, file
)
5861 Elf32_Internal_Shdr
* section
;
5862 unsigned char * start
;
5863 FILE * file ATTRIBUTE_UNUSED
;
5865 DWARF2_External_LineInfo
* external
;
5866 DWARF2_Internal_LineInfo info
;
5867 unsigned char * standard_opcodes
;
5868 unsigned char * data
= start
;
5869 unsigned char * end
= start
+ section
->sh_size
;
5870 unsigned char * end_of_sequence
;
5873 printf (_("\nDump of debug contents of section %s:\n\n"),
5874 SECTION_NAME (section
));
5878 external
= (DWARF2_External_LineInfo
*) data
;
5880 /* Check the length of the block. */
5881 info
.li_length
= BYTE_GET (external
->li_length
);
5883 if (info
.li_length
== 0xffffffff)
5885 warn (_("64-bit DWARF line info is not supported yet.\n"));
5889 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
5892 (_("The line info appears to be corrupt - the section is too small\n"));
5896 /* Check its version number. */
5897 info
.li_version
= BYTE_GET (external
->li_version
);
5898 if (info
.li_version
!= 2)
5900 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5904 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
5905 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
5906 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
5907 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
5908 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
5909 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
5911 /* Sign extend the line base field. */
5912 info
.li_line_base
<<= 24;
5913 info
.li_line_base
>>= 24;
5915 printf (_(" Length: %ld\n"), info
.li_length
);
5916 printf (_(" DWARF Version: %d\n"), info
.li_version
);
5917 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
5918 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
5919 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
5920 printf (_(" Line Base: %d\n"), info
.li_line_base
);
5921 printf (_(" Line Range: %d\n"), info
.li_line_range
);
5922 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
5924 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
5926 reset_state_machine (info
.li_default_is_stmt
);
5928 /* Display the contents of the Opcodes table. */
5929 standard_opcodes
= data
+ sizeof (* external
);
5931 printf (_("\n Opcodes:\n"));
5933 for (i
= 1; i
< info
.li_opcode_base
; i
++)
5934 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
5936 /* Display the contents of the Directory table. */
5937 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
5940 printf (_("\n The Directory Table is empty.\n"));
5943 printf (_("\n The Directory Table:\n"));
5947 printf (_(" %s\n"), data
);
5949 data
+= strlen ((char *) data
) + 1;
5953 /* Skip the NUL at the end of the table. */
5956 /* Display the contents of the File Name table. */
5958 printf (_("\n The File Name Table is empty.\n"));
5961 printf (_("\n The File Name Table:\n"));
5962 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5966 unsigned char * name
;
5969 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5972 data
+= strlen ((char *) data
) + 1;
5974 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5976 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5978 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5980 printf (_("%s\n"), name
);
5984 /* Skip the NUL at the end of the table. */
5987 /* Now display the statements. */
5988 printf (_("\n Line Number Statements:\n"));
5991 while (data
< end_of_sequence
)
5993 unsigned char op_code
;
5997 op_code
= * data
++;
5999 if (op_code
>= info
.li_opcode_base
)
6001 op_code
-= info
.li_opcode_base
;
6002 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6003 state_machine_regs
.address
+= adv
;
6004 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6005 op_code
, adv
, state_machine_regs
.address
);
6006 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6007 state_machine_regs
.line
+= adv
;
6008 printf (_(" and Line by %d to %d\n"),
6009 adv
, state_machine_regs
.line
);
6011 else switch (op_code
)
6013 case DW_LNS_extended_op
:
6014 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6015 debug_line_pointer_size
);
6019 printf (_(" Copy\n"));
6022 case DW_LNS_advance_pc
:
6023 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6025 state_machine_regs
.address
+= adv
;
6026 printf (_(" Advance PC by %d to %lx\n"), adv
,
6027 state_machine_regs
.address
);
6030 case DW_LNS_advance_line
:
6031 adv
= read_leb128 (data
, & bytes_read
, 1);
6033 state_machine_regs
.line
+= adv
;
6034 printf (_(" Advance Line by %d to %d\n"), adv
,
6035 state_machine_regs
.line
);
6038 case DW_LNS_set_file
:
6039 adv
= read_leb128 (data
, & bytes_read
, 0);
6041 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6043 state_machine_regs
.file
= adv
;
6046 case DW_LNS_set_column
:
6047 adv
= read_leb128 (data
, & bytes_read
, 0);
6049 printf (_(" Set column to %d\n"), adv
);
6050 state_machine_regs
.column
= adv
;
6053 case DW_LNS_negate_stmt
:
6054 adv
= state_machine_regs
.is_stmt
;
6056 printf (_(" Set is_stmt to %d\n"), adv
);
6057 state_machine_regs
.is_stmt
= adv
;
6060 case DW_LNS_set_basic_block
:
6061 printf (_(" Set basic block\n"));
6062 state_machine_regs
.basic_block
= 1;
6065 case DW_LNS_const_add_pc
:
6066 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6067 * info
.li_min_insn_length
);
6068 state_machine_regs
.address
+= adv
;
6069 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6070 state_machine_regs
.address
);
6073 case DW_LNS_fixed_advance_pc
:
6074 adv
= byte_get (data
, 2);
6076 state_machine_regs
.address
+= adv
;
6077 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6078 adv
, state_machine_regs
.address
);
6081 case DW_LNS_set_prologue_end
:
6082 printf (_(" Set prologue_end to true\n"));
6085 case DW_LNS_set_epilogue_begin
:
6086 printf (_(" Set epilogue_begin to true\n"));
6089 case DW_LNS_set_isa
:
6090 adv
= read_leb128 (data
, & bytes_read
, 0);
6092 printf (_(" Set ISA to %d\n"), adv
);
6096 printf (_(" Unknown opcode %d with operands: "), op_code
);
6099 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6101 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6102 i
== 1 ? "" : ", ");
6117 display_debug_pubnames (section
, start
, file
)
6118 Elf32_Internal_Shdr
* section
;
6119 unsigned char * start
;
6120 FILE * file ATTRIBUTE_UNUSED
;
6122 DWARF2_External_PubNames
* external
;
6123 DWARF2_Internal_PubNames pubnames
;
6124 unsigned char * end
;
6126 end
= start
+ section
->sh_size
;
6128 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6132 unsigned char * data
;
6133 unsigned long offset
;
6135 external
= (DWARF2_External_PubNames
*) start
;
6137 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
6138 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
6139 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
6140 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
6142 data
= start
+ sizeof (* external
);
6143 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
6145 if (pubnames
.pn_length
== 0xffffffff)
6147 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6151 if (pubnames
.pn_version
!= 2)
6153 static int warned
= 0;
6157 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6164 printf (_(" Length: %ld\n"),
6165 pubnames
.pn_length
);
6166 printf (_(" Version: %d\n"),
6167 pubnames
.pn_version
);
6168 printf (_(" Offset into .debug_info section: %ld\n"),
6169 pubnames
.pn_offset
);
6170 printf (_(" Size of area in .debug_info section: %ld\n"),
6173 printf (_("\n Offset\tName\n"));
6177 offset
= byte_get (data
, 4);
6182 printf (" %ld\t\t%s\n", offset
, data
);
6183 data
+= strlen ((char *) data
) + 1;
6186 while (offset
!= 0);
6199 case DW_TAG_padding
: return "DW_TAG_padding";
6200 case DW_TAG_array_type
: return "DW_TAG_array_type";
6201 case DW_TAG_class_type
: return "DW_TAG_class_type";
6202 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6203 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6204 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6205 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6206 case DW_TAG_label
: return "DW_TAG_label";
6207 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6208 case DW_TAG_member
: return "DW_TAG_member";
6209 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6210 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6211 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6212 case DW_TAG_string_type
: return "DW_TAG_string_type";
6213 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6214 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6215 case DW_TAG_typedef
: return "DW_TAG_typedef";
6216 case DW_TAG_union_type
: return "DW_TAG_union_type";
6217 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6218 case DW_TAG_variant
: return "DW_TAG_variant";
6219 case DW_TAG_common_block
: return "DW_TAG_common_block";
6220 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6221 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6222 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6223 case DW_TAG_module
: return "DW_TAG_module";
6224 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6225 case DW_TAG_set_type
: return "DW_TAG_set_type";
6226 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6227 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6228 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6229 case DW_TAG_base_type
: return "DW_TAG_base_type";
6230 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6231 case DW_TAG_const_type
: return "DW_TAG_const_type";
6232 case DW_TAG_constant
: return "DW_TAG_constant";
6233 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6234 case DW_TAG_file_type
: return "DW_TAG_file_type";
6235 case DW_TAG_friend
: return "DW_TAG_friend";
6236 case DW_TAG_namelist
: return "DW_TAG_namelist";
6237 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6238 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6239 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6240 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6241 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6242 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6243 case DW_TAG_try_block
: return "DW_TAG_try_block";
6244 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6245 case DW_TAG_variable
: return "DW_TAG_variable";
6246 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6247 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6248 case DW_TAG_format_label
: return "DW_TAG_format_label";
6249 case DW_TAG_function_template
: return "DW_TAG_function_template";
6250 case DW_TAG_class_template
: return "DW_TAG_class_template";
6251 /* DWARF 2.1 values. */
6252 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6253 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6254 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6255 case DW_TAG_namespace
: return "DW_TAG_namespace";
6256 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6257 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6258 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6259 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6262 static char buffer
[100];
6264 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6271 get_AT_name (attribute
)
6272 unsigned long attribute
;
6276 case DW_AT_sibling
: return "DW_AT_sibling";
6277 case DW_AT_location
: return "DW_AT_location";
6278 case DW_AT_name
: return "DW_AT_name";
6279 case DW_AT_ordering
: return "DW_AT_ordering";
6280 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6281 case DW_AT_byte_size
: return "DW_AT_byte_size";
6282 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6283 case DW_AT_bit_size
: return "DW_AT_bit_size";
6284 case DW_AT_element_list
: return "DW_AT_element_list";
6285 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6286 case DW_AT_low_pc
: return "DW_AT_low_pc";
6287 case DW_AT_high_pc
: return "DW_AT_high_pc";
6288 case DW_AT_language
: return "DW_AT_language";
6289 case DW_AT_member
: return "DW_AT_member";
6290 case DW_AT_discr
: return "DW_AT_discr";
6291 case DW_AT_discr_value
: return "DW_AT_discr_value";
6292 case DW_AT_visibility
: return "DW_AT_visibility";
6293 case DW_AT_import
: return "DW_AT_import";
6294 case DW_AT_string_length
: return "DW_AT_string_length";
6295 case DW_AT_common_reference
: return "DW_AT_common_reference";
6296 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6297 case DW_AT_const_value
: return "DW_AT_const_value";
6298 case DW_AT_containing_type
: return "DW_AT_containing_type";
6299 case DW_AT_default_value
: return "DW_AT_default_value";
6300 case DW_AT_inline
: return "DW_AT_inline";
6301 case DW_AT_is_optional
: return "DW_AT_is_optional";
6302 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6303 case DW_AT_producer
: return "DW_AT_producer";
6304 case DW_AT_prototyped
: return "DW_AT_prototyped";
6305 case DW_AT_return_addr
: return "DW_AT_return_addr";
6306 case DW_AT_start_scope
: return "DW_AT_start_scope";
6307 case DW_AT_stride_size
: return "DW_AT_stride_size";
6308 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6309 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6310 case DW_AT_accessibility
: return "DW_AT_accessibility";
6311 case DW_AT_address_class
: return "DW_AT_address_class";
6312 case DW_AT_artificial
: return "DW_AT_artificial";
6313 case DW_AT_base_types
: return "DW_AT_base_types";
6314 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6315 case DW_AT_count
: return "DW_AT_count";
6316 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6317 case DW_AT_decl_column
: return "DW_AT_decl_column";
6318 case DW_AT_decl_file
: return "DW_AT_decl_file";
6319 case DW_AT_decl_line
: return "DW_AT_decl_line";
6320 case DW_AT_declaration
: return "DW_AT_declaration";
6321 case DW_AT_discr_list
: return "DW_AT_discr_list";
6322 case DW_AT_encoding
: return "DW_AT_encoding";
6323 case DW_AT_external
: return "DW_AT_external";
6324 case DW_AT_frame_base
: return "DW_AT_frame_base";
6325 case DW_AT_friend
: return "DW_AT_friend";
6326 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6327 case DW_AT_macro_info
: return "DW_AT_macro_info";
6328 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6329 case DW_AT_priority
: return "DW_AT_priority";
6330 case DW_AT_segment
: return "DW_AT_segment";
6331 case DW_AT_specification
: return "DW_AT_specification";
6332 case DW_AT_static_link
: return "DW_AT_static_link";
6333 case DW_AT_type
: return "DW_AT_type";
6334 case DW_AT_use_location
: return "DW_AT_use_location";
6335 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6336 case DW_AT_virtuality
: return "DW_AT_virtuality";
6337 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6338 /* DWARF 2.1 values. */
6339 case DW_AT_allocated
: return "DW_AT_allocated";
6340 case DW_AT_associated
: return "DW_AT_associated";
6341 case DW_AT_data_location
: return "DW_AT_data_location";
6342 case DW_AT_stride
: return "DW_AT_stride";
6343 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6344 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6345 case DW_AT_extension
: return "DW_AT_extension";
6346 case DW_AT_ranges
: return "DW_AT_ranges";
6347 case DW_AT_trampoline
: return "DW_AT_trampoline";
6348 case DW_AT_call_column
: return "DW_AT_call_column";
6349 case DW_AT_call_file
: return "DW_AT_call_file";
6350 case DW_AT_call_line
: return "DW_AT_call_line";
6351 /* SGI/MIPS extensions. */
6352 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6353 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6354 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6355 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6356 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6357 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
6358 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6359 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6360 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6361 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6362 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6363 /* GNU extensions. */
6364 case DW_AT_sf_names
: return "DW_AT_sf_names";
6365 case DW_AT_src_info
: return "DW_AT_src_info";
6366 case DW_AT_mac_info
: return "DW_AT_mac_info";
6367 case DW_AT_src_coords
: return "DW_AT_src_coords";
6368 case DW_AT_body_begin
: return "DW_AT_body_begin";
6369 case DW_AT_body_end
: return "DW_AT_body_end";
6372 static char buffer
[100];
6374 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6381 get_FORM_name (form
)
6386 case DW_FORM_addr
: return "DW_FORM_addr";
6387 case DW_FORM_block2
: return "DW_FORM_block2";
6388 case DW_FORM_block4
: return "DW_FORM_block4";
6389 case DW_FORM_data2
: return "DW_FORM_data2";
6390 case DW_FORM_data4
: return "DW_FORM_data4";
6391 case DW_FORM_data8
: return "DW_FORM_data8";
6392 case DW_FORM_string
: return "DW_FORM_string";
6393 case DW_FORM_block
: return "DW_FORM_block";
6394 case DW_FORM_block1
: return "DW_FORM_block1";
6395 case DW_FORM_data1
: return "DW_FORM_data1";
6396 case DW_FORM_flag
: return "DW_FORM_flag";
6397 case DW_FORM_sdata
: return "DW_FORM_sdata";
6398 case DW_FORM_strp
: return "DW_FORM_strp";
6399 case DW_FORM_udata
: return "DW_FORM_udata";
6400 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6401 case DW_FORM_ref1
: return "DW_FORM_ref1";
6402 case DW_FORM_ref2
: return "DW_FORM_ref2";
6403 case DW_FORM_ref4
: return "DW_FORM_ref4";
6404 case DW_FORM_ref8
: return "DW_FORM_ref8";
6405 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6406 case DW_FORM_indirect
: return "DW_FORM_indirect";
6409 static char buffer
[100];
6411 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6417 /* FIXME: There are better and more effiecint ways to handle
6418 these structures. For now though, I just want something that
6419 is simple to implement. */
6420 typedef struct abbrev_attr
6422 unsigned long attribute
;
6424 struct abbrev_attr
* next
;
6428 typedef struct abbrev_entry
6430 unsigned long entry
;
6433 struct abbrev_attr
* first_attr
;
6434 struct abbrev_attr
* last_attr
;
6435 struct abbrev_entry
* next
;
6439 static abbrev_entry
* first_abbrev
= NULL
;
6440 static abbrev_entry
* last_abbrev
= NULL
;
6443 free_abbrevs
PARAMS ((void))
6445 abbrev_entry
* abbrev
;
6447 for (abbrev
= first_abbrev
; abbrev
;)
6449 abbrev_entry
* next
= abbrev
->next
;
6452 for (attr
= abbrev
->first_attr
; attr
;)
6454 abbrev_attr
* next
= attr
->next
;
6464 last_abbrev
= first_abbrev
= NULL
;
6468 add_abbrev (number
, tag
, children
)
6469 unsigned long number
;
6473 abbrev_entry
* entry
;
6475 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
6481 entry
->entry
= number
;
6483 entry
->children
= children
;
6484 entry
->first_attr
= NULL
;
6485 entry
->last_attr
= NULL
;
6488 if (first_abbrev
== NULL
)
6489 first_abbrev
= entry
;
6491 last_abbrev
->next
= entry
;
6493 last_abbrev
= entry
;
6497 add_abbrev_attr (attribute
, form
)
6498 unsigned long attribute
;
6503 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
6509 attr
->attribute
= attribute
;
6513 if (last_abbrev
->first_attr
== NULL
)
6514 last_abbrev
->first_attr
= attr
;
6516 last_abbrev
->last_attr
->next
= attr
;
6518 last_abbrev
->last_attr
= attr
;
6521 /* Processes the (partial) contents of a .debug_abbrev section.
6522 Returns NULL if the end of the section was encountered.
6523 Returns the address after the last byte read if the end of
6524 an abbreviation set was found. */
6526 static unsigned char *
6527 process_abbrev_section (start
, end
)
6528 unsigned char * start
;
6529 unsigned char * end
;
6531 if (first_abbrev
!= NULL
)
6537 unsigned long entry
;
6539 unsigned long attribute
;
6542 entry
= read_leb128 (start
, & bytes_read
, 0);
6543 start
+= bytes_read
;
6545 /* A single zero is supposed to end the section according
6546 to the standard. If there's more, then signal that to
6549 return start
== end
? NULL
: start
;
6551 tag
= read_leb128 (start
, & bytes_read
, 0);
6552 start
+= bytes_read
;
6554 children
= * start
++;
6556 add_abbrev (entry
, tag
, children
);
6562 attribute
= read_leb128 (start
, & bytes_read
, 0);
6563 start
+= bytes_read
;
6565 form
= read_leb128 (start
, & bytes_read
, 0);
6566 start
+= bytes_read
;
6569 add_abbrev_attr (attribute
, form
);
6571 while (attribute
!= 0);
6579 display_debug_macinfo (section
, start
, file
)
6580 Elf32_Internal_Shdr
* section
;
6581 unsigned char * start
;
6582 FILE * file ATTRIBUTE_UNUSED
;
6584 unsigned char * end
= start
+ section
->sh_size
;
6585 unsigned char * curr
= start
;
6586 unsigned int bytes_read
;
6587 enum dwarf_macinfo_record_type op
;
6589 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6593 unsigned int lineno
;
6594 const char * string
;
6601 case DW_MACINFO_start_file
:
6603 unsigned int filenum
;
6605 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6607 filenum
= read_leb128 (curr
, & bytes_read
, 0);
6610 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
6614 case DW_MACINFO_end_file
:
6615 printf (_(" DW_MACINFO_end_file\n"));
6618 case DW_MACINFO_define
:
6619 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6622 curr
+= strlen (string
) + 1;
6623 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
6626 case DW_MACINFO_undef
:
6627 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6630 curr
+= strlen (string
) + 1;
6631 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
6634 case DW_MACINFO_vendor_ext
:
6636 unsigned int constant
;
6638 constant
= read_leb128 (curr
, & bytes_read
, 0);
6641 curr
+= strlen (string
) + 1;
6642 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
6653 display_debug_abbrev (section
, start
, file
)
6654 Elf32_Internal_Shdr
* section
;
6655 unsigned char * start
;
6656 FILE * file ATTRIBUTE_UNUSED
;
6658 abbrev_entry
* entry
;
6659 unsigned char * end
= start
+ section
->sh_size
;
6661 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6665 start
= process_abbrev_section (start
, end
);
6667 if (first_abbrev
== NULL
)
6670 printf (_(" Number TAG\n"));
6672 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
6676 printf (_(" %ld %s [%s]\n"),
6678 get_TAG_name (entry
->tag
),
6679 entry
->children
? _("has children") : _("no children"));
6681 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6683 printf (_(" %-18s %s\n"),
6684 get_AT_name (attr
->attribute
),
6685 get_FORM_name (attr
->form
));
6699 static unsigned char *
6700 display_block (data
, length
)
6701 unsigned char * data
;
6702 unsigned long length
;
6704 printf (_(" %lu byte block: "), length
);
6707 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
6713 decode_location_expression (data
, pointer_size
, length
)
6714 unsigned char * data
;
6715 unsigned int pointer_size
;
6716 unsigned long length
;
6720 unsigned long uvalue
;
6721 unsigned char * end
= data
+ length
;
6730 printf ("DW_OP_addr: %lx",
6731 (unsigned long) byte_get (data
, pointer_size
));
6732 data
+= pointer_size
;
6735 printf ("DW_OP_deref");
6738 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
6741 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
6744 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
6748 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
6752 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
6756 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
6760 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
6761 (unsigned long) byte_get (data
+ 4, 4));
6765 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
6766 (long) byte_get (data
+ 4, 4));
6770 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
6774 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
6778 printf ("DW_OP_dup");
6781 printf ("DW_OP_drop");
6784 printf ("DW_OP_over");
6787 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
6790 printf ("DW_OP_swap");
6793 printf ("DW_OP_rot");
6796 printf ("DW_OP_xderef");
6799 printf ("DW_OP_abs");
6802 printf ("DW_OP_and");
6805 printf ("DW_OP_div");
6808 printf ("DW_OP_minus");
6811 printf ("DW_OP_mod");
6814 printf ("DW_OP_mul");
6817 printf ("DW_OP_neg");
6820 printf ("DW_OP_not");
6823 printf ("DW_OP_or");
6826 printf ("DW_OP_plus");
6828 case DW_OP_plus_uconst
:
6829 printf ("DW_OP_plus_uconst: %lu",
6830 read_leb128 (data
, &bytes_read
, 0));
6834 printf ("DW_OP_shl");
6837 printf ("DW_OP_shr");
6840 printf ("DW_OP_shra");
6843 printf ("DW_OP_xor");
6846 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
6850 printf ("DW_OP_eq");
6853 printf ("DW_OP_ge");
6856 printf ("DW_OP_gt");
6859 printf ("DW_OP_le");
6862 printf ("DW_OP_lt");
6865 printf ("DW_OP_ne");
6868 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
6904 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
6939 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
6974 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
6975 read_leb128 (data
, &bytes_read
, 1));
6980 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
6984 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
6988 uvalue
= read_leb128 (data
, &bytes_read
, 0);
6990 printf ("DW_OP_bregx: %lu %ld", uvalue
,
6991 read_leb128 (data
, &bytes_read
, 1));
6995 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
6998 case DW_OP_deref_size
:
6999 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7001 case DW_OP_xderef_size
:
7002 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7005 printf ("DW_OP_nop");
7008 /* DWARF 2.1 extensions. */
7009 case DW_OP_push_object_address
:
7010 printf ("DW_OP_push_object_address");
7013 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7017 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7021 printf ("DW_OP_calli");
7025 if (op
>= DW_OP_lo_user
7026 && op
<= DW_OP_hi_user
)
7027 printf (_("(User defined location op)"));
7029 printf (_("(Unknown location op)"));
7030 /* No way to tell where the next op is, so just bail. */
7034 /* Separate the ops. */
7040 static const char * debug_str_contents
;
7041 static bfd_vma debug_str_size
;
7044 load_debug_str (file
)
7047 Elf32_Internal_Shdr
* sec
;
7050 /* If it is already loaded, do nothing. */
7051 if (debug_str_contents
!= NULL
)
7054 /* Locate the .debug_str section. */
7055 for (i
= 0, sec
= section_headers
;
7056 i
< elf_header
.e_shnum
;
7058 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7061 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7064 debug_str_size
= sec
->sh_size
;
7066 debug_str_contents
= ((char *)
7067 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7068 _("debug_str section data")));
7074 if (debug_str_contents
== NULL
)
7077 free ((char *) debug_str_contents
);
7078 debug_str_contents
= NULL
;
7083 fetch_indirect_string (offset
)
7084 unsigned long offset
;
7086 if (debug_str_contents
== NULL
)
7087 return _("<no .debug_str section>");
7089 if (offset
> debug_str_size
)
7090 return _("<offset is too big>");
7092 return debug_str_contents
+ offset
;
7097 display_debug_str (section
, start
, file
)
7098 Elf32_Internal_Shdr
* section
;
7099 unsigned char * start
;
7100 FILE * file ATTRIBUTE_UNUSED
;
7102 unsigned long bytes
;
7105 addr
= section
->sh_addr
;
7106 bytes
= section
->sh_size
;
7110 printf (_("\nThe .debug_str section is empty.\n"));
7114 printf (_("Contents of the .debug_str section:\n\n"));
7122 lbytes
= (bytes
> 16 ? 16 : bytes
);
7124 printf (" 0x%8.8lx ", (unsigned long) addr
);
7126 for (j
= 0; j
< 16; j
++)
7129 printf ("%2.2x", start
[j
]);
7137 for (j
= 0; j
< lbytes
; j
++)
7140 if (k
>= ' ' && k
< 0x80)
7157 static unsigned char *
7158 read_and_display_attr_value (attribute
, form
, data
, cu_offset
, pointer_size
)
7159 unsigned long attribute
;
7161 unsigned char * data
;
7162 unsigned long cu_offset
;
7163 unsigned long pointer_size
;
7165 unsigned long uvalue
= 0;
7166 unsigned char * block_start
= NULL
;
7174 case DW_FORM_ref_addr
:
7176 uvalue
= byte_get (data
, pointer_size
);
7177 data
+= pointer_size
;
7181 uvalue
= byte_get (data
, /* offset_size */ 4);
7182 data
+= /* offset_size */ 4;
7188 uvalue
= byte_get (data
++, 1);
7193 uvalue
= byte_get (data
, 2);
7199 uvalue
= byte_get (data
, 4);
7204 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7208 case DW_FORM_ref_udata
:
7210 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7214 case DW_FORM_indirect
:
7215 form
= read_leb128 (data
, & bytes_read
, 0);
7217 printf (" %s", get_FORM_name (form
));
7218 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7224 case DW_FORM_ref_addr
:
7225 printf (" <#%lx>", uvalue
);
7231 case DW_FORM_ref_udata
:
7232 printf (" <%lx>", uvalue
+ cu_offset
);
7236 printf (" %#lx", uvalue
);
7244 printf (" %ld", uvalue
);
7249 uvalue
= byte_get (data
, 4);
7250 printf (" %lx", uvalue
);
7251 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7255 case DW_FORM_string
:
7256 printf (" %s", data
);
7257 data
+= strlen ((char *) data
) + 1;
7261 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7262 block_start
= data
+ bytes_read
;
7263 data
= display_block (block_start
, uvalue
);
7266 case DW_FORM_block1
:
7267 uvalue
= byte_get (data
, 1);
7268 block_start
= data
+ 1;
7269 data
= display_block (block_start
, uvalue
);
7272 case DW_FORM_block2
:
7273 uvalue
= byte_get (data
, 2);
7274 block_start
= data
+ 2;
7275 data
= display_block (block_start
, uvalue
);
7278 case DW_FORM_block4
:
7279 uvalue
= byte_get (data
, 4);
7280 block_start
= data
+ 4;
7281 data
= display_block (block_start
, uvalue
);
7285 printf (_(" (indirect string, offset: 0x%lx): "), uvalue
);
7286 printf (fetch_indirect_string (uvalue
));
7289 case DW_FORM_indirect
:
7290 /* Handled above. */
7294 warn (_("Unrecognised form: %d\n"), form
);
7298 /* For some attributes we can display futher information. */
7307 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
7308 case DW_INL_inlined
: printf (_("(inlined)")); break;
7309 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
7310 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
7311 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
7315 case DW_AT_language
:
7318 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7319 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7320 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7321 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7322 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7323 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7324 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7325 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7326 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7327 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7328 /* DWARF 2.1 values. */
7329 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7330 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7331 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7332 /* MIPS extension. */
7333 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7334 default: printf ("(Unknown: %lx)", uvalue
); break;
7338 case DW_AT_encoding
:
7341 case DW_ATE_void
: printf ("(void)"); break;
7342 case DW_ATE_address
: printf ("(machine address)"); break;
7343 case DW_ATE_boolean
: printf ("(boolean)"); break;
7344 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7345 case DW_ATE_float
: printf ("(float)"); break;
7346 case DW_ATE_signed
: printf ("(signed)"); break;
7347 case DW_ATE_signed_char
: printf ("(signed char)"); break;
7348 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
7349 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
7350 /* DWARF 2.1 value. */
7351 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
7353 if (uvalue
>= DW_ATE_lo_user
7354 && uvalue
<= DW_ATE_hi_user
)
7355 printf ("(user defined type)");
7357 printf ("(unknown type)");
7362 case DW_AT_accessibility
:
7365 case DW_ACCESS_public
: printf ("(public)"); break;
7366 case DW_ACCESS_protected
: printf ("(protected)"); break;
7367 case DW_ACCESS_private
: printf ("(private)"); break;
7368 default: printf ("(unknown accessibility)"); break;
7372 case DW_AT_visibility
:
7375 case DW_VIS_local
: printf ("(local)"); break;
7376 case DW_VIS_exported
: printf ("(exported)"); break;
7377 case DW_VIS_qualified
: printf ("(qualified)"); break;
7378 default: printf ("(unknown visibility)"); break;
7382 case DW_AT_virtuality
:
7385 case DW_VIRTUALITY_none
: printf ("(none)"); break;
7386 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
7387 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
7388 default: printf ("(unknown virtuality)"); break;
7392 case DW_AT_identifier_case
:
7395 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
7396 case DW_ID_up_case
: printf ("(up_case)"); break;
7397 case DW_ID_down_case
: printf ("(down_case)"); break;
7398 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
7399 default: printf ("(unknown case)"); break;
7403 case DW_AT_calling_convention
:
7406 case DW_CC_normal
: printf ("(normal)"); break;
7407 case DW_CC_program
: printf ("(program)"); break;
7408 case DW_CC_nocall
: printf ("(nocall)"); break;
7410 if (uvalue
>= DW_CC_lo_user
7411 && uvalue
<= DW_CC_hi_user
)
7412 printf ("(user defined)");
7414 printf ("(unknown convention)");
7418 case DW_AT_ordering
:
7421 case -1: printf ("(undefined)"); break;
7422 case 0: printf ("(row major)"); break;
7423 case 1: printf ("(column major)"); break;
7427 case DW_AT_frame_base
:
7428 case DW_AT_location
:
7429 case DW_AT_data_member_location
:
7430 case DW_AT_vtable_elem_location
:
7431 case DW_AT_allocated
:
7432 case DW_AT_associated
:
7433 case DW_AT_data_location
:
7435 case DW_AT_upper_bound
:
7436 case DW_AT_lower_bound
:
7440 decode_location_expression (block_start
, pointer_size
, uvalue
);
7452 static unsigned char *
7453 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
7454 unsigned long attribute
;
7456 unsigned char * data
;
7457 unsigned long cu_offset
;
7458 unsigned long pointer_size
;
7460 printf (" %-18s:", get_AT_name (attribute
));
7461 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7468 display_debug_info (section
, start
, file
)
7469 Elf32_Internal_Shdr
* section
;
7470 unsigned char * start
;
7473 unsigned char * end
= start
+ section
->sh_size
;
7474 unsigned char * section_begin
= start
;
7476 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7478 load_debug_str (file
);
7482 DWARF2_External_CompUnit
* external
;
7483 DWARF2_Internal_CompUnit compunit
;
7484 Elf32_Internal_Shdr
* relsec
;
7485 unsigned char * tags
;
7488 unsigned long cu_offset
;
7490 external
= (DWARF2_External_CompUnit
*) start
;
7492 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
7493 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
7494 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
7495 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
7497 if (compunit
.cu_length
== 0xffffffff)
7499 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7503 /* Check for RELA relocations in the abbrev_offset address, and
7505 for (relsec
= section_headers
;
7506 relsec
< section_headers
+ elf_header
.e_shnum
;
7509 unsigned long nrelas
;
7510 Elf_Internal_Rela
*rela
, *rp
;
7511 Elf32_Internal_Shdr
*symsec
;
7512 Elf_Internal_Sym
*symtab
;
7513 Elf_Internal_Sym
*sym
;
7515 if (relsec
->sh_type
!= SHT_RELA
7516 || SECTION_HEADER (relsec
->sh_info
) != section
)
7519 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7523 symsec
= SECTION_HEADER (relsec
->sh_link
);
7524 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7526 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7529 != (bfd_vma
) ((unsigned char *) &external
->cu_abbrev_offset
7535 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7537 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7539 warn (_("Skipping unexpected symbol type %u\n"),
7540 ELF32_ST_TYPE (sym
->st_info
));
7546 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7548 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7550 warn (_("Skipping unexpected symbol type %u\n"),
7551 ELF64_ST_TYPE (sym
->st_info
));
7556 compunit
.cu_abbrev_offset
+= rp
->r_addend
;
7564 tags
= start
+ sizeof (* external
);
7565 cu_offset
= start
- section_begin
;
7566 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
7568 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
7569 printf (_(" Length: %ld\n"), compunit
.cu_length
);
7570 printf (_(" Version: %d\n"), compunit
.cu_version
);
7571 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
7572 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
7574 if (compunit
.cu_version
!= 2)
7576 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7582 /* Read in the abbrevs used by this compilation unit. */
7585 Elf32_Internal_Shdr
* sec
;
7586 unsigned char * begin
;
7588 /* Locate the .debug_abbrev section and process it. */
7589 for (i
= 0, sec
= section_headers
;
7590 i
< elf_header
.e_shnum
;
7592 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
7595 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7597 warn (_("Unable to locate .debug_abbrev section!\n"));
7601 begin
= ((unsigned char *)
7602 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7603 _("debug_abbrev section data")));
7607 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
7608 begin
+ sec
->sh_size
);
7614 while (tags
< start
)
7617 unsigned long abbrev_number
;
7618 abbrev_entry
* entry
;
7621 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
7624 /* A null DIE marks the end of a list of children. */
7625 if (abbrev_number
== 0)
7631 /* Scan through the abbreviation list until we reach the
7633 for (entry
= first_abbrev
;
7634 entry
&& entry
->entry
!= abbrev_number
;
7635 entry
= entry
->next
)
7640 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7645 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7647 (unsigned long) (tags
- section_begin
- bytes_read
),
7649 get_TAG_name (entry
->tag
));
7651 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7652 tags
= read_and_display_attr (attr
->attribute
,
7655 compunit
.cu_pointer_size
);
7657 if (entry
->children
)
7670 display_debug_aranges (section
, start
, file
)
7671 Elf32_Internal_Shdr
* section
;
7672 unsigned char * start
;
7673 FILE * file ATTRIBUTE_UNUSED
;
7675 unsigned char * end
= start
+ section
->sh_size
;
7677 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7681 DWARF2_External_ARange
* external
;
7682 DWARF2_Internal_ARange arange
;
7683 unsigned char * ranges
;
7684 unsigned long length
;
7685 unsigned long address
;
7688 external
= (DWARF2_External_ARange
*) start
;
7690 arange
.ar_length
= BYTE_GET (external
->ar_length
);
7691 arange
.ar_version
= BYTE_GET (external
->ar_version
);
7692 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
7693 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
7694 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
7696 if (arange
.ar_length
== 0xffffffff)
7698 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7702 if (arange
.ar_version
!= 2)
7704 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7708 printf (_(" Length: %ld\n"), arange
.ar_length
);
7709 printf (_(" Version: %d\n"), arange
.ar_version
);
7710 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
7711 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
7712 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
7714 printf (_("\n Address Length\n"));
7716 ranges
= start
+ sizeof (* external
);
7718 /* Must pad to an alignment boundary that is twice the pointer size. */
7719 excess
= sizeof (* external
) % (2 * arange
.ar_pointer_size
);
7721 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
7725 address
= byte_get (ranges
, arange
.ar_pointer_size
);
7727 ranges
+= arange
.ar_pointer_size
;
7729 length
= byte_get (ranges
, arange
.ar_pointer_size
);
7731 ranges
+= arange
.ar_pointer_size
;
7733 /* A pair of zeros marks the end of the list. */
7734 if (address
== 0 && length
== 0)
7737 printf (" %8.8lx %lu\n", address
, length
);
7740 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
7748 typedef struct Frame_Chunk
7750 struct Frame_Chunk
* next
;
7751 unsigned char * chunk_start
;
7753 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7754 short int * col_type
;
7756 char * augmentation
;
7757 unsigned int code_factor
;
7759 unsigned long pc_begin
;
7760 unsigned long pc_range
;
7764 unsigned char fde_encoding
;
7768 /* A marker for a col_type that means this column was never referenced
7769 in the frame info. */
7770 #define DW_CFA_unreferenced (-1)
7772 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
7773 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
7774 static int size_of_encoded_value
PARAMS ((int));
7777 frame_need_space (fc
, reg
)
7781 int prev
= fc
->ncols
;
7783 if (reg
< fc
->ncols
)
7786 fc
->ncols
= reg
+ 1;
7787 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
7788 fc
->ncols
* sizeof (short int));
7789 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
7790 fc
->ncols
* sizeof (int));
7792 while (prev
< fc
->ncols
)
7794 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
7795 fc
->col_offset
[prev
] = 0;
7801 frame_display_row (fc
, need_col_headers
, max_regs
)
7803 int * need_col_headers
;
7809 if (* max_regs
< fc
->ncols
)
7810 * max_regs
= fc
->ncols
;
7812 if (* need_col_headers
)
7814 * need_col_headers
= 0;
7816 printf (" LOC CFA ");
7818 for (r
= 0; r
< * max_regs
; r
++)
7819 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7824 printf ("r%-4d", r
);
7830 printf ("%08lx ", fc
->pc_begin
);
7831 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
7832 printf ("%-8s ", tmp
);
7834 for (r
= 0; r
< fc
->ncols
; r
++)
7836 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7838 switch (fc
->col_type
[r
])
7840 case DW_CFA_undefined
:
7843 case DW_CFA_same_value
:
7847 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
7849 case DW_CFA_register
:
7850 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
7853 strcpy (tmp
, "n/a");
7856 printf ("%-5s", tmp
);
7863 size_of_encoded_value (encoding
)
7866 switch (encoding
& 0x7)
7869 case 0: return is_32bit_elf
? 4 : 8;
7876 #define GET(N) byte_get (start, N); start += N
7877 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7878 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7881 display_debug_frames (section
, start
, file
)
7882 Elf32_Internal_Shdr
* section
;
7883 unsigned char * start
;
7884 FILE * file ATTRIBUTE_UNUSED
;
7886 unsigned char * end
= start
+ section
->sh_size
;
7887 unsigned char * section_start
= start
;
7888 Frame_Chunk
* chunks
= 0;
7889 Frame_Chunk
* remembered_state
= 0;
7891 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
7894 int addr_size
= is_32bit_elf
? 4 : 8;
7896 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
7900 unsigned char * saved_start
;
7901 unsigned char * block_end
;
7902 unsigned long length
;
7903 unsigned long cie_id
;
7906 int need_col_headers
= 1;
7907 unsigned char * augmentation_data
= NULL
;
7908 unsigned long augmentation_data_len
= 0;
7909 int encoded_ptr_size
= addr_size
;
7911 saved_start
= start
;
7912 length
= byte_get (start
, 4); start
+= 4;
7917 if (length
== 0xffffffff)
7919 warn (_("64-bit DWARF format frames are not supported yet.\n"));
7923 block_end
= saved_start
+ length
+ 4;
7924 cie_id
= byte_get (start
, 4); start
+= 4;
7926 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
7930 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
7931 memset (fc
, 0, sizeof (Frame_Chunk
));
7935 fc
->chunk_start
= saved_start
;
7937 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7938 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7939 frame_need_space (fc
, max_regs
-1);
7943 fc
->augmentation
= start
;
7944 start
= strchr (start
, '\0') + 1;
7946 if (fc
->augmentation
[0] == 'z')
7948 fc
->code_factor
= LEB ();
7949 fc
->data_factor
= SLEB ();
7950 fc
->ra
= byte_get (start
, 1); start
+= 1;
7951 augmentation_data_len
= LEB ();
7952 augmentation_data
= start
;
7953 start
+= augmentation_data_len
;
7955 else if (strcmp (fc
->augmentation
, "eh") == 0)
7958 fc
->code_factor
= LEB ();
7959 fc
->data_factor
= SLEB ();
7960 fc
->ra
= byte_get (start
, 1); start
+= 1;
7964 fc
->code_factor
= LEB ();
7965 fc
->data_factor
= SLEB ();
7966 fc
->ra
= byte_get (start
, 1); start
+= 1;
7970 if (do_debug_frames_interp
)
7971 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7972 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
7973 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
7977 printf ("\n%08lx %08lx %08lx CIE\n",
7978 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
7979 printf (" Version: %d\n", version
);
7980 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
7981 printf (" Code alignment factor: %u\n", fc
->code_factor
);
7982 printf (" Data alignment factor: %d\n", fc
->data_factor
);
7983 printf (" Return address column: %d\n", fc
->ra
);
7985 if (augmentation_data_len
)
7988 printf (" Augmentation data: ");
7989 for (i
= 0; i
< augmentation_data_len
; ++i
)
7990 printf (" %02x", augmentation_data
[i
]);
7996 if (augmentation_data_len
)
7998 unsigned char *p
, *q
;
7999 p
= fc
->augmentation
+ 1;
8000 q
= augmentation_data
;
8007 q
+= 1 + size_of_encoded_value (*q
);
8009 fc
->fde_encoding
= *q
++;
8015 if (fc
->fde_encoding
)
8016 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8019 frame_need_space (fc
, fc
->ra
);
8023 unsigned char * look_for
;
8024 static Frame_Chunk fde_fc
;
8027 memset (fc
, 0, sizeof (Frame_Chunk
));
8029 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8031 for (cie
= chunks
; cie
; cie
= cie
->next
)
8032 if (cie
->chunk_start
== look_for
)
8037 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8038 cie_id
, saved_start
);
8041 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8042 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8043 frame_need_space (fc
, max_regs
- 1);
8045 fc
->augmentation
= "";
8046 fc
->fde_encoding
= 0;
8050 fc
->ncols
= cie
->ncols
;
8051 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
8052 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
8053 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
8054 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
8055 fc
->augmentation
= cie
->augmentation
;
8056 fc
->code_factor
= cie
->code_factor
;
8057 fc
->data_factor
= cie
->data_factor
;
8058 fc
->cfa_reg
= cie
->cfa_reg
;
8059 fc
->cfa_offset
= cie
->cfa_offset
;
8061 frame_need_space (fc
, max_regs
-1);
8062 fc
->fde_encoding
= cie
->fde_encoding
;
8065 if (fc
->fde_encoding
)
8066 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8068 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
8069 start
+= encoded_ptr_size
;
8070 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8071 start
+= encoded_ptr_size
;
8073 if (cie
->augmentation
[0] == 'z')
8075 augmentation_data_len
= LEB ();
8076 augmentation_data
= start
;
8077 start
+= augmentation_data_len
;
8080 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8081 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8082 (unsigned long)(cie
->chunk_start
- section_start
),
8083 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8084 if (! do_debug_frames_interp
&& augmentation_data_len
)
8087 printf (" Augmentation data: ");
8088 for (i
= 0; i
< augmentation_data_len
; ++i
)
8089 printf (" %02x", augmentation_data
[i
]);
8095 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8096 about to interpret instructions for the chunk. */
8098 if (do_debug_frames_interp
)
8100 /* Start by making a pass over the chunk, allocating storage
8101 and taking note of what registers are used. */
8102 unsigned char * tmp
= start
;
8104 while (start
< block_end
)
8114 /* Warning: if you add any more cases to this switch, be
8115 sure to add them to the corresponding switch below. */
8118 case DW_CFA_advance_loc
:
8122 frame_need_space (fc
, opa
);
8123 fc
->col_type
[opa
] = DW_CFA_undefined
;
8125 case DW_CFA_restore
:
8126 frame_need_space (fc
, opa
);
8127 fc
->col_type
[opa
] = DW_CFA_undefined
;
8129 case DW_CFA_set_loc
:
8130 start
+= encoded_ptr_size
;
8132 case DW_CFA_advance_loc1
:
8135 case DW_CFA_advance_loc2
:
8138 case DW_CFA_advance_loc4
:
8141 case DW_CFA_offset_extended
:
8142 reg
= LEB (); LEB ();
8143 frame_need_space (fc
, reg
);
8144 fc
->col_type
[reg
] = DW_CFA_undefined
;
8146 case DW_CFA_restore_extended
:
8148 frame_need_space (fc
, reg
);
8149 fc
->col_type
[reg
] = DW_CFA_undefined
;
8151 case DW_CFA_undefined
:
8153 frame_need_space (fc
, reg
);
8154 fc
->col_type
[reg
] = DW_CFA_undefined
;
8156 case DW_CFA_same_value
:
8158 frame_need_space (fc
, reg
);
8159 fc
->col_type
[reg
] = DW_CFA_undefined
;
8161 case DW_CFA_register
:
8162 reg
= LEB (); LEB ();
8163 frame_need_space (fc
, reg
);
8164 fc
->col_type
[reg
] = DW_CFA_undefined
;
8166 case DW_CFA_def_cfa
:
8169 case DW_CFA_def_cfa_register
:
8172 case DW_CFA_def_cfa_offset
:
8175 #ifndef DW_CFA_GNU_args_size
8176 #define DW_CFA_GNU_args_size 0x2e
8178 case DW_CFA_GNU_args_size
:
8181 #ifndef DW_CFA_GNU_negative_offset_extended
8182 #define DW_CFA_GNU_negative_offset_extended 0x2f
8184 case DW_CFA_GNU_negative_offset_extended
:
8185 reg
= LEB (); LEB ();
8186 frame_need_space (fc
, reg
);
8187 fc
->col_type
[reg
] = DW_CFA_undefined
;
8196 /* Now we know what registers are used, make a second pass over
8197 the chunk, this time actually printing out the info. */
8199 while (start
< block_end
)
8202 unsigned long ul
, reg
, roffs
;
8211 /* Warning: if you add any more cases to this switch, be
8212 sure to add them to the corresponding switch above. */
8215 case DW_CFA_advance_loc
:
8216 if (do_debug_frames_interp
)
8217 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8219 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8220 opa
* fc
->code_factor
,
8221 fc
->pc_begin
+ opa
* fc
->code_factor
);
8222 fc
->pc_begin
+= opa
* fc
->code_factor
;
8227 if (! do_debug_frames_interp
)
8228 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8229 opa
, roffs
* fc
->data_factor
);
8230 fc
->col_type
[opa
] = DW_CFA_offset
;
8231 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8234 case DW_CFA_restore
:
8235 if (! do_debug_frames_interp
)
8236 printf (" DW_CFA_restore: r%d\n", opa
);
8237 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8238 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8241 case DW_CFA_set_loc
:
8242 vma
= byte_get (start
, encoded_ptr_size
);
8243 start
+= encoded_ptr_size
;
8244 if (do_debug_frames_interp
)
8245 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8247 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8251 case DW_CFA_advance_loc1
:
8252 ofs
= byte_get (start
, 1); start
+= 1;
8253 if (do_debug_frames_interp
)
8254 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8256 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8257 ofs
* fc
->code_factor
,
8258 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8259 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8262 case DW_CFA_advance_loc2
:
8263 ofs
= byte_get (start
, 2); start
+= 2;
8264 if (do_debug_frames_interp
)
8265 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8267 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8268 ofs
* fc
->code_factor
,
8269 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8270 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8273 case DW_CFA_advance_loc4
:
8274 ofs
= byte_get (start
, 4); start
+= 4;
8275 if (do_debug_frames_interp
)
8276 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8278 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8279 ofs
* fc
->code_factor
,
8280 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8281 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8284 case DW_CFA_offset_extended
:
8287 if (! do_debug_frames_interp
)
8288 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8289 reg
, roffs
* fc
->data_factor
);
8290 fc
->col_type
[reg
] = DW_CFA_offset
;
8291 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8294 case DW_CFA_restore_extended
:
8296 if (! do_debug_frames_interp
)
8297 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8298 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8299 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8302 case DW_CFA_undefined
:
8304 if (! do_debug_frames_interp
)
8305 printf (" DW_CFA_undefined: r%ld\n", reg
);
8306 fc
->col_type
[reg
] = DW_CFA_undefined
;
8307 fc
->col_offset
[reg
] = 0;
8310 case DW_CFA_same_value
:
8312 if (! do_debug_frames_interp
)
8313 printf (" DW_CFA_same_value: r%ld\n", reg
);
8314 fc
->col_type
[reg
] = DW_CFA_same_value
;
8315 fc
->col_offset
[reg
] = 0;
8318 case DW_CFA_register
:
8321 if (! do_debug_frames_interp
)
8322 printf (" DW_CFA_register: r%ld\n", reg
);
8323 fc
->col_type
[reg
] = DW_CFA_register
;
8324 fc
->col_offset
[reg
] = roffs
;
8327 case DW_CFA_remember_state
:
8328 if (! do_debug_frames_interp
)
8329 printf (" DW_CFA_remember_state\n");
8330 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8331 rs
->ncols
= fc
->ncols
;
8332 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
8333 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
8334 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
8335 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
8336 rs
->next
= remembered_state
;
8337 remembered_state
= rs
;
8340 case DW_CFA_restore_state
:
8341 if (! do_debug_frames_interp
)
8342 printf (" DW_CFA_restore_state\n");
8343 rs
= remembered_state
;
8344 remembered_state
= rs
->next
;
8345 frame_need_space (fc
, rs
->ncols
-1);
8346 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
8347 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
8348 free (rs
->col_type
);
8349 free (rs
->col_offset
);
8353 case DW_CFA_def_cfa
:
8354 fc
->cfa_reg
= LEB ();
8355 fc
->cfa_offset
= LEB ();
8356 if (! do_debug_frames_interp
)
8357 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8358 fc
->cfa_reg
, fc
->cfa_offset
);
8361 case DW_CFA_def_cfa_register
:
8362 fc
->cfa_reg
= LEB ();
8363 if (! do_debug_frames_interp
)
8364 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
8367 case DW_CFA_def_cfa_offset
:
8368 fc
->cfa_offset
= LEB ();
8369 if (! do_debug_frames_interp
)
8370 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
8374 if (! do_debug_frames_interp
)
8375 printf (" DW_CFA_nop\n");
8378 #ifndef DW_CFA_GNU_window_save
8379 #define DW_CFA_GNU_window_save 0x2d
8381 case DW_CFA_GNU_window_save
:
8382 if (! do_debug_frames_interp
)
8383 printf (" DW_CFA_GNU_window_save\n");
8386 case DW_CFA_GNU_args_size
:
8388 if (! do_debug_frames_interp
)
8389 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
8392 case DW_CFA_GNU_negative_offset_extended
:
8395 frame_need_space (fc
, reg
);
8396 if (! do_debug_frames_interp
)
8397 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8398 reg
, l
* fc
->data_factor
);
8399 fc
->col_type
[reg
] = DW_CFA_offset
;
8400 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
8404 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
8409 if (do_debug_frames_interp
)
8410 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8425 display_debug_not_supported (section
, start
, file
)
8426 Elf32_Internal_Shdr
* section
;
8427 unsigned char * start ATTRIBUTE_UNUSED
;
8428 FILE * file ATTRIBUTE_UNUSED
;
8430 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8431 SECTION_NAME (section
));
8436 /* Pre-scan the .debug_info section to record the size of address.
8437 When dumping the .debug_line, we use that size information, assuming
8438 that all compilation units have the same address size. */
8440 prescan_debug_info (section
, start
, file
)
8441 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
8442 unsigned char * start
;
8443 FILE * file ATTRIBUTE_UNUSED
;
8445 DWARF2_External_CompUnit
* external
;
8447 external
= (DWARF2_External_CompUnit
*) start
;
8449 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
8453 /* A structure containing the name of a debug section and a pointer
8454 to a function that can decode it. The third field is a prescan
8455 function to be run over the section before displaying any of the
8459 const char * const name
;
8460 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8461 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8465 { ".debug_abbrev", display_debug_abbrev
, NULL
},
8466 { ".debug_aranges", display_debug_aranges
, NULL
},
8467 { ".debug_frame", display_debug_frames
, NULL
},
8468 { ".debug_info", display_debug_info
, prescan_debug_info
},
8469 { ".debug_line", display_debug_lines
, NULL
},
8470 { ".debug_pubnames", display_debug_pubnames
, NULL
},
8471 { ".eh_frame", display_debug_frames
, NULL
},
8472 { ".debug_macinfo", display_debug_macinfo
, NULL
},
8473 { ".debug_str", display_debug_str
, NULL
},
8475 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
8476 { ".debug_ranges", display_debug_not_supported
, NULL
},
8477 { ".debug_static_func", display_debug_not_supported
, NULL
},
8478 { ".debug_static_vars", display_debug_not_supported
, NULL
},
8479 { ".debug_types", display_debug_not_supported
, NULL
},
8480 { ".debug_weaknames", display_debug_not_supported
, NULL
}
8484 display_debug_section (section
, file
)
8485 Elf32_Internal_Shdr
* section
;
8488 char * name
= SECTION_NAME (section
);
8489 bfd_size_type length
;
8490 unsigned char * start
;
8493 length
= section
->sh_size
;
8496 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8500 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
8501 _("debug section data"));
8505 /* See if we know how to display the contents of this section. */
8506 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
8507 name
= ".debug_info";
8509 for (i
= NUM_ELEM (debug_displays
); i
--;)
8510 if (strcmp (debug_displays
[i
].name
, name
) == 0)
8512 debug_displays
[i
].display (section
, start
, file
);
8517 printf (_("Unrecognised debug section: %s\n"), name
);
8521 /* If we loaded in the abbrev section at some point,
8522 we must release it here. */
8529 process_section_contents (file
)
8532 Elf32_Internal_Shdr
* section
;
8538 /* Pre-scan the debug sections to find some debug information not
8539 present in some of them. For the .debug_line, we must find out the
8540 size of address (specified in .debug_info and .debug_aranges). */
8541 for (i
= 0, section
= section_headers
;
8542 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8545 char * name
= SECTION_NAME (section
);
8548 if (section
->sh_size
== 0)
8551 /* See if there is some pre-scan operation for this section. */
8552 for (j
= NUM_ELEM (debug_displays
); j
--;)
8553 if (strcmp (debug_displays
[j
].name
, name
) == 0)
8555 if (debug_displays
[j
].prescan
!= NULL
)
8557 bfd_size_type length
;
8558 unsigned char * start
;
8560 length
= section
->sh_size
;
8561 start
= ((unsigned char *)
8562 get_data (NULL
, file
, section
->sh_offset
, length
,
8563 _("debug section data")));
8567 debug_displays
[j
].prescan (section
, start
, file
);
8575 for (i
= 0, section
= section_headers
;
8576 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8579 #ifdef SUPPORT_DISASSEMBLY
8580 if (dump_sects
[i
] & DISASS_DUMP
)
8581 disassemble_section (section
, file
);
8583 if (dump_sects
[i
] & HEX_DUMP
)
8584 dump_section (section
, file
);
8586 if (dump_sects
[i
] & DEBUG_DUMP
)
8587 display_debug_section (section
, file
);
8590 if (i
< num_dump_sects
)
8591 warn (_("Some sections were not dumped because they do not exist!\n"));
8597 process_mips_fpe_exception (mask
)
8603 if (mask
& OEX_FPU_INEX
)
8604 fputs ("INEX", stdout
), first
= 0;
8605 if (mask
& OEX_FPU_UFLO
)
8606 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8607 if (mask
& OEX_FPU_OFLO
)
8608 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8609 if (mask
& OEX_FPU_DIV0
)
8610 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8611 if (mask
& OEX_FPU_INVAL
)
8612 printf ("%sINVAL", first
? "" : "|");
8615 fputs ("0", stdout
);
8619 process_mips_specific (file
)
8622 Elf_Internal_Dyn
* entry
;
8623 size_t liblist_offset
= 0;
8624 size_t liblistno
= 0;
8625 size_t conflictsno
= 0;
8626 size_t options_offset
= 0;
8627 size_t conflicts_offset
= 0;
8629 /* We have a lot of special sections. Thanks SGI! */
8630 if (dynamic_segment
== NULL
)
8631 /* No information available. */
8634 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
8635 switch (entry
->d_tag
)
8637 case DT_MIPS_LIBLIST
:
8638 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
8640 case DT_MIPS_LIBLISTNO
:
8641 liblistno
= entry
->d_un
.d_val
;
8643 case DT_MIPS_OPTIONS
:
8644 options_offset
= entry
->d_un
.d_val
- loadaddr
;
8646 case DT_MIPS_CONFLICT
:
8647 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
8649 case DT_MIPS_CONFLICTNO
:
8650 conflictsno
= entry
->d_un
.d_val
;
8656 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8658 Elf32_External_Lib
* elib
;
8661 elib
= ((Elf32_External_Lib
*)
8662 get_data (NULL
, file
, liblist_offset
,
8663 liblistno
* sizeof (Elf32_External_Lib
),
8667 printf ("\nSection '.liblist' contains %lu entries:\n",
8668 (unsigned long) liblistno
);
8669 fputs (" Library Time Stamp Checksum Version Flags\n",
8672 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8679 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8680 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8681 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8682 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8683 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8685 tmp
= gmtime (&time
);
8686 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
8687 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8688 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8690 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt
,
8691 dynamic_strings
+ liblist
.l_name
, timebuf
,
8692 liblist
.l_checksum
, liblist
.l_version
);
8694 if (liblist
.l_flags
== 0)
8705 { " EXACT_MATCH", LL_EXACT_MATCH
},
8706 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8707 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8708 { " EXPORTS", LL_EXPORTS
},
8709 { " DELAY_LOAD", LL_DELAY_LOAD
},
8710 { " DELTA", LL_DELTA
}
8712 int flags
= liblist
.l_flags
;
8716 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8718 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8720 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8721 flags
^= l_flags_vals
[fcnt
].bit
;
8724 printf (" %#x", (unsigned int) flags
);
8734 if (options_offset
!= 0)
8736 Elf_External_Options
* eopt
;
8737 Elf_Internal_Shdr
* sect
= section_headers
;
8738 Elf_Internal_Options
* iopt
;
8739 Elf_Internal_Options
* option
;
8743 /* Find the section header so that we get the size. */
8744 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8747 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
8748 sect
->sh_size
, _("options"));
8751 iopt
= ((Elf_Internal_Options
*)
8752 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (* iopt
)));
8755 error (_("Out of memory"));
8762 while (offset
< sect
->sh_size
)
8764 Elf_External_Options
* eoption
;
8766 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8768 option
->kind
= BYTE_GET (eoption
->kind
);
8769 option
->size
= BYTE_GET (eoption
->size
);
8770 option
->section
= BYTE_GET (eoption
->section
);
8771 option
->info
= BYTE_GET (eoption
->info
);
8773 offset
+= option
->size
;
8779 printf (_("\nSection '%s' contains %d entries:\n"),
8780 SECTION_NAME (sect
), cnt
);
8788 switch (option
->kind
)
8791 /* This shouldn't happen. */
8792 printf (" NULL %d %lx", option
->section
, option
->info
);
8795 printf (" REGINFO ");
8796 if (elf_header
.e_machine
== EM_MIPS
)
8799 Elf32_External_RegInfo
* ereg
;
8800 Elf32_RegInfo reginfo
;
8802 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8803 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8804 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8805 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8806 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8807 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8808 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8810 printf ("GPR %08lx GP 0x%lx\n",
8812 (unsigned long) reginfo
.ri_gp_value
);
8813 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8814 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8815 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8820 Elf64_External_RegInfo
* ereg
;
8821 Elf64_Internal_RegInfo reginfo
;
8823 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8824 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8825 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8826 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8827 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8828 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8829 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
8831 printf ("GPR %08lx GP 0x",
8832 reginfo
.ri_gprmask
);
8833 printf_vma (reginfo
.ri_gp_value
);
8836 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8837 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8838 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8842 case ODK_EXCEPTIONS
:
8843 fputs (" EXCEPTIONS fpe_min(", stdout
);
8844 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8845 fputs (") fpe_max(", stdout
);
8846 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8847 fputs (")", stdout
);
8849 if (option
->info
& OEX_PAGE0
)
8850 fputs (" PAGE0", stdout
);
8851 if (option
->info
& OEX_SMM
)
8852 fputs (" SMM", stdout
);
8853 if (option
->info
& OEX_FPDBUG
)
8854 fputs (" FPDBUG", stdout
);
8855 if (option
->info
& OEX_DISMISS
)
8856 fputs (" DISMISS", stdout
);
8859 fputs (" PAD ", stdout
);
8860 if (option
->info
& OPAD_PREFIX
)
8861 fputs (" PREFIX", stdout
);
8862 if (option
->info
& OPAD_POSTFIX
)
8863 fputs (" POSTFIX", stdout
);
8864 if (option
->info
& OPAD_SYMBOL
)
8865 fputs (" SYMBOL", stdout
);
8868 fputs (" HWPATCH ", stdout
);
8869 if (option
->info
& OHW_R4KEOP
)
8870 fputs (" R4KEOP", stdout
);
8871 if (option
->info
& OHW_R8KPFETCH
)
8872 fputs (" R8KPFETCH", stdout
);
8873 if (option
->info
& OHW_R5KEOP
)
8874 fputs (" R5KEOP", stdout
);
8875 if (option
->info
& OHW_R5KCVTL
)
8876 fputs (" R5KCVTL", stdout
);
8879 fputs (" FILL ", stdout
);
8880 /* XXX Print content of info word? */
8883 fputs (" TAGS ", stdout
);
8884 /* XXX Print content of info word? */
8887 fputs (" HWAND ", stdout
);
8888 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8889 fputs (" R4KEOP_CHECKED", stdout
);
8890 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8891 fputs (" R4KEOP_CLEAN", stdout
);
8894 fputs (" HWOR ", stdout
);
8895 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8896 fputs (" R4KEOP_CHECKED", stdout
);
8897 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8898 fputs (" R4KEOP_CLEAN", stdout
);
8901 printf (" GP_GROUP %#06lx self-contained %#06lx",
8902 option
->info
& OGP_GROUP
,
8903 (option
->info
& OGP_SELF
) >> 16);
8906 printf (" IDENT %#06lx self-contained %#06lx",
8907 option
->info
& OGP_GROUP
,
8908 (option
->info
& OGP_SELF
) >> 16);
8911 /* This shouldn't happen. */
8912 printf (" %3d ??? %d %lx",
8913 option
->kind
, option
->section
, option
->info
);
8917 len
= sizeof (* eopt
);
8918 while (len
< option
->size
)
8919 if (((char *) option
)[len
] >= ' '
8920 && ((char *) option
)[len
] < 0x7f)
8921 printf ("%c", ((char *) option
)[len
++]);
8923 printf ("\\%03o", ((char *) option
)[len
++]);
8925 fputs ("\n", stdout
);
8933 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8935 Elf32_Conflict
* iconf
;
8938 if (dynamic_symbols
== NULL
)
8940 error (_("conflict list with without table"));
8944 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (* iconf
));
8947 error (_("Out of memory"));
8953 Elf32_External_Conflict
* econf32
;
8955 econf32
= ((Elf32_External_Conflict
*)
8956 get_data (NULL
, file
, conflicts_offset
,
8957 conflictsno
* sizeof (* econf32
),
8962 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8963 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8969 Elf64_External_Conflict
* econf64
;
8971 econf64
= ((Elf64_External_Conflict
*)
8972 get_data (NULL
, file
, conflicts_offset
,
8973 conflictsno
* sizeof (* econf64
),
8978 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8979 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8984 printf (_("\nSection '.conflict' contains %ld entries:\n"),
8985 (long) conflictsno
);
8986 puts (_(" Num: Index Value Name"));
8988 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8990 Elf_Internal_Sym
* psym
= &dynamic_symbols
[iconf
[cnt
]];
8992 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8993 print_vma (psym
->st_value
, FULL_HEX
);
8994 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
9004 get_note_type (e_type
)
9007 static char buff
[64];
9011 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
9012 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
9013 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
9014 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
9015 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
9016 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
9017 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
9018 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
9019 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9020 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9021 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
9023 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9028 /* Note that by the ELF standard, the name field is already null byte
9029 terminated, and namesz includes the terminating null byte.
9030 I.E. the value of namesz for the name "FSF" is 4.
9032 If the value of namesz is zero, there is no name present. */
9034 process_note (pnote
)
9035 Elf32_Internal_Note
* pnote
;
9037 printf (" %s\t\t0x%08lx\t%s\n",
9038 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9039 pnote
->descsz
, get_note_type (pnote
->type
));
9045 process_corefile_note_segment (file
, offset
, length
)
9050 Elf_External_Note
* pnotes
;
9051 Elf_External_Note
* external
;
9057 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
9064 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9065 (unsigned long) offset
, (unsigned long) length
);
9066 printf (_(" Owner\t\tData size\tDescription\n"));
9068 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9070 Elf32_Internal_Note inote
;
9073 inote
.type
= BYTE_GET (external
->type
);
9074 inote
.namesz
= BYTE_GET (external
->namesz
);
9075 inote
.namedata
= external
->name
;
9076 inote
.descsz
= BYTE_GET (external
->descsz
);
9077 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9078 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9080 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9082 /* Verify that name is null terminated. It appears that at least
9083 one version of Linux (RedHat 6.0) generates corefiles that don't
9084 comply with the ELF spec by failing to include the null byte in
9086 if (inote
.namedata
[inote
.namesz
] != '\0')
9088 temp
= malloc (inote
.namesz
+ 1);
9092 error (_("Out of memory\n"));
9097 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9098 temp
[inote
.namesz
] = 0;
9100 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9101 inote
.namedata
= temp
;
9104 res
&= process_note (& inote
);
9119 process_corefile_note_segments (file
)
9122 Elf_Internal_Phdr
* program_headers
;
9123 Elf_Internal_Phdr
* segment
;
9127 program_headers
= (Elf_Internal_Phdr
*) malloc
9128 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
9130 if (program_headers
== NULL
)
9132 error (_("Out of memory\n"));
9137 i
= get_32bit_program_headers (file
, program_headers
);
9139 i
= get_64bit_program_headers (file
, program_headers
);
9143 free (program_headers
);
9147 for (i
= 0, segment
= program_headers
;
9148 i
< elf_header
.e_phnum
;
9151 if (segment
->p_type
== PT_NOTE
)
9152 res
&= process_corefile_note_segment (file
,
9153 (bfd_vma
) segment
->p_offset
,
9154 (bfd_vma
) segment
->p_filesz
);
9157 free (program_headers
);
9163 process_corefile_contents (file
)
9166 /* If we have not been asked to display the notes then do nothing. */
9170 /* If file is not a core file then exit. */
9171 if (elf_header
.e_type
!= ET_CORE
)
9174 /* No program headers means no NOTE segment. */
9175 if (elf_header
.e_phnum
== 0)
9177 printf (_("No note segments present in the core file.\n"));
9181 return process_corefile_note_segments (file
);
9185 process_arch_specific (file
)
9191 switch (elf_header
.e_machine
)
9194 case EM_MIPS_RS3_LE
:
9195 return process_mips_specific (file
);
9204 get_file_header (file
)
9207 /* Read in the identity array. */
9208 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
9211 /* Determine how to read the rest of the header. */
9212 switch (elf_header
.e_ident
[EI_DATA
])
9214 default: /* fall through */
9215 case ELFDATANONE
: /* fall through */
9216 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
9217 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
9220 /* For now we only support 32 bit and 64 bit ELF files. */
9221 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
9223 /* Read in the rest of the header. */
9226 Elf32_External_Ehdr ehdr32
;
9228 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
9231 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
9232 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
9233 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
9234 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
9235 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
9236 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
9237 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
9238 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
9239 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
9240 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
9241 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
9242 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
9243 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
9247 Elf64_External_Ehdr ehdr64
;
9249 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9250 we will not be able to cope with the 64bit data found in
9251 64 ELF files. Detect this now and abort before we start
9252 overwritting things. */
9253 if (sizeof (bfd_vma
) < 8)
9255 error (_("This instance of readelf has been built without support for a\n\
9256 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9260 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
9263 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
9264 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
9265 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
9266 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
9267 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
9268 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
9269 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
9270 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
9271 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
9272 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
9273 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
9274 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
9275 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
9278 /* There may be some extensions in the first section header. Don't
9279 bomb if we can't read it. */
9281 get_32bit_section_headers (file
, 1);
9283 get_64bit_section_headers (file
, 1);
9289 process_file (file_name
)
9293 struct stat statbuf
;
9296 if (stat (file_name
, & statbuf
) < 0)
9298 error (_("Cannot stat input file %s.\n"), file_name
);
9302 file
= fopen (file_name
, "rb");
9305 error (_("Input file %s not found.\n"), file_name
);
9309 if (! get_file_header (file
))
9311 error (_("%s: Failed to read file header\n"), file_name
);
9316 /* Initialise per file variables. */
9317 for (i
= NUM_ELEM (version_info
); i
--;)
9318 version_info
[i
] = 0;
9320 for (i
= NUM_ELEM (dynamic_info
); i
--;)
9321 dynamic_info
[i
] = 0;
9323 /* Process the file. */
9325 printf (_("\nFile: %s\n"), file_name
);
9327 if (! process_file_header ())
9333 process_section_headers (file
);
9335 process_program_headers (file
);
9337 process_dynamic_segment (file
);
9339 process_relocs (file
);
9341 process_unwind (file
);
9343 process_symbol_table (file
);
9345 process_syminfo (file
);
9347 process_version_sections (file
);
9349 process_section_contents (file
);
9351 process_corefile_contents (file
);
9353 process_arch_specific (file
);
9357 if (section_headers
)
9359 free (section_headers
);
9360 section_headers
= NULL
;
9365 free (string_table
);
9366 string_table
= NULL
;
9367 string_table_length
= 0;
9370 if (dynamic_strings
)
9372 free (dynamic_strings
);
9373 dynamic_strings
= NULL
;
9376 if (dynamic_symbols
)
9378 free (dynamic_symbols
);
9379 dynamic_symbols
= NULL
;
9380 num_dynamic_syms
= 0;
9383 if (dynamic_syminfo
)
9385 free (dynamic_syminfo
);
9386 dynamic_syminfo
= NULL
;
9392 #ifdef SUPPORT_DISASSEMBLY
9393 /* Needed by the i386 disassembler. For extra credit, someone could
9394 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9398 print_address (unsigned int addr
, FILE * outfile
)
9400 fprintf (outfile
,"0x%8.8x", addr
);
9403 /* Needed by the i386 disassembler. */
9405 db_task_printsym (unsigned int addr
)
9407 print_address (addr
, stderr
);
9411 int main
PARAMS ((int, char **));
9420 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9421 setlocale (LC_MESSAGES
, "");
9423 #if defined (HAVE_SETLOCALE)
9424 setlocale (LC_CTYPE
, "");
9426 bindtextdomain (PACKAGE
, LOCALEDIR
);
9427 textdomain (PACKAGE
);
9429 parse_args (argc
, argv
);
9431 if (optind
< (argc
- 1))
9435 while (optind
< argc
)
9436 err
|= process_file (argv
[optind
++]);
9438 if (dump_sects
!= NULL
)