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"
77 #include "elf/x86-64.h"
83 char * program_name = "readelf";
84 unsigned int dynamic_addr;
85 bfd_size_type dynamic_size;
86 unsigned int rela_addr;
87 unsigned int rela_size;
88 char * dynamic_strings;
90 unsigned long string_table_length;
91 unsigned long num_dynamic_syms;
92 Elf_Internal_Sym * dynamic_symbols;
93 Elf_Internal_Syminfo * dynamic_syminfo;
94 unsigned long dynamic_syminfo_offset;
95 unsigned int dynamic_syminfo_nent;
96 char program_interpreter [64];
97 int dynamic_info[DT_JMPREL + 1];
100 Elf_Internal_Ehdr elf_header;
101 Elf_Internal_Shdr * section_headers;
102 Elf_Internal_Dyn * dynamic_segment;
110 int do_using_dynamic;
117 int do_debug_abbrevs;
119 int do_debug_pubnames;
120 int do_debug_aranges;
122 int do_debug_frames_interp;
123 int do_debug_macinfo;
128 /* A dynamic array of flags indicating which sections require dumping. */
129 char * dump_sects = NULL;
130 unsigned int num_dump_sects = 0;
132 #define HEX_DUMP (1 << 0)
133 #define DISASS_DUMP (1 << 1)
134 #define DEBUG_DUMP (1 << 2)
136 /* How to rpint a vma value. */
137 typedef enum print_mode
149 /* Forward declarations for dumb compilers. */
150 static void print_vma PARAMS ((bfd_vma, print_mode));
151 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
152 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
153 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
154 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
155 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
156 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
157 static const char * get_dynamic_type PARAMS ((unsigned long));
158 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
159 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
160 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
161 static char * get_file_type PARAMS ((unsigned));
162 static char * get_machine_name PARAMS ((unsigned));
163 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
164 static char * get_machine_flags PARAMS ((unsigned, unsigned));
165 static const char * get_mips_segment_type PARAMS ((unsigned long));
166 static const char * get_parisc_segment_type PARAMS ((unsigned long));
167 static const char * get_ia64_segment_type PARAMS ((unsigned long));
168 static const char * get_segment_type PARAMS ((unsigned long));
169 static const char * get_mips_section_type_name PARAMS ((unsigned int));
170 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
171 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
172 static const char * get_section_type_name PARAMS ((unsigned int));
173 static const char * get_symbol_binding PARAMS ((unsigned int));
174 static const char * get_symbol_type PARAMS ((unsigned int));
175 static const char * get_symbol_visibility PARAMS ((unsigned int));
176 static const char * get_symbol_index_type PARAMS ((unsigned int));
177 static const char * get_dynamic_flags PARAMS ((bfd_vma));
178 static void usage PARAMS ((void));
179 static void parse_args PARAMS ((int, char **));
180 static int process_file_header PARAMS ((void));
181 static int process_program_headers PARAMS ((FILE *));
182 static int process_section_headers PARAMS ((FILE *));
183 static int process_unwind PARAMS ((FILE *));
184 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
185 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
186 static int process_dynamic_segment PARAMS ((FILE *));
187 static int process_symbol_table PARAMS ((FILE *));
188 static int process_syminfo PARAMS ((FILE *));
189 static int process_section_contents PARAMS ((FILE *));
190 static void process_mips_fpe_exception PARAMS ((int));
191 static int process_mips_specific PARAMS ((FILE *));
192 static int process_file PARAMS ((char *));
193 static int process_relocs PARAMS ((FILE *));
194 static int process_version_sections PARAMS ((FILE *));
195 static char * get_ver_flags PARAMS ((unsigned int));
196 static int get_32bit_section_headers PARAMS ((FILE *));
197 static int get_64bit_section_headers PARAMS ((FILE *));
198 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
199 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
200 static int get_file_header PARAMS ((FILE *));
201 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
202 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
203 static const char * get_elf_section_flags PARAMS ((bfd_vma));
204 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
205 static int get_32bit_dynamic_segment PARAMS ((FILE *));
206 static int get_64bit_dynamic_segment PARAMS ((FILE *));
207 #ifdef SUPPORT_DISASSEMBLY
208 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
210 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
211 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
212 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
213 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
214 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
215 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
216 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
217 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
218 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
219 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
220 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
221 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
222 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
223 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
224 static void reset_state_machine PARAMS ((int));
225 static char * get_TAG_name PARAMS ((unsigned long));
226 static char * get_AT_name PARAMS ((unsigned long));
227 static char * get_FORM_name PARAMS ((unsigned long));
228 static void free_abbrevs PARAMS ((void));
229 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
230 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
231 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
232 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
233 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
234 static void request_dump PARAMS ((unsigned int, char));
235 static const char * get_elf_class PARAMS ((unsigned char));
236 static const char * get_data_encoding PARAMS ((unsigned char));
237 static const char * get_osabi_name PARAMS ((unsigned char));
238 static int guess_is_rela PARAMS ((unsigned long));
239 static char * get_note_type PARAMS ((unsigned int));
240 static int process_note PARAMS ((Elf32_Internal_Note *));
241 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
242 static int process_corefile_note_segments PARAMS ((FILE *));
243 static int process_corefile_contents PARAMS ((FILE *));
244 static int process_arch_specific PARAMS ((FILE *));
246 typedef int Elf32_Word;
254 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
255 ((X)->sh_name >= string_table_length \
256 ? "<corrupt>" : string_table + (X)->sh_name))
258 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
260 #define BYTE_GET(field) byte_get (field, sizeof (field))
262 /* If we can support a 64 bit data type then BFD64 should be defined
263 and sizeof (bfd_vma) == 8. In this case when translating from an
264 external 8 byte field to an internal field, we can assume that the
265 internal field is also 8 bytes wide and so we can extract all the data.
266 If, however, BFD64 is not defined, then we must assume that the
267 internal data structure only has 4 byte wide fields that are the
268 equivalent of the 8 byte wide external counterparts, and so we must
269 truncate the data. */
271 #define BYTE_GET8(field) byte_get (field, -8)
273 #define BYTE_GET8(field) byte_get (field, 8)
276 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
278 #define GET_ELF_SYMBOLS(file, offset, size) \
279 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
280 : get_64bit_elf_symbols (file, offset, size))
283 #ifdef ANSI_PROTOTYPES
285 error (const char * message, ...)
289 fprintf (stderr, _("%s: Error: "), program_name);
290 va_start (args, message);
291 vfprintf (stderr, message, args);
297 warn (const char * message, ...)
301 fprintf (stderr, _("%s: Warning: "), program_name);
302 va_start (args, message);
303 vfprintf (stderr, message, args);
315 fprintf (stderr, _("%s: Error: "), program_name);
317 message = va_arg (args, char *);
318 vfprintf (stderr, message, args);
330 fprintf (stderr, _("%s: Warning: "), program_name);
332 message = va_arg (args, char *);
333 vfprintf (stderr, message, args);
339 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
342 get_data (var, file, offset, size, reason)
354 if (fseek (file, offset, SEEK_SET))
356 error (_("Unable to seek to %x for %s\n"), offset, reason);
363 mvar = (PTR) malloc (size);
367 error (_("Out of memory allocating %d bytes for %s\n"),
373 if (fread (mvar, size, 1, file) != 1)
375 error (_("Unable to read in %d bytes of %s\n"), size, reason);
385 byte_get_little_endian (field, size)
386 unsigned char * field;
395 return ((unsigned int) (field [0]))
396 | (((unsigned int) (field [1])) << 8);
400 /* We want to extract data from an 8 byte wide field and
401 place it into a 4 byte wide field. Since this is a little
402 endian source we can juts use the 4 byte extraction code. */
406 return ((unsigned long) (field [0]))
407 | (((unsigned long) (field [1])) << 8)
408 | (((unsigned long) (field [2])) << 16)
409 | (((unsigned long) (field [3])) << 24);
414 /* This is a special case, generated by the BYTE_GET8 macro.
415 It means that we are loading an 8 byte value from a field
416 in an external structure into an 8 byte value in a field
417 in an internal strcuture. */
418 return ((bfd_vma) (field [0]))
419 | (((bfd_vma) (field [1])) << 8)
420 | (((bfd_vma) (field [2])) << 16)
421 | (((bfd_vma) (field [3])) << 24)
422 | (((bfd_vma) (field [4])) << 32)
423 | (((bfd_vma) (field [5])) << 40)
424 | (((bfd_vma) (field [6])) << 48)
425 | (((bfd_vma) (field [7])) << 56);
428 error (_("Unhandled data length: %d\n"), size);
433 /* Print a VMA value. */
435 print_vma (vma, mode)
445 case FULL_HEX: printf ("0x"); /* drop through */
446 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
447 case PREFIX_HEX: printf ("0x"); /* drop through */
448 case HEX: printf ("%lx", (unsigned long) vma); break;
449 case DEC: printf ("%ld", (unsigned long) vma); break;
450 case DEC_5: printf ("%5ld", (long) vma); break;
451 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
472 #if BFD_HOST_64BIT_LONG
475 if (_bfd_int64_high (vma))
476 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
478 printf ("%lx", _bfd_int64_low (vma));
483 #if BFD_HOST_64BIT_LONG
486 if (_bfd_int64_high (vma))
488 printf ("++%ld", _bfd_int64_low (vma));
490 printf ("%ld", _bfd_int64_low (vma));
495 #if BFD_HOST_64BIT_LONG
496 printf ("%5ld", vma);
498 if (_bfd_int64_high (vma))
500 printf ("++%ld", _bfd_int64_low (vma));
502 printf ("%5ld", _bfd_int64_low (vma));
507 #if BFD_HOST_64BIT_LONG
510 if (_bfd_int64_high (vma))
512 printf ("++%lu", _bfd_int64_low (vma));
514 printf ("%lu", _bfd_int64_low (vma));
523 byte_get_big_endian (field, size)
524 unsigned char * field;
533 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
536 return ((unsigned long) (field [3]))
537 | (((unsigned long) (field [2])) << 8)
538 | (((unsigned long) (field [1])) << 16)
539 | (((unsigned long) (field [0])) << 24);
543 /* Although we are extracing data from an 8 byte wide field, we
544 are returning only 4 bytes of data. */
545 return ((unsigned long) (field [7]))
546 | (((unsigned long) (field [6])) << 8)
547 | (((unsigned long) (field [5])) << 16)
548 | (((unsigned long) (field [4])) << 24);
552 /* This is a special case, generated by the BYTE_GET8 macro.
553 It means that we are loading an 8 byte value from a field
554 in an external structure into an 8 byte value in a field
555 in an internal strcuture. */
556 return ((bfd_vma) (field [7]))
557 | (((bfd_vma) (field [6])) << 8)
558 | (((bfd_vma) (field [5])) << 16)
559 | (((bfd_vma) (field [4])) << 24)
560 | (((bfd_vma) (field [3])) << 32)
561 | (((bfd_vma) (field [2])) << 40)
562 | (((bfd_vma) (field [1])) << 48)
563 | (((bfd_vma) (field [0])) << 56);
567 error (_("Unhandled data length: %d\n"), size);
572 /* Guess the relocation size commonly used by the specific machines. */
575 guess_is_rela (e_machine)
576 unsigned long e_machine;
580 /* Targets that use REL relocations. */
591 /* Targets that use RELA relocations. */
602 case EM_CYGNUS_MN10200:
603 case EM_CYGNUS_MN10300:
636 warn (_("Don't know about relocations on this machine architecture\n"));
642 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
644 unsigned long rel_offset;
645 unsigned long rel_size;
646 Elf_Internal_Rela **relasp;
647 unsigned long *nrelasp;
649 Elf_Internal_Rela *relas;
650 unsigned long nrelas;
655 Elf32_External_Rela * erelas;
657 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
658 rel_size, _("relocs"));
662 nrelas = rel_size / sizeof (Elf32_External_Rela);
664 relas = (Elf_Internal_Rela *)
665 malloc (nrelas * sizeof (Elf_Internal_Rela));
669 error(_("out of memory parsing relocs"));
673 for (i = 0; i < nrelas; i++)
675 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
676 relas[i].r_info = BYTE_GET (erelas[i].r_info);
677 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
684 Elf64_External_Rela * erelas;
686 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
687 rel_size, _("relocs"));
691 nrelas = rel_size / sizeof (Elf64_External_Rela);
693 relas = (Elf_Internal_Rela *)
694 malloc (nrelas * sizeof (Elf_Internal_Rela));
698 error(_("out of memory parsing relocs"));
702 for (i = 0; i < nrelas; i++)
704 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
705 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
706 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
717 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
719 unsigned long rel_offset;
720 unsigned long rel_size;
721 Elf_Internal_Rel **relsp;
722 unsigned long *nrelsp;
724 Elf_Internal_Rel *rels;
730 Elf32_External_Rel * erels;
732 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
733 rel_size, _("relocs"));
737 nrels = rel_size / sizeof (Elf32_External_Rel);
739 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
743 error(_("out of memory parsing relocs"));
747 for (i = 0; i < nrels; i++)
749 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
750 rels[i].r_info = BYTE_GET (erels[i].r_info);
757 Elf64_External_Rel * erels;
759 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
760 rel_size, _("relocs"));
764 nrels = rel_size / sizeof (Elf64_External_Rel);
766 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
770 error(_("out of memory parsing relocs"));
774 for (i = 0; i < nrels; i++)
776 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
777 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
787 /* Display the contents of the relocation data found at the specified offset. */
789 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
791 unsigned long rel_offset;
792 unsigned long rel_size;
793 Elf_Internal_Sym * symtab;
799 Elf_Internal_Rel * rels;
800 Elf_Internal_Rela * relas;
803 if (is_rela == UNKNOWN)
804 is_rela = guess_is_rela (elf_header.e_machine);
808 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
813 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
821 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
824 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
830 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
833 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
836 for (i = 0; i < rel_size; i++)
841 bfd_vma symtab_index;
846 offset = relas [i].r_offset;
847 info = relas [i].r_info;
851 offset = rels [i].r_offset;
852 info = rels [i].r_info;
857 type = ELF32_R_TYPE (info);
858 symtab_index = ELF32_R_SYM (info);
862 if (elf_header.e_machine == EM_SPARCV9)
863 type = ELF64_R_TYPE_ID (info);
865 type = ELF64_R_TYPE (info);
866 /* The #ifdef BFD64 below is to prevent a compile time warning.
867 We know that if we do not have a 64 bit data type that we
868 will never execute this code anyway. */
870 symtab_index = ELF64_R_SYM (info);
876 #ifdef _bfd_int64_low
877 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
879 printf ("%8.8lx %8.8lx ", offset, info);
884 #ifdef _bfd_int64_low
885 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
886 _bfd_int64_high (offset),
887 _bfd_int64_low (offset),
888 _bfd_int64_high (info),
889 _bfd_int64_low (info));
891 printf ("%16.16lx %16.16lx ", offset, info);
895 switch (elf_header.e_machine)
902 rtype = elf_m32r_reloc_type (type);
907 rtype = elf_i386_reloc_type (type);
911 rtype = elf_m68k_reloc_type (type);
915 rtype = elf_i960_reloc_type (type);
919 rtype = elf_avr_reloc_type (type);
926 rtype = elf_sparc_reloc_type (type);
930 rtype = v850_reloc_type (type);
934 rtype = elf_d10v_reloc_type (type);
938 rtype = elf_d30v_reloc_type (type);
942 rtype = elf_sh_reloc_type (type);
945 case EM_CYGNUS_MN10300:
946 rtype = elf_mn10300_reloc_type (type);
949 case EM_CYGNUS_MN10200:
950 rtype = elf_mn10200_reloc_type (type);
954 rtype = elf_fr30_reloc_type (type);
958 rtype = elf_mcore_reloc_type (type);
963 rtype = elf_ppc_reloc_type (type);
968 rtype = elf_mips_reloc_type (type);
972 rtype = elf_alpha_reloc_type (type);
976 rtype = elf_arm_reloc_type (type);
981 rtype = elf_arc_reloc_type (type);
985 rtype = elf_hppa_reloc_type (type);
991 rtype = elf_h8_reloc_type (type);
995 rtype = elf_pj_reloc_type (type);
998 rtype = elf_ia64_reloc_type (type);
1002 rtype = elf_cris_reloc_type (type);
1006 rtype = elf_i860_reloc_type (type);
1010 rtype = elf_x86_64_reloc_type (type);
1015 rtype = elf_s390_reloc_type (type);
1020 #ifdef _bfd_int64_low
1021 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
1023 printf (_("unrecognised: %-7lx"), type);
1026 printf ("%-21.21s", rtype);
1030 if (symtab == NULL || symtab_index >= nsyms)
1031 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1034 Elf_Internal_Sym * psym;
1036 psym = symtab + symtab_index;
1039 print_vma (psym->st_value, LONG_HEX);
1042 if (psym->st_name == 0)
1044 SECTION_NAME (section_headers + psym->st_shndx));
1045 else if (strtab == NULL)
1046 printf (_("<string table index %3ld>"), psym->st_name);
1048 printf ("%-25.25s", strtab + psym->st_name);
1051 printf (" + %lx", (unsigned long) relas [i].r_addend);
1056 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1057 print_vma (relas[i].r_addend, LONG_HEX);
1060 if (elf_header.e_machine == EM_SPARCV9
1061 && !strcmp (rtype, "R_SPARC_OLO10"))
1062 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1076 get_mips_dynamic_type (type)
1081 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1082 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1083 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1084 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1085 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1086 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1087 case DT_MIPS_MSYM: return "MIPS_MSYM";
1088 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1089 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1090 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1091 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1092 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1093 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1094 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1095 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1096 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1097 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1098 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1099 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1100 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1101 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1102 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1103 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1104 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1105 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1106 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1107 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1108 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1109 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1110 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1111 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1112 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1113 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1114 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1115 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1116 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1117 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1118 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1119 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1120 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1121 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1122 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1123 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1130 get_sparc64_dynamic_type (type)
1135 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1142 get_parisc_dynamic_type (type)
1147 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1148 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1149 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1150 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1151 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1152 case DT_HP_PREINIT: return "HP_PREINIT";
1153 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1154 case DT_HP_NEEDED: return "HP_NEEDED";
1155 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1156 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1157 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1158 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1159 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1166 get_dynamic_type (type)
1169 static char buff [32];
1173 case DT_NULL: return "NULL";
1174 case DT_NEEDED: return "NEEDED";
1175 case DT_PLTRELSZ: return "PLTRELSZ";
1176 case DT_PLTGOT: return "PLTGOT";
1177 case DT_HASH: return "HASH";
1178 case DT_STRTAB: return "STRTAB";
1179 case DT_SYMTAB: return "SYMTAB";
1180 case DT_RELA: return "RELA";
1181 case DT_RELASZ: return "RELASZ";
1182 case DT_RELAENT: return "RELAENT";
1183 case DT_STRSZ: return "STRSZ";
1184 case DT_SYMENT: return "SYMENT";
1185 case DT_INIT: return "INIT";
1186 case DT_FINI: return "FINI";
1187 case DT_SONAME: return "SONAME";
1188 case DT_RPATH: return "RPATH";
1189 case DT_SYMBOLIC: return "SYMBOLIC";
1190 case DT_REL: return "REL";
1191 case DT_RELSZ: return "RELSZ";
1192 case DT_RELENT: return "RELENT";
1193 case DT_PLTREL: return "PLTREL";
1194 case DT_DEBUG: return "DEBUG";
1195 case DT_TEXTREL: return "TEXTREL";
1196 case DT_JMPREL: return "JMPREL";
1197 case DT_BIND_NOW: return "BIND_NOW";
1198 case DT_INIT_ARRAY: return "INIT_ARRAY";
1199 case DT_FINI_ARRAY: return "FINI_ARRAY";
1200 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1201 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1202 case DT_RUNPATH: return "RUNPATH";
1203 case DT_FLAGS: return "FLAGS";
1205 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1206 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1208 case DT_CHECKSUM: return "CHECKSUM";
1209 case DT_PLTPADSZ: return "PLTPADSZ";
1210 case DT_MOVEENT: return "MOVEENT";
1211 case DT_MOVESZ: return "MOVESZ";
1212 case DT_FEATURE: return "FEATURE";
1213 case DT_POSFLAG_1: return "POSFLAG_1";
1214 case DT_SYMINSZ: return "SYMINSZ";
1215 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1217 case DT_ADDRRNGLO: return "ADDRRNGLO";
1218 case DT_CONFIG: return "CONFIG";
1219 case DT_DEPAUDIT: return "DEPAUDIT";
1220 case DT_AUDIT: return "AUDIT";
1221 case DT_PLTPAD: return "PLTPAD";
1222 case DT_MOVETAB: return "MOVETAB";
1223 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1225 case DT_VERSYM: return "VERSYM";
1227 case DT_RELACOUNT: return "RELACOUNT";
1228 case DT_RELCOUNT: return "RELCOUNT";
1229 case DT_FLAGS_1: return "FLAGS_1";
1230 case DT_VERDEF: return "VERDEF";
1231 case DT_VERDEFNUM: return "VERDEFNUM";
1232 case DT_VERNEED: return "VERNEED";
1233 case DT_VERNEEDNUM: return "VERNEEDNUM";
1235 case DT_AUXILIARY: return "AUXILIARY";
1236 case DT_USED: return "USED";
1237 case DT_FILTER: return "FILTER";
1240 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1242 const char * result;
1244 switch (elf_header.e_machine)
1247 case EM_MIPS_RS3_LE:
1248 result = get_mips_dynamic_type (type);
1251 result = get_sparc64_dynamic_type (type);
1261 sprintf (buff, _("Processor Specific: %lx"), type);
1263 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1265 const char * result;
1267 switch (elf_header.e_machine)
1270 result = get_parisc_dynamic_type (type);
1280 sprintf (buff, _("Operating System specific: %lx"), type);
1283 sprintf (buff, _("<unknown>: %lx"), type);
1290 get_file_type (e_type)
1293 static char buff [32];
1297 case ET_NONE: return _("NONE (None)");
1298 case ET_REL: return _("REL (Relocatable file)");
1299 case ET_EXEC: return _("EXEC (Executable file)");
1300 case ET_DYN: return _("DYN (Shared object file)");
1301 case ET_CORE: return _("CORE (Core file)");
1304 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1305 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1306 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1307 sprintf (buff, _("OS Specific: (%x)"), e_type);
1309 sprintf (buff, _("<unknown>: %x"), e_type);
1315 get_machine_name (e_machine)
1318 static char buff [64]; /* XXX */
1322 case EM_NONE: return _("None");
1323 case EM_M32: return "WE32100";
1324 case EM_SPARC: return "Sparc";
1325 case EM_386: return "Intel 80386";
1326 case EM_68K: return "MC68000";
1327 case EM_88K: return "MC88000";
1328 case EM_486: return "Intel 80486";
1329 case EM_860: return "Intel 80860";
1330 case EM_MIPS: return "MIPS R3000";
1331 case EM_S370: return "IBM System/370";
1332 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1333 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1334 case EM_PARISC: return "HPPA";
1335 case EM_PPC_OLD: return "Power PC (old)";
1336 case EM_SPARC32PLUS: return "Sparc v8+" ;
1337 case EM_960: return "Intel 90860";
1338 case EM_PPC: return "PowerPC";
1339 case EM_V800: return "NEC V800";
1340 case EM_FR20: return "Fujitsu FR20";
1341 case EM_RH32: return "TRW RH32";
1342 case EM_MCORE: return "MCORE";
1343 case EM_ARM: return "ARM";
1344 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1345 case EM_SH: return "Hitachi SH";
1346 case EM_SPARCV9: return "Sparc v9";
1347 case EM_TRICORE: return "Siemens Tricore";
1348 case EM_ARC: return "ARC";
1349 case EM_H8_300: return "Hitachi H8/300";
1350 case EM_H8_300H: return "Hitachi H8/300H";
1351 case EM_H8S: return "Hitachi H8S";
1352 case EM_H8_500: return "Hitachi H8/500";
1353 case EM_IA_64: return "Intel IA-64";
1354 case EM_MIPS_X: return "Stanford MIPS-X";
1355 case EM_COLDFIRE: return "Motorola Coldfire";
1356 case EM_68HC12: return "Motorola M68HC12";
1357 case EM_ALPHA: return "Alpha";
1358 case EM_CYGNUS_D10V: return "d10v";
1359 case EM_CYGNUS_D30V: return "d30v";
1360 case EM_CYGNUS_ARC: return "ARC";
1361 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1362 case EM_CYGNUS_V850: return "NEC v850";
1363 case EM_CYGNUS_MN10300: return "mn10300";
1364 case EM_CYGNUS_MN10200: return "mn10200";
1365 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1366 case EM_PJ: return "picoJava";
1367 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1368 case EM_PCP: return "Siemens PCP";
1369 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1370 case EM_NDR1: return "Denso NDR1 microprocesspr";
1371 case EM_STARCORE: return "Motorola Star*Core processor";
1372 case EM_ME16: return "Toyota ME16 processor";
1373 case EM_ST100: return "STMicroelectronics ST100 processor";
1374 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1375 case EM_FX66: return "Siemens FX66 microcontroller";
1376 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1377 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1378 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1379 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1380 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1381 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1382 case EM_SVX: return "Silicon Graphics SVx";
1383 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1384 case EM_VAX: return "Digital VAX";
1385 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1386 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1387 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1388 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1389 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1390 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1391 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1392 case EM_PRISM: return "SiTera Prism";
1393 case EM_X86_64: return "Advanced Micro Devices X86-64";
1395 case EM_S390: return "IBM S/390";
1397 sprintf (buff, _("<unknown>: %x"), e_machine);
1403 decode_ARM_machine_flags (e_flags, buf)
1410 eabi = EF_ARM_EABI_VERSION (e_flags);
1411 e_flags &= ~ EF_ARM_EABIMASK;
1413 /* Handle "generic" ARM flags. */
1414 if (e_flags & EF_ARM_RELEXEC)
1416 strcat (buf, ", relocatable executable");
1417 e_flags &= ~ EF_ARM_RELEXEC;
1420 if (e_flags & EF_ARM_HASENTRY)
1422 strcat (buf, ", has entry point");
1423 e_flags &= ~ EF_ARM_HASENTRY;
1426 /* Now handle EABI specific flags. */
1430 strcat (buf, ", <unrecognised EABI>");
1435 case EF_ARM_EABI_VER1:
1436 strcat (buf, ", Version1 EABI");
1441 /* Process flags one bit at a time. */
1442 flag = e_flags & - e_flags;
1447 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1448 strcat (buf, ", sorted symbol tables");
1458 case EF_ARM_EABI_VER2:
1459 strcat (buf, ", Version2 EABI");
1464 /* Process flags one bit at a time. */
1465 flag = e_flags & - e_flags;
1470 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1471 strcat (buf, ", sorted symbol tables");
1474 case EF_ARM_DYNSYMSUSESEGIDX:
1475 strcat (buf, ", dynamic symbols use segment index");
1478 case EF_ARM_MAPSYMSFIRST:
1479 strcat (buf, ", mapping symbols precede others");
1489 case EF_ARM_EABI_UNKNOWN:
1490 strcat (buf, ", GNU EABI");
1495 /* Process flags one bit at a time. */
1496 flag = e_flags & - e_flags;
1501 case EF_ARM_INTERWORK:
1502 strcat (buf, ", interworking enabled");
1505 case EF_ARM_APCS_26:
1506 strcat (buf, ", uses APCS/26");
1509 case EF_ARM_APCS_FLOAT:
1510 strcat (buf, ", uses APCS/float");
1514 strcat (buf, ", position independent");
1518 strcat (buf, ", 8 bit structure alignment");
1521 case EF_ARM_NEW_ABI:
1522 strcat (buf, ", uses new ABI");
1525 case EF_ARM_OLD_ABI:
1526 strcat (buf, ", uses old ABI");
1529 case EF_ARM_SOFT_FLOAT:
1530 strcat (buf, ", software FP");
1541 strcat (buf,", <unknown>");
1545 get_machine_flags (e_flags, e_machine)
1549 static char buf [1024];
1561 decode_ARM_machine_flags (e_flags, buf);
1565 if (e_flags & EF_CPU32)
1566 strcat (buf, ", cpu32");
1570 if (e_flags & EF_PPC_EMB)
1571 strcat (buf, ", emb");
1573 if (e_flags & EF_PPC_RELOCATABLE)
1574 strcat (buf, ", relocatable");
1576 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1577 strcat (buf, ", relocatable-lib");
1580 case EM_CYGNUS_V850:
1581 switch (e_flags & EF_V850_ARCH)
1584 strcat (buf, ", v850e");
1587 strcat (buf, ", v850ea");
1590 strcat (buf, ", v850");
1593 strcat (buf, ", unknown v850 architecture variant");
1598 case EM_CYGNUS_M32R:
1599 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1600 strcat (buf, ", m32r");
1605 case EM_MIPS_RS3_LE:
1606 if (e_flags & EF_MIPS_NOREORDER)
1607 strcat (buf, ", noreorder");
1609 if (e_flags & EF_MIPS_PIC)
1610 strcat (buf, ", pic");
1612 if (e_flags & EF_MIPS_CPIC)
1613 strcat (buf, ", cpic");
1615 if (e_flags & EF_MIPS_UCODE)
1616 strcat (buf, ", ugen_reserved");
1618 if (e_flags & EF_MIPS_ABI2)
1619 strcat (buf, ", abi2");
1621 if (e_flags & EF_MIPS_32BITMODE)
1622 strcat (buf, ", 32bitmode");
1624 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1625 strcat (buf, ", mips1");
1627 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1628 strcat (buf, ", mips2");
1630 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1631 strcat (buf, ", mips3");
1633 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1634 strcat (buf, ", mips4");
1636 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
1637 strcat (buf, ", mips5");
1639 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
1640 strcat (buf, ", mips32");
1642 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
1643 strcat (buf, ", mips64");
1645 switch ((e_flags & EF_MIPS_MACH))
1647 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1648 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1649 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1650 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1651 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1652 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1653 default: strcat (buf, " UNKNOWN"); break;
1658 if (e_flags & EF_SPARC_32PLUS)
1659 strcat (buf, ", v8+");
1661 if (e_flags & EF_SPARC_SUN_US1)
1662 strcat (buf, ", ultrasparcI");
1664 if (e_flags & EF_SPARC_SUN_US3)
1665 strcat (buf, ", ultrasparcIII");
1667 if (e_flags & EF_SPARC_HAL_R1)
1668 strcat (buf, ", halr1");
1670 if (e_flags & EF_SPARC_LEDATA)
1671 strcat (buf, ", ledata");
1673 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1674 strcat (buf, ", tso");
1676 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1677 strcat (buf, ", pso");
1679 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1680 strcat (buf, ", rmo");
1684 switch (e_flags & EF_PARISC_ARCH)
1686 case EFA_PARISC_1_0:
1687 strcpy (buf, ", PA-RISC 1.0");
1689 case EFA_PARISC_1_1:
1690 strcpy (buf, ", PA-RISC 1.1");
1692 case EFA_PARISC_2_0:
1693 strcpy (buf, ", PA-RISC 2.0");
1698 if (e_flags & EF_PARISC_TRAPNIL)
1699 strcat (buf, ", trapnil");
1700 if (e_flags & EF_PARISC_EXT)
1701 strcat (buf, ", ext");
1702 if (e_flags & EF_PARISC_LSB)
1703 strcat (buf, ", lsb");
1704 if (e_flags & EF_PARISC_WIDE)
1705 strcat (buf, ", wide");
1706 if (e_flags & EF_PARISC_NO_KABP)
1707 strcat (buf, ", no kabp");
1708 if (e_flags & EF_PARISC_LAZYSWAP)
1709 strcat (buf, ", lazyswap");
1713 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1714 strcat (buf, ", new calling convention");
1716 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1717 strcat (buf, ", gnu calling convention");
1721 if ((e_flags & EF_IA_64_ABI64))
1722 strcat (buf, ", 64-bit");
1724 strcat (buf, ", 32-bit");
1725 if ((e_flags & EF_IA_64_REDUCEDFP))
1726 strcat (buf, ", reduced fp model");
1727 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1728 strcat (buf, ", no function descriptors, constant gp");
1729 else if ((e_flags & EF_IA_64_CONS_GP))
1730 strcat (buf, ", constant gp");
1731 if ((e_flags & EF_IA_64_ABSOLUTE))
1732 strcat (buf, ", absolute");
1741 get_mips_segment_type (type)
1746 case PT_MIPS_REGINFO:
1748 case PT_MIPS_RTPROC:
1750 case PT_MIPS_OPTIONS:
1760 get_parisc_segment_type (type)
1765 case PT_HP_TLS: return "HP_TLS";
1766 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1767 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1768 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1769 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1770 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1771 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1772 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1773 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1774 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1775 case PT_HP_PARALLEL: return "HP_PARALLEL";
1776 case PT_HP_FASTBIND: return "HP_FASTBIND";
1777 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1778 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1787 get_ia64_segment_type (type)
1792 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1793 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1802 get_segment_type (p_type)
1803 unsigned long p_type;
1805 static char buff [32];
1809 case PT_NULL: return "NULL";
1810 case PT_LOAD: return "LOAD";
1811 case PT_DYNAMIC: return "DYNAMIC";
1812 case PT_INTERP: return "INTERP";
1813 case PT_NOTE: return "NOTE";
1814 case PT_SHLIB: return "SHLIB";
1815 case PT_PHDR: return "PHDR";
1818 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1820 const char * result;
1822 switch (elf_header.e_machine)
1825 case EM_MIPS_RS3_LE:
1826 result = get_mips_segment_type (p_type);
1829 result = get_parisc_segment_type (p_type);
1832 result = get_ia64_segment_type (p_type);
1842 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1844 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1846 const char * result;
1848 switch (elf_header.e_machine)
1851 result = get_parisc_segment_type (p_type);
1861 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1864 sprintf (buff, _("<unknown>: %lx"), p_type);
1871 get_mips_section_type_name (sh_type)
1872 unsigned int sh_type;
1876 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1877 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1878 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1879 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1880 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1881 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1882 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1883 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1884 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1885 case SHT_MIPS_RELD: return "MIPS_RELD";
1886 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1887 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1888 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1889 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1890 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1891 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1892 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1893 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1894 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1895 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1896 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1897 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1898 case SHT_MIPS_LINE: return "MIPS_LINE";
1899 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1900 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1901 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1902 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1903 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1904 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1905 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1906 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1907 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1908 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1909 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1910 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1911 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1912 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1913 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1914 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1922 get_parisc_section_type_name (sh_type)
1923 unsigned int sh_type;
1927 case SHT_PARISC_EXT: return "PARISC_EXT";
1928 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1929 case SHT_PARISC_DOC: return "PARISC_DOC";
1937 get_ia64_section_type_name (sh_type)
1938 unsigned int sh_type;
1942 case SHT_IA_64_EXT: return "IA_64_EXT";
1943 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
1951 get_section_type_name (sh_type)
1952 unsigned int sh_type;
1954 static char buff [32];
1958 case SHT_NULL: return "NULL";
1959 case SHT_PROGBITS: return "PROGBITS";
1960 case SHT_SYMTAB: return "SYMTAB";
1961 case SHT_STRTAB: return "STRTAB";
1962 case SHT_RELA: return "RELA";
1963 case SHT_HASH: return "HASH";
1964 case SHT_DYNAMIC: return "DYNAMIC";
1965 case SHT_NOTE: return "NOTE";
1966 case SHT_NOBITS: return "NOBITS";
1967 case SHT_REL: return "REL";
1968 case SHT_SHLIB: return "SHLIB";
1969 case SHT_DYNSYM: return "DYNSYM";
1970 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1971 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1972 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1973 case SHT_GROUP: return "GROUP";
1974 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
1975 case SHT_GNU_verdef: return "VERDEF";
1976 case SHT_GNU_verneed: return "VERNEED";
1977 case SHT_GNU_versym: return "VERSYM";
1978 case 0x6ffffff0: return "VERSYM";
1979 case 0x6ffffffc: return "VERDEF";
1980 case 0x7ffffffd: return "AUXILIARY";
1981 case 0x7fffffff: return "FILTER";
1984 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1986 const char * result;
1988 switch (elf_header.e_machine)
1991 case EM_MIPS_RS3_LE:
1992 result = get_mips_section_type_name (sh_type);
1995 result = get_parisc_section_type_name (sh_type);
1998 result = get_ia64_section_type_name (sh_type);
2008 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
2010 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2011 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
2012 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2013 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
2015 sprintf (buff, _("<unknown>: %x"), sh_type);
2021 struct option options [] =
2023 {"all", no_argument, 0, 'a'},
2024 {"file-header", no_argument, 0, 'h'},
2025 {"program-headers", no_argument, 0, 'l'},
2026 {"headers", no_argument, 0, 'e'},
2027 {"histogram", no_argument, 0, 'I'},
2028 {"segments", no_argument, 0, 'l'},
2029 {"sections", no_argument, 0, 'S'},
2030 {"section-headers", no_argument, 0, 'S'},
2031 {"symbols", no_argument, 0, 's'},
2032 {"syms", no_argument, 0, 's'},
2033 {"relocs", no_argument, 0, 'r'},
2034 {"notes", no_argument, 0, 'n'},
2035 {"dynamic", no_argument, 0, 'd'},
2036 {"arch-specific", no_argument, 0, 'A'},
2037 {"version-info", no_argument, 0, 'V'},
2038 {"use-dynamic", no_argument, 0, 'D'},
2039 {"hex-dump", required_argument, 0, 'x'},
2040 {"debug-dump", optional_argument, 0, 'w'},
2041 {"unwind", no_argument, 0, 'u'},
2042 #ifdef SUPPORT_DISASSEMBLY
2043 {"instruction-dump", required_argument, 0, 'i'},
2046 {"version", no_argument, 0, 'v'},
2047 {"help", no_argument, 0, 'H'},
2048 {0, no_argument, 0, 0}
2054 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
2055 fprintf (stdout, _(" Options are:\n"));
2056 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2057 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
2058 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
2059 fprintf (stdout, _(" Display the program headers\n"));
2060 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
2061 fprintf (stdout, _(" Display the sections' header\n"));
2062 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
2063 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
2064 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
2065 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
2066 fprintf (stdout, _(" -u or --unwind Display the unwind info (if present)\n"));
2067 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2068 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
2069 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2070 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2071 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
2072 fprintf (stdout, _(" Dump the contents of section <number>\n"));
2073 fprintf (stdout, _(" -w[liaprmf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames]\n"));
2074 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
2075 #ifdef SUPPORT_DISASSEMBLY
2076 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
2077 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
2079 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2080 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
2081 fprintf (stdout, _(" -H or --help Display this information\n"));
2082 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2088 request_dump (section, type)
2089 unsigned int section;
2092 if (section >= num_dump_sects)
2094 char * new_dump_sects;
2096 new_dump_sects = (char *) calloc (section + 1, 1);
2098 if (new_dump_sects == NULL)
2099 error (_("Out of memory allocating dump request table."));
2102 /* Copy current flag settings. */
2103 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2107 dump_sects = new_dump_sects;
2108 num_dump_sects = section + 1;
2113 dump_sects [section] |= type;
2119 parse_args (argc, argv)
2128 while ((c = getopt_long
2129 (argc, argv, "ersuahnldSDAIw::x:i:vV", options, NULL)) != EOF)
2165 do_using_dynamic ++;
2196 section = strtoul (optarg, & cp, 0);
2197 if (! * cp && section >= 0)
2199 request_dump (section, HEX_DUMP);
2219 do_debug_abbrevs = 1;
2229 do_debug_pubnames = 1;
2234 do_debug_aranges = 1;
2238 do_debug_frames_interp = 1;
2240 do_debug_frames = 1;
2245 do_debug_macinfo = 1;
2249 warn (_("Unrecognised debug option '%s'\n"), optarg);
2254 #ifdef SUPPORT_DISASSEMBLY
2257 section = strtoul (optarg, & cp, 0);
2258 if (! * cp && section >= 0)
2260 request_dump (section, DISASS_DUMP);
2266 print_version (program_name);
2273 /* xgettext:c-format */
2274 error (_("Invalid option '-%c'\n"), c);
2281 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2282 && !do_segments && !do_header && !do_dump && !do_version
2283 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2287 warn (_("Nothing to do.\n"));
2293 get_elf_class (elf_class)
2294 unsigned char elf_class;
2296 static char buff [32];
2300 case ELFCLASSNONE: return _("none");
2301 case ELFCLASS32: return _("ELF32");
2302 case ELFCLASS64: return _("ELF64");
2304 sprintf (buff, _("<unknown: %x>"), elf_class);
2310 get_data_encoding (encoding)
2311 unsigned char encoding;
2313 static char buff [32];
2317 case ELFDATANONE: return _("none");
2318 case ELFDATA2LSB: return _("2's complement, little endian");
2319 case ELFDATA2MSB: return _("2's complement, big endian");
2321 sprintf (buff, _("<unknown: %x>"), encoding);
2327 get_osabi_name (osabi)
2328 unsigned char osabi;
2330 static char buff [32];
2334 case ELFOSABI_NONE: return _("UNIX - System V");
2335 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2336 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2337 case ELFOSABI_LINUX: return _("UNIX - Linux");
2338 case ELFOSABI_HURD: return _("GNU/Hurd");
2339 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2340 case ELFOSABI_AIX: return _("UNIX - AIX");
2341 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2342 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2343 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2344 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2345 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2346 case ELFOSABI_STANDALONE: return _("Standalone App");
2347 case ELFOSABI_ARM: return _("ARM");
2349 sprintf (buff, _("<unknown: %x>"), osabi);
2354 /* Decode the data held in 'elf_header'. */
2356 process_file_header ()
2358 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2359 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2360 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2361 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2364 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2372 printf (_("ELF Header:\n"));
2373 printf (_(" Magic: "));
2374 for (i = 0; i < EI_NIDENT; i ++)
2375 printf ("%2.2x ", elf_header.e_ident [i]);
2377 printf (_(" Class: %s\n"),
2378 get_elf_class (elf_header.e_ident [EI_CLASS]));
2379 printf (_(" Data: %s\n"),
2380 get_data_encoding (elf_header.e_ident [EI_DATA]));
2381 printf (_(" Version: %d %s\n"),
2382 elf_header.e_ident [EI_VERSION],
2383 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2385 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2388 printf (_(" OS/ABI: %s\n"),
2389 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2390 printf (_(" ABI Version: %d\n"),
2391 elf_header.e_ident [EI_ABIVERSION]);
2392 printf (_(" Type: %s\n"),
2393 get_file_type (elf_header.e_type));
2394 printf (_(" Machine: %s\n"),
2395 get_machine_name (elf_header.e_machine));
2396 printf (_(" Version: 0x%lx\n"),
2397 (unsigned long) elf_header.e_version);
2399 printf (_(" Entry point address: "));
2400 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2401 printf (_("\n Start of program headers: "));
2402 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2403 printf (_(" (bytes into file)\n Start of section headers: "));
2404 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2405 printf (_(" (bytes into file)\n"));
2407 printf (_(" Flags: 0x%lx%s\n"),
2408 (unsigned long) elf_header.e_flags,
2409 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2410 printf (_(" Size of this header: %ld (bytes)\n"),
2411 (long) elf_header.e_ehsize);
2412 printf (_(" Size of program headers: %ld (bytes)\n"),
2413 (long) elf_header.e_phentsize);
2414 printf (_(" Number of program headers: %ld\n"),
2415 (long) elf_header.e_phnum);
2416 printf (_(" Size of section headers: %ld (bytes)\n"),
2417 (long) elf_header.e_shentsize);
2418 printf (_(" Number of section headers: %ld\n"),
2419 (long) elf_header.e_shnum);
2420 printf (_(" Section header string table index: %ld\n"),
2421 (long) elf_header.e_shstrndx);
2429 get_32bit_program_headers (file, program_headers)
2431 Elf_Internal_Phdr * program_headers;
2433 Elf32_External_Phdr * phdrs;
2434 Elf32_External_Phdr * external;
2435 Elf32_Internal_Phdr * internal;
2438 phdrs = ((Elf32_External_Phdr *)
2439 get_data (NULL, file, elf_header.e_phoff,
2440 elf_header.e_phentsize * elf_header.e_phnum,
2441 _("program headers")));
2445 for (i = 0, internal = program_headers, external = phdrs;
2446 i < elf_header.e_phnum;
2447 i ++, internal ++, external ++)
2449 internal->p_type = BYTE_GET (external->p_type);
2450 internal->p_offset = BYTE_GET (external->p_offset);
2451 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2452 internal->p_paddr = BYTE_GET (external->p_paddr);
2453 internal->p_filesz = BYTE_GET (external->p_filesz);
2454 internal->p_memsz = BYTE_GET (external->p_memsz);
2455 internal->p_flags = BYTE_GET (external->p_flags);
2456 internal->p_align = BYTE_GET (external->p_align);
2465 get_64bit_program_headers (file, program_headers)
2467 Elf_Internal_Phdr * program_headers;
2469 Elf64_External_Phdr * phdrs;
2470 Elf64_External_Phdr * external;
2471 Elf64_Internal_Phdr * internal;
2474 phdrs = ((Elf64_External_Phdr *)
2475 get_data (NULL, file, elf_header.e_phoff,
2476 elf_header.e_phentsize * elf_header.e_phnum,
2477 _("program headers")));
2481 for (i = 0, internal = program_headers, external = phdrs;
2482 i < elf_header.e_phnum;
2483 i ++, internal ++, external ++)
2485 internal->p_type = BYTE_GET (external->p_type);
2486 internal->p_flags = BYTE_GET (external->p_flags);
2487 internal->p_offset = BYTE_GET8 (external->p_offset);
2488 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2489 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2490 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2491 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2492 internal->p_align = BYTE_GET8 (external->p_align);
2501 process_program_headers (file)
2504 Elf_Internal_Phdr * program_headers;
2505 Elf_Internal_Phdr * segment;
2508 if (elf_header.e_phnum == 0)
2511 printf (_("\nThere are no program headers in this file.\n"));
2515 if (do_segments && !do_header)
2517 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2518 printf (_("Entry point "));
2519 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2520 printf (_("\nThere are %d program headers, starting at offset "),
2521 elf_header.e_phnum);
2522 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2526 program_headers = (Elf_Internal_Phdr *) malloc
2527 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2529 if (program_headers == NULL)
2531 error (_("Out of memory\n"));
2536 i = get_32bit_program_headers (file, program_headers);
2538 i = get_64bit_program_headers (file, program_headers);
2542 free (program_headers);
2549 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2553 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2557 (_(" Type Offset VirtAddr PhysAddr\n"));
2559 (_(" FileSiz MemSiz Flags Align\n"));
2567 for (i = 0, segment = program_headers;
2568 i < elf_header.e_phnum;
2573 printf (" %-14.14s ", get_segment_type (segment->p_type));
2577 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2578 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2579 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2580 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2581 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2583 (segment->p_flags & PF_R ? 'R' : ' '),
2584 (segment->p_flags & PF_W ? 'W' : ' '),
2585 (segment->p_flags & PF_X ? 'E' : ' '));
2586 printf ("%#lx", (unsigned long) segment->p_align);
2590 print_vma (segment->p_offset, FULL_HEX);
2592 print_vma (segment->p_vaddr, FULL_HEX);
2594 print_vma (segment->p_paddr, FULL_HEX);
2596 print_vma (segment->p_filesz, FULL_HEX);
2598 print_vma (segment->p_memsz, FULL_HEX);
2600 (segment->p_flags & PF_R ? 'R' : ' '),
2601 (segment->p_flags & PF_W ? 'W' : ' '),
2602 (segment->p_flags & PF_X ? 'E' : ' '));
2603 print_vma (segment->p_align, HEX);
2607 switch (segment->p_type)
2611 loadaddr = (segment->p_vaddr & 0xfffff000)
2612 - (segment->p_offset & 0xfffff000);
2617 error (_("more than one dynamic segment\n"));
2619 dynamic_addr = segment->p_offset;
2620 dynamic_size = segment->p_filesz;
2624 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2625 error (_("Unable to find program interpreter name\n"));
2628 program_interpreter[0] = 0;
2629 fscanf (file, "%63s", program_interpreter);
2632 printf (_("\n [Requesting program interpreter: %s]"),
2633 program_interpreter);
2639 putc ('\n', stdout);
2648 if (do_segments && section_headers != NULL)
2650 printf (_("\n Section to Segment mapping:\n"));
2651 printf (_(" Segment Sections...\n"));
2653 assert (string_table != NULL);
2655 for (i = 0; i < elf_header.e_phnum; i++)
2658 Elf_Internal_Shdr * section;
2660 segment = program_headers + i;
2661 section = section_headers;
2663 printf (" %2.2d ", i);
2665 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2667 if (section->sh_size > 0
2668 /* Compare allocated sections by VMA, unallocated
2669 sections by file offset. */
2670 && (section->sh_flags & SHF_ALLOC
2671 ? (section->sh_addr >= segment->p_vaddr
2672 && section->sh_addr + section->sh_size
2673 <= segment->p_vaddr + segment->p_memsz)
2674 : ((bfd_vma) section->sh_offset >= segment->p_offset
2675 && (section->sh_offset + section->sh_size
2676 <= segment->p_offset + segment->p_filesz))))
2677 printf ("%s ", SECTION_NAME (section));
2684 free (program_headers);
2691 get_32bit_section_headers (file)
2694 Elf32_External_Shdr * shdrs;
2695 Elf32_Internal_Shdr * internal;
2698 shdrs = ((Elf32_External_Shdr *)
2699 get_data (NULL, file, elf_header.e_shoff,
2700 elf_header.e_shentsize * elf_header.e_shnum,
2701 _("section headers")));
2705 section_headers = (Elf_Internal_Shdr *) malloc
2706 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2708 if (section_headers == NULL)
2710 error (_("Out of memory\n"));
2714 for (i = 0, internal = section_headers;
2715 i < elf_header.e_shnum;
2718 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2719 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2720 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2721 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2722 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2723 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2724 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2725 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2726 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2727 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2736 get_64bit_section_headers (file)
2739 Elf64_External_Shdr * shdrs;
2740 Elf64_Internal_Shdr * internal;
2743 shdrs = ((Elf64_External_Shdr *)
2744 get_data (NULL, file, elf_header.e_shoff,
2745 elf_header.e_shentsize * elf_header.e_shnum,
2746 _("section headers")));
2750 section_headers = (Elf_Internal_Shdr *) malloc
2751 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2753 if (section_headers == NULL)
2755 error (_("Out of memory\n"));
2759 for (i = 0, internal = section_headers;
2760 i < elf_header.e_shnum;
2763 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2764 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2765 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2766 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2767 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2768 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2769 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2770 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2771 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2772 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2780 static Elf_Internal_Sym *
2781 get_32bit_elf_symbols (file, offset, number)
2783 unsigned long offset;
2784 unsigned long number;
2786 Elf32_External_Sym * esyms;
2787 Elf_Internal_Sym * isyms;
2788 Elf_Internal_Sym * psym;
2791 esyms = ((Elf32_External_Sym *)
2792 get_data (NULL, file, offset,
2793 number * sizeof (Elf32_External_Sym), _("symbols")));
2797 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2801 error (_("Out of memory\n"));
2807 for (j = 0, psym = isyms;
2811 psym->st_name = BYTE_GET (esyms[j].st_name);
2812 psym->st_value = BYTE_GET (esyms[j].st_value);
2813 psym->st_size = BYTE_GET (esyms[j].st_size);
2814 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2815 psym->st_info = BYTE_GET (esyms[j].st_info);
2816 psym->st_other = BYTE_GET (esyms[j].st_other);
2824 static Elf_Internal_Sym *
2825 get_64bit_elf_symbols (file, offset, number)
2827 unsigned long offset;
2828 unsigned long number;
2830 Elf64_External_Sym * esyms;
2831 Elf_Internal_Sym * isyms;
2832 Elf_Internal_Sym * psym;
2835 esyms = ((Elf64_External_Sym *)
2836 get_data (NULL, file, offset,
2837 number * sizeof (Elf64_External_Sym), _("symbols")));
2841 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2845 error (_("Out of memory\n"));
2851 for (j = 0, psym = isyms;
2855 psym->st_name = BYTE_GET (esyms[j].st_name);
2856 psym->st_info = BYTE_GET (esyms[j].st_info);
2857 psym->st_other = BYTE_GET (esyms[j].st_other);
2858 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2859 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2860 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2869 get_elf_section_flags (sh_flags)
2872 static char buff [32];
2880 flag = sh_flags & - sh_flags;
2885 case SHF_WRITE: strcat (buff, "W"); break;
2886 case SHF_ALLOC: strcat (buff, "A"); break;
2887 case SHF_EXECINSTR: strcat (buff, "X"); break;
2888 case SHF_MERGE: strcat (buff, "M"); break;
2889 case SHF_STRINGS: strcat (buff, "S"); break;
2890 case SHF_INFO_LINK: strcat (buff, "I"); break;
2891 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2892 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2893 case SHF_GROUP: strcat (buff, "G"); break;
2896 if (flag & SHF_MASKOS)
2899 sh_flags &= ~ SHF_MASKOS;
2901 else if (flag & SHF_MASKPROC)
2904 sh_flags &= ~ SHF_MASKPROC;
2916 process_section_headers (file)
2919 Elf_Internal_Shdr * section;
2922 section_headers = NULL;
2924 if (elf_header.e_shnum == 0)
2927 printf (_("\nThere are no sections in this file.\n"));
2932 if (do_sections && !do_header)
2933 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2934 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2938 if (! get_32bit_section_headers (file))
2941 else if (! get_64bit_section_headers (file))
2944 /* Read in the string table, so that we have names to display. */
2945 section = section_headers + elf_header.e_shstrndx;
2947 if (section->sh_size != 0)
2949 string_table = (char *) get_data (NULL, file, section->sh_offset,
2950 section->sh_size, _("string table"));
2952 string_table_length = section->sh_size;
2955 /* Scan the sections for the dynamic symbol table
2956 and dynamic string table and debug sections. */
2957 dynamic_symbols = NULL;
2958 dynamic_strings = NULL;
2959 dynamic_syminfo = NULL;
2961 for (i = 0, section = section_headers;
2962 i < elf_header.e_shnum;
2965 char * name = SECTION_NAME (section);
2967 if (section->sh_type == SHT_DYNSYM)
2969 if (dynamic_symbols != NULL)
2971 error (_("File contains multiple dynamic symbol tables\n"));
2975 num_dynamic_syms = section->sh_size / section->sh_entsize;
2977 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2979 else if (section->sh_type == SHT_STRTAB
2980 && strcmp (name, ".dynstr") == 0)
2982 if (dynamic_strings != NULL)
2984 error (_("File contains multiple dynamic string tables\n"));
2988 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
2990 _("dynamic strings"));
2992 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2993 || do_debug_lines || do_debug_pubnames || do_debug_aranges
2994 || do_debug_frames || do_debug_macinfo)
2995 && strncmp (name, ".debug_", 7) == 0)
3000 || (do_debug_info && (strcmp (name, "info") == 0))
3001 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3002 || (do_debug_lines && (strcmp (name, "line") == 0))
3003 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3004 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3005 || (do_debug_frames && (strcmp (name, "frame") == 0))
3006 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3008 request_dump (i, DEBUG_DUMP);
3010 /* linkonce section to be combined with .debug_info at link time. */
3011 else if ((do_debugging || do_debug_info)
3012 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3013 request_dump (i, DEBUG_DUMP);
3014 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3015 request_dump (i, DEBUG_DUMP);
3021 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3025 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3028 printf (_(" [Nr] Name Type Address Offset\n"));
3029 printf (_(" Size EntSize Flags Link Info Align\n"));
3032 for (i = 0, section = section_headers;
3033 i < elf_header.e_shnum;
3036 printf (" [%2d] %-17.17s %-15.15s ",
3038 SECTION_NAME (section),
3039 get_section_type_name (section->sh_type));
3043 print_vma (section->sh_addr, LONG_HEX);
3045 printf ( " %6.6lx %6.6lx %2.2lx",
3046 (unsigned long) section->sh_offset,
3047 (unsigned long) section->sh_size,
3048 (unsigned long) section->sh_entsize);
3050 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3052 printf ("%2ld %3lx %2ld\n",
3053 (unsigned long) section->sh_link,
3054 (unsigned long) section->sh_info,
3055 (unsigned long) section->sh_addralign);
3060 print_vma (section->sh_addr, LONG_HEX);
3061 printf (" %8.8lx", section->sh_offset);
3063 print_vma (section->sh_size, LONG_HEX);
3065 print_vma (section->sh_entsize, LONG_HEX);
3067 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3069 printf (" %2ld %3lx %ld\n",
3070 (unsigned long) section->sh_link,
3071 (unsigned long) section->sh_info,
3072 (unsigned long) section->sh_addralign);
3076 printf (_("Key to Flags:\n"));
3077 printf (_(" W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
3078 printf (_(" I (info), L (link order), G (group), x (unknown)\n"));
3079 printf (_(" O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3084 /* Process the reloc section. */
3086 process_relocs (file)
3089 unsigned long rel_size;
3090 unsigned long rel_offset;
3096 if (do_using_dynamic)
3098 int is_rela = FALSE;
3103 if (dynamic_info[DT_REL])
3105 rel_offset = dynamic_info[DT_REL];
3106 rel_size = dynamic_info[DT_RELSZ];
3109 else if (dynamic_info [DT_RELA])
3111 rel_offset = dynamic_info[DT_RELA];
3112 rel_size = dynamic_info[DT_RELASZ];
3115 else if (dynamic_info[DT_JMPREL])
3117 rel_offset = dynamic_info[DT_JMPREL];
3118 rel_size = dynamic_info[DT_PLTRELSZ];
3120 switch (dynamic_info[DT_PLTREL])
3137 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3138 rel_offset, rel_size);
3140 dump_relocations (file, rel_offset - loadaddr, rel_size,
3141 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3144 printf (_("\nThere are no dynamic relocations in this file.\n"));
3148 Elf32_Internal_Shdr * section;
3152 for (i = 0, section = section_headers;
3153 i < elf_header.e_shnum;
3156 if ( section->sh_type != SHT_RELA
3157 && section->sh_type != SHT_REL)
3160 rel_offset = section->sh_offset;
3161 rel_size = section->sh_size;
3165 Elf32_Internal_Shdr * strsec;
3166 Elf_Internal_Sym * symtab;
3169 unsigned long nsyms;
3171 printf (_("\nRelocation section "));
3173 if (string_table == NULL)
3174 printf ("%d", section->sh_name);
3176 printf ("'%s'", SECTION_NAME (section));
3178 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3179 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3184 if (section->sh_link)
3186 Elf32_Internal_Shdr * symsec;
3188 symsec = section_headers + section->sh_link;
3189 nsyms = symsec->sh_size / symsec->sh_entsize;
3190 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
3195 strsec = section_headers + symsec->sh_link;
3197 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3201 is_rela = section->sh_type == SHT_RELA;
3203 dump_relocations (file, rel_offset, rel_size,
3204 symtab, nsyms, strtab, is_rela);
3216 printf (_("\nThere are no relocations in this file.\n"));
3222 #include "unwind-ia64.h"
3224 /* An absolute address consists of a section and an offset. If the
3225 section is NULL, the offset itself is the address, otherwise, the
3226 address equals to LOAD_ADDRESS(section) + offset. */
3230 unsigned short section;
3236 struct unw_table_entry
3238 struct absaddr start;
3240 struct absaddr info;
3242 *table; /* Unwind table. */
3243 unsigned long table_len; /* Length of unwind table. */
3244 unsigned char * info; /* Unwind info. */
3245 unsigned long info_size; /* Size of unwind info. */
3246 bfd_vma info_addr; /* starting address of unwind info. */
3247 bfd_vma seg_base; /* Starting address of segment. */
3248 Elf_Internal_Sym * symtab; /* The symbol table. */
3249 unsigned long nsyms; /* Number of symbols. */
3250 char * strtab; /* The string table. */
3251 unsigned long strtab_size; /* Size of string table. */
3254 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3255 struct absaddr, const char **,
3257 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3258 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3259 Elf32_Internal_Shdr *));
3262 find_symbol_for_address (aux, addr, symname, offset)
3263 struct unw_aux_info *aux;
3264 struct absaddr addr;
3265 const char **symname;
3268 bfd_vma dist = (bfd_vma) 0x100000;
3269 Elf_Internal_Sym *sym, *best = NULL;
3272 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3274 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3275 && sym->st_name != 0
3276 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3277 && addr.offset >= sym->st_value
3278 && addr.offset - sym->st_value < dist)
3281 dist = addr.offset - sym->st_value;
3288 *symname = (best->st_name >= aux->strtab_size
3289 ? "<corrupt>" : aux->strtab + best->st_name);
3294 *offset = addr.offset;
3298 dump_ia64_unwind (aux)
3299 struct unw_aux_info *aux;
3302 struct unw_table_entry * tp;
3305 addr_size = is_32bit_elf ? 4 : 8;
3307 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3311 const unsigned char * dp;
3312 const unsigned char * head;
3313 const char * procname;
3315 find_symbol_for_address (aux, tp->start, &procname, &offset);
3317 fputs ("\n<", stdout);
3321 fputs (procname, stdout);
3324 printf ("+%lx", (unsigned long) offset);
3327 fputs (">: [", stdout);
3328 print_vma (tp->start.offset, PREFIX_HEX);
3329 fputc ('-', stdout);
3330 print_vma (tp->end.offset, PREFIX_HEX);
3331 printf ("), info at +0x%lx\n",
3332 (unsigned long) (tp->info.offset - aux->seg_base));
3334 head = aux->info + (tp->info.offset - aux->info_addr);
3335 stamp = BYTE_GET8 ((unsigned char *) head);
3337 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3338 (unsigned) UNW_VER (stamp),
3339 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3340 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3341 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3342 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3344 if (UNW_VER (stamp) != 1)
3346 printf ("\tUnknown version.\n");
3351 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3352 dp = unw_decode (dp, in_body, & in_body);
3357 slurp_ia64_unwind_table (file, aux, sec)
3359 struct unw_aux_info *aux;
3360 Elf32_Internal_Shdr *sec;
3362 unsigned long size, addr_size, nrelas, i;
3363 Elf_Internal_Phdr *prog_hdrs, *seg;
3364 struct unw_table_entry *tep;
3365 Elf32_Internal_Shdr *relsec;
3366 Elf_Internal_Rela *rela, *rp;
3367 unsigned char *table, *tp;
3368 Elf_Internal_Sym *sym;
3369 const char *relname;
3372 addr_size = is_32bit_elf ? 4 : 8;
3374 /* First, find the starting address of the segment that includes
3377 if (elf_header.e_phnum)
3379 prog_hdrs = (Elf_Internal_Phdr *)
3380 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3383 result = get_32bit_program_headers (file, prog_hdrs);
3385 result = get_64bit_program_headers (file, prog_hdrs);
3393 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3395 if (seg->p_type != PT_LOAD)
3398 if (sec->sh_addr >= seg->p_vaddr
3399 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3401 aux->seg_base = seg->p_vaddr;
3409 /* Second, build the unwind table from the contents of the unwind section: */
3410 size = sec->sh_size;
3411 table = (char *) get_data (NULL, file, sec->sh_offset,
3412 size, _("unwind table"));
3416 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3417 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3419 tep->start.section = SHN_UNDEF;
3420 tep->end.section = SHN_UNDEF;
3421 tep->info.section = SHN_UNDEF;
3424 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3425 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3426 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3430 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3431 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3432 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3434 tep->start.offset += aux->seg_base;
3435 tep->end.offset += aux->seg_base;
3436 tep->info.offset += aux->seg_base;
3440 /* Third, apply any relocations to the unwind table: */
3442 for (relsec = section_headers;
3443 relsec < section_headers + elf_header.e_shnum;
3446 if (relsec->sh_type != SHT_RELA
3447 || section_headers + relsec->sh_info != sec)
3450 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3454 for (rp = rela; rp < rela + nrelas; ++rp)
3458 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3459 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3461 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3463 warn (_("Skipping unexpected symbol type %u"),
3464 ELF32_ST_TYPE (sym->st_info));
3470 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3471 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3473 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3475 warn (_("Skipping unexpected symbol type %u"),
3476 ELF64_ST_TYPE (sym->st_info));
3481 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3483 warn (_("Skipping unexpected relocation type %s"), relname);
3487 i = rp->r_offset / (3 * addr_size);
3489 switch (rp->r_offset/addr_size % 3)
3492 aux->table[i].start.section = sym->st_shndx;
3493 aux->table[i].start.offset += rp->r_addend;
3496 aux->table[i].end.section = sym->st_shndx;
3497 aux->table[i].end.offset += rp->r_addend;
3500 aux->table[i].info.section = sym->st_shndx;
3501 aux->table[i].info.offset += rp->r_addend;
3511 aux->table_len = size / (3 * addr_size);
3516 process_unwind (file)
3519 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3520 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3521 struct unw_aux_info aux;
3526 if (elf_header.e_machine != EM_IA_64)
3528 printf (_("\nThere are no unwind sections in this file.\n"));
3532 memset (& aux, 0, sizeof (aux));
3534 addr_size = is_32bit_elf ? 4 : 8;
3536 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3538 if (sec->sh_type == SHT_SYMTAB)
3540 aux.nsyms = sec->sh_size / sec->sh_entsize;
3541 aux.symtab = GET_ELF_SYMBOLS (file, sec->sh_offset, aux.nsyms);
3543 strsec = section_headers + sec->sh_link;
3544 aux.strtab_size = strsec->sh_size;
3545 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3546 aux.strtab_size, _("string table"));
3548 else if (sec->sh_type == SHT_IA_64_UNWIND)
3553 printf (_("\nThere are no unwind sections in this file.\n"));
3555 while (unwcount-- > 0)
3560 for (i = unwstart, sec = section_headers + unwstart;
3561 i < elf_header.e_shnum; ++i, ++sec)
3562 if (sec->sh_type == SHT_IA_64_UNWIND)
3569 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3571 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3574 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3575 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3576 suffix = SECTION_NAME (unwsec) + len;
3577 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3579 if (strncmp (SECTION_NAME (sec),
3580 ELF_STRING_ia64_unwind_info_once, len2) == 0
3581 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3586 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3587 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3588 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3589 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3591 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3593 suffix = SECTION_NAME (unwsec) + len;
3594 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3596 if (strncmp (SECTION_NAME (sec),
3597 ELF_STRING_ia64_unwind_info, len2) == 0
3598 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3602 if (i == elf_header.e_shnum)
3604 printf (_("\nCould not find unwind info section for "));
3606 if (string_table == NULL)
3607 printf ("%d", unwsec->sh_name);
3609 printf ("'%s'", SECTION_NAME (unwsec));
3613 aux.info_size = sec->sh_size;
3614 aux.info_addr = sec->sh_addr;
3615 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3616 aux.info_size, _("unwind info"));
3618 printf (_("\nUnwind section "));
3620 if (string_table == NULL)
3621 printf ("%d", unwsec->sh_name);
3623 printf ("'%s'", SECTION_NAME (unwsec));
3625 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3627 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3629 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3631 if (aux.table_len > 0)
3632 dump_ia64_unwind (& aux);
3635 free ((char *) aux.table);
3637 free ((char *) aux.info);
3646 free ((char *) aux.strtab);
3652 dynamic_segment_mips_val (entry)
3653 Elf_Internal_Dyn * entry;
3655 switch (entry->d_tag)
3658 if (entry->d_un.d_val == 0)
3662 static const char * opts[] =
3664 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3665 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3666 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3667 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3672 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3673 if (entry->d_un.d_val & (1 << cnt))
3675 printf ("%s%s", first ? "" : " ", opts[cnt]);
3682 case DT_MIPS_IVERSION:
3683 if (dynamic_strings != NULL)
3684 printf ("Interface Version: %s\n",
3685 dynamic_strings + entry->d_un.d_val);
3687 printf ("%ld\n", (long) entry->d_un.d_ptr);
3690 case DT_MIPS_TIME_STAMP:
3695 time_t time = entry->d_un.d_val;
3696 tmp = gmtime (&time);
3697 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3698 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3699 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3700 printf ("Time Stamp: %s\n", timebuf);
3704 case DT_MIPS_RLD_VERSION:
3705 case DT_MIPS_LOCAL_GOTNO:
3706 case DT_MIPS_CONFLICTNO:
3707 case DT_MIPS_LIBLISTNO:
3708 case DT_MIPS_SYMTABNO:
3709 case DT_MIPS_UNREFEXTNO:
3710 case DT_MIPS_HIPAGENO:
3711 case DT_MIPS_DELTA_CLASS_NO:
3712 case DT_MIPS_DELTA_INSTANCE_NO:
3713 case DT_MIPS_DELTA_RELOC_NO:
3714 case DT_MIPS_DELTA_SYM_NO:
3715 case DT_MIPS_DELTA_CLASSSYM_NO:
3716 case DT_MIPS_COMPACT_SIZE:
3717 printf ("%ld\n", (long) entry->d_un.d_ptr);
3721 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3727 dynamic_segment_parisc_val (entry)
3728 Elf_Internal_Dyn * entry;
3730 switch (entry->d_tag)
3732 case DT_HP_DLD_FLAGS:
3741 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3742 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3743 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3744 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3745 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3746 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3747 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3748 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3749 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3750 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3751 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3755 bfd_vma val = entry->d_un.d_val;
3757 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3758 if (val & flags[cnt].bit)
3762 fputs (flags[cnt].str, stdout);
3764 val ^= flags[cnt].bit;
3767 if (val != 0 || first)
3771 print_vma (val, HEX);
3777 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3783 get_32bit_dynamic_segment (file)
3786 Elf32_External_Dyn * edyn;
3787 Elf_Internal_Dyn * entry;
3790 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
3791 dynamic_size, _("dynamic segment"));
3795 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3796 how large this .dynamic is now. We can do this even before the byte
3797 swapping since the DT_NULL tag is recognizable. */
3799 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3802 dynamic_segment = (Elf_Internal_Dyn *)
3803 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3805 if (dynamic_segment == NULL)
3807 error (_("Out of memory\n"));
3812 for (i = 0, entry = dynamic_segment;
3816 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3817 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3826 get_64bit_dynamic_segment (file)
3829 Elf64_External_Dyn * edyn;
3830 Elf_Internal_Dyn * entry;
3833 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
3834 dynamic_size, _("dynamic segment"));
3838 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3839 how large this .dynamic is now. We can do this even before the byte
3840 swapping since the DT_NULL tag is recognizable. */
3842 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3845 dynamic_segment = (Elf_Internal_Dyn *)
3846 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3848 if (dynamic_segment == NULL)
3850 error (_("Out of memory\n"));
3855 for (i = 0, entry = dynamic_segment;
3859 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3860 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3869 get_dynamic_flags (flags)
3872 static char buff [64];
3877 flag = flags & - flags;
3882 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3883 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3884 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3885 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3886 default: strcat (buff, "unknown "); break;
3892 /* Parse and display the contents of the dynamic segment. */
3894 process_dynamic_segment (file)
3897 Elf_Internal_Dyn * entry;
3900 if (dynamic_size == 0)
3903 printf (_("\nThere is no dynamic segment in this file.\n"));
3910 if (! get_32bit_dynamic_segment (file))
3913 else if (! get_64bit_dynamic_segment (file))
3916 /* Find the appropriate symbol table. */
3917 if (dynamic_symbols == NULL)
3919 for (i = 0, entry = dynamic_segment;
3923 unsigned long offset;
3925 if (entry->d_tag != DT_SYMTAB)
3928 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3930 /* Since we do not know how big the symbol table is,
3931 we default to reading in the entire file (!) and
3932 processing that. This is overkill, I know, but it
3934 offset = entry->d_un.d_val - loadaddr;
3936 if (fseek (file, 0, SEEK_END))
3937 error (_("Unable to seek to end of file!"));
3940 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3942 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3944 if (num_dynamic_syms < 1)
3946 error (_("Unable to determine the number of symbols to load\n"));
3950 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3954 /* Similarly find a string table. */
3955 if (dynamic_strings == NULL)
3957 for (i = 0, entry = dynamic_segment;
3961 unsigned long offset;
3964 if (entry->d_tag != DT_STRTAB)
3967 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3969 /* Since we do not know how big the string table is,
3970 we default to reading in the entire file (!) and
3971 processing that. This is overkill, I know, but it
3974 offset = entry->d_un.d_val - loadaddr;
3975 if (fseek (file, 0, SEEK_END))
3976 error (_("Unable to seek to end of file\n"));
3977 str_tab_len = ftell (file) - offset;
3979 if (str_tab_len < 1)
3982 (_("Unable to determine the length of the dynamic string table\n"));
3986 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
3987 _("dynamic string table"));
3993 /* And find the syminfo section if available. */
3994 if (dynamic_syminfo == NULL)
3996 unsigned int syminsz = 0;
3998 for (i = 0, entry = dynamic_segment;
4002 if (entry->d_tag == DT_SYMINENT)
4004 /* Note: these braces are necessary to avoid a syntax
4005 error from the SunOS4 C compiler. */
4006 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4008 else if (entry->d_tag == DT_SYMINSZ)
4009 syminsz = entry->d_un.d_val;
4010 else if (entry->d_tag == DT_SYMINFO)
4011 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4014 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4016 Elf_External_Syminfo * extsyminfo;
4017 Elf_Internal_Syminfo * syminfo;
4019 /* There is a syminfo section. Read the data. */
4020 extsyminfo = ((Elf_External_Syminfo *)
4021 get_data (NULL, file, dynamic_syminfo_offset,
4022 syminsz, _("symbol information")));
4026 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4027 if (dynamic_syminfo == NULL)
4029 error (_("Out of memory\n"));
4033 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4034 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4037 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4038 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4045 if (do_dynamic && dynamic_addr)
4046 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4047 dynamic_addr, (long) dynamic_size);
4049 printf (_(" Tag Type Name/Value\n"));
4051 for (i = 0, entry = dynamic_segment;
4060 print_vma (entry->d_tag, FULL_HEX);
4061 dtype = get_dynamic_type (entry->d_tag);
4062 printf (" (%s)%*s", dtype,
4063 ((is_32bit_elf ? 27 : 19)
4064 - (int) strlen (dtype)),
4068 switch (entry->d_tag)
4072 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4082 switch (entry->d_tag)
4085 printf (_("Auxiliary library"));
4089 printf (_("Filter library"));
4093 printf (_("Configuration file"));
4097 printf (_("Dependency audit library"));
4101 printf (_("Audit library"));
4105 if (dynamic_strings)
4106 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4110 print_vma (entry->d_un.d_val, PREFIX_HEX);
4119 printf (_("Flags:"));
4120 if (entry->d_un.d_val == 0)
4121 printf (_(" None\n"));
4124 unsigned long int val = entry->d_un.d_val;
4125 if (val & DTF_1_PARINIT)
4127 printf (" PARINIT");
4128 val ^= DTF_1_PARINIT;
4130 if (val & DTF_1_CONFEXP)
4132 printf (" CONFEXP");
4133 val ^= DTF_1_CONFEXP;
4136 printf (" %lx", val);
4145 printf (_("Flags:"));
4146 if (entry->d_un.d_val == 0)
4147 printf (_(" None\n"));
4150 unsigned long int val = entry->d_un.d_val;
4151 if (val & DF_P1_LAZYLOAD)
4153 printf (" LAZYLOAD");
4154 val ^= DF_P1_LAZYLOAD;
4156 if (val & DF_P1_GROUPPERM)
4158 printf (" GROUPPERM");
4159 val ^= DF_P1_GROUPPERM;
4162 printf (" %lx", val);
4171 printf (_("Flags:"));
4172 if (entry->d_un.d_val == 0)
4173 printf (_(" None\n"));
4176 unsigned long int val = entry->d_un.d_val;
4182 if (val & DF_1_GLOBAL)
4187 if (val & DF_1_GROUP)
4192 if (val & DF_1_NODELETE)
4194 printf (" NODELETE");
4195 val ^= DF_1_NODELETE;
4197 if (val & DF_1_LOADFLTR)
4199 printf (" LOADFLTR");
4200 val ^= DF_1_LOADFLTR;
4202 if (val & DF_1_INITFIRST)
4204 printf (" INITFIRST");
4205 val ^= DF_1_INITFIRST;
4207 if (val & DF_1_NOOPEN)
4212 if (val & DF_1_ORIGIN)
4217 if (val & DF_1_DIRECT)
4222 if (val & DF_1_TRANS)
4227 if (val & DF_1_INTERPOSE)
4229 printf (" INTERPOSE");
4230 val ^= DF_1_INTERPOSE;
4232 if (val & DF_1_NODEFLIB)
4234 printf (" NODEFLIB");
4235 val ^= DF_1_NODEFLIB;
4237 if (val & DF_1_NODUMP)
4242 if (val & DF_1_CONLFAT)
4244 printf (" CONLFAT");
4245 val ^= DF_1_CONLFAT;
4248 printf (" %lx", val);
4256 puts (get_dynamic_type (entry->d_un.d_val));
4276 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4282 if (dynamic_strings == NULL)
4285 name = dynamic_strings + entry->d_un.d_val;
4289 switch (entry->d_tag)
4292 printf (_("Shared library: [%s]"), name);
4294 if (strcmp (name, program_interpreter) == 0)
4295 printf (_(" program interpreter"));
4299 printf (_("Library soname: [%s]"), name);
4303 printf (_("Library rpath: [%s]"), name);
4307 printf (_("Library runpath: [%s]"), name);
4311 print_vma (entry->d_un.d_val, PREFIX_HEX);
4316 print_vma (entry->d_un.d_val, PREFIX_HEX);
4332 case DT_INIT_ARRAYSZ:
4333 case DT_FINI_ARRAYSZ:
4336 print_vma (entry->d_un.d_val, UNSIGNED);
4337 printf (" (bytes)\n");
4347 print_vma (entry->d_un.d_val, UNSIGNED);
4360 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4364 name = dynamic_strings + entry->d_un.d_val;
4368 printf (_("Not needed object: [%s]\n"), name);
4373 print_vma (entry->d_un.d_val, PREFIX_HEX);
4379 /* The value of this entry is ignored. */
4383 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4384 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4389 switch (elf_header.e_machine)
4392 case EM_MIPS_RS3_LE:
4393 dynamic_segment_mips_val (entry);
4396 dynamic_segment_parisc_val (entry);
4399 print_vma (entry->d_un.d_val, PREFIX_HEX);
4411 get_ver_flags (flags)
4414 static char buff [32];
4421 if (flags & VER_FLG_BASE)
4422 strcat (buff, "BASE ");
4424 if (flags & VER_FLG_WEAK)
4426 if (flags & VER_FLG_BASE)
4427 strcat (buff, "| ");
4429 strcat (buff, "WEAK ");
4432 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4433 strcat (buff, "| <unknown>");
4438 /* Display the contents of the version sections. */
4440 process_version_sections (file)
4443 Elf32_Internal_Shdr * section;
4450 for (i = 0, section = section_headers;
4451 i < elf_header.e_shnum;
4454 switch (section->sh_type)
4456 case SHT_GNU_verdef:
4458 Elf_External_Verdef * edefs;
4465 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4466 SECTION_NAME (section), section->sh_info);
4468 printf (_(" Addr: 0x"));
4469 printf_vma (section->sh_addr);
4470 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4471 (unsigned long) section->sh_offset, section->sh_link,
4472 SECTION_NAME (section_headers + section->sh_link));
4474 edefs = ((Elf_External_Verdef *)
4475 get_data (NULL, file, section->sh_offset,
4477 _("version definition section")));
4481 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4484 Elf_External_Verdef * edef;
4485 Elf_Internal_Verdef ent;
4486 Elf_External_Verdaux * eaux;
4487 Elf_Internal_Verdaux aux;
4491 vstart = ((char *) edefs) + idx;
4493 edef = (Elf_External_Verdef *) vstart;
4495 ent.vd_version = BYTE_GET (edef->vd_version);
4496 ent.vd_flags = BYTE_GET (edef->vd_flags);
4497 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4498 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4499 ent.vd_hash = BYTE_GET (edef->vd_hash);
4500 ent.vd_aux = BYTE_GET (edef->vd_aux);
4501 ent.vd_next = BYTE_GET (edef->vd_next);
4503 printf (_(" %#06x: Rev: %d Flags: %s"),
4504 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4506 printf (_(" Index: %d Cnt: %d "),
4507 ent.vd_ndx, ent.vd_cnt);
4509 vstart += ent.vd_aux;
4511 eaux = (Elf_External_Verdaux *) vstart;
4513 aux.vda_name = BYTE_GET (eaux->vda_name);
4514 aux.vda_next = BYTE_GET (eaux->vda_next);
4516 if (dynamic_strings)
4517 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4519 printf (_("Name index: %ld\n"), aux.vda_name);
4521 isum = idx + ent.vd_aux;
4523 for (j = 1; j < ent.vd_cnt; j ++)
4525 isum += aux.vda_next;
4526 vstart += aux.vda_next;
4528 eaux = (Elf_External_Verdaux *) vstart;
4530 aux.vda_name = BYTE_GET (eaux->vda_name);
4531 aux.vda_next = BYTE_GET (eaux->vda_next);
4533 if (dynamic_strings)
4534 printf (_(" %#06x: Parent %d: %s\n"),
4535 isum, j, dynamic_strings + aux.vda_name);
4537 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4538 isum, j, aux.vda_name);
4548 case SHT_GNU_verneed:
4550 Elf_External_Verneed * eneed;
4556 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4557 SECTION_NAME (section), section->sh_info);
4559 printf (_(" Addr: 0x"));
4560 printf_vma (section->sh_addr);
4561 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4562 (unsigned long) section->sh_offset, section->sh_link,
4563 SECTION_NAME (section_headers + section->sh_link));
4565 eneed = ((Elf_External_Verneed *)
4566 get_data (NULL, file, section->sh_offset,
4567 section->sh_size, _("version need section")));
4571 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4573 Elf_External_Verneed * entry;
4574 Elf_Internal_Verneed ent;
4579 vstart = ((char *) eneed) + idx;
4581 entry = (Elf_External_Verneed *) vstart;
4583 ent.vn_version = BYTE_GET (entry->vn_version);
4584 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4585 ent.vn_file = BYTE_GET (entry->vn_file);
4586 ent.vn_aux = BYTE_GET (entry->vn_aux);
4587 ent.vn_next = BYTE_GET (entry->vn_next);
4589 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4591 if (dynamic_strings)
4592 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4594 printf (_(" File: %lx"), ent.vn_file);
4596 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4598 vstart += ent.vn_aux;
4600 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4602 Elf_External_Vernaux * eaux;
4603 Elf_Internal_Vernaux aux;
4605 eaux = (Elf_External_Vernaux *) vstart;
4607 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4608 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4609 aux.vna_other = BYTE_GET (eaux->vna_other);
4610 aux.vna_name = BYTE_GET (eaux->vna_name);
4611 aux.vna_next = BYTE_GET (eaux->vna_next);
4613 if (dynamic_strings)
4614 printf (_(" %#06x: Name: %s"),
4615 isum, dynamic_strings + aux.vna_name);
4617 printf (_(" %#06x: Name index: %lx"),
4618 isum, aux.vna_name);
4620 printf (_(" Flags: %s Version: %d\n"),
4621 get_ver_flags (aux.vna_flags), aux.vna_other);
4623 isum += aux.vna_next;
4624 vstart += aux.vna_next;
4634 case SHT_GNU_versym:
4636 Elf32_Internal_Shdr * link_section;
4639 unsigned char * edata;
4640 unsigned short * data;
4642 Elf_Internal_Sym * symbols;
4643 Elf32_Internal_Shdr * string_sec;
4645 link_section = section_headers + section->sh_link;
4646 total = section->sh_size / section->sh_entsize;
4650 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
4651 link_section->sh_size / link_section->sh_entsize);
4653 string_sec = section_headers + link_section->sh_link;
4655 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4656 string_sec->sh_size,
4657 _("version string table"));
4661 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4662 SECTION_NAME (section), total);
4664 printf (_(" Addr: "));
4665 printf_vma (section->sh_addr);
4666 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4667 (unsigned long) section->sh_offset, section->sh_link,
4668 SECTION_NAME (link_section));
4672 get_data (NULL, file,
4673 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4674 total * sizeof (short), _("version symbol data")));
4681 data = (unsigned short *) malloc (total * sizeof (short));
4683 for (cnt = total; cnt --;)
4684 data [cnt] = byte_get (edata + cnt * sizeof (short),
4689 for (cnt = 0; cnt < total; cnt += 4)
4692 int check_def, check_need;
4695 printf (" %03x:", cnt);
4697 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4698 switch (data [cnt + j])
4701 fputs (_(" 0 (*local*) "), stdout);
4705 fputs (_(" 1 (*global*) "), stdout);
4709 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4710 data [cnt + j] & 0x8000 ? 'h' : ' ');
4714 if (symbols [cnt + j].st_shndx >= SHN_LORESERVE
4715 || section_headers[symbols [cnt + j].st_shndx].sh_type
4718 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4725 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4727 Elf_Internal_Verneed ivn;
4728 unsigned long offset;
4730 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4735 Elf_Internal_Vernaux ivna;
4736 Elf_External_Verneed evn;
4737 Elf_External_Vernaux evna;
4738 unsigned long a_off;
4740 get_data (&evn, file, offset, sizeof (evn),
4743 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4744 ivn.vn_next = BYTE_GET (evn.vn_next);
4746 a_off = offset + ivn.vn_aux;
4750 get_data (&evna, file, a_off, sizeof (evna),
4751 _("version need aux (2)"));
4753 ivna.vna_next = BYTE_GET (evna.vna_next);
4754 ivna.vna_other = BYTE_GET (evna.vna_other);
4756 a_off += ivna.vna_next;
4758 while (ivna.vna_other != data [cnt + j]
4759 && ivna.vna_next != 0);
4761 if (ivna.vna_other == data [cnt + j])
4763 ivna.vna_name = BYTE_GET (evna.vna_name);
4765 name = strtab + ivna.vna_name;
4766 nn += printf ("(%s%-*s",
4768 12 - (int) strlen (name),
4774 offset += ivn.vn_next;
4776 while (ivn.vn_next);
4779 if (check_def && data [cnt + j] != 0x8001
4780 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4782 Elf_Internal_Verdef ivd;
4783 Elf_External_Verdef evd;
4784 unsigned long offset;
4786 offset = version_info
4787 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4791 get_data (&evd, file, offset, sizeof (evd),
4794 ivd.vd_next = BYTE_GET (evd.vd_next);
4795 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4797 offset += ivd.vd_next;
4799 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4800 && ivd.vd_next != 0);
4802 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4804 Elf_External_Verdaux evda;
4805 Elf_Internal_Verdaux ivda;
4807 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4809 get_data (&evda, file,
4810 offset - ivd.vd_next + ivd.vd_aux,
4811 sizeof (evda), _("version def aux"));
4813 ivda.vda_name = BYTE_GET (evda.vda_name);
4815 name = strtab + ivda.vda_name;
4816 nn += printf ("(%s%-*s",
4818 12 - (int) strlen (name),
4824 printf ("%*c", 18 - nn, ' ');
4842 printf (_("\nNo version information found in this file.\n"));
4848 get_symbol_binding (binding)
4849 unsigned int binding;
4851 static char buff [32];
4855 case STB_LOCAL: return "LOCAL";
4856 case STB_GLOBAL: return "GLOBAL";
4857 case STB_WEAK: return "WEAK";
4859 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4860 sprintf (buff, _("<processor specific>: %d"), binding);
4861 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4862 sprintf (buff, _("<OS specific>: %d"), binding);
4864 sprintf (buff, _("<unknown>: %d"), binding);
4870 get_symbol_type (type)
4873 static char buff [32];
4877 case STT_NOTYPE: return "NOTYPE";
4878 case STT_OBJECT: return "OBJECT";
4879 case STT_FUNC: return "FUNC";
4880 case STT_SECTION: return "SECTION";
4881 case STT_FILE: return "FILE";
4882 case STT_COMMON: return "COMMON";
4884 if (type >= STT_LOPROC && type <= STT_HIPROC)
4886 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4887 return "THUMB_FUNC";
4889 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4892 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4893 return "PARISC_MILLI";
4895 sprintf (buff, _("<processor specific>: %d"), type);
4897 else if (type >= STT_LOOS && type <= STT_HIOS)
4899 if (elf_header.e_machine == EM_PARISC)
4901 if (type == STT_HP_OPAQUE)
4903 if (type == STT_HP_STUB)
4907 sprintf (buff, _("<OS specific>: %d"), type);
4910 sprintf (buff, _("<unknown>: %d"), type);
4916 get_symbol_visibility (visibility)
4917 unsigned int visibility;
4921 case STV_DEFAULT: return "DEFAULT";
4922 case STV_INTERNAL: return "INTERNAL";
4923 case STV_HIDDEN: return "HIDDEN";
4924 case STV_PROTECTED: return "PROTECTED";
4930 get_symbol_index_type (type)
4935 case SHN_UNDEF: return "UND";
4936 case SHN_ABS: return "ABS";
4937 case SHN_COMMON: return "COM";
4939 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4941 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4943 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4947 static char buff [32];
4949 sprintf (buff, "%3d", type);
4956 get_dynamic_data (file, number)
4958 unsigned int number;
4960 unsigned char * e_data;
4963 e_data = (unsigned char *) malloc (number * 4);
4967 error (_("Out of memory\n"));
4971 if (fread (e_data, 4, number, file) != number)
4973 error (_("Unable to read in dynamic data\n"));
4977 i_data = (int *) malloc (number * sizeof (* i_data));
4981 error (_("Out of memory\n"));
4987 i_data [number] = byte_get (e_data + number * 4, 4);
4994 /* Dump the symbol table */
4996 process_symbol_table (file)
4999 Elf32_Internal_Shdr * section;
5000 unsigned char nb [4];
5001 unsigned char nc [4];
5004 int * buckets = NULL;
5005 int * chains = NULL;
5007 if (! do_syms && !do_histogram)
5010 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5013 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5015 error (_("Unable to seek to start of dynamic information"));
5019 if (fread (nb, sizeof (nb), 1, file) != 1)
5021 error (_("Failed to read in number of buckets\n"));
5025 if (fread (nc, sizeof (nc), 1, file) != 1)
5027 error (_("Failed to read in number of chains\n"));
5031 nbuckets = byte_get (nb, 4);
5032 nchains = byte_get (nc, 4);
5034 buckets = get_dynamic_data (file, nbuckets);
5035 chains = get_dynamic_data (file, nchains);
5037 if (buckets == NULL || chains == NULL)
5042 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5047 printf (_("\nSymbol table for image:\n"));
5049 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5051 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5053 for (hn = 0; hn < nbuckets; hn++)
5058 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5060 Elf_Internal_Sym * psym;
5062 psym = dynamic_symbols + si;
5064 printf (" %3d %3d: ", si, hn);
5065 print_vma (psym->st_value, LONG_HEX);
5067 print_vma (psym->st_size, DEC_5);
5069 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5070 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5071 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5072 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
5073 printf (" %s\n", dynamic_strings + psym->st_name);
5077 else if (do_syms && !do_using_dynamic)
5081 for (i = 0, section = section_headers;
5082 i < elf_header.e_shnum;
5087 Elf_Internal_Sym * symtab;
5088 Elf_Internal_Sym * psym;
5091 if ( section->sh_type != SHT_SYMTAB
5092 && section->sh_type != SHT_DYNSYM)
5095 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5096 SECTION_NAME (section),
5097 (unsigned long) (section->sh_size / section->sh_entsize));
5099 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5101 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5103 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
5104 section->sh_size / section->sh_entsize);
5108 if (section->sh_link == elf_header.e_shstrndx)
5109 strtab = string_table;
5112 Elf32_Internal_Shdr * string_sec;
5114 string_sec = section_headers + section->sh_link;
5116 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5117 string_sec->sh_size,
5121 for (si = 0, psym = symtab;
5122 si < section->sh_size / section->sh_entsize;
5125 printf ("%6d: ", si);
5126 print_vma (psym->st_value, LONG_HEX);
5128 print_vma (psym->st_size, DEC_5);
5129 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5130 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5131 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5132 printf (" %4s", get_symbol_index_type (psym->st_shndx));
5133 printf (" %s", strtab + psym->st_name);
5135 if (section->sh_type == SHT_DYNSYM &&
5136 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5138 unsigned char data[2];
5139 unsigned short vers_data;
5140 unsigned long offset;
5144 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5147 get_data (&data, file, offset + si * sizeof (vers_data),
5148 sizeof (data), _("version data"));
5150 vers_data = byte_get (data, 2);
5152 is_nobits = psym->st_shndx < SHN_LORESERVE ?
5153 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
5156 check_def = (psym->st_shndx != SHN_UNDEF);
5158 if ((vers_data & 0x8000) || vers_data > 1)
5160 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5161 && (is_nobits || ! check_def))
5163 Elf_External_Verneed evn;
5164 Elf_Internal_Verneed ivn;
5165 Elf_Internal_Vernaux ivna;
5167 /* We must test both. */
5168 offset = version_info
5169 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5173 unsigned long vna_off;
5175 get_data (&evn, file, offset, sizeof (evn),
5178 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5179 ivn.vn_next = BYTE_GET (evn.vn_next);
5181 vna_off = offset + ivn.vn_aux;
5185 Elf_External_Vernaux evna;
5187 get_data (&evna, file, vna_off,
5189 _("version need aux (3)"));
5191 ivna.vna_other = BYTE_GET (evna.vna_other);
5192 ivna.vna_next = BYTE_GET (evna.vna_next);
5193 ivna.vna_name = BYTE_GET (evna.vna_name);
5195 vna_off += ivna.vna_next;
5197 while (ivna.vna_other != vers_data
5198 && ivna.vna_next != 0);
5200 if (ivna.vna_other == vers_data)
5203 offset += ivn.vn_next;
5205 while (ivn.vn_next != 0);
5207 if (ivna.vna_other == vers_data)
5210 strtab + ivna.vna_name, ivna.vna_other);
5213 else if (! is_nobits)
5214 error (_("bad dynamic symbol"));
5221 if (vers_data != 0x8001
5222 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5224 Elf_Internal_Verdef ivd;
5225 Elf_Internal_Verdaux ivda;
5226 Elf_External_Verdaux evda;
5227 unsigned long offset;
5230 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5235 Elf_External_Verdef evd;
5237 get_data (&evd, file, offset, sizeof (evd),
5240 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5241 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5242 ivd.vd_next = BYTE_GET (evd.vd_next);
5244 offset += ivd.vd_next;
5246 while (ivd.vd_ndx != (vers_data & 0x7fff)
5247 && ivd.vd_next != 0);
5249 offset -= ivd.vd_next;
5250 offset += ivd.vd_aux;
5252 get_data (&evda, file, offset, sizeof (evda),
5253 _("version def aux"));
5255 ivda.vda_name = BYTE_GET (evda.vda_name);
5257 if (psym->st_name != ivda.vda_name)
5258 printf ((vers_data & 0x8000)
5260 strtab + ivda.vda_name);
5270 if (strtab != string_table)
5276 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5278 if (do_histogram && buckets != NULL)
5285 int nzero_counts = 0;
5288 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5290 printf (_(" Length Number %% of total Coverage\n"));
5292 lengths = (int *) calloc (nbuckets, sizeof (int));
5293 if (lengths == NULL)
5295 error (_("Out of memory"));
5298 for (hn = 0; hn < nbuckets; ++hn)
5303 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5306 if (maxlength < ++lengths[hn])
5311 counts = (int *) calloc (maxlength + 1, sizeof (int));
5314 error (_("Out of memory"));
5318 for (hn = 0; hn < nbuckets; ++hn)
5319 ++ counts [lengths [hn]];
5323 printf (" 0 %-10d (%5.1f%%)\n",
5324 counts[0], (counts[0] * 100.0) / nbuckets);
5325 for (si = 1; si <= maxlength; ++si)
5327 nzero_counts += counts[si] * si;
5328 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5329 si, counts[si], (counts[si] * 100.0) / nbuckets,
5330 (nzero_counts * 100.0) / nsyms);
5338 if (buckets != NULL)
5348 process_syminfo (file)
5349 FILE * file ATTRIBUTE_UNUSED;
5353 if (dynamic_syminfo == NULL
5355 /* No syminfo, this is ok. */
5358 /* There better should be a dynamic symbol section. */
5359 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5363 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5364 dynamic_syminfo_offset, dynamic_syminfo_nent);
5366 printf (_(" Num: Name BoundTo Flags\n"));
5367 for (i = 0; i < dynamic_syminfo_nent; ++i)
5369 unsigned short int flags = dynamic_syminfo[i].si_flags;
5371 printf ("%4d: %-30s ", i,
5372 dynamic_strings + dynamic_symbols[i].st_name);
5374 switch (dynamic_syminfo[i].si_boundto)
5376 case SYMINFO_BT_SELF:
5377 fputs ("SELF ", stdout);
5379 case SYMINFO_BT_PARENT:
5380 fputs ("PARENT ", stdout);
5383 if (dynamic_syminfo[i].si_boundto > 0
5384 && dynamic_syminfo[i].si_boundto < dynamic_size)
5387 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5389 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5393 if (flags & SYMINFO_FLG_DIRECT)
5395 if (flags & SYMINFO_FLG_PASSTHRU)
5396 printf (" PASSTHRU");
5397 if (flags & SYMINFO_FLG_COPY)
5399 if (flags & SYMINFO_FLG_LAZYLOAD)
5400 printf (" LAZYLOAD");
5408 #ifdef SUPPORT_DISASSEMBLY
5410 disassemble_section (section, file)
5411 Elf32_Internal_Shdr * section;
5414 printf (_("\nAssembly dump of section %s\n"),
5415 SECTION_NAME (section));
5417 /* XXX -- to be done --- XXX */
5424 dump_section (section, file)
5425 Elf32_Internal_Shdr * section;
5428 bfd_size_type bytes;
5430 unsigned char * data;
5431 unsigned char * start;
5433 bytes = section->sh_size;
5437 printf (_("\nSection '%s' has no data to dump.\n"),
5438 SECTION_NAME (section));
5442 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5444 addr = section->sh_addr;
5446 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5459 lbytes = (bytes > 16 ? 16 : bytes);
5461 printf (" 0x%8.8lx ", (unsigned long) addr);
5463 switch (elf_header.e_ident [EI_DATA])
5467 for (j = 15; j >= 0; j --)
5470 printf ("%2.2x", data [j]);
5480 for (j = 0; j < 16; j++)
5483 printf ("%2.2x", data [j]);
5493 for (j = 0; j < lbytes; j++)
5496 if (k >= ' ' && k < 0x80)
5515 static unsigned long int
5516 read_leb128 (data, length_return, sign)
5517 unsigned char * data;
5518 int * length_return;
5521 unsigned long int result = 0;
5522 unsigned int num_read = 0;
5531 result |= (byte & 0x7f) << shift;
5536 while (byte & 0x80);
5538 if (length_return != NULL)
5539 * length_return = num_read;
5541 if (sign && (shift < 32) && (byte & 0x40))
5542 result |= -1 << shift;
5547 typedef struct State_Machine_Registers
5549 unsigned long address;
5552 unsigned int column;
5556 /* This variable hold the number of the last entry seen
5557 in the File Table. */
5558 unsigned int last_file_entry;
5561 static SMR state_machine_regs;
5564 reset_state_machine (is_stmt)
5567 state_machine_regs.address = 0;
5568 state_machine_regs.file = 1;
5569 state_machine_regs.line = 1;
5570 state_machine_regs.column = 0;
5571 state_machine_regs.is_stmt = is_stmt;
5572 state_machine_regs.basic_block = 0;
5573 state_machine_regs.end_sequence = 0;
5574 state_machine_regs.last_file_entry = 0;
5577 /* Handled an extend line op. Returns true if this is the end
5580 process_extended_line_op (data, is_stmt, pointer_size)
5581 unsigned char * data;
5585 unsigned char op_code;
5588 unsigned char * name;
5591 len = read_leb128 (data, & bytes_read, 0);
5596 warn (_("badly formed extended line op encountered!"));
5601 op_code = * data ++;
5603 printf (_(" Extended opcode %d: "), op_code);
5607 case DW_LNE_end_sequence:
5608 printf (_("End of Sequence\n\n"));
5609 reset_state_machine (is_stmt);
5612 case DW_LNE_set_address:
5613 adr = byte_get (data, pointer_size);
5614 printf (_("set Address to 0x%lx\n"), adr);
5615 state_machine_regs.address = adr;
5618 case DW_LNE_define_file:
5619 printf (_(" define new File Table entry\n"));
5620 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5622 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5624 data += strlen ((char *) data) + 1;
5625 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5627 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5629 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5630 printf (_("%s\n\n"), name);
5634 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5641 /* Size of pointers in the .debug_line section. This information is not
5642 really present in that section. It's obtained before dumping the debug
5643 sections by doing some pre-scan of the .debug_info section. */
5644 static int debug_line_pointer_size = 4;
5647 display_debug_lines (section, start, file)
5648 Elf32_Internal_Shdr * section;
5649 unsigned char * start;
5650 FILE * file ATTRIBUTE_UNUSED;
5652 DWARF2_External_LineInfo * external;
5653 DWARF2_Internal_LineInfo info;
5654 unsigned char * standard_opcodes;
5655 unsigned char * data = start;
5656 unsigned char * end = start + section->sh_size;
5657 unsigned char * end_of_sequence;
5660 printf (_("\nDump of debug contents of section %s:\n\n"),
5661 SECTION_NAME (section));
5665 external = (DWARF2_External_LineInfo *) data;
5667 /* Check the length of the block. */
5668 info.li_length = BYTE_GET (external->li_length);
5669 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5672 (_("The line info appears to be corrupt - the section is too small\n"));
5676 /* Check its version number. */
5677 info.li_version = BYTE_GET (external->li_version);
5678 if (info.li_version != 2)
5680 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5684 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5685 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5686 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5687 info.li_line_base = BYTE_GET (external->li_line_base);
5688 info.li_line_range = BYTE_GET (external->li_line_range);
5689 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5691 /* Sign extend the line base field. */
5692 info.li_line_base <<= 24;
5693 info.li_line_base >>= 24;
5695 printf (_(" Length: %ld\n"), info.li_length);
5696 printf (_(" DWARF Version: %d\n"), info.li_version);
5697 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
5698 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5699 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5700 printf (_(" Line Base: %d\n"), info.li_line_base);
5701 printf (_(" Line Range: %d\n"), info.li_line_range);
5702 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5704 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5706 reset_state_machine (info.li_default_is_stmt);
5708 /* Display the contents of the Opcodes table. */
5709 standard_opcodes = data + sizeof (* external);
5711 printf (_("\n Opcodes:\n"));
5713 for (i = 1; i < info.li_opcode_base; i++)
5714 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5716 /* Display the contents of the Directory table. */
5717 data = standard_opcodes + info.li_opcode_base - 1;
5720 printf (_("\n The Directory Table is empty.\n"));
5723 printf (_("\n The Directory Table:\n"));
5727 printf (_(" %s\n"), data);
5729 data += strlen ((char *) data) + 1;
5733 /* Skip the NUL at the end of the table. */
5736 /* Display the contents of the File Name table. */
5738 printf (_("\n The File Name Table is empty.\n"));
5741 printf (_("\n The File Name Table:\n"));
5742 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5746 unsigned char * name;
5749 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5752 data += strlen ((char *) data) + 1;
5754 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5756 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5758 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5760 printf (_("%s\n"), name);
5764 /* Skip the NUL at the end of the table. */
5767 /* Now display the statements. */
5768 printf (_("\n Line Number Statements:\n"));
5771 while (data < end_of_sequence)
5773 unsigned char op_code;
5777 op_code = * data ++;
5781 case DW_LNS_extended_op:
5782 data += process_extended_line_op (data, info.li_default_is_stmt,
5783 debug_line_pointer_size);
5787 printf (_(" Copy\n"));
5790 case DW_LNS_advance_pc:
5791 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5793 state_machine_regs.address += adv;
5794 printf (_(" Advance PC by %d to %lx\n"), adv,
5795 state_machine_regs.address);
5798 case DW_LNS_advance_line:
5799 adv = read_leb128 (data, & bytes_read, 1);
5801 state_machine_regs.line += adv;
5802 printf (_(" Advance Line by %d to %d\n"), adv,
5803 state_machine_regs.line);
5806 case DW_LNS_set_file:
5807 adv = read_leb128 (data, & bytes_read, 0);
5809 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5811 state_machine_regs.file = adv;
5814 case DW_LNS_set_column:
5815 adv = read_leb128 (data, & bytes_read, 0);
5817 printf (_(" Set column to %d\n"), adv);
5818 state_machine_regs.column = adv;
5821 case DW_LNS_negate_stmt:
5822 adv = state_machine_regs.is_stmt;
5824 printf (_(" Set is_stmt to %d\n"), adv);
5825 state_machine_regs.is_stmt = adv;
5828 case DW_LNS_set_basic_block:
5829 printf (_(" Set basic block\n"));
5830 state_machine_regs.basic_block = 1;
5833 case DW_LNS_const_add_pc:
5834 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5835 * info.li_min_insn_length);
5836 state_machine_regs.address += adv;
5837 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5838 state_machine_regs.address);
5841 case DW_LNS_fixed_advance_pc:
5842 adv = byte_get (data, 2);
5844 state_machine_regs.address += adv;
5845 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5846 adv, state_machine_regs.address);
5850 op_code -= info.li_opcode_base;
5851 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5852 state_machine_regs.address += adv;
5853 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5854 op_code, adv, state_machine_regs.address);
5855 adv = (op_code % info.li_line_range) + info.li_line_base;
5856 state_machine_regs.line += adv;
5857 printf (_(" and Line by %d to %d\n"),
5858 adv, state_machine_regs.line);
5869 display_debug_pubnames (section, start, file)
5870 Elf32_Internal_Shdr * section;
5871 unsigned char * start;
5872 FILE * file ATTRIBUTE_UNUSED;
5874 DWARF2_External_PubNames * external;
5875 DWARF2_Internal_PubNames pubnames;
5876 unsigned char * end;
5878 end = start + section->sh_size;
5880 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5884 unsigned char * data;
5885 unsigned long offset;
5887 external = (DWARF2_External_PubNames *) start;
5889 pubnames.pn_length = BYTE_GET (external->pn_length);
5890 pubnames.pn_version = BYTE_GET (external->pn_version);
5891 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5892 pubnames.pn_size = BYTE_GET (external->pn_size);
5894 data = start + sizeof (* external);
5895 start += pubnames.pn_length + sizeof (external->pn_length);
5897 if (pubnames.pn_version != 2)
5899 static int warned = 0;
5903 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5910 printf (_(" Length: %ld\n"),
5911 pubnames.pn_length);
5912 printf (_(" Version: %d\n"),
5913 pubnames.pn_version);
5914 printf (_(" Offset into .debug_info section: %ld\n"),
5915 pubnames.pn_offset);
5916 printf (_(" Size of area in .debug_info section: %ld\n"),
5919 printf (_("\n Offset\tName\n"));
5923 offset = byte_get (data, 4);
5928 printf (" %ld\t\t%s\n", offset, data);
5929 data += strlen ((char *) data) + 1;
5932 while (offset != 0);
5945 case DW_TAG_padding: return "DW_TAG_padding";
5946 case DW_TAG_array_type: return "DW_TAG_array_type";
5947 case DW_TAG_class_type: return "DW_TAG_class_type";
5948 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5949 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5950 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5951 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5952 case DW_TAG_label: return "DW_TAG_label";
5953 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5954 case DW_TAG_member: return "DW_TAG_member";
5955 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5956 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5957 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5958 case DW_TAG_string_type: return "DW_TAG_string_type";
5959 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5960 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5961 case DW_TAG_typedef: return "DW_TAG_typedef";
5962 case DW_TAG_union_type: return "DW_TAG_union_type";
5963 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5964 case DW_TAG_variant: return "DW_TAG_variant";
5965 case DW_TAG_common_block: return "DW_TAG_common_block";
5966 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5967 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5968 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5969 case DW_TAG_module: return "DW_TAG_module";
5970 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5971 case DW_TAG_set_type: return "DW_TAG_set_type";
5972 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5973 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5974 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5975 case DW_TAG_base_type: return "DW_TAG_base_type";
5976 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5977 case DW_TAG_const_type: return "DW_TAG_const_type";
5978 case DW_TAG_constant: return "DW_TAG_constant";
5979 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5980 case DW_TAG_file_type: return "DW_TAG_file_type";
5981 case DW_TAG_friend: return "DW_TAG_friend";
5982 case DW_TAG_namelist: return "DW_TAG_namelist";
5983 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5984 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5985 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5986 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5987 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5988 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5989 case DW_TAG_try_block: return "DW_TAG_try_block";
5990 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5991 case DW_TAG_variable: return "DW_TAG_variable";
5992 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5993 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5994 case DW_TAG_format_label: return "DW_TAG_format_label";
5995 case DW_TAG_function_template: return "DW_TAG_function_template";
5996 case DW_TAG_class_template: return "DW_TAG_class_template";
5997 /* DWARF 2.1 values. */
5998 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
5999 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6000 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6001 case DW_TAG_namespace: return "DW_TAG_namespace";
6002 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6003 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6004 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6005 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6008 static char buffer [100];
6010 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6017 get_AT_name (attribute)
6018 unsigned long attribute;
6022 case DW_AT_sibling: return "DW_AT_sibling";
6023 case DW_AT_location: return "DW_AT_location";
6024 case DW_AT_name: return "DW_AT_name";
6025 case DW_AT_ordering: return "DW_AT_ordering";
6026 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6027 case DW_AT_byte_size: return "DW_AT_byte_size";
6028 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6029 case DW_AT_bit_size: return "DW_AT_bit_size";
6030 case DW_AT_element_list: return "DW_AT_element_list";
6031 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6032 case DW_AT_low_pc: return "DW_AT_low_pc";
6033 case DW_AT_high_pc: return "DW_AT_high_pc";
6034 case DW_AT_language: return "DW_AT_language";
6035 case DW_AT_member: return "DW_AT_member";
6036 case DW_AT_discr: return "DW_AT_discr";
6037 case DW_AT_discr_value: return "DW_AT_discr_value";
6038 case DW_AT_visibility: return "DW_AT_visibility";
6039 case DW_AT_import: return "DW_AT_import";
6040 case DW_AT_string_length: return "DW_AT_string_length";
6041 case DW_AT_common_reference: return "DW_AT_common_reference";
6042 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6043 case DW_AT_const_value: return "DW_AT_const_value";
6044 case DW_AT_containing_type: return "DW_AT_containing_type";
6045 case DW_AT_default_value: return "DW_AT_default_value";
6046 case DW_AT_inline: return "DW_AT_inline";
6047 case DW_AT_is_optional: return "DW_AT_is_optional";
6048 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6049 case DW_AT_producer: return "DW_AT_producer";
6050 case DW_AT_prototyped: return "DW_AT_prototyped";
6051 case DW_AT_return_addr: return "DW_AT_return_addr";
6052 case DW_AT_start_scope: return "DW_AT_start_scope";
6053 case DW_AT_stride_size: return "DW_AT_stride_size";
6054 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6055 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6056 case DW_AT_accessibility: return "DW_AT_accessibility";
6057 case DW_AT_address_class: return "DW_AT_address_class";
6058 case DW_AT_artificial: return "DW_AT_artificial";
6059 case DW_AT_base_types: return "DW_AT_base_types";
6060 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6061 case DW_AT_count: return "DW_AT_count";
6062 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6063 case DW_AT_decl_column: return "DW_AT_decl_column";
6064 case DW_AT_decl_file: return "DW_AT_decl_file";
6065 case DW_AT_decl_line: return "DW_AT_decl_line";
6066 case DW_AT_declaration: return "DW_AT_declaration";
6067 case DW_AT_discr_list: return "DW_AT_discr_list";
6068 case DW_AT_encoding: return "DW_AT_encoding";
6069 case DW_AT_external: return "DW_AT_external";
6070 case DW_AT_frame_base: return "DW_AT_frame_base";
6071 case DW_AT_friend: return "DW_AT_friend";
6072 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6073 case DW_AT_macro_info: return "DW_AT_macro_info";
6074 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6075 case DW_AT_priority: return "DW_AT_priority";
6076 case DW_AT_segment: return "DW_AT_segment";
6077 case DW_AT_specification: return "DW_AT_specification";
6078 case DW_AT_static_link: return "DW_AT_static_link";
6079 case DW_AT_type: return "DW_AT_type";
6080 case DW_AT_use_location: return "DW_AT_use_location";
6081 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6082 case DW_AT_virtuality: return "DW_AT_virtuality";
6083 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6084 /* DWARF 2.1 values. */
6085 case DW_AT_allocated: return "DW_AT_allocated";
6086 case DW_AT_associated: return "DW_AT_associated";
6087 case DW_AT_data_location: return "DW_AT_data_location";
6088 case DW_AT_stride: return "DW_AT_stride";
6089 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6090 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6091 case DW_AT_extension: return "DW_AT_extension";
6092 case DW_AT_ranges: return "DW_AT_ranges";
6093 case DW_AT_trampoline: return "DW_AT_trampoline";
6094 case DW_AT_call_column: return "DW_AT_call_column";
6095 case DW_AT_call_file: return "DW_AT_call_file";
6096 case DW_AT_call_line: return "DW_AT_call_line";
6097 /* SGI/MIPS extensions. */
6098 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6099 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6100 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6101 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6102 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6103 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6104 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6105 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6106 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6107 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6108 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6109 /* GNU extensions. */
6110 case DW_AT_sf_names: return "DW_AT_sf_names";
6111 case DW_AT_src_info: return "DW_AT_src_info";
6112 case DW_AT_mac_info: return "DW_AT_mac_info";
6113 case DW_AT_src_coords: return "DW_AT_src_coords";
6114 case DW_AT_body_begin: return "DW_AT_body_begin";
6115 case DW_AT_body_end: return "DW_AT_body_end";
6118 static char buffer [100];
6120 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6127 get_FORM_name (form)
6132 case DW_FORM_addr: return "DW_FORM_addr";
6133 case DW_FORM_block2: return "DW_FORM_block2";
6134 case DW_FORM_block4: return "DW_FORM_block4";
6135 case DW_FORM_data2: return "DW_FORM_data2";
6136 case DW_FORM_data4: return "DW_FORM_data4";
6137 case DW_FORM_data8: return "DW_FORM_data8";
6138 case DW_FORM_string: return "DW_FORM_string";
6139 case DW_FORM_block: return "DW_FORM_block";
6140 case DW_FORM_block1: return "DW_FORM_block1";
6141 case DW_FORM_data1: return "DW_FORM_data1";
6142 case DW_FORM_flag: return "DW_FORM_flag";
6143 case DW_FORM_sdata: return "DW_FORM_sdata";
6144 case DW_FORM_strp: return "DW_FORM_strp";
6145 case DW_FORM_udata: return "DW_FORM_udata";
6146 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6147 case DW_FORM_ref1: return "DW_FORM_ref1";
6148 case DW_FORM_ref2: return "DW_FORM_ref2";
6149 case DW_FORM_ref4: return "DW_FORM_ref4";
6150 case DW_FORM_ref8: return "DW_FORM_ref8";
6151 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6152 case DW_FORM_indirect: return "DW_FORM_indirect";
6155 static char buffer [100];
6157 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6163 /* FIXME: There are better and more effiecint ways to handle
6164 these structures. For now though, I just want something that
6165 is simple to implement. */
6166 typedef struct abbrev_attr
6168 unsigned long attribute;
6170 struct abbrev_attr * next;
6174 typedef struct abbrev_entry
6176 unsigned long entry;
6179 struct abbrev_attr * first_attr;
6180 struct abbrev_attr * last_attr;
6181 struct abbrev_entry * next;
6185 static abbrev_entry * first_abbrev = NULL;
6186 static abbrev_entry * last_abbrev = NULL;
6189 free_abbrevs PARAMS ((void))
6191 abbrev_entry * abbrev;
6193 for (abbrev = first_abbrev; abbrev;)
6195 abbrev_entry * next = abbrev->next;
6198 for (attr = abbrev->first_attr; attr;)
6200 abbrev_attr * next = attr->next;
6210 last_abbrev = first_abbrev = NULL;
6214 add_abbrev (number, tag, children)
6215 unsigned long number;
6219 abbrev_entry * entry;
6221 entry = (abbrev_entry *) malloc (sizeof (* entry));
6227 entry->entry = number;
6229 entry->children = children;
6230 entry->first_attr = NULL;
6231 entry->last_attr = NULL;
6234 if (first_abbrev == NULL)
6235 first_abbrev = entry;
6237 last_abbrev->next = entry;
6239 last_abbrev = entry;
6243 add_abbrev_attr (attribute, form)
6244 unsigned long attribute;
6249 attr = (abbrev_attr *) malloc (sizeof (* attr));
6255 attr->attribute = attribute;
6259 if (last_abbrev->first_attr == NULL)
6260 last_abbrev->first_attr = attr;
6262 last_abbrev->last_attr->next = attr;
6264 last_abbrev->last_attr = attr;
6267 /* Processes the (partial) contents of a .debug_abbrev section.
6268 Returns NULL if the end of the section was encountered.
6269 Returns the address after the last byte read if the end of
6270 an abbreviation set was found. */
6272 static unsigned char *
6273 process_abbrev_section (start, end)
6274 unsigned char * start;
6275 unsigned char * end;
6277 if (first_abbrev != NULL)
6283 unsigned long entry;
6285 unsigned long attribute;
6288 entry = read_leb128 (start, & bytes_read, 0);
6289 start += bytes_read;
6291 /* A single zero is supposed to end the section according
6292 to the standard. If there's more, then signal that to
6295 return start == end ? NULL : start;
6297 tag = read_leb128 (start, & bytes_read, 0);
6298 start += bytes_read;
6300 children = * start ++;
6302 add_abbrev (entry, tag, children);
6308 attribute = read_leb128 (start, & bytes_read, 0);
6309 start += bytes_read;
6311 form = read_leb128 (start, & bytes_read, 0);
6312 start += bytes_read;
6315 add_abbrev_attr (attribute, form);
6317 while (attribute != 0);
6325 display_debug_macinfo (section, start, file)
6326 Elf32_Internal_Shdr * section;
6327 unsigned char * start;
6328 FILE * file ATTRIBUTE_UNUSED;
6330 unsigned char * end = start + section->sh_size;
6331 unsigned char * curr = start;
6332 unsigned int bytes_read;
6333 enum dwarf_macinfo_record_type op;
6335 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6339 unsigned int lineno;
6340 const char * string;
6347 case DW_MACINFO_start_file:
6349 unsigned int filenum;
6351 lineno = read_leb128 (curr, & bytes_read, 0);
6353 filenum = read_leb128 (curr, & bytes_read, 0);
6356 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6360 case DW_MACINFO_end_file:
6361 printf (_(" DW_MACINFO_end_file\n"));
6364 case DW_MACINFO_define:
6365 lineno = read_leb128 (curr, & bytes_read, 0);
6368 curr += strlen (string) + 1;
6369 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6372 case DW_MACINFO_undef:
6373 lineno = read_leb128 (curr, & bytes_read, 0);
6376 curr += strlen (string) + 1;
6377 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6380 case DW_MACINFO_vendor_ext:
6382 unsigned int constant;
6384 constant = read_leb128 (curr, & bytes_read, 0);
6387 curr += strlen (string) + 1;
6388 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6399 display_debug_abbrev (section, start, file)
6400 Elf32_Internal_Shdr * section;
6401 unsigned char * start;
6402 FILE * file ATTRIBUTE_UNUSED;
6404 abbrev_entry * entry;
6405 unsigned char * end = start + section->sh_size;
6407 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6411 start = process_abbrev_section (start, end);
6413 printf (_(" Number TAG\n"));
6415 for (entry = first_abbrev; entry; entry = entry->next)
6419 printf (_(" %ld %s [%s]\n"),
6421 get_TAG_name (entry->tag),
6422 entry->children ? _("has children") : _("no children"));
6424 for (attr = entry->first_attr; attr; attr = attr->next)
6426 printf (_(" %-18s %s\n"),
6427 get_AT_name (attr->attribute),
6428 get_FORM_name (attr->form));
6440 static unsigned char *
6441 display_block (data, length)
6442 unsigned char * data;
6443 unsigned long length;
6445 printf (_(" %lu byte block: "), length);
6448 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6454 decode_location_expression (data, pointer_size, length)
6455 unsigned char * data;
6456 unsigned int pointer_size;
6457 unsigned long length;
6461 unsigned long uvalue;
6462 unsigned char * end = data + length;
6471 printf ("DW_OP_addr: %lx",
6472 (unsigned long) byte_get (data, pointer_size));
6473 data += pointer_size;
6476 printf ("DW_OP_deref");
6479 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6482 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6485 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6489 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6493 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6497 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6501 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6502 (unsigned long) byte_get (data + 4, 4));
6506 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6507 (long) byte_get (data + 4, 4));
6511 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6515 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6519 printf ("DW_OP_dup");
6522 printf ("DW_OP_drop");
6525 printf ("DW_OP_over");
6528 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6531 printf ("DW_OP_swap");
6534 printf ("DW_OP_rot");
6537 printf ("DW_OP_xderef");
6540 printf ("DW_OP_abs");
6543 printf ("DW_OP_and");
6546 printf ("DW_OP_div");
6549 printf ("DW_OP_minus");
6552 printf ("DW_OP_mod");
6555 printf ("DW_OP_mul");
6558 printf ("DW_OP_neg");
6561 printf ("DW_OP_not");
6564 printf ("DW_OP_or");
6567 printf ("DW_OP_plus");
6569 case DW_OP_plus_uconst:
6570 printf ("DW_OP_plus_uconst: %lu",
6571 read_leb128 (data, &bytes_read, 0));
6575 printf ("DW_OP_shl");
6578 printf ("DW_OP_shr");
6581 printf ("DW_OP_shra");
6584 printf ("DW_OP_xor");
6587 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6591 printf ("DW_OP_eq");
6594 printf ("DW_OP_ge");
6597 printf ("DW_OP_gt");
6600 printf ("DW_OP_le");
6603 printf ("DW_OP_lt");
6606 printf ("DW_OP_ne");
6609 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6645 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6680 printf ("DW_OP_reg%d", op - DW_OP_reg0);
6715 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6716 read_leb128 (data, &bytes_read, 1));
6721 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
6725 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
6729 uvalue = read_leb128 (data, &bytes_read, 0);
6731 printf ("DW_OP_bregx: %lu %ld", uvalue,
6732 read_leb128 (data, &bytes_read, 1));
6736 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6739 case DW_OP_deref_size:
6740 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6742 case DW_OP_xderef_size:
6743 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6746 printf ("DW_OP_nop");
6749 /* DWARF 2.1 extensions. */
6750 case DW_OP_push_object_address:
6751 printf ("DW_OP_push_object_address");
6754 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
6758 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
6762 printf ("DW_OP_calli");
6766 if (op >= DW_OP_lo_user
6767 && op <= DW_OP_hi_user)
6768 printf (_("(User defined location op)"));
6770 printf (_("(Unknown location op)"));
6771 /* No way to tell where the next op is, so just bail. */
6775 /* Separate the ops. */
6781 static unsigned char *
6782 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
6783 unsigned long attribute;
6785 unsigned char * data;
6786 unsigned long cu_offset;
6787 unsigned long pointer_size;
6789 unsigned long uvalue = 0;
6790 unsigned char * block_start = NULL;
6793 printf (" %-18s:", get_AT_name (attribute));
6800 case DW_FORM_ref_addr:
6802 uvalue = byte_get (data, pointer_size);
6803 data += pointer_size;
6809 uvalue = byte_get (data ++, 1);
6814 uvalue = byte_get (data, 2);
6820 uvalue = byte_get (data, 4);
6825 uvalue = read_leb128 (data, & bytes_read, 1);
6829 case DW_FORM_ref_udata:
6831 uvalue = read_leb128 (data, & bytes_read, 0);
6838 case DW_FORM_ref_addr:
6839 printf (" <#%lx>", uvalue);
6845 case DW_FORM_ref_udata:
6846 printf (" <%lx>", uvalue + cu_offset);
6850 printf (" %#lx", uvalue);
6858 printf (" %ld", uvalue);
6863 uvalue = byte_get (data, 4);
6864 printf (" %lx", uvalue);
6865 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6869 case DW_FORM_string:
6870 printf (" %s", data);
6871 data += strlen ((char *) data) + 1;
6875 uvalue = read_leb128 (data, & bytes_read, 0);
6876 block_start = data + bytes_read;
6877 data = display_block (block_start, uvalue);
6880 case DW_FORM_block1:
6881 uvalue = byte_get (data, 1);
6882 block_start = data + 1;
6883 data = display_block (block_start, uvalue);
6886 case DW_FORM_block2:
6887 uvalue = byte_get (data, 2);
6888 block_start = data + 2;
6889 data = display_block (block_start, uvalue);
6892 case DW_FORM_block4:
6893 uvalue = byte_get (data, 4);
6894 block_start = data + 4;
6895 data = display_block (block_start, uvalue);
6899 case DW_FORM_indirect:
6900 warn (_("Unable to handle FORM: %d"), form);
6904 warn (_("Unrecognised form: %d"), form);
6908 /* For some attributes we can display futher information. */
6917 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6918 case DW_INL_inlined: printf (_("(inlined)")); break;
6919 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6920 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6921 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6925 case DW_AT_language:
6928 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6929 case DW_LANG_C89: printf ("(ANSI C)"); break;
6930 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6931 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6932 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6933 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6934 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6935 case DW_LANG_Ada83: printf ("(Ada)"); break;
6936 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6937 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6938 /* DWARF 2.1 values. */
6939 case DW_LANG_C99: printf ("(ANSI C99)"); break;
6940 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
6941 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
6942 /* MIPS extension. */
6943 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6944 default: printf ("(Unknown: %lx)", uvalue); break;
6948 case DW_AT_encoding:
6951 case DW_ATE_void: printf ("(void)"); break;
6952 case DW_ATE_address: printf ("(machine address)"); break;
6953 case DW_ATE_boolean: printf ("(boolean)"); break;
6954 case DW_ATE_complex_float: printf ("(complex float)"); break;
6955 case DW_ATE_float: printf ("(float)"); break;
6956 case DW_ATE_signed: printf ("(signed)"); break;
6957 case DW_ATE_signed_char: printf ("(signed char)"); break;
6958 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6959 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6960 /* DWARF 2.1 value. */
6961 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
6963 if (uvalue >= DW_ATE_lo_user
6964 && uvalue <= DW_ATE_hi_user)
6965 printf ("(user defined type)");
6967 printf ("(unknown type)");
6972 case DW_AT_accessibility:
6975 case DW_ACCESS_public: printf ("(public)"); break;
6976 case DW_ACCESS_protected: printf ("(protected)"); break;
6977 case DW_ACCESS_private: printf ("(private)"); break;
6978 default: printf ("(unknown accessibility)"); break;
6982 case DW_AT_visibility:
6985 case DW_VIS_local: printf ("(local)"); break;
6986 case DW_VIS_exported: printf ("(exported)"); break;
6987 case DW_VIS_qualified: printf ("(qualified)"); break;
6988 default: printf ("(unknown visibility)"); break;
6992 case DW_AT_virtuality:
6995 case DW_VIRTUALITY_none: printf ("(none)"); break;
6996 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6997 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6998 default: printf ("(unknown virtuality)"); break;
7002 case DW_AT_identifier_case:
7005 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7006 case DW_ID_up_case: printf ("(up_case)"); break;
7007 case DW_ID_down_case: printf ("(down_case)"); break;
7008 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7009 default: printf ("(unknown case)"); break;
7013 case DW_AT_calling_convention:
7016 case DW_CC_normal: printf ("(normal)"); break;
7017 case DW_CC_program: printf ("(program)"); break;
7018 case DW_CC_nocall: printf ("(nocall)"); break;
7020 if (uvalue >= DW_CC_lo_user
7021 && uvalue <= DW_CC_hi_user)
7022 printf ("(user defined)");
7024 printf ("(unknown convention)");
7028 case DW_AT_ordering:
7031 case -1: printf ("(undefined)"); break;
7032 case 0: printf ("(row major)"); break;
7033 case 1: printf ("(column major)"); break;
7037 case DW_AT_frame_base:
7038 case DW_AT_location:
7039 case DW_AT_data_member_location:
7040 case DW_AT_vtable_elem_location:
7041 case DW_AT_allocated:
7042 case DW_AT_associated:
7043 case DW_AT_data_location:
7045 case DW_AT_upper_bound:
7046 case DW_AT_lower_bound:
7050 decode_location_expression (block_start, pointer_size, uvalue);
7064 display_debug_info (section, start, file)
7065 Elf32_Internal_Shdr * section;
7066 unsigned char * start;
7069 unsigned char * end = start + section->sh_size;
7070 unsigned char * section_begin = start;
7072 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7076 DWARF2_External_CompUnit * external;
7077 DWARF2_Internal_CompUnit compunit;
7078 Elf32_Internal_Shdr * relsec;
7079 unsigned char * tags;
7082 unsigned long cu_offset;
7084 external = (DWARF2_External_CompUnit *) start;
7086 compunit.cu_length = BYTE_GET (external->cu_length);
7087 compunit.cu_version = BYTE_GET (external->cu_version);
7088 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7089 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7091 /* Check for RELA relocations in the abbrev_offset address, and
7093 for (relsec = section_headers;
7094 relsec < section_headers + elf_header.e_shnum;
7097 unsigned long nrelas, nsyms;
7098 Elf_Internal_Rela *rela, *rp;
7099 Elf32_Internal_Shdr *symsec;
7100 Elf_Internal_Sym *symtab;
7101 Elf_Internal_Sym *sym;
7103 if (relsec->sh_type != SHT_RELA
7104 || section_headers + relsec->sh_info != section)
7107 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7111 symsec = section_headers + relsec->sh_link;
7112 nsyms = symsec->sh_size / symsec->sh_entsize;
7113 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
7115 for (rp = rela; rp < rela + nrelas; ++rp)
7118 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7124 sym = symtab + ELF32_R_SYM (rp->r_info);
7126 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7128 warn (_("Skipping unexpected symbol type %u"),
7129 ELF32_ST_TYPE (sym->st_info));
7135 sym = symtab + ELF64_R_SYM (rp->r_info);
7137 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7139 warn (_("Skipping unexpected symbol type %u"),
7140 ELF64_ST_TYPE (sym->st_info));
7145 compunit.cu_abbrev_offset += rp->r_addend;
7153 tags = start + sizeof (* external);
7154 cu_offset = start - section_begin;
7155 start += compunit.cu_length + sizeof (external->cu_length);
7157 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7158 printf (_(" Length: %ld\n"), compunit.cu_length);
7159 printf (_(" Version: %d\n"), compunit.cu_version);
7160 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7161 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7163 if (compunit.cu_version != 2)
7165 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7169 if (first_abbrev != NULL)
7172 /* Read in the abbrevs used by this compilation unit. */
7175 Elf32_Internal_Shdr * sec;
7176 unsigned char * begin;
7178 /* Locate the .debug_abbrev section and process it. */
7179 for (i = 0, sec = section_headers;
7180 i < elf_header.e_shnum;
7182 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7185 if (i == -1 || sec->sh_size == 0)
7187 warn (_("Unable to locate .debug_abbrev section!\n"));
7191 begin = ((unsigned char *)
7192 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7193 _("debug_abbrev section data")));
7197 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7198 begin + sec->sh_size);
7204 while (tags < start)
7207 unsigned long abbrev_number;
7208 abbrev_entry * entry;
7211 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7214 /* A null DIE marks the end of a list of children. */
7215 if (abbrev_number == 0)
7221 /* Scan through the abbreviation list until we reach the
7223 for (entry = first_abbrev;
7224 entry && entry->entry != abbrev_number;
7225 entry = entry->next)
7230 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7235 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7237 (unsigned long) (tags - section_begin - bytes_read),
7239 get_TAG_name (entry->tag));
7241 for (attr = entry->first_attr; attr; attr = attr->next)
7242 tags = read_and_display_attr (attr->attribute,
7245 compunit.cu_pointer_size);
7247 if (entry->children)
7258 display_debug_aranges (section, start, file)
7259 Elf32_Internal_Shdr * section;
7260 unsigned char * start;
7261 FILE * file ATTRIBUTE_UNUSED;
7263 unsigned char * end = start + section->sh_size;
7265 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7269 DWARF2_External_ARange * external;
7270 DWARF2_Internal_ARange arange;
7271 unsigned char * ranges;
7272 unsigned long length;
7273 unsigned long address;
7276 external = (DWARF2_External_ARange *) start;
7278 arange.ar_length = BYTE_GET (external->ar_length);
7279 arange.ar_version = BYTE_GET (external->ar_version);
7280 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7281 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7282 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7284 if (arange.ar_version != 2)
7286 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7290 printf (_(" Length: %ld\n"), arange.ar_length);
7291 printf (_(" Version: %d\n"), arange.ar_version);
7292 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7293 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7294 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7296 printf (_("\n Address Length\n"));
7298 ranges = start + sizeof (* external);
7300 /* Must pad to an alignment boundary that is twice the pointer size. */
7301 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7303 ranges += (2 * arange.ar_pointer_size) - excess;
7307 address = byte_get (ranges, arange.ar_pointer_size);
7309 ranges += arange.ar_pointer_size;
7311 length = byte_get (ranges, arange.ar_pointer_size);
7313 ranges += arange.ar_pointer_size;
7315 /* A pair of zeros marks the end of the list. */
7316 if (address == 0 && length == 0)
7319 printf (" %8.8lx %lu\n", address, length);
7322 start += arange.ar_length + sizeof (external->ar_length);
7330 typedef struct Frame_Chunk
7332 struct Frame_Chunk * next;
7333 unsigned char * chunk_start;
7335 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7336 short int * col_type;
7338 char * augmentation;
7339 unsigned int code_factor;
7341 unsigned long pc_begin;
7342 unsigned long pc_range;
7346 unsigned char fde_encoding;
7350 /* A marker for a col_type that means this column was never referenced
7351 in the frame info. */
7352 #define DW_CFA_unreferenced (-1)
7354 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7355 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7356 static int size_of_encoded_value PARAMS ((int));
7359 frame_need_space (fc, reg)
7363 int prev = fc->ncols;
7365 if (reg < fc->ncols)
7368 fc->ncols = reg + 1;
7369 fc->col_type = (short int *) xrealloc (fc->col_type,
7370 fc->ncols * sizeof (short int));
7371 fc->col_offset = (int *) xrealloc (fc->col_offset,
7372 fc->ncols * sizeof (int));
7374 while (prev < fc->ncols)
7376 fc->col_type[prev] = DW_CFA_unreferenced;
7377 fc->col_offset[prev] = 0;
7383 frame_display_row (fc, need_col_headers, max_regs)
7385 int * need_col_headers;
7391 if (* max_regs < fc->ncols)
7392 * max_regs = fc->ncols;
7394 if (* need_col_headers)
7396 * need_col_headers = 0;
7398 printf (" LOC CFA ");
7400 for (r = 0; r < * max_regs; r++)
7401 if (fc->col_type[r] != DW_CFA_unreferenced)
7406 printf ("r%-4d", r);
7412 printf ("%08lx ", fc->pc_begin);
7413 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7414 printf ("%-8s ", tmp);
7416 for (r = 0; r < fc->ncols; r++)
7418 if (fc->col_type[r] != DW_CFA_unreferenced)
7420 switch (fc->col_type[r])
7422 case DW_CFA_undefined:
7425 case DW_CFA_same_value:
7429 sprintf (tmp, "c%+d", fc->col_offset[r]);
7431 case DW_CFA_register:
7432 sprintf (tmp, "r%d", fc->col_offset[r]);
7435 strcpy (tmp, "n/a");
7438 printf ("%-5s", tmp);
7445 size_of_encoded_value (encoding)
7448 switch (encoding & 0x7)
7451 case 0: return is_32bit_elf ? 4 : 8;
7458 #define GET(N) byte_get (start, N); start += N
7459 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7460 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7463 display_debug_frames (section, start, file)
7464 Elf32_Internal_Shdr * section;
7465 unsigned char * start;
7466 FILE * file ATTRIBUTE_UNUSED;
7468 unsigned char * end = start + section->sh_size;
7469 unsigned char * section_start = start;
7470 Frame_Chunk * chunks = 0;
7471 Frame_Chunk * remembered_state = 0;
7473 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7476 int addr_size = is_32bit_elf ? 4 : 8;
7478 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7482 unsigned char * saved_start;
7483 unsigned char * block_end;
7484 unsigned long length;
7485 unsigned long cie_id;
7488 int need_col_headers = 1;
7489 unsigned char * augmentation_data = NULL;
7490 unsigned long augmentation_data_len = 0;
7491 int encoded_ptr_size = addr_size;
7493 saved_start = start;
7494 length = byte_get (start, 4); start += 4;
7499 block_end = saved_start + length + 4;
7500 cie_id = byte_get (start, 4); start += 4;
7502 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7506 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7507 memset (fc, 0, sizeof (Frame_Chunk));
7511 fc->chunk_start = saved_start;
7513 fc->col_type = (short int *) xmalloc (sizeof (short int));
7514 fc->col_offset = (int *) xmalloc (sizeof (int));
7515 frame_need_space (fc, max_regs-1);
7519 fc->augmentation = start;
7520 start = strchr (start, '\0') + 1;
7522 if (fc->augmentation[0] == 'z')
7524 fc->code_factor = LEB ();
7525 fc->data_factor = SLEB ();
7526 fc->ra = byte_get (start, 1); start += 1;
7527 augmentation_data_len = LEB ();
7528 augmentation_data = start;
7529 start += augmentation_data_len;
7531 else if (strcmp (fc->augmentation, "eh") == 0)
7534 fc->code_factor = LEB ();
7535 fc->data_factor = SLEB ();
7536 fc->ra = byte_get (start, 1); start += 1;
7540 fc->code_factor = LEB ();
7541 fc->data_factor = SLEB ();
7542 fc->ra = byte_get (start, 1); start += 1;
7546 if (do_debug_frames_interp)
7547 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7548 (unsigned long)(saved_start - section_start), length, cie_id,
7549 fc->augmentation, fc->code_factor, fc->data_factor,
7553 printf ("\n%08lx %08lx %08lx CIE\n",
7554 (unsigned long)(saved_start - section_start), length, cie_id);
7555 printf (" Version: %d\n", version);
7556 printf (" Augmentation: \"%s\"\n", fc->augmentation);
7557 printf (" Code alignment factor: %u\n", fc->code_factor);
7558 printf (" Data alignment factor: %d\n", fc->data_factor);
7559 printf (" Return address column: %d\n", fc->ra);
7561 if (augmentation_data_len)
7564 printf (" Augmentation data: ");
7565 for (i = 0; i < augmentation_data_len; ++i)
7566 printf (" %02x", augmentation_data[i]);
7572 if (augmentation_data_len)
7574 unsigned char *p, *q;
7575 p = fc->augmentation + 1;
7576 q = augmentation_data;
7583 q += 1 + size_of_encoded_value (*q);
7585 fc->fde_encoding = *q++;
7591 if (fc->fde_encoding)
7592 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7595 frame_need_space (fc, fc->ra);
7599 unsigned char * look_for;
7600 static Frame_Chunk fde_fc;
7603 memset (fc, 0, sizeof (Frame_Chunk));
7605 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
7607 for (cie=chunks; cie ; cie = cie->next)
7608 if (cie->chunk_start == look_for)
7613 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7614 cie_id, saved_start);
7617 fc->col_type = (short int *) xmalloc (sizeof (short int));
7618 fc->col_offset = (int *) xmalloc (sizeof (int));
7619 frame_need_space (fc, max_regs - 1);
7621 fc->augmentation = "";
7622 fc->fde_encoding = 0;
7626 fc->ncols = cie->ncols;
7627 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
7628 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
7629 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7630 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7631 fc->augmentation = cie->augmentation;
7632 fc->code_factor = cie->code_factor;
7633 fc->data_factor = cie->data_factor;
7634 fc->cfa_reg = cie->cfa_reg;
7635 fc->cfa_offset = cie->cfa_offset;
7637 frame_need_space (fc, max_regs-1);
7638 fc->fde_encoding = cie->fde_encoding;
7641 if (fc->fde_encoding)
7642 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7644 fc->pc_begin = byte_get (start, encoded_ptr_size);
7645 start += encoded_ptr_size;
7646 fc->pc_range = byte_get (start, encoded_ptr_size);
7647 start += encoded_ptr_size;
7649 if (cie->augmentation[0] == 'z')
7651 augmentation_data_len = LEB ();
7652 augmentation_data = start;
7653 start += augmentation_data_len;
7656 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
7657 (unsigned long)(saved_start - section_start), length, cie_id,
7658 (unsigned long)(cie->chunk_start - section_start),
7659 fc->pc_begin, fc->pc_begin + fc->pc_range);
7660 if (! do_debug_frames_interp && augmentation_data_len)
7663 printf (" Augmentation data: ");
7664 for (i = 0; i < augmentation_data_len; ++i)
7665 printf (" %02x", augmentation_data[i]);
7671 /* At this point, fc is the current chunk, cie (if any) is set, and we're
7672 about to interpret instructions for the chunk. */
7674 if (do_debug_frames_interp)
7676 /* Start by making a pass over the chunk, allocating storage
7677 and taking note of what registers are used. */
7678 unsigned char * tmp = start;
7680 while (start < block_end)
7690 /* Warning: if you add any more cases to this switch, be
7691 sure to add them to the corresponding switch below. */
7694 case DW_CFA_advance_loc:
7698 frame_need_space (fc, opa);
7699 fc->col_type[opa] = DW_CFA_undefined;
7701 case DW_CFA_restore:
7702 frame_need_space (fc, opa);
7703 fc->col_type[opa] = DW_CFA_undefined;
7705 case DW_CFA_set_loc:
7706 start += encoded_ptr_size;
7708 case DW_CFA_advance_loc1:
7711 case DW_CFA_advance_loc2:
7714 case DW_CFA_advance_loc4:
7717 case DW_CFA_offset_extended:
7718 reg = LEB (); LEB ();
7719 frame_need_space (fc, reg);
7720 fc->col_type[reg] = DW_CFA_undefined;
7722 case DW_CFA_restore_extended:
7724 frame_need_space (fc, reg);
7725 fc->col_type[reg] = DW_CFA_undefined;
7727 case DW_CFA_undefined:
7729 frame_need_space (fc, reg);
7730 fc->col_type[reg] = DW_CFA_undefined;
7732 case DW_CFA_same_value:
7734 frame_need_space (fc, reg);
7735 fc->col_type[reg] = DW_CFA_undefined;
7737 case DW_CFA_register:
7738 reg = LEB (); LEB ();
7739 frame_need_space (fc, reg);
7740 fc->col_type[reg] = DW_CFA_undefined;
7742 case DW_CFA_def_cfa:
7745 case DW_CFA_def_cfa_register:
7748 case DW_CFA_def_cfa_offset:
7751 #ifndef DW_CFA_GNU_args_size
7752 #define DW_CFA_GNU_args_size 0x2e
7754 case DW_CFA_GNU_args_size:
7757 #ifndef DW_CFA_GNU_negative_offset_extended
7758 #define DW_CFA_GNU_negative_offset_extended 0x2f
7760 case DW_CFA_GNU_negative_offset_extended:
7761 reg = LEB (); LEB ();
7762 frame_need_space (fc, reg);
7763 fc->col_type[reg] = DW_CFA_undefined;
7772 /* Now we know what registers are used, make a second pass over
7773 the chunk, this time actually printing out the info. */
7775 while (start < block_end)
7778 unsigned long ul, reg, roffs;
7787 /* Warning: if you add any more cases to this switch, be
7788 sure to add them to the corresponding switch above. */
7791 case DW_CFA_advance_loc:
7792 if (do_debug_frames_interp)
7793 frame_display_row (fc, &need_col_headers, &max_regs);
7795 printf (" DW_CFA_advance_loc: %d to %08lx\n",
7796 opa * fc->code_factor,
7797 fc->pc_begin + opa * fc->code_factor);
7798 fc->pc_begin += opa * fc->code_factor;
7803 if (! do_debug_frames_interp)
7804 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
7805 opa, roffs * fc->data_factor);
7806 fc->col_type[opa] = DW_CFA_offset;
7807 fc->col_offset[opa] = roffs * fc->data_factor;
7810 case DW_CFA_restore:
7811 if (! do_debug_frames_interp)
7812 printf (" DW_CFA_restore: r%d\n", opa);
7813 fc->col_type[opa] = cie->col_type[opa];
7814 fc->col_offset[opa] = cie->col_offset[opa];
7817 case DW_CFA_set_loc:
7818 vma = byte_get (start, encoded_ptr_size);
7819 start += encoded_ptr_size;
7820 if (do_debug_frames_interp)
7821 frame_display_row (fc, &need_col_headers, &max_regs);
7823 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
7827 case DW_CFA_advance_loc1:
7828 ofs = byte_get (start, 1); start += 1;
7829 if (do_debug_frames_interp)
7830 frame_display_row (fc, &need_col_headers, &max_regs);
7832 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
7833 ofs * fc->code_factor,
7834 fc->pc_begin + ofs * fc->code_factor);
7835 fc->pc_begin += ofs * fc->code_factor;
7838 case DW_CFA_advance_loc2:
7839 ofs = byte_get (start, 2); start += 2;
7840 if (do_debug_frames_interp)
7841 frame_display_row (fc, &need_col_headers, &max_regs);
7843 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
7844 ofs * fc->code_factor,
7845 fc->pc_begin + ofs * fc->code_factor);
7846 fc->pc_begin += ofs * fc->code_factor;
7849 case DW_CFA_advance_loc4:
7850 ofs = byte_get (start, 4); start += 4;
7851 if (do_debug_frames_interp)
7852 frame_display_row (fc, &need_col_headers, &max_regs);
7854 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
7855 ofs * fc->code_factor,
7856 fc->pc_begin + ofs * fc->code_factor);
7857 fc->pc_begin += ofs * fc->code_factor;
7860 case DW_CFA_offset_extended:
7863 if (! do_debug_frames_interp)
7864 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
7865 reg, roffs * fc->data_factor);
7866 fc->col_type[reg] = DW_CFA_offset;
7867 fc->col_offset[reg] = roffs * fc->data_factor;
7870 case DW_CFA_restore_extended:
7872 if (! do_debug_frames_interp)
7873 printf (" DW_CFA_restore_extended: r%ld\n", reg);
7874 fc->col_type[reg] = cie->col_type[reg];
7875 fc->col_offset[reg] = cie->col_offset[reg];
7878 case DW_CFA_undefined:
7880 if (! do_debug_frames_interp)
7881 printf (" DW_CFA_undefined: r%ld\n", reg);
7882 fc->col_type[reg] = DW_CFA_undefined;
7883 fc->col_offset[reg] = 0;
7886 case DW_CFA_same_value:
7888 if (! do_debug_frames_interp)
7889 printf (" DW_CFA_same_value: r%ld\n", reg);
7890 fc->col_type[reg] = DW_CFA_same_value;
7891 fc->col_offset[reg] = 0;
7894 case DW_CFA_register:
7897 if (! do_debug_frames_interp)
7898 printf (" DW_CFA_register: r%ld\n", reg);
7899 fc->col_type[reg] = DW_CFA_register;
7900 fc->col_offset[reg] = roffs;
7903 case DW_CFA_remember_state:
7904 if (! do_debug_frames_interp)
7905 printf (" DW_CFA_remember_state\n");
7906 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7907 rs->ncols = fc->ncols;
7908 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
7909 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
7910 memcpy (rs->col_type, fc->col_type, rs->ncols);
7911 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
7912 rs->next = remembered_state;
7913 remembered_state = rs;
7916 case DW_CFA_restore_state:
7917 if (! do_debug_frames_interp)
7918 printf (" DW_CFA_restore_state\n");
7919 rs = remembered_state;
7920 remembered_state = rs->next;
7921 frame_need_space (fc, rs->ncols-1);
7922 memcpy (fc->col_type, rs->col_type, rs->ncols);
7923 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
7924 free (rs->col_type);
7925 free (rs->col_offset);
7929 case DW_CFA_def_cfa:
7930 fc->cfa_reg = LEB ();
7931 fc->cfa_offset = LEB ();
7932 if (! do_debug_frames_interp)
7933 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
7934 fc->cfa_reg, fc->cfa_offset);
7937 case DW_CFA_def_cfa_register:
7938 fc->cfa_reg = LEB ();
7939 if (! do_debug_frames_interp)
7940 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
7943 case DW_CFA_def_cfa_offset:
7944 fc->cfa_offset = LEB ();
7945 if (! do_debug_frames_interp)
7946 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
7950 if (! do_debug_frames_interp)
7951 printf (" DW_CFA_nop\n");
7954 #ifndef DW_CFA_GNU_window_save
7955 #define DW_CFA_GNU_window_save 0x2d
7957 case DW_CFA_GNU_window_save:
7958 if (! do_debug_frames_interp)
7959 printf (" DW_CFA_GNU_window_save\n");
7962 case DW_CFA_GNU_args_size:
7964 if (! do_debug_frames_interp)
7965 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
7968 case DW_CFA_GNU_negative_offset_extended:
7971 frame_need_space (fc, reg);
7972 if (! do_debug_frames_interp)
7973 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
7974 reg, l * fc->data_factor);
7975 fc->col_type[reg] = DW_CFA_offset;
7976 fc->col_offset[reg] = l * fc->data_factor;
7980 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
7985 if (do_debug_frames_interp)
7986 frame_display_row (fc, &need_col_headers, &max_regs);
8001 display_debug_not_supported (section, start, file)
8002 Elf32_Internal_Shdr * section;
8003 unsigned char * start ATTRIBUTE_UNUSED;
8004 FILE * file ATTRIBUTE_UNUSED;
8006 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8007 SECTION_NAME (section));
8012 /* Pre-scan the .debug_info section to record the size of address.
8013 When dumping the .debug_line, we use that size information, assuming
8014 that all compilation units have the same address size. */
8016 prescan_debug_info (section, start, file)
8017 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8018 unsigned char * start;
8019 FILE * file ATTRIBUTE_UNUSED;
8021 DWARF2_External_CompUnit * external;
8023 external = (DWARF2_External_CompUnit *) start;
8025 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8029 /* A structure containing the name of a debug section and a pointer
8030 to a function that can decode it. The third field is a prescan
8031 function to be run over the section before displaying any of the
8036 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8037 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8041 { ".debug_info", display_debug_info, prescan_debug_info },
8042 { ".debug_abbrev", display_debug_abbrev, NULL },
8043 { ".debug_line", display_debug_lines, NULL },
8044 { ".debug_aranges", display_debug_aranges, NULL },
8045 { ".debug_pubnames", display_debug_pubnames, NULL },
8046 { ".debug_frame", display_debug_frames, NULL },
8047 { ".eh_frame", display_debug_frames, NULL },
8048 { ".debug_macinfo", display_debug_macinfo, NULL },
8049 { ".debug_str", display_debug_not_supported, NULL },
8050 { ".debug_static_func", display_debug_not_supported, NULL },
8051 { ".debug_static_vars", display_debug_not_supported, NULL },
8052 { ".debug_types", display_debug_not_supported, NULL },
8053 { ".debug_weaknames", display_debug_not_supported, NULL }
8057 display_debug_section (section, file)
8058 Elf32_Internal_Shdr * section;
8061 char * name = SECTION_NAME (section);
8062 bfd_size_type length;
8063 unsigned char * start;
8066 length = section->sh_size;
8069 printf (_("\nSection '%s' has no debugging data.\n"), name);
8073 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8074 _("debug section data"));
8078 /* See if we know how to display the contents of this section. */
8079 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8080 name = ".debug_info";
8082 for (i = NUM_ELEM (debug_displays); i--;)
8083 if (strcmp (debug_displays[i].name, name) == 0)
8085 debug_displays[i].display (section, start, file);
8090 printf (_("Unrecognised debug section: %s\n"), name);
8094 /* If we loaded in the abbrev section at some point,
8095 we must release it here. */
8096 if (first_abbrev != NULL)
8103 process_section_contents (file)
8106 Elf32_Internal_Shdr * section;
8112 /* Pre-scan the debug sections to find some debug information not
8113 present in some of them. For the .debug_line, we must find out the
8114 size of address (specified in .debug_info and .debug_aranges). */
8115 for (i = 0, section = section_headers;
8116 i < elf_header.e_shnum && i < num_dump_sects;
8119 char * name = SECTION_NAME (section);
8122 if (section->sh_size == 0)
8125 /* See if there is some pre-scan operation for this section. */
8126 for (j = NUM_ELEM (debug_displays); j--;)
8127 if (strcmp (debug_displays[j].name, name) == 0)
8129 if (debug_displays[j].prescan != NULL)
8131 bfd_size_type length;
8132 unsigned char * start;
8134 length = section->sh_size;
8135 start = ((unsigned char *)
8136 get_data (NULL, file, section->sh_offset, length,
8137 _("debug section data")));
8141 debug_displays[j].prescan (section, start, file);
8149 for (i = 0, section = section_headers;
8150 i < elf_header.e_shnum && i < num_dump_sects;
8153 #ifdef SUPPORT_DISASSEMBLY
8154 if (dump_sects[i] & DISASS_DUMP)
8155 disassemble_section (section, file);
8157 if (dump_sects[i] & HEX_DUMP)
8158 dump_section (section, file);
8160 if (dump_sects[i] & DEBUG_DUMP)
8161 display_debug_section (section, file);
8164 if (i < num_dump_sects)
8165 warn (_("Some sections were not dumped because they do not exist!\n"));
8171 process_mips_fpe_exception (mask)
8177 if (mask & OEX_FPU_INEX)
8178 fputs ("INEX", stdout), first = 0;
8179 if (mask & OEX_FPU_UFLO)
8180 printf ("%sUFLO", first ? "" : "|"), first = 0;
8181 if (mask & OEX_FPU_OFLO)
8182 printf ("%sOFLO", first ? "" : "|"), first = 0;
8183 if (mask & OEX_FPU_DIV0)
8184 printf ("%sDIV0", first ? "" : "|"), first = 0;
8185 if (mask & OEX_FPU_INVAL)
8186 printf ("%sINVAL", first ? "" : "|");
8189 fputs ("0", stdout);
8193 process_mips_specific (file)
8196 Elf_Internal_Dyn * entry;
8197 size_t liblist_offset = 0;
8198 size_t liblistno = 0;
8199 size_t conflictsno = 0;
8200 size_t options_offset = 0;
8201 size_t conflicts_offset = 0;
8203 /* We have a lot of special sections. Thanks SGI! */
8204 if (dynamic_segment == NULL)
8205 /* No information available. */
8208 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8209 switch (entry->d_tag)
8211 case DT_MIPS_LIBLIST:
8212 liblist_offset = entry->d_un.d_val - loadaddr;
8214 case DT_MIPS_LIBLISTNO:
8215 liblistno = entry->d_un.d_val;
8217 case DT_MIPS_OPTIONS:
8218 options_offset = entry->d_un.d_val - loadaddr;
8220 case DT_MIPS_CONFLICT:
8221 conflicts_offset = entry->d_un.d_val - loadaddr;
8223 case DT_MIPS_CONFLICTNO:
8224 conflictsno = entry->d_un.d_val;
8230 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8232 Elf32_External_Lib * elib;
8235 elib = ((Elf32_External_Lib *)
8236 get_data (NULL, file, liblist_offset,
8237 liblistno * sizeof (Elf32_External_Lib),
8241 printf ("\nSection '.liblist' contains %lu entries:\n",
8242 (unsigned long) liblistno);
8243 fputs (" Library Time Stamp Checksum Version Flags\n",
8246 for (cnt = 0; cnt < liblistno; ++cnt)
8253 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8254 time = BYTE_GET (elib[cnt].l_time_stamp);
8255 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8256 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8257 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8259 tmp = gmtime (&time);
8260 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8261 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8262 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8264 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
8265 dynamic_strings + liblist.l_name, timebuf,
8266 liblist.l_checksum, liblist.l_version);
8268 if (liblist.l_flags == 0)
8279 { " EXACT_MATCH", LL_EXACT_MATCH },
8280 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8281 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8282 { " EXPORTS", LL_EXPORTS },
8283 { " DELAY_LOAD", LL_DELAY_LOAD },
8284 { " DELTA", LL_DELTA }
8286 int flags = liblist.l_flags;
8290 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8292 if ((flags & l_flags_vals[fcnt].bit) != 0)
8294 fputs (l_flags_vals[fcnt].name, stdout);
8295 flags ^= l_flags_vals[fcnt].bit;
8298 printf (" %#x", (unsigned int) flags);
8308 if (options_offset != 0)
8310 Elf_External_Options * eopt;
8311 Elf_Internal_Shdr * sect = section_headers;
8312 Elf_Internal_Options * iopt;
8313 Elf_Internal_Options * option;
8317 /* Find the section header so that we get the size. */
8318 while (sect->sh_type != SHT_MIPS_OPTIONS)
8321 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8322 sect->sh_size, _("options"));
8325 iopt = ((Elf_Internal_Options *)
8326 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8329 error (_("Out of memory"));
8336 while (offset < sect->sh_size)
8338 Elf_External_Options * eoption;
8340 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8342 option->kind = BYTE_GET (eoption->kind);
8343 option->size = BYTE_GET (eoption->size);
8344 option->section = BYTE_GET (eoption->section);
8345 option->info = BYTE_GET (eoption->info);
8347 offset += option->size;
8353 printf (_("\nSection '%s' contains %d entries:\n"),
8354 SECTION_NAME (sect), cnt);
8362 switch (option->kind)
8365 /* This shouldn't happen. */
8366 printf (" NULL %d %lx", option->section, option->info);
8369 printf (" REGINFO ");
8370 if (elf_header.e_machine == EM_MIPS)
8373 Elf32_External_RegInfo * ereg;
8374 Elf32_RegInfo reginfo;
8376 ereg = (Elf32_External_RegInfo *) (option + 1);
8377 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8378 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8379 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8380 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8381 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8382 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8384 printf ("GPR %08lx GP 0x%lx\n",
8386 (unsigned long) reginfo.ri_gp_value);
8387 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8388 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8389 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8394 Elf64_External_RegInfo * ereg;
8395 Elf64_Internal_RegInfo reginfo;
8397 ereg = (Elf64_External_RegInfo *) (option + 1);
8398 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8399 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8400 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8401 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8402 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8403 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8405 printf ("GPR %08lx GP 0x",
8406 reginfo.ri_gprmask);
8407 printf_vma (reginfo.ri_gp_value);
8410 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8411 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8412 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8416 case ODK_EXCEPTIONS:
8417 fputs (" EXCEPTIONS fpe_min(", stdout);
8418 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8419 fputs (") fpe_max(", stdout);
8420 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8421 fputs (")", stdout);
8423 if (option->info & OEX_PAGE0)
8424 fputs (" PAGE0", stdout);
8425 if (option->info & OEX_SMM)
8426 fputs (" SMM", stdout);
8427 if (option->info & OEX_FPDBUG)
8428 fputs (" FPDBUG", stdout);
8429 if (option->info & OEX_DISMISS)
8430 fputs (" DISMISS", stdout);
8433 fputs (" PAD ", stdout);
8434 if (option->info & OPAD_PREFIX)
8435 fputs (" PREFIX", stdout);
8436 if (option->info & OPAD_POSTFIX)
8437 fputs (" POSTFIX", stdout);
8438 if (option->info & OPAD_SYMBOL)
8439 fputs (" SYMBOL", stdout);
8442 fputs (" HWPATCH ", stdout);
8443 if (option->info & OHW_R4KEOP)
8444 fputs (" R4KEOP", stdout);
8445 if (option->info & OHW_R8KPFETCH)
8446 fputs (" R8KPFETCH", stdout);
8447 if (option->info & OHW_R5KEOP)
8448 fputs (" R5KEOP", stdout);
8449 if (option->info & OHW_R5KCVTL)
8450 fputs (" R5KCVTL", stdout);
8453 fputs (" FILL ", stdout);
8454 /* XXX Print content of info word? */
8457 fputs (" TAGS ", stdout);
8458 /* XXX Print content of info word? */
8461 fputs (" HWAND ", stdout);
8462 if (option->info & OHWA0_R4KEOP_CHECKED)
8463 fputs (" R4KEOP_CHECKED", stdout);
8464 if (option->info & OHWA0_R4KEOP_CLEAN)
8465 fputs (" R4KEOP_CLEAN", stdout);
8468 fputs (" HWOR ", stdout);
8469 if (option->info & OHWA0_R4KEOP_CHECKED)
8470 fputs (" R4KEOP_CHECKED", stdout);
8471 if (option->info & OHWA0_R4KEOP_CLEAN)
8472 fputs (" R4KEOP_CLEAN", stdout);
8475 printf (" GP_GROUP %#06lx self-contained %#06lx",
8476 option->info & OGP_GROUP,
8477 (option->info & OGP_SELF) >> 16);
8480 printf (" IDENT %#06lx self-contained %#06lx",
8481 option->info & OGP_GROUP,
8482 (option->info & OGP_SELF) >> 16);
8485 /* This shouldn't happen. */
8486 printf (" %3d ??? %d %lx",
8487 option->kind, option->section, option->info);
8491 len = sizeof (* eopt);
8492 while (len < option->size)
8493 if (((char *) option)[len] >= ' '
8494 && ((char *) option)[len] < 0x7f)
8495 printf ("%c", ((char *) option)[len++]);
8497 printf ("\\%03o", ((char *) option)[len++]);
8499 fputs ("\n", stdout);
8507 if (conflicts_offset != 0 && conflictsno != 0)
8509 Elf32_Conflict * iconf;
8512 if (dynamic_symbols == NULL)
8514 error (_("conflict list with without table"));
8518 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
8521 error (_("Out of memory"));
8527 Elf32_External_Conflict * econf32;
8529 econf32 = ((Elf32_External_Conflict *)
8530 get_data (NULL, file, conflicts_offset,
8531 conflictsno * sizeof (* econf32),
8536 for (cnt = 0; cnt < conflictsno; ++cnt)
8537 iconf[cnt] = BYTE_GET (econf32[cnt]);
8543 Elf64_External_Conflict * econf64;
8545 econf64 = ((Elf64_External_Conflict *)
8546 get_data (NULL, file, conflicts_offset,
8547 conflictsno * sizeof (* econf64),
8552 for (cnt = 0; cnt < conflictsno; ++cnt)
8553 iconf[cnt] = BYTE_GET (econf64[cnt]);
8558 printf (_("\nSection '.conflict' contains %ld entries:\n"),
8559 (long) conflictsno);
8560 puts (_(" Num: Index Value Name"));
8562 for (cnt = 0; cnt < conflictsno; ++cnt)
8564 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
8566 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
8567 print_vma (psym->st_value, FULL_HEX);
8568 printf (" %s\n", dynamic_strings + psym->st_name);
8578 get_note_type (e_type)
8581 static char buff[64];
8585 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
8586 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
8587 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
8588 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
8589 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
8590 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
8591 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
8592 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
8593 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8594 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8595 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8597 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
8602 /* Note that by the ELF standard, the name field is already null byte
8603 terminated, and namesz includes the terminating null byte.
8604 I.E. the value of namesz for the name "FSF" is 4.
8606 If the value of namesz is zero, there is no name present. */
8608 process_note (pnote)
8609 Elf32_Internal_Note * pnote;
8611 printf (" %s\t\t0x%08lx\t%s\n",
8612 pnote->namesz ? pnote->namedata : "(NONE)",
8613 pnote->descsz, get_note_type (pnote->type));
8619 process_corefile_note_segment (file, offset, length)
8624 Elf_External_Note * pnotes;
8625 Elf_External_Note * external;
8631 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
8638 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8639 (unsigned long) offset, (unsigned long) length);
8640 printf (_(" Owner\t\tData size\tDescription\n"));
8642 while (external < (Elf_External_Note *)((char *) pnotes + length))
8644 Elf32_Internal_Note inote;
8647 inote.type = BYTE_GET (external->type);
8648 inote.namesz = BYTE_GET (external->namesz);
8649 inote.namedata = external->name;
8650 inote.descsz = BYTE_GET (external->descsz);
8651 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
8652 inote.descpos = offset + (inote.descdata - (char *) pnotes);
8654 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
8656 /* Verify that name is null terminated. It appears that at least
8657 one version of Linux (RedHat 6.0) generates corefiles that don't
8658 comply with the ELF spec by failing to include the null byte in
8660 if (inote.namedata[inote.namesz] != '\0')
8662 temp = malloc (inote.namesz + 1);
8666 error (_("Out of memory\n"));
8671 strncpy (temp, inote.namedata, inote.namesz);
8672 temp[inote.namesz] = 0;
8674 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8675 inote.namedata = temp;
8678 res &= process_note (& inote);
8693 process_corefile_note_segments (file)
8696 Elf_Internal_Phdr * program_headers;
8697 Elf_Internal_Phdr * segment;
8701 program_headers = (Elf_Internal_Phdr *) malloc
8702 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
8704 if (program_headers == NULL)
8706 error (_("Out of memory\n"));
8711 i = get_32bit_program_headers (file, program_headers);
8713 i = get_64bit_program_headers (file, program_headers);
8717 free (program_headers);
8721 for (i = 0, segment = program_headers;
8722 i < elf_header.e_phnum;
8725 if (segment->p_type == PT_NOTE)
8726 res &= process_corefile_note_segment (file,
8727 (bfd_vma) segment->p_offset,
8728 (bfd_vma) segment->p_filesz);
8731 free (program_headers);
8737 process_corefile_contents (file)
8740 /* If we have not been asked to display the notes then do nothing. */
8744 /* If file is not a core file then exit. */
8745 if (elf_header.e_type != ET_CORE)
8748 /* No program headers means no NOTE segment. */
8749 if (elf_header.e_phnum == 0)
8751 printf (_("No note segments present in the core file.\n"));
8755 return process_corefile_note_segments (file);
8759 process_arch_specific (file)
8765 switch (elf_header.e_machine)
8768 case EM_MIPS_RS3_LE:
8769 return process_mips_specific (file);
8778 get_file_header (file)
8781 /* Read in the identity array. */
8782 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
8785 /* Determine how to read the rest of the header. */
8786 switch (elf_header.e_ident [EI_DATA])
8788 default: /* fall through */
8789 case ELFDATANONE: /* fall through */
8790 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
8791 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
8794 /* For now we only support 32 bit and 64 bit ELF files. */
8795 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
8797 /* Read in the rest of the header. */
8800 Elf32_External_Ehdr ehdr32;
8802 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
8805 elf_header.e_type = BYTE_GET (ehdr32.e_type);
8806 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
8807 elf_header.e_version = BYTE_GET (ehdr32.e_version);
8808 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
8809 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
8810 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
8811 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
8812 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
8813 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
8814 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
8815 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
8816 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
8817 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
8821 Elf64_External_Ehdr ehdr64;
8823 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8824 we will not be able to cope with the 64bit data found in
8825 64 ELF files. Detect this now and abort before we start
8826 overwritting things. */
8827 if (sizeof (bfd_vma) < 8)
8829 error (_("This instance of readelf has been built without support for a\n"));
8830 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
8834 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
8837 elf_header.e_type = BYTE_GET (ehdr64.e_type);
8838 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
8839 elf_header.e_version = BYTE_GET (ehdr64.e_version);
8840 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
8841 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
8842 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
8843 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
8844 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
8845 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
8846 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
8847 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
8848 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
8849 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
8856 process_file (file_name)
8860 struct stat statbuf;
8863 if (stat (file_name, & statbuf) < 0)
8865 error (_("Cannot stat input file %s.\n"), file_name);
8869 file = fopen (file_name, "rb");
8872 error (_("Input file %s not found.\n"), file_name);
8876 if (! get_file_header (file))
8878 error (_("%s: Failed to read file header\n"), file_name);
8883 /* Initialise per file variables. */
8884 for (i = NUM_ELEM (version_info); i--;)
8885 version_info[i] = 0;
8887 for (i = NUM_ELEM (dynamic_info); i--;)
8888 dynamic_info[i] = 0;
8890 /* Process the file. */
8892 printf (_("\nFile: %s\n"), file_name);
8894 if (! process_file_header ())
8900 process_section_headers (file);
8902 process_program_headers (file);
8904 process_dynamic_segment (file);
8906 process_relocs (file);
8908 process_unwind (file);
8910 process_symbol_table (file);
8912 process_syminfo (file);
8914 process_version_sections (file);
8916 process_section_contents (file);
8918 process_corefile_contents (file);
8920 process_arch_specific (file);
8924 if (section_headers)
8926 free (section_headers);
8927 section_headers = NULL;
8932 free (string_table);
8933 string_table = NULL;
8934 string_table_length = 0;
8937 if (dynamic_strings)
8939 free (dynamic_strings);
8940 dynamic_strings = NULL;
8943 if (dynamic_symbols)
8945 free (dynamic_symbols);
8946 dynamic_symbols = NULL;
8947 num_dynamic_syms = 0;
8950 if (dynamic_syminfo)
8952 free (dynamic_syminfo);
8953 dynamic_syminfo = NULL;
8959 #ifdef SUPPORT_DISASSEMBLY
8960 /* Needed by the i386 disassembler. For extra credit, someone could
8961 fix this so that we insert symbolic addresses here, esp for GOT/PLT
8965 print_address (unsigned int addr, FILE * outfile)
8967 fprintf (outfile,"0x%8.8x", addr);
8970 /* Needed by the i386 disassembler. */
8972 db_task_printsym (unsigned int addr)
8974 print_address (addr, stderr);
8985 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
8986 setlocale (LC_MESSAGES, "");
8988 bindtextdomain (PACKAGE, LOCALEDIR);
8989 textdomain (PACKAGE);
8991 parse_args (argc, argv);
8993 if (optind < (argc - 1))
8997 while (optind < argc)
8998 err |= process_file (argv [optind ++]);
9000 if (dump_sects != NULL)