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"
69 #include "elf/mcore.h"
76 #include "elf/x86-64.h"
82 char * program_name = "readelf";
83 unsigned int dynamic_addr;
84 bfd_size_type dynamic_size;
85 unsigned int rela_addr;
86 unsigned int rela_size;
87 char * dynamic_strings;
89 unsigned long string_table_length;
90 unsigned long num_dynamic_syms;
91 Elf_Internal_Sym * dynamic_symbols;
92 Elf_Internal_Syminfo * dynamic_syminfo;
93 unsigned long dynamic_syminfo_offset;
94 unsigned int dynamic_syminfo_nent;
95 char program_interpreter [64];
96 int dynamic_info[DT_JMPREL + 1];
99 Elf_Internal_Ehdr elf_header;
100 Elf_Internal_Shdr * section_headers;
101 Elf_Internal_Dyn * dynamic_segment;
109 int do_using_dynamic;
116 int do_debug_abbrevs;
118 int do_debug_pubnames;
119 int do_debug_aranges;
121 int do_debug_frames_interp;
122 int do_debug_macinfo;
127 /* A dynamic array of flags indicating which sections require dumping. */
128 char * dump_sects = NULL;
129 unsigned int num_dump_sects = 0;
131 #define HEX_DUMP (1 << 0)
132 #define DISASS_DUMP (1 << 1)
133 #define DEBUG_DUMP (1 << 2)
135 /* How to rpint a vma value. */
136 typedef enum print_mode
148 /* Forward declarations for dumb compilers. */
149 static void print_vma PARAMS ((bfd_vma, print_mode));
150 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
151 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
152 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
153 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
154 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
155 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
156 static const char * get_dynamic_type PARAMS ((unsigned long));
157 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
158 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
159 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
160 static char * get_file_type PARAMS ((unsigned));
161 static char * get_machine_name PARAMS ((unsigned));
162 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
163 static char * get_machine_flags PARAMS ((unsigned, unsigned));
164 static const char * get_mips_segment_type PARAMS ((unsigned long));
165 static const char * get_parisc_segment_type PARAMS ((unsigned long));
166 static const char * get_ia64_segment_type PARAMS ((unsigned long));
167 static const char * get_segment_type PARAMS ((unsigned long));
168 static const char * get_mips_section_type_name PARAMS ((unsigned int));
169 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
170 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
171 static const char * get_section_type_name PARAMS ((unsigned int));
172 static const char * get_symbol_binding PARAMS ((unsigned int));
173 static const char * get_symbol_type PARAMS ((unsigned int));
174 static const char * get_symbol_visibility PARAMS ((unsigned int));
175 static const char * get_symbol_index_type PARAMS ((unsigned int));
176 static const char * get_dynamic_flags PARAMS ((bfd_vma));
177 static void usage PARAMS ((void));
178 static void parse_args PARAMS ((int, char **));
179 static int process_file_header PARAMS ((void));
180 static int process_program_headers PARAMS ((FILE *));
181 static int process_section_headers PARAMS ((FILE *));
182 static int process_unwind PARAMS ((FILE *));
183 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
184 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
185 static int process_dynamic_segment PARAMS ((FILE *));
186 static int process_symbol_table PARAMS ((FILE *));
187 static int process_syminfo PARAMS ((FILE *));
188 static int process_section_contents PARAMS ((FILE *));
189 static void process_mips_fpe_exception PARAMS ((int));
190 static int process_mips_specific PARAMS ((FILE *));
191 static int process_file PARAMS ((char *));
192 static int process_relocs PARAMS ((FILE *));
193 static int process_version_sections PARAMS ((FILE *));
194 static char * get_ver_flags PARAMS ((unsigned int));
195 static int get_32bit_section_headers PARAMS ((FILE *));
196 static int get_64bit_section_headers PARAMS ((FILE *));
197 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
198 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
199 static int get_file_header PARAMS ((FILE *));
200 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
201 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
202 static const char * get_elf_section_flags PARAMS ((bfd_vma));
203 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
204 static int get_32bit_dynamic_segment PARAMS ((FILE *));
205 static int get_64bit_dynamic_segment PARAMS ((FILE *));
206 #ifdef SUPPORT_DISASSEMBLY
207 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
209 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
210 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
211 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
212 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
213 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
214 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
215 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
216 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
217 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
218 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
219 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
220 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
221 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
222 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
223 static void reset_state_machine PARAMS ((int));
224 static char * get_TAG_name PARAMS ((unsigned long));
225 static char * get_AT_name PARAMS ((unsigned long));
226 static char * get_FORM_name PARAMS ((unsigned long));
227 static void free_abbrevs PARAMS ((void));
228 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
229 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
230 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
231 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
232 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
233 static void request_dump PARAMS ((unsigned int, char));
234 static const char * get_elf_class PARAMS ((unsigned char));
235 static const char * get_data_encoding PARAMS ((unsigned char));
236 static const char * get_osabi_name PARAMS ((unsigned char));
237 static int guess_is_rela PARAMS ((unsigned long));
238 static char * get_note_type PARAMS ((unsigned int));
239 static int process_note PARAMS ((Elf32_Internal_Note *));
240 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
241 static int process_corefile_note_segments PARAMS ((FILE *));
242 static int process_corefile_contents PARAMS ((FILE *));
243 static int process_arch_specific PARAMS ((FILE *));
245 typedef int Elf32_Word;
253 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
254 ((X)->sh_name >= string_table_length \
255 ? "<corrupt>" : string_table + (X)->sh_name))
257 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
259 #define BYTE_GET(field) byte_get (field, sizeof (field))
261 /* If we can support a 64 bit data type then BFD64 should be defined
262 and sizeof (bfd_vma) == 8. In this case when translating from an
263 external 8 byte field to an internal field, we can assume that the
264 internal field is also 8 bytes wide and so we can extract all the data.
265 If, however, BFD64 is not defined, then we must assume that the
266 internal data structure only has 4 byte wide fields that are the
267 equivalent of the 8 byte wide external counterparts, and so we must
268 truncate the data. */
270 #define BYTE_GET8(field) byte_get (field, -8)
272 #define BYTE_GET8(field) byte_get (field, 8)
275 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
277 #define GET_ELF_SYMBOLS(file, offset, size) \
278 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
279 : get_64bit_elf_symbols (file, offset, size))
282 #ifdef ANSI_PROTOTYPES
284 error (const char * message, ...)
288 fprintf (stderr, _("%s: Error: "), program_name);
289 va_start (args, message);
290 vfprintf (stderr, message, args);
296 warn (const char * message, ...)
300 fprintf (stderr, _("%s: Warning: "), program_name);
301 va_start (args, message);
302 vfprintf (stderr, message, args);
314 fprintf (stderr, _("%s: Error: "), program_name);
316 message = va_arg (args, char *);
317 vfprintf (stderr, message, args);
329 fprintf (stderr, _("%s: Warning: "), program_name);
331 message = va_arg (args, char *);
332 vfprintf (stderr, message, args);
338 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
341 get_data (var, file, offset, size, reason)
353 if (fseek (file, offset, SEEK_SET))
355 error (_("Unable to seek to %x for %s\n"), offset, reason);
362 mvar = (PTR) malloc (size);
366 error (_("Out of memory allocating %d bytes for %s\n"),
372 if (fread (mvar, size, 1, file) != 1)
374 error (_("Unable to read in %d bytes of %s\n"), size, reason);
384 byte_get_little_endian (field, size)
385 unsigned char * field;
394 return ((unsigned int) (field [0]))
395 | (((unsigned int) (field [1])) << 8);
399 /* We want to extract data from an 8 byte wide field and
400 place it into a 4 byte wide field. Since this is a little
401 endian source we can juts use the 4 byte extraction code. */
405 return ((unsigned long) (field [0]))
406 | (((unsigned long) (field [1])) << 8)
407 | (((unsigned long) (field [2])) << 16)
408 | (((unsigned long) (field [3])) << 24);
413 /* This is a special case, generated by the BYTE_GET8 macro.
414 It means that we are loading an 8 byte value from a field
415 in an external structure into an 8 byte value in a field
416 in an internal strcuture. */
417 return ((bfd_vma) (field [0]))
418 | (((bfd_vma) (field [1])) << 8)
419 | (((bfd_vma) (field [2])) << 16)
420 | (((bfd_vma) (field [3])) << 24)
421 | (((bfd_vma) (field [4])) << 32)
422 | (((bfd_vma) (field [5])) << 40)
423 | (((bfd_vma) (field [6])) << 48)
424 | (((bfd_vma) (field [7])) << 56);
427 error (_("Unhandled data length: %d\n"), size);
432 /* Print a VMA value. */
434 print_vma (vma, mode)
444 case FULL_HEX: printf ("0x"); /* drop through */
445 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
446 case PREFIX_HEX: printf ("0x"); /* drop through */
447 case HEX: printf ("%lx", (unsigned long) vma); break;
448 case DEC: printf ("%ld", (unsigned long) vma); break;
449 case DEC_5: printf ("%5ld", (long) vma); break;
450 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
471 #if BFD_HOST_64BIT_LONG
474 if (_bfd_int64_high (vma))
475 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
477 printf ("%lx", _bfd_int64_low (vma));
482 #if BFD_HOST_64BIT_LONG
485 if (_bfd_int64_high (vma))
487 printf ("++%ld", _bfd_int64_low (vma));
489 printf ("%ld", _bfd_int64_low (vma));
494 #if BFD_HOST_64BIT_LONG
495 printf ("%5ld", vma);
497 if (_bfd_int64_high (vma))
499 printf ("++%ld", _bfd_int64_low (vma));
501 printf ("%5ld", _bfd_int64_low (vma));
506 #if BFD_HOST_64BIT_LONG
509 if (_bfd_int64_high (vma))
511 printf ("++%lu", _bfd_int64_low (vma));
513 printf ("%lu", _bfd_int64_low (vma));
522 byte_get_big_endian (field, size)
523 unsigned char * field;
532 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
535 return ((unsigned long) (field [3]))
536 | (((unsigned long) (field [2])) << 8)
537 | (((unsigned long) (field [1])) << 16)
538 | (((unsigned long) (field [0])) << 24);
542 /* Although we are extracing data from an 8 byte wide field, we
543 are returning only 4 bytes of data. */
544 return ((unsigned long) (field [7]))
545 | (((unsigned long) (field [6])) << 8)
546 | (((unsigned long) (field [5])) << 16)
547 | (((unsigned long) (field [4])) << 24);
551 /* This is a special case, generated by the BYTE_GET8 macro.
552 It means that we are loading an 8 byte value from a field
553 in an external structure into an 8 byte value in a field
554 in an internal strcuture. */
555 return ((bfd_vma) (field [7]))
556 | (((bfd_vma) (field [6])) << 8)
557 | (((bfd_vma) (field [5])) << 16)
558 | (((bfd_vma) (field [4])) << 24)
559 | (((bfd_vma) (field [3])) << 32)
560 | (((bfd_vma) (field [2])) << 40)
561 | (((bfd_vma) (field [1])) << 48)
562 | (((bfd_vma) (field [0])) << 56);
566 error (_("Unhandled data length: %d\n"), size);
571 /* Guess the relocation size commonly used by the specific machines. */
574 guess_is_rela (e_machine)
575 unsigned long e_machine;
579 /* Targets that use REL relocations. */
590 /* Targets that use RELA relocations. */
598 case EM_CYGNUS_MN10200:
599 case EM_CYGNUS_MN10300:
632 warn (_("Don't know about relocations on this machine architecture\n"));
638 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
640 unsigned long rel_offset;
641 unsigned long rel_size;
642 Elf_Internal_Rela **relasp;
643 unsigned long *nrelasp;
645 Elf_Internal_Rela *relas;
646 unsigned long nrelas;
651 Elf32_External_Rela * erelas;
653 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
654 rel_size, _("relocs"));
658 nrelas = rel_size / sizeof (Elf32_External_Rela);
660 relas = (Elf_Internal_Rela *)
661 malloc (nrelas * sizeof (Elf_Internal_Rela));
665 error(_("out of memory parsing relocs"));
669 for (i = 0; i < nrelas; i++)
671 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
672 relas[i].r_info = BYTE_GET (erelas[i].r_info);
673 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
680 Elf64_External_Rela * erelas;
682 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
683 rel_size, _("relocs"));
687 nrelas = rel_size / sizeof (Elf64_External_Rela);
689 relas = (Elf_Internal_Rela *)
690 malloc (nrelas * sizeof (Elf_Internal_Rela));
694 error(_("out of memory parsing relocs"));
698 for (i = 0; i < nrelas; i++)
700 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
701 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
702 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
713 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
715 unsigned long rel_offset;
716 unsigned long rel_size;
717 Elf_Internal_Rel **relsp;
718 unsigned long *nrelsp;
720 Elf_Internal_Rel *rels;
726 Elf32_External_Rel * erels;
728 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
729 rel_size, _("relocs"));
733 nrels = rel_size / sizeof (Elf32_External_Rel);
735 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
739 error(_("out of memory parsing relocs"));
743 for (i = 0; i < nrels; i++)
745 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
746 rels[i].r_info = BYTE_GET (erels[i].r_info);
753 Elf64_External_Rel * erels;
755 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
756 rel_size, _("relocs"));
760 nrels = rel_size / sizeof (Elf64_External_Rel);
762 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
766 error(_("out of memory parsing relocs"));
770 for (i = 0; i < nrels; i++)
772 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
773 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
783 /* Display the contents of the relocation data found at the specified offset. */
785 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
787 unsigned long rel_offset;
788 unsigned long rel_size;
789 Elf_Internal_Sym * symtab;
795 Elf_Internal_Rel * rels;
796 Elf_Internal_Rela * relas;
799 if (is_rela == UNKNOWN)
800 is_rela = guess_is_rela (elf_header.e_machine);
804 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
809 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
817 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
820 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
826 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
829 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
832 for (i = 0; i < rel_size; i++)
837 bfd_vma symtab_index;
842 offset = relas [i].r_offset;
843 info = relas [i].r_info;
847 offset = rels [i].r_offset;
848 info = rels [i].r_info;
853 type = ELF32_R_TYPE (info);
854 symtab_index = ELF32_R_SYM (info);
858 if (elf_header.e_machine == EM_SPARCV9)
859 type = ELF64_R_TYPE_ID (info);
861 type = ELF64_R_TYPE (info);
862 /* The #ifdef BFD64 below is to prevent a compile time warning.
863 We know that if we do not have a 64 bit data type that we
864 will never execute this code anyway. */
866 symtab_index = ELF64_R_SYM (info);
872 #ifdef _bfd_int64_low
873 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
875 printf ("%8.8lx %8.8lx ", offset, info);
880 #ifdef _bfd_int64_low
881 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
882 _bfd_int64_high (offset),
883 _bfd_int64_low (offset),
884 _bfd_int64_high (info),
885 _bfd_int64_low (info));
887 printf ("%16.16lx %16.16lx ", offset, info);
891 switch (elf_header.e_machine)
898 rtype = elf_m32r_reloc_type (type);
903 rtype = elf_i386_reloc_type (type);
907 rtype = elf_m68k_reloc_type (type);
911 rtype = elf_i960_reloc_type (type);
915 rtype = elf_avr_reloc_type (type);
922 rtype = elf_sparc_reloc_type (type);
926 rtype = v850_reloc_type (type);
930 rtype = elf_d10v_reloc_type (type);
934 rtype = elf_d30v_reloc_type (type);
938 rtype = elf_sh_reloc_type (type);
941 case EM_CYGNUS_MN10300:
942 rtype = elf_mn10300_reloc_type (type);
945 case EM_CYGNUS_MN10200:
946 rtype = elf_mn10200_reloc_type (type);
950 rtype = elf_fr30_reloc_type (type);
954 rtype = elf_mcore_reloc_type (type);
959 rtype = elf_ppc_reloc_type (type);
964 rtype = elf_mips_reloc_type (type);
968 rtype = elf_alpha_reloc_type (type);
972 rtype = elf_arm_reloc_type (type);
977 rtype = elf_arc_reloc_type (type);
981 rtype = elf_hppa_reloc_type (type);
985 rtype = elf_pj_reloc_type (type);
988 rtype = elf_ia64_reloc_type (type);
992 rtype = elf_cris_reloc_type (type);
996 rtype = elf_i860_reloc_type (type);
1000 rtype = elf_x86_64_reloc_type (type);
1005 rtype = elf_s390_reloc_type (type);
1010 #ifdef _bfd_int64_low
1011 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
1013 printf (_("unrecognised: %-7lx"), type);
1016 printf ("%-21.21s", rtype);
1020 if (symtab == NULL || symtab_index >= nsyms)
1021 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1024 Elf_Internal_Sym * psym;
1026 psym = symtab + symtab_index;
1029 print_vma (psym->st_value, LONG_HEX);
1032 if (psym->st_name == 0)
1034 SECTION_NAME (section_headers + psym->st_shndx));
1035 else if (strtab == NULL)
1036 printf (_("<string table index %3ld>"), psym->st_name);
1038 printf ("%-25.25s", strtab + psym->st_name);
1041 printf (" + %lx", (unsigned long) relas [i].r_addend);
1046 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1047 print_vma (relas[i].r_addend, LONG_HEX);
1050 if (elf_header.e_machine == EM_SPARCV9
1051 && !strcmp (rtype, "R_SPARC_OLO10"))
1052 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1066 get_mips_dynamic_type (type)
1071 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1072 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1073 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1074 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1075 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1076 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1077 case DT_MIPS_MSYM: return "MIPS_MSYM";
1078 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1079 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1080 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1081 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1082 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1083 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1084 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1085 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1086 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1087 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1088 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1089 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1090 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1091 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1092 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1093 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1094 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1095 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1096 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1097 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1098 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1099 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1100 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1101 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1102 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1103 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1104 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1105 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1106 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1107 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1108 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1109 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1110 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1111 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1112 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1113 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1120 get_sparc64_dynamic_type (type)
1125 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1132 get_parisc_dynamic_type (type)
1137 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1138 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1139 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1140 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1141 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1142 case DT_HP_PREINIT: return "HP_PREINIT";
1143 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1144 case DT_HP_NEEDED: return "HP_NEEDED";
1145 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1146 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1147 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1148 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1149 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1156 get_dynamic_type (type)
1159 static char buff [32];
1163 case DT_NULL: return "NULL";
1164 case DT_NEEDED: return "NEEDED";
1165 case DT_PLTRELSZ: return "PLTRELSZ";
1166 case DT_PLTGOT: return "PLTGOT";
1167 case DT_HASH: return "HASH";
1168 case DT_STRTAB: return "STRTAB";
1169 case DT_SYMTAB: return "SYMTAB";
1170 case DT_RELA: return "RELA";
1171 case DT_RELASZ: return "RELASZ";
1172 case DT_RELAENT: return "RELAENT";
1173 case DT_STRSZ: return "STRSZ";
1174 case DT_SYMENT: return "SYMENT";
1175 case DT_INIT: return "INIT";
1176 case DT_FINI: return "FINI";
1177 case DT_SONAME: return "SONAME";
1178 case DT_RPATH: return "RPATH";
1179 case DT_SYMBOLIC: return "SYMBOLIC";
1180 case DT_REL: return "REL";
1181 case DT_RELSZ: return "RELSZ";
1182 case DT_RELENT: return "RELENT";
1183 case DT_PLTREL: return "PLTREL";
1184 case DT_DEBUG: return "DEBUG";
1185 case DT_TEXTREL: return "TEXTREL";
1186 case DT_JMPREL: return "JMPREL";
1187 case DT_BIND_NOW: return "BIND_NOW";
1188 case DT_INIT_ARRAY: return "INIT_ARRAY";
1189 case DT_FINI_ARRAY: return "FINI_ARRAY";
1190 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1191 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1192 case DT_RUNPATH: return "RUNPATH";
1193 case DT_FLAGS: return "FLAGS";
1195 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1196 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1198 case DT_CHECKSUM: return "CHECKSUM";
1199 case DT_PLTPADSZ: return "PLTPADSZ";
1200 case DT_MOVEENT: return "MOVEENT";
1201 case DT_MOVESZ: return "MOVESZ";
1202 case DT_FEATURE: return "FEATURE";
1203 case DT_POSFLAG_1: return "POSFLAG_1";
1204 case DT_SYMINSZ: return "SYMINSZ";
1205 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1207 case DT_ADDRRNGLO: return "ADDRRNGLO";
1208 case DT_CONFIG: return "CONFIG";
1209 case DT_DEPAUDIT: return "DEPAUDIT";
1210 case DT_AUDIT: return "AUDIT";
1211 case DT_PLTPAD: return "PLTPAD";
1212 case DT_MOVETAB: return "MOVETAB";
1213 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1215 case DT_VERSYM: return "VERSYM";
1217 case DT_RELACOUNT: return "RELACOUNT";
1218 case DT_RELCOUNT: return "RELCOUNT";
1219 case DT_FLAGS_1: return "FLAGS_1";
1220 case DT_VERDEF: return "VERDEF";
1221 case DT_VERDEFNUM: return "VERDEFNUM";
1222 case DT_VERNEED: return "VERNEED";
1223 case DT_VERNEEDNUM: return "VERNEEDNUM";
1225 case DT_AUXILIARY: return "AUXILIARY";
1226 case DT_USED: return "USED";
1227 case DT_FILTER: return "FILTER";
1230 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1232 const char * result;
1234 switch (elf_header.e_machine)
1237 case EM_MIPS_RS3_LE:
1238 result = get_mips_dynamic_type (type);
1241 result = get_sparc64_dynamic_type (type);
1251 sprintf (buff, _("Processor Specific: %lx"), type);
1253 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1255 const char * result;
1257 switch (elf_header.e_machine)
1260 result = get_parisc_dynamic_type (type);
1270 sprintf (buff, _("Operating System specific: %lx"), type);
1273 sprintf (buff, _("<unknown>: %lx"), type);
1280 get_file_type (e_type)
1283 static char buff [32];
1287 case ET_NONE: return _("NONE (None)");
1288 case ET_REL: return _("REL (Relocatable file)");
1289 case ET_EXEC: return _("EXEC (Executable file)");
1290 case ET_DYN: return _("DYN (Shared object file)");
1291 case ET_CORE: return _("CORE (Core file)");
1294 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1295 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1296 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1297 sprintf (buff, _("OS Specific: (%x)"), e_type);
1299 sprintf (buff, _("<unknown>: %x"), e_type);
1305 get_machine_name (e_machine)
1308 static char buff [64]; /* XXX */
1312 case EM_NONE: return _("None");
1313 case EM_M32: return "WE32100";
1314 case EM_SPARC: return "Sparc";
1315 case EM_386: return "Intel 80386";
1316 case EM_68K: return "MC68000";
1317 case EM_88K: return "MC88000";
1318 case EM_486: return "Intel 80486";
1319 case EM_860: return "Intel 80860";
1320 case EM_MIPS: return "MIPS R3000";
1321 case EM_S370: return "IBM System/370";
1322 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1323 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1324 case EM_PARISC: return "HPPA";
1325 case EM_PPC_OLD: return "Power PC (old)";
1326 case EM_SPARC32PLUS: return "Sparc v8+" ;
1327 case EM_960: return "Intel 90860";
1328 case EM_PPC: return "PowerPC";
1329 case EM_V800: return "NEC V800";
1330 case EM_FR20: return "Fujitsu FR20";
1331 case EM_RH32: return "TRW RH32";
1332 case EM_MCORE: return "MCORE";
1333 case EM_ARM: return "ARM";
1334 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1335 case EM_SH: return "Hitachi SH";
1336 case EM_SPARCV9: return "Sparc v9";
1337 case EM_TRICORE: return "Siemens Tricore";
1338 case EM_ARC: return "ARC";
1339 case EM_H8_300: return "Hitachi H8/300";
1340 case EM_H8_300H: return "Hitachi H8/300H";
1341 case EM_H8S: return "Hitachi H8S";
1342 case EM_H8_500: return "Hitachi H8/500";
1343 case EM_IA_64: return "Intel IA-64";
1344 case EM_MIPS_X: return "Stanford MIPS-X";
1345 case EM_COLDFIRE: return "Motorola Coldfire";
1346 case EM_68HC12: return "Motorola M68HC12";
1347 case EM_ALPHA: return "Alpha";
1348 case EM_CYGNUS_D10V: return "d10v";
1349 case EM_CYGNUS_D30V: return "d30v";
1350 case EM_CYGNUS_ARC: return "ARC";
1351 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1352 case EM_CYGNUS_V850: return "NEC v850";
1353 case EM_CYGNUS_MN10300: return "mn10300";
1354 case EM_CYGNUS_MN10200: return "mn10200";
1355 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1356 case EM_PJ: return "picoJava";
1357 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1358 case EM_PCP: return "Siemens PCP";
1359 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1360 case EM_NDR1: return "Denso NDR1 microprocesspr";
1361 case EM_STARCORE: return "Motorola Star*Core processor";
1362 case EM_ME16: return "Toyota ME16 processor";
1363 case EM_ST100: return "STMicroelectronics ST100 processor";
1364 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1365 case EM_FX66: return "Siemens FX66 microcontroller";
1366 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1367 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1368 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1369 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1370 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1371 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1372 case EM_SVX: return "Silicon Graphics SVx";
1373 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1374 case EM_VAX: return "Digital VAX";
1375 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1376 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1377 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1378 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1379 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1380 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1381 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1382 case EM_PRISM: return "SiTera Prism";
1383 case EM_X86_64: return "Advanced Micro Devices X86-64";
1385 case EM_S390: return "IBM S/390";
1387 sprintf (buff, _("<unknown>: %x"), e_machine);
1393 decode_ARM_machine_flags (e_flags, buf)
1400 eabi = EF_ARM_EABI_VERSION (e_flags);
1401 e_flags &= ~ EF_ARM_EABIMASK;
1403 /* Handle "generic" ARM flags. */
1404 if (e_flags & EF_ARM_RELEXEC)
1406 strcat (buf, ", relocatable executable");
1407 e_flags &= ~ EF_ARM_RELEXEC;
1410 if (e_flags & EF_ARM_HASENTRY)
1412 strcat (buf, ", has entry point");
1413 e_flags &= ~ EF_ARM_HASENTRY;
1416 /* Now handle EABI specific flags. */
1420 strcat (buf, ", <unrecognised EABI>");
1425 case EF_ARM_EABI_VER1:
1426 strcat (buf, ", Version1 EABI");
1431 /* Process flags one bit at a time. */
1432 flag = e_flags & - e_flags;
1437 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1438 strcat (buf, ", sorted symbol tables");
1448 case EF_ARM_EABI_VER2:
1449 strcat (buf, ", Version2 EABI");
1454 /* Process flags one bit at a time. */
1455 flag = e_flags & - e_flags;
1460 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1461 strcat (buf, ", sorted symbol tables");
1464 case EF_ARM_DYNSYMSUSESEGIDX:
1465 strcat (buf, ", dynamic symbols use segment index");
1468 case EF_ARM_MAPSYMSFIRST:
1469 strcat (buf, ", mapping symbols precede others");
1479 case EF_ARM_EABI_UNKNOWN:
1480 strcat (buf, ", GNU EABI");
1485 /* Process flags one bit at a time. */
1486 flag = e_flags & - e_flags;
1491 case EF_ARM_INTERWORK:
1492 strcat (buf, ", interworking enabled");
1495 case EF_ARM_APCS_26:
1496 strcat (buf, ", uses APCS/26");
1499 case EF_ARM_APCS_FLOAT:
1500 strcat (buf, ", uses APCS/float");
1504 strcat (buf, ", position independent");
1508 strcat (buf, ", 8 bit structure alignment");
1511 case EF_ARM_NEW_ABI:
1512 strcat (buf, ", uses new ABI");
1515 case EF_ARM_OLD_ABI:
1516 strcat (buf, ", uses old ABI");
1519 case EF_ARM_SOFT_FLOAT:
1520 strcat (buf, ", software FP");
1531 strcat (buf,", <unknown>");
1535 get_machine_flags (e_flags, e_machine)
1539 static char buf [1024];
1551 decode_ARM_machine_flags (e_flags, buf);
1555 if (e_flags & EF_CPU32)
1556 strcat (buf, ", cpu32");
1560 if (e_flags & EF_PPC_EMB)
1561 strcat (buf, ", emb");
1563 if (e_flags & EF_PPC_RELOCATABLE)
1564 strcat (buf, ", relocatable");
1566 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1567 strcat (buf, ", relocatable-lib");
1570 case EM_CYGNUS_V850:
1571 switch (e_flags & EF_V850_ARCH)
1574 strcat (buf, ", v850e");
1577 strcat (buf, ", v850ea");
1580 strcat (buf, ", v850");
1583 strcat (buf, ", unknown v850 architecture variant");
1588 case EM_CYGNUS_M32R:
1589 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1590 strcat (buf, ", m32r");
1595 case EM_MIPS_RS3_LE:
1596 if (e_flags & EF_MIPS_NOREORDER)
1597 strcat (buf, ", noreorder");
1599 if (e_flags & EF_MIPS_PIC)
1600 strcat (buf, ", pic");
1602 if (e_flags & EF_MIPS_CPIC)
1603 strcat (buf, ", cpic");
1605 if (e_flags & EF_MIPS_UCODE)
1606 strcat (buf, ", ugen_reserved");
1608 if (e_flags & EF_MIPS_ABI2)
1609 strcat (buf, ", abi2");
1611 if (e_flags & EF_MIPS_32BITMODE)
1612 strcat (buf, ", 32bitmode");
1614 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1615 strcat (buf, ", mips1");
1617 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1618 strcat (buf, ", mips2");
1620 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1621 strcat (buf, ", mips3");
1623 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1624 strcat (buf, ", mips4");
1626 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
1627 strcat (buf, ", mips5");
1629 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
1630 strcat (buf, ", mips32");
1632 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
1633 strcat (buf, ", mips64");
1635 switch ((e_flags & EF_MIPS_MACH))
1637 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1638 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1639 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1640 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1641 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1642 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1643 default: strcat (buf, " UNKNOWN"); break;
1648 if (e_flags & EF_SPARC_32PLUS)
1649 strcat (buf, ", v8+");
1651 if (e_flags & EF_SPARC_SUN_US1)
1652 strcat (buf, ", ultrasparcI");
1654 if (e_flags & EF_SPARC_SUN_US3)
1655 strcat (buf, ", ultrasparcIII");
1657 if (e_flags & EF_SPARC_HAL_R1)
1658 strcat (buf, ", halr1");
1660 if (e_flags & EF_SPARC_LEDATA)
1661 strcat (buf, ", ledata");
1663 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1664 strcat (buf, ", tso");
1666 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1667 strcat (buf, ", pso");
1669 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1670 strcat (buf, ", rmo");
1674 switch (e_flags & EF_PARISC_ARCH)
1676 case EFA_PARISC_1_0:
1677 strcpy (buf, ", PA-RISC 1.0");
1679 case EFA_PARISC_1_1:
1680 strcpy (buf, ", PA-RISC 1.1");
1682 case EFA_PARISC_2_0:
1683 strcpy (buf, ", PA-RISC 2.0");
1688 if (e_flags & EF_PARISC_TRAPNIL)
1689 strcat (buf, ", trapnil");
1690 if (e_flags & EF_PARISC_EXT)
1691 strcat (buf, ", ext");
1692 if (e_flags & EF_PARISC_LSB)
1693 strcat (buf, ", lsb");
1694 if (e_flags & EF_PARISC_WIDE)
1695 strcat (buf, ", wide");
1696 if (e_flags & EF_PARISC_NO_KABP)
1697 strcat (buf, ", no kabp");
1698 if (e_flags & EF_PARISC_LAZYSWAP)
1699 strcat (buf, ", lazyswap");
1703 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1704 strcat (buf, ", new calling convention");
1706 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1707 strcat (buf, ", gnu calling convention");
1711 if ((e_flags & EF_IA_64_ABI64))
1712 strcat (buf, ", 64-bit");
1714 strcat (buf, ", 32-bit");
1715 if ((e_flags & EF_IA_64_REDUCEDFP))
1716 strcat (buf, ", reduced fp model");
1717 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1718 strcat (buf, ", no function descriptors, constant gp");
1719 else if ((e_flags & EF_IA_64_CONS_GP))
1720 strcat (buf, ", constant gp");
1721 if ((e_flags & EF_IA_64_ABSOLUTE))
1722 strcat (buf, ", absolute");
1731 get_mips_segment_type (type)
1736 case PT_MIPS_REGINFO:
1738 case PT_MIPS_RTPROC:
1740 case PT_MIPS_OPTIONS:
1750 get_parisc_segment_type (type)
1755 case PT_HP_TLS: return "HP_TLS";
1756 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1757 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1758 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1759 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1760 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1761 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1762 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1763 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1764 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1765 case PT_HP_PARALLEL: return "HP_PARALLEL";
1766 case PT_HP_FASTBIND: return "HP_FASTBIND";
1767 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1768 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1777 get_ia64_segment_type (type)
1782 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1783 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1792 get_segment_type (p_type)
1793 unsigned long p_type;
1795 static char buff [32];
1799 case PT_NULL: return "NULL";
1800 case PT_LOAD: return "LOAD";
1801 case PT_DYNAMIC: return "DYNAMIC";
1802 case PT_INTERP: return "INTERP";
1803 case PT_NOTE: return "NOTE";
1804 case PT_SHLIB: return "SHLIB";
1805 case PT_PHDR: return "PHDR";
1808 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1810 const char * result;
1812 switch (elf_header.e_machine)
1815 case EM_MIPS_RS3_LE:
1816 result = get_mips_segment_type (p_type);
1819 result = get_parisc_segment_type (p_type);
1822 result = get_ia64_segment_type (p_type);
1832 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1834 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1836 const char * result;
1838 switch (elf_header.e_machine)
1841 result = get_parisc_segment_type (p_type);
1851 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1854 sprintf (buff, _("<unknown>: %lx"), p_type);
1861 get_mips_section_type_name (sh_type)
1862 unsigned int sh_type;
1866 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1867 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1868 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1869 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1870 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1871 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1872 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1873 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1874 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1875 case SHT_MIPS_RELD: return "MIPS_RELD";
1876 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1877 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1878 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1879 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1880 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1881 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1882 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1883 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1884 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1885 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1886 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1887 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1888 case SHT_MIPS_LINE: return "MIPS_LINE";
1889 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1890 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1891 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1892 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1893 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1894 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1895 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1896 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1897 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1898 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1899 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1900 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1901 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1902 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1903 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1904 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1912 get_parisc_section_type_name (sh_type)
1913 unsigned int sh_type;
1917 case SHT_PARISC_EXT: return "PARISC_EXT";
1918 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1919 case SHT_PARISC_DOC: return "PARISC_DOC";
1927 get_ia64_section_type_name (sh_type)
1928 unsigned int sh_type;
1932 case SHT_IA_64_EXT: return "IA_64_EXT";
1933 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
1941 get_section_type_name (sh_type)
1942 unsigned int sh_type;
1944 static char buff [32];
1948 case SHT_NULL: return "NULL";
1949 case SHT_PROGBITS: return "PROGBITS";
1950 case SHT_SYMTAB: return "SYMTAB";
1951 case SHT_STRTAB: return "STRTAB";
1952 case SHT_RELA: return "RELA";
1953 case SHT_HASH: return "HASH";
1954 case SHT_DYNAMIC: return "DYNAMIC";
1955 case SHT_NOTE: return "NOTE";
1956 case SHT_NOBITS: return "NOBITS";
1957 case SHT_REL: return "REL";
1958 case SHT_SHLIB: return "SHLIB";
1959 case SHT_DYNSYM: return "DYNSYM";
1960 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1961 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1962 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1963 case SHT_GROUP: return "GROUP";
1964 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
1965 case SHT_GNU_verdef: return "VERDEF";
1966 case SHT_GNU_verneed: return "VERNEED";
1967 case SHT_GNU_versym: return "VERSYM";
1968 case 0x6ffffff0: return "VERSYM";
1969 case 0x6ffffffc: return "VERDEF";
1970 case 0x7ffffffd: return "AUXILIARY";
1971 case 0x7fffffff: return "FILTER";
1974 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1976 const char * result;
1978 switch (elf_header.e_machine)
1981 case EM_MIPS_RS3_LE:
1982 result = get_mips_section_type_name (sh_type);
1985 result = get_parisc_section_type_name (sh_type);
1988 result = get_ia64_section_type_name (sh_type);
1998 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
2000 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2001 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
2002 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2003 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
2005 sprintf (buff, _("<unknown>: %x"), sh_type);
2011 struct option options [] =
2013 {"all", no_argument, 0, 'a'},
2014 {"file-header", no_argument, 0, 'h'},
2015 {"program-headers", no_argument, 0, 'l'},
2016 {"headers", no_argument, 0, 'e'},
2017 {"histogram", no_argument, 0, 'I'},
2018 {"segments", no_argument, 0, 'l'},
2019 {"sections", no_argument, 0, 'S'},
2020 {"section-headers", no_argument, 0, 'S'},
2021 {"symbols", no_argument, 0, 's'},
2022 {"syms", no_argument, 0, 's'},
2023 {"relocs", no_argument, 0, 'r'},
2024 {"notes", no_argument, 0, 'n'},
2025 {"dynamic", no_argument, 0, 'd'},
2026 {"arch-specific", no_argument, 0, 'A'},
2027 {"version-info", no_argument, 0, 'V'},
2028 {"use-dynamic", no_argument, 0, 'D'},
2029 {"hex-dump", required_argument, 0, 'x'},
2030 {"debug-dump", optional_argument, 0, 'w'},
2031 {"unwind", no_argument, 0, 'u'},
2032 #ifdef SUPPORT_DISASSEMBLY
2033 {"instruction-dump", required_argument, 0, 'i'},
2036 {"version", no_argument, 0, 'v'},
2037 {"help", no_argument, 0, 'H'},
2038 {0, no_argument, 0, 0}
2044 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
2045 fprintf (stdout, _(" Options are:\n"));
2046 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2047 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
2048 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
2049 fprintf (stdout, _(" Display the program headers\n"));
2050 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
2051 fprintf (stdout, _(" Display the sections' header\n"));
2052 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
2053 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
2054 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
2055 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
2056 fprintf (stdout, _(" -u or --unwind Display the unwind info (if present)\n"));
2057 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2058 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
2059 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2060 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2061 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
2062 fprintf (stdout, _(" Dump the contents of section <number>\n"));
2063 fprintf (stdout, _(" -w[liaprmf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames]\n"));
2064 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
2065 #ifdef SUPPORT_DISASSEMBLY
2066 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
2067 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
2069 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2070 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
2071 fprintf (stdout, _(" -H or --help Display this information\n"));
2072 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2078 request_dump (section, type)
2079 unsigned int section;
2082 if (section >= num_dump_sects)
2084 char * new_dump_sects;
2086 new_dump_sects = (char *) calloc (section + 1, 1);
2088 if (new_dump_sects == NULL)
2089 error (_("Out of memory allocating dump request table."));
2092 /* Copy current flag settings. */
2093 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2097 dump_sects = new_dump_sects;
2098 num_dump_sects = section + 1;
2103 dump_sects [section] |= type;
2109 parse_args (argc, argv)
2118 while ((c = getopt_long
2119 (argc, argv, "ersuahnldSDAIw::x:i:vV", options, NULL)) != EOF)
2155 do_using_dynamic ++;
2186 section = strtoul (optarg, & cp, 0);
2187 if (! * cp && section >= 0)
2189 request_dump (section, HEX_DUMP);
2209 do_debug_abbrevs = 1;
2219 do_debug_pubnames = 1;
2224 do_debug_aranges = 1;
2228 do_debug_frames_interp = 1;
2230 do_debug_frames = 1;
2235 do_debug_macinfo = 1;
2239 warn (_("Unrecognised debug option '%s'\n"), optarg);
2244 #ifdef SUPPORT_DISASSEMBLY
2247 section = strtoul (optarg, & cp, 0);
2248 if (! * cp && section >= 0)
2250 request_dump (section, DISASS_DUMP);
2256 print_version (program_name);
2263 /* xgettext:c-format */
2264 error (_("Invalid option '-%c'\n"), c);
2271 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2272 && !do_segments && !do_header && !do_dump && !do_version
2273 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2277 warn (_("Nothing to do.\n"));
2283 get_elf_class (elf_class)
2284 unsigned char elf_class;
2286 static char buff [32];
2290 case ELFCLASSNONE: return _("none");
2291 case ELFCLASS32: return _("ELF32");
2292 case ELFCLASS64: return _("ELF64");
2294 sprintf (buff, _("<unknown: %x>"), elf_class);
2300 get_data_encoding (encoding)
2301 unsigned char encoding;
2303 static char buff [32];
2307 case ELFDATANONE: return _("none");
2308 case ELFDATA2LSB: return _("2's complement, little endian");
2309 case ELFDATA2MSB: return _("2's complement, big endian");
2311 sprintf (buff, _("<unknown: %x>"), encoding);
2317 get_osabi_name (osabi)
2318 unsigned char osabi;
2320 static char buff [32];
2324 case ELFOSABI_NONE: return _("UNIX - System V");
2325 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2326 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2327 case ELFOSABI_LINUX: return _("UNIX - Linux");
2328 case ELFOSABI_HURD: return _("GNU/Hurd");
2329 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2330 case ELFOSABI_AIX: return _("UNIX - AIX");
2331 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2332 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2333 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2334 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2335 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2336 case ELFOSABI_STANDALONE: return _("Standalone App");
2337 case ELFOSABI_ARM: return _("ARM");
2339 sprintf (buff, _("<unknown: %x>"), osabi);
2344 /* Decode the data held in 'elf_header'. */
2346 process_file_header ()
2348 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2349 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2350 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2351 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2354 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2362 printf (_("ELF Header:\n"));
2363 printf (_(" Magic: "));
2364 for (i = 0; i < EI_NIDENT; i ++)
2365 printf ("%2.2x ", elf_header.e_ident [i]);
2367 printf (_(" Class: %s\n"),
2368 get_elf_class (elf_header.e_ident [EI_CLASS]));
2369 printf (_(" Data: %s\n"),
2370 get_data_encoding (elf_header.e_ident [EI_DATA]));
2371 printf (_(" Version: %d %s\n"),
2372 elf_header.e_ident [EI_VERSION],
2373 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2375 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2378 printf (_(" OS/ABI: %s\n"),
2379 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2380 printf (_(" ABI Version: %d\n"),
2381 elf_header.e_ident [EI_ABIVERSION]);
2382 printf (_(" Type: %s\n"),
2383 get_file_type (elf_header.e_type));
2384 printf (_(" Machine: %s\n"),
2385 get_machine_name (elf_header.e_machine));
2386 printf (_(" Version: 0x%lx\n"),
2387 (unsigned long) elf_header.e_version);
2389 printf (_(" Entry point address: "));
2390 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2391 printf (_("\n Start of program headers: "));
2392 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2393 printf (_(" (bytes into file)\n Start of section headers: "));
2394 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2395 printf (_(" (bytes into file)\n"));
2397 printf (_(" Flags: 0x%lx%s\n"),
2398 (unsigned long) elf_header.e_flags,
2399 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2400 printf (_(" Size of this header: %ld (bytes)\n"),
2401 (long) elf_header.e_ehsize);
2402 printf (_(" Size of program headers: %ld (bytes)\n"),
2403 (long) elf_header.e_phentsize);
2404 printf (_(" Number of program headers: %ld\n"),
2405 (long) elf_header.e_phnum);
2406 printf (_(" Size of section headers: %ld (bytes)\n"),
2407 (long) elf_header.e_shentsize);
2408 printf (_(" Number of section headers: %ld\n"),
2409 (long) elf_header.e_shnum);
2410 printf (_(" Section header string table index: %ld\n"),
2411 (long) elf_header.e_shstrndx);
2419 get_32bit_program_headers (file, program_headers)
2421 Elf_Internal_Phdr * program_headers;
2423 Elf32_External_Phdr * phdrs;
2424 Elf32_External_Phdr * external;
2425 Elf32_Internal_Phdr * internal;
2428 phdrs = ((Elf32_External_Phdr *)
2429 get_data (NULL, file, elf_header.e_phoff,
2430 elf_header.e_phentsize * elf_header.e_phnum,
2431 _("program headers")));
2435 for (i = 0, internal = program_headers, external = phdrs;
2436 i < elf_header.e_phnum;
2437 i ++, internal ++, external ++)
2439 internal->p_type = BYTE_GET (external->p_type);
2440 internal->p_offset = BYTE_GET (external->p_offset);
2441 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2442 internal->p_paddr = BYTE_GET (external->p_paddr);
2443 internal->p_filesz = BYTE_GET (external->p_filesz);
2444 internal->p_memsz = BYTE_GET (external->p_memsz);
2445 internal->p_flags = BYTE_GET (external->p_flags);
2446 internal->p_align = BYTE_GET (external->p_align);
2455 get_64bit_program_headers (file, program_headers)
2457 Elf_Internal_Phdr * program_headers;
2459 Elf64_External_Phdr * phdrs;
2460 Elf64_External_Phdr * external;
2461 Elf64_Internal_Phdr * internal;
2464 phdrs = ((Elf64_External_Phdr *)
2465 get_data (NULL, file, elf_header.e_phoff,
2466 elf_header.e_phentsize * elf_header.e_phnum,
2467 _("program headers")));
2471 for (i = 0, internal = program_headers, external = phdrs;
2472 i < elf_header.e_phnum;
2473 i ++, internal ++, external ++)
2475 internal->p_type = BYTE_GET (external->p_type);
2476 internal->p_flags = BYTE_GET (external->p_flags);
2477 internal->p_offset = BYTE_GET8 (external->p_offset);
2478 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2479 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2480 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2481 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2482 internal->p_align = BYTE_GET8 (external->p_align);
2491 process_program_headers (file)
2494 Elf_Internal_Phdr * program_headers;
2495 Elf_Internal_Phdr * segment;
2498 if (elf_header.e_phnum == 0)
2501 printf (_("\nThere are no program headers in this file.\n"));
2505 if (do_segments && !do_header)
2507 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2508 printf (_("Entry point "));
2509 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2510 printf (_("\nThere are %d program headers, starting at offset "),
2511 elf_header.e_phnum);
2512 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2516 program_headers = (Elf_Internal_Phdr *) malloc
2517 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2519 if (program_headers == NULL)
2521 error (_("Out of memory\n"));
2526 i = get_32bit_program_headers (file, program_headers);
2528 i = get_64bit_program_headers (file, program_headers);
2532 free (program_headers);
2539 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2543 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2547 (_(" Type Offset VirtAddr PhysAddr\n"));
2549 (_(" FileSiz MemSiz Flags Align\n"));
2557 for (i = 0, segment = program_headers;
2558 i < elf_header.e_phnum;
2563 printf (" %-14.14s ", get_segment_type (segment->p_type));
2567 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2568 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2569 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2570 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2571 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2573 (segment->p_flags & PF_R ? 'R' : ' '),
2574 (segment->p_flags & PF_W ? 'W' : ' '),
2575 (segment->p_flags & PF_X ? 'E' : ' '));
2576 printf ("%#lx", (unsigned long) segment->p_align);
2580 print_vma (segment->p_offset, FULL_HEX);
2582 print_vma (segment->p_vaddr, FULL_HEX);
2584 print_vma (segment->p_paddr, FULL_HEX);
2586 print_vma (segment->p_filesz, FULL_HEX);
2588 print_vma (segment->p_memsz, FULL_HEX);
2590 (segment->p_flags & PF_R ? 'R' : ' '),
2591 (segment->p_flags & PF_W ? 'W' : ' '),
2592 (segment->p_flags & PF_X ? 'E' : ' '));
2593 print_vma (segment->p_align, HEX);
2597 switch (segment->p_type)
2601 loadaddr = (segment->p_vaddr & 0xfffff000)
2602 - (segment->p_offset & 0xfffff000);
2607 error (_("more than one dynamic segment\n"));
2609 dynamic_addr = segment->p_offset;
2610 dynamic_size = segment->p_filesz;
2614 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2615 error (_("Unable to find program interpreter name\n"));
2618 program_interpreter[0] = 0;
2619 fscanf (file, "%63s", program_interpreter);
2622 printf (_("\n [Requesting program interpreter: %s]"),
2623 program_interpreter);
2629 putc ('\n', stdout);
2638 if (do_segments && section_headers != NULL)
2640 printf (_("\n Section to Segment mapping:\n"));
2641 printf (_(" Segment Sections...\n"));
2643 assert (string_table != NULL);
2645 for (i = 0; i < elf_header.e_phnum; i++)
2648 Elf_Internal_Shdr * section;
2650 segment = program_headers + i;
2651 section = section_headers;
2653 printf (" %2.2d ", i);
2655 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2657 if (section->sh_size > 0
2658 /* Compare allocated sections by VMA, unallocated
2659 sections by file offset. */
2660 && (section->sh_flags & SHF_ALLOC
2661 ? (section->sh_addr >= segment->p_vaddr
2662 && section->sh_addr + section->sh_size
2663 <= segment->p_vaddr + segment->p_memsz)
2664 : ((bfd_vma) section->sh_offset >= segment->p_offset
2665 && (section->sh_offset + section->sh_size
2666 <= segment->p_offset + segment->p_filesz))))
2667 printf ("%s ", SECTION_NAME (section));
2674 free (program_headers);
2681 get_32bit_section_headers (file)
2684 Elf32_External_Shdr * shdrs;
2685 Elf32_Internal_Shdr * internal;
2688 shdrs = ((Elf32_External_Shdr *)
2689 get_data (NULL, file, elf_header.e_shoff,
2690 elf_header.e_shentsize * elf_header.e_shnum,
2691 _("section headers")));
2695 section_headers = (Elf_Internal_Shdr *) malloc
2696 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2698 if (section_headers == NULL)
2700 error (_("Out of memory\n"));
2704 for (i = 0, internal = section_headers;
2705 i < elf_header.e_shnum;
2708 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2709 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2710 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2711 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2712 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2713 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2714 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2715 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2716 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2717 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2726 get_64bit_section_headers (file)
2729 Elf64_External_Shdr * shdrs;
2730 Elf64_Internal_Shdr * internal;
2733 shdrs = ((Elf64_External_Shdr *)
2734 get_data (NULL, file, elf_header.e_shoff,
2735 elf_header.e_shentsize * elf_header.e_shnum,
2736 _("section headers")));
2740 section_headers = (Elf_Internal_Shdr *) malloc
2741 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2743 if (section_headers == NULL)
2745 error (_("Out of memory\n"));
2749 for (i = 0, internal = section_headers;
2750 i < elf_header.e_shnum;
2753 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2754 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2755 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2756 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2757 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2758 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2759 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2760 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2761 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2762 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2770 static Elf_Internal_Sym *
2771 get_32bit_elf_symbols (file, offset, number)
2773 unsigned long offset;
2774 unsigned long number;
2776 Elf32_External_Sym * esyms;
2777 Elf_Internal_Sym * isyms;
2778 Elf_Internal_Sym * psym;
2781 esyms = ((Elf32_External_Sym *)
2782 get_data (NULL, file, offset,
2783 number * sizeof (Elf32_External_Sym), _("symbols")));
2787 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2791 error (_("Out of memory\n"));
2797 for (j = 0, psym = isyms;
2801 psym->st_name = BYTE_GET (esyms[j].st_name);
2802 psym->st_value = BYTE_GET (esyms[j].st_value);
2803 psym->st_size = BYTE_GET (esyms[j].st_size);
2804 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2805 psym->st_info = BYTE_GET (esyms[j].st_info);
2806 psym->st_other = BYTE_GET (esyms[j].st_other);
2814 static Elf_Internal_Sym *
2815 get_64bit_elf_symbols (file, offset, number)
2817 unsigned long offset;
2818 unsigned long number;
2820 Elf64_External_Sym * esyms;
2821 Elf_Internal_Sym * isyms;
2822 Elf_Internal_Sym * psym;
2825 esyms = ((Elf64_External_Sym *)
2826 get_data (NULL, file, offset,
2827 number * sizeof (Elf64_External_Sym), _("symbols")));
2831 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2835 error (_("Out of memory\n"));
2841 for (j = 0, psym = isyms;
2845 psym->st_name = BYTE_GET (esyms[j].st_name);
2846 psym->st_info = BYTE_GET (esyms[j].st_info);
2847 psym->st_other = BYTE_GET (esyms[j].st_other);
2848 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2849 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2850 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2859 get_elf_section_flags (sh_flags)
2862 static char buff [32];
2870 flag = sh_flags & - sh_flags;
2875 case SHF_WRITE: strcat (buff, "W"); break;
2876 case SHF_ALLOC: strcat (buff, "A"); break;
2877 case SHF_EXECINSTR: strcat (buff, "X"); break;
2878 case SHF_MERGE: strcat (buff, "M"); break;
2879 case SHF_STRINGS: strcat (buff, "S"); break;
2880 case SHF_INFO_LINK: strcat (buff, "I"); break;
2881 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2882 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2883 case SHF_GROUP: strcat (buff, "G"); break;
2886 if (flag & SHF_MASKOS)
2889 sh_flags &= ~ SHF_MASKOS;
2891 else if (flag & SHF_MASKPROC)
2894 sh_flags &= ~ SHF_MASKPROC;
2906 process_section_headers (file)
2909 Elf_Internal_Shdr * section;
2912 section_headers = NULL;
2914 if (elf_header.e_shnum == 0)
2917 printf (_("\nThere are no sections in this file.\n"));
2922 if (do_sections && !do_header)
2923 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2924 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2928 if (! get_32bit_section_headers (file))
2931 else if (! get_64bit_section_headers (file))
2934 /* Read in the string table, so that we have names to display. */
2935 section = section_headers + elf_header.e_shstrndx;
2937 if (section->sh_size != 0)
2939 string_table = (char *) get_data (NULL, file, section->sh_offset,
2940 section->sh_size, _("string table"));
2942 string_table_length = section->sh_size;
2945 /* Scan the sections for the dynamic symbol table
2946 and dynamic string table and debug sections. */
2947 dynamic_symbols = NULL;
2948 dynamic_strings = NULL;
2949 dynamic_syminfo = NULL;
2951 for (i = 0, section = section_headers;
2952 i < elf_header.e_shnum;
2955 char * name = SECTION_NAME (section);
2957 if (section->sh_type == SHT_DYNSYM)
2959 if (dynamic_symbols != NULL)
2961 error (_("File contains multiple dynamic symbol tables\n"));
2965 num_dynamic_syms = section->sh_size / section->sh_entsize;
2967 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2969 else if (section->sh_type == SHT_STRTAB
2970 && strcmp (name, ".dynstr") == 0)
2972 if (dynamic_strings != NULL)
2974 error (_("File contains multiple dynamic string tables\n"));
2978 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
2980 _("dynamic strings"));
2982 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2983 || do_debug_lines || do_debug_pubnames || do_debug_aranges
2984 || do_debug_frames || do_debug_macinfo)
2985 && strncmp (name, ".debug_", 7) == 0)
2990 || (do_debug_info && (strcmp (name, "info") == 0))
2991 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2992 || (do_debug_lines && (strcmp (name, "line") == 0))
2993 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2994 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2995 || (do_debug_frames && (strcmp (name, "frame") == 0))
2996 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
2998 request_dump (i, DEBUG_DUMP);
3000 /* linkonce section to be combined with .debug_info at link time. */
3001 else if ((do_debugging || do_debug_info)
3002 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3003 request_dump (i, DEBUG_DUMP);
3004 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3005 request_dump (i, DEBUG_DUMP);
3011 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3015 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3018 printf (_(" [Nr] Name Type Address Offset\n"));
3019 printf (_(" Size EntSize Flags Link Info Align\n"));
3022 for (i = 0, section = section_headers;
3023 i < elf_header.e_shnum;
3026 printf (" [%2d] %-17.17s %-15.15s ",
3028 SECTION_NAME (section),
3029 get_section_type_name (section->sh_type));
3033 print_vma (section->sh_addr, LONG_HEX);
3035 printf ( " %6.6lx %6.6lx %2.2lx",
3036 (unsigned long) section->sh_offset,
3037 (unsigned long) section->sh_size,
3038 (unsigned long) section->sh_entsize);
3040 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3042 printf ("%2ld %3lx %2ld\n",
3043 (unsigned long) section->sh_link,
3044 (unsigned long) section->sh_info,
3045 (unsigned long) section->sh_addralign);
3050 print_vma (section->sh_addr, LONG_HEX);
3051 printf (" %8.8lx", section->sh_offset);
3053 print_vma (section->sh_size, LONG_HEX);
3055 print_vma (section->sh_entsize, LONG_HEX);
3057 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3059 printf (" %2ld %3lx %ld\n",
3060 (unsigned long) section->sh_link,
3061 (unsigned long) section->sh_info,
3062 (unsigned long) section->sh_addralign);
3066 printf (_("Key to Flags:\n"));
3067 printf (_(" W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
3068 printf (_(" I (info), L (link order), G (group), x (unknown)\n"));
3069 printf (_(" O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3074 /* Process the reloc section. */
3076 process_relocs (file)
3079 unsigned long rel_size;
3080 unsigned long rel_offset;
3086 if (do_using_dynamic)
3088 int is_rela = FALSE;
3093 if (dynamic_info[DT_REL])
3095 rel_offset = dynamic_info[DT_REL];
3096 rel_size = dynamic_info[DT_RELSZ];
3099 else if (dynamic_info [DT_RELA])
3101 rel_offset = dynamic_info[DT_RELA];
3102 rel_size = dynamic_info[DT_RELASZ];
3105 else if (dynamic_info[DT_JMPREL])
3107 rel_offset = dynamic_info[DT_JMPREL];
3108 rel_size = dynamic_info[DT_PLTRELSZ];
3110 switch (dynamic_info[DT_PLTREL])
3127 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3128 rel_offset, rel_size);
3130 dump_relocations (file, rel_offset - loadaddr, rel_size,
3131 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3134 printf (_("\nThere are no dynamic relocations in this file.\n"));
3138 Elf32_Internal_Shdr * section;
3142 for (i = 0, section = section_headers;
3143 i < elf_header.e_shnum;
3146 if ( section->sh_type != SHT_RELA
3147 && section->sh_type != SHT_REL)
3150 rel_offset = section->sh_offset;
3151 rel_size = section->sh_size;
3155 Elf32_Internal_Shdr * strsec;
3156 Elf_Internal_Sym * symtab;
3159 unsigned long nsyms;
3161 printf (_("\nRelocation section "));
3163 if (string_table == NULL)
3164 printf ("%d", section->sh_name);
3166 printf ("'%s'", SECTION_NAME (section));
3168 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3169 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3174 if (section->sh_link)
3176 Elf32_Internal_Shdr * symsec;
3178 symsec = section_headers + section->sh_link;
3179 nsyms = symsec->sh_size / symsec->sh_entsize;
3180 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
3185 strsec = section_headers + symsec->sh_link;
3187 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3191 is_rela = section->sh_type == SHT_RELA;
3193 dump_relocations (file, rel_offset, rel_size,
3194 symtab, nsyms, strtab, is_rela);
3206 printf (_("\nThere are no relocations in this file.\n"));
3212 #include "unwind-ia64.h"
3214 /* An absolute address consists of a section and an offset. If the
3215 section is NULL, the offset itself is the address, otherwise, the
3216 address equals to LOAD_ADDRESS(section) + offset. */
3220 unsigned short section;
3226 struct unw_table_entry
3228 struct absaddr start;
3230 struct absaddr info;
3232 *table; /* Unwind table. */
3233 unsigned long table_len; /* Length of unwind table. */
3234 unsigned char * info; /* Unwind info. */
3235 unsigned long info_size; /* Size of unwind info. */
3236 bfd_vma info_addr; /* starting address of unwind info. */
3237 bfd_vma seg_base; /* Starting address of segment. */
3238 Elf_Internal_Sym * symtab; /* The symbol table. */
3239 unsigned long nsyms; /* Number of symbols. */
3240 char * strtab; /* The string table. */
3241 unsigned long strtab_size; /* Size of string table. */
3244 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3245 struct absaddr, const char **,
3247 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3248 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3249 Elf32_Internal_Shdr *));
3252 find_symbol_for_address (aux, addr, symname, offset)
3253 struct unw_aux_info *aux;
3254 struct absaddr addr;
3255 const char **symname;
3258 bfd_vma dist = (bfd_vma) 0x100000;
3259 Elf_Internal_Sym *sym, *best = NULL;
3262 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3264 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3265 && sym->st_name != 0
3266 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3267 && addr.offset >= sym->st_value
3268 && addr.offset - sym->st_value < dist)
3271 dist = addr.offset - sym->st_value;
3278 *symname = (best->st_name >= aux->strtab_size
3279 ? "<corrupt>" : aux->strtab + best->st_name);
3284 *offset = addr.offset;
3288 dump_ia64_unwind (aux)
3289 struct unw_aux_info *aux;
3292 struct unw_table_entry * tp;
3295 addr_size = is_32bit_elf ? 4 : 8;
3297 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3301 const unsigned char * dp;
3302 const unsigned char * head;
3303 const char * procname;
3305 find_symbol_for_address (aux, tp->start, &procname, &offset);
3307 fputs ("\n<", stdout);
3311 fputs (procname, stdout);
3314 printf ("+%lx", (unsigned long) offset);
3317 fputs (">: [", stdout);
3318 print_vma (tp->start.offset, PREFIX_HEX);
3319 fputc ('-', stdout);
3320 print_vma (tp->end.offset, PREFIX_HEX);
3321 printf ("), info at +0x%lx\n",
3322 (unsigned long) (tp->info.offset - aux->seg_base));
3324 head = aux->info + (tp->info.offset - aux->info_addr);
3325 stamp = BYTE_GET8 ((unsigned char *) head);
3327 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3328 (unsigned) UNW_VER (stamp),
3329 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3330 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3331 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3332 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3334 if (UNW_VER (stamp) != 1)
3336 printf ("\tUnknown version.\n");
3341 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3342 dp = unw_decode (dp, in_body, & in_body);
3347 slurp_ia64_unwind_table (file, aux, sec)
3349 struct unw_aux_info *aux;
3350 Elf32_Internal_Shdr *sec;
3352 unsigned long size, addr_size, nrelas, i;
3353 Elf_Internal_Phdr *prog_hdrs, *seg;
3354 struct unw_table_entry *tep;
3355 Elf32_Internal_Shdr *relsec;
3356 Elf_Internal_Rela *rela, *rp;
3357 unsigned char *table, *tp;
3358 Elf_Internal_Sym *sym;
3359 const char *relname;
3362 addr_size = is_32bit_elf ? 4 : 8;
3364 /* First, find the starting address of the segment that includes
3367 if (elf_header.e_phnum)
3369 prog_hdrs = (Elf_Internal_Phdr *)
3370 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3373 result = get_32bit_program_headers (file, prog_hdrs);
3375 result = get_64bit_program_headers (file, prog_hdrs);
3383 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3385 if (seg->p_type != PT_LOAD)
3388 if (sec->sh_addr >= seg->p_vaddr
3389 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3391 aux->seg_base = seg->p_vaddr;
3399 /* Second, build the unwind table from the contents of the unwind section: */
3400 size = sec->sh_size;
3401 table = (char *) get_data (NULL, file, sec->sh_offset,
3402 size, _("unwind table"));
3406 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3407 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3409 tep->start.section = SHN_UNDEF;
3410 tep->end.section = SHN_UNDEF;
3411 tep->info.section = SHN_UNDEF;
3414 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3415 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3416 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3420 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3421 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3422 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3424 tep->start.offset += aux->seg_base;
3425 tep->end.offset += aux->seg_base;
3426 tep->info.offset += aux->seg_base;
3430 /* Third, apply any relocations to the unwind table: */
3432 for (relsec = section_headers;
3433 relsec < section_headers + elf_header.e_shnum;
3436 if (relsec->sh_type != SHT_RELA
3437 || section_headers + relsec->sh_info != sec)
3440 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3444 for (rp = rela; rp < rela + nrelas; ++rp)
3448 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3449 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3451 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3453 warn (_("Skipping unexpected symbol type %u"),
3454 ELF32_ST_TYPE (sym->st_info));
3460 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3461 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3463 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3465 warn (_("Skipping unexpected symbol type %u"),
3466 ELF64_ST_TYPE (sym->st_info));
3471 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3473 warn (_("Skipping unexpected relocation type %s"), relname);
3477 i = rp->r_offset / (3 * addr_size);
3479 switch (rp->r_offset/addr_size % 3)
3482 aux->table[i].start.section = sym->st_shndx;
3483 aux->table[i].start.offset += rp->r_addend;
3486 aux->table[i].end.section = sym->st_shndx;
3487 aux->table[i].end.offset += rp->r_addend;
3490 aux->table[i].info.section = sym->st_shndx;
3491 aux->table[i].info.offset += rp->r_addend;
3501 aux->table_len = size / (3 * addr_size);
3506 process_unwind (file)
3509 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3510 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3511 struct unw_aux_info aux;
3516 if (elf_header.e_machine != EM_IA_64)
3518 printf (_("\nThere are no unwind sections in this file.\n"));
3522 memset (& aux, 0, sizeof (aux));
3524 addr_size = is_32bit_elf ? 4 : 8;
3526 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3528 if (sec->sh_type == SHT_SYMTAB)
3530 aux.nsyms = sec->sh_size / sec->sh_entsize;
3531 aux.symtab = GET_ELF_SYMBOLS (file, sec->sh_offset, aux.nsyms);
3533 strsec = section_headers + sec->sh_link;
3534 aux.strtab_size = strsec->sh_size;
3535 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3536 aux.strtab_size, _("string table"));
3538 else if (sec->sh_type == SHT_IA_64_UNWIND)
3543 printf (_("\nThere are no unwind sections in this file.\n"));
3545 while (unwcount-- > 0)
3550 for (i = unwstart, sec = section_headers + unwstart;
3551 i < elf_header.e_shnum; ++i, ++sec)
3552 if (sec->sh_type == SHT_IA_64_UNWIND)
3559 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3561 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3564 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3565 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3566 suffix = SECTION_NAME (unwsec) + len;
3567 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3569 if (strncmp (SECTION_NAME (sec),
3570 ELF_STRING_ia64_unwind_info_once, len2) == 0
3571 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3576 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3577 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3578 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3579 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3581 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3583 suffix = SECTION_NAME (unwsec) + len;
3584 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3586 if (strncmp (SECTION_NAME (sec),
3587 ELF_STRING_ia64_unwind_info, len2) == 0
3588 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3592 if (i == elf_header.e_shnum)
3594 printf (_("\nCould not find unwind info section for "));
3596 if (string_table == NULL)
3597 printf ("%d", unwsec->sh_name);
3599 printf ("'%s'", SECTION_NAME (unwsec));
3603 aux.info_size = sec->sh_size;
3604 aux.info_addr = sec->sh_addr;
3605 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3606 aux.info_size, _("unwind info"));
3608 printf (_("\nUnwind section "));
3610 if (string_table == NULL)
3611 printf ("%d", unwsec->sh_name);
3613 printf ("'%s'", SECTION_NAME (unwsec));
3615 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3617 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3619 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3621 if (aux.table_len > 0)
3622 dump_ia64_unwind (& aux);
3625 free ((char *) aux.table);
3627 free ((char *) aux.info);
3636 free ((char *) aux.strtab);
3642 dynamic_segment_mips_val (entry)
3643 Elf_Internal_Dyn * entry;
3645 switch (entry->d_tag)
3648 if (entry->d_un.d_val == 0)
3652 static const char * opts[] =
3654 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3655 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3656 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3657 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3662 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3663 if (entry->d_un.d_val & (1 << cnt))
3665 printf ("%s%s", first ? "" : " ", opts[cnt]);
3672 case DT_MIPS_IVERSION:
3673 if (dynamic_strings != NULL)
3674 printf ("Interface Version: %s\n",
3675 dynamic_strings + entry->d_un.d_val);
3677 printf ("%ld\n", (long) entry->d_un.d_ptr);
3680 case DT_MIPS_TIME_STAMP:
3685 time_t time = entry->d_un.d_val;
3686 tmp = gmtime (&time);
3687 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3688 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3689 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3690 printf ("Time Stamp: %s\n", timebuf);
3694 case DT_MIPS_RLD_VERSION:
3695 case DT_MIPS_LOCAL_GOTNO:
3696 case DT_MIPS_CONFLICTNO:
3697 case DT_MIPS_LIBLISTNO:
3698 case DT_MIPS_SYMTABNO:
3699 case DT_MIPS_UNREFEXTNO:
3700 case DT_MIPS_HIPAGENO:
3701 case DT_MIPS_DELTA_CLASS_NO:
3702 case DT_MIPS_DELTA_INSTANCE_NO:
3703 case DT_MIPS_DELTA_RELOC_NO:
3704 case DT_MIPS_DELTA_SYM_NO:
3705 case DT_MIPS_DELTA_CLASSSYM_NO:
3706 case DT_MIPS_COMPACT_SIZE:
3707 printf ("%ld\n", (long) entry->d_un.d_ptr);
3711 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3717 dynamic_segment_parisc_val (entry)
3718 Elf_Internal_Dyn * entry;
3720 switch (entry->d_tag)
3722 case DT_HP_DLD_FLAGS:
3731 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3732 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3733 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3734 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3735 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3736 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3737 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3738 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3739 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3740 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3741 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3745 bfd_vma val = entry->d_un.d_val;
3747 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3748 if (val & flags[cnt].bit)
3752 fputs (flags[cnt].str, stdout);
3754 val ^= flags[cnt].bit;
3757 if (val != 0 || first)
3761 print_vma (val, HEX);
3767 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3773 get_32bit_dynamic_segment (file)
3776 Elf32_External_Dyn * edyn;
3777 Elf_Internal_Dyn * entry;
3780 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
3781 dynamic_size, _("dynamic segment"));
3785 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3786 how large this .dynamic is now. We can do this even before the byte
3787 swapping since the DT_NULL tag is recognizable. */
3789 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3792 dynamic_segment = (Elf_Internal_Dyn *)
3793 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3795 if (dynamic_segment == NULL)
3797 error (_("Out of memory\n"));
3802 for (i = 0, entry = dynamic_segment;
3806 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3807 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3816 get_64bit_dynamic_segment (file)
3819 Elf64_External_Dyn * edyn;
3820 Elf_Internal_Dyn * entry;
3823 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
3824 dynamic_size, _("dynamic segment"));
3828 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3829 how large this .dynamic is now. We can do this even before the byte
3830 swapping since the DT_NULL tag is recognizable. */
3832 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3835 dynamic_segment = (Elf_Internal_Dyn *)
3836 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3838 if (dynamic_segment == NULL)
3840 error (_("Out of memory\n"));
3845 for (i = 0, entry = dynamic_segment;
3849 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3850 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3859 get_dynamic_flags (flags)
3862 static char buff [64];
3867 flag = flags & - flags;
3872 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3873 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3874 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3875 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3876 default: strcat (buff, "unknown "); break;
3882 /* Parse and display the contents of the dynamic segment. */
3884 process_dynamic_segment (file)
3887 Elf_Internal_Dyn * entry;
3890 if (dynamic_size == 0)
3893 printf (_("\nThere is no dynamic segment in this file.\n"));
3900 if (! get_32bit_dynamic_segment (file))
3903 else if (! get_64bit_dynamic_segment (file))
3906 /* Find the appropriate symbol table. */
3907 if (dynamic_symbols == NULL)
3909 for (i = 0, entry = dynamic_segment;
3913 unsigned long offset;
3915 if (entry->d_tag != DT_SYMTAB)
3918 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3920 /* Since we do not know how big the symbol table is,
3921 we default to reading in the entire file (!) and
3922 processing that. This is overkill, I know, but it
3924 offset = entry->d_un.d_val - loadaddr;
3926 if (fseek (file, 0, SEEK_END))
3927 error (_("Unable to seek to end of file!"));
3930 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3932 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3934 if (num_dynamic_syms < 1)
3936 error (_("Unable to determine the number of symbols to load\n"));
3940 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3944 /* Similarly find a string table. */
3945 if (dynamic_strings == NULL)
3947 for (i = 0, entry = dynamic_segment;
3951 unsigned long offset;
3954 if (entry->d_tag != DT_STRTAB)
3957 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3959 /* Since we do not know how big the string table is,
3960 we default to reading in the entire file (!) and
3961 processing that. This is overkill, I know, but it
3964 offset = entry->d_un.d_val - loadaddr;
3965 if (fseek (file, 0, SEEK_END))
3966 error (_("Unable to seek to end of file\n"));
3967 str_tab_len = ftell (file) - offset;
3969 if (str_tab_len < 1)
3972 (_("Unable to determine the length of the dynamic string table\n"));
3976 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
3977 _("dynamic string table"));
3983 /* And find the syminfo section if available. */
3984 if (dynamic_syminfo == NULL)
3986 unsigned int syminsz = 0;
3988 for (i = 0, entry = dynamic_segment;
3992 if (entry->d_tag == DT_SYMINENT)
3994 /* Note: these braces are necessary to avoid a syntax
3995 error from the SunOS4 C compiler. */
3996 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3998 else if (entry->d_tag == DT_SYMINSZ)
3999 syminsz = entry->d_un.d_val;
4000 else if (entry->d_tag == DT_SYMINFO)
4001 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4004 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4006 Elf_External_Syminfo * extsyminfo;
4007 Elf_Internal_Syminfo * syminfo;
4009 /* There is a syminfo section. Read the data. */
4010 extsyminfo = ((Elf_External_Syminfo *)
4011 get_data (NULL, file, dynamic_syminfo_offset,
4012 syminsz, _("symbol information")));
4016 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4017 if (dynamic_syminfo == NULL)
4019 error (_("Out of memory\n"));
4023 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4024 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4027 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4028 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4035 if (do_dynamic && dynamic_addr)
4036 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4037 dynamic_addr, (long) dynamic_size);
4039 printf (_(" Tag Type Name/Value\n"));
4041 for (i = 0, entry = dynamic_segment;
4050 print_vma (entry->d_tag, FULL_HEX);
4051 dtype = get_dynamic_type (entry->d_tag);
4052 printf (" (%s)%*s", dtype,
4053 ((is_32bit_elf ? 27 : 19)
4054 - (int) strlen (dtype)),
4058 switch (entry->d_tag)
4062 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4072 switch (entry->d_tag)
4075 printf (_("Auxiliary library"));
4079 printf (_("Filter library"));
4083 printf (_("Configuration file"));
4087 printf (_("Dependency audit library"));
4091 printf (_("Audit library"));
4095 if (dynamic_strings)
4096 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4100 print_vma (entry->d_un.d_val, PREFIX_HEX);
4109 printf (_("Flags:"));
4110 if (entry->d_un.d_val == 0)
4111 printf (_(" None\n"));
4114 unsigned long int val = entry->d_un.d_val;
4115 if (val & DTF_1_PARINIT)
4117 printf (" PARINIT");
4118 val ^= DTF_1_PARINIT;
4120 if (val & DTF_1_CONFEXP)
4122 printf (" CONFEXP");
4123 val ^= DTF_1_CONFEXP;
4126 printf (" %lx", val);
4135 printf (_("Flags:"));
4136 if (entry->d_un.d_val == 0)
4137 printf (_(" None\n"));
4140 unsigned long int val = entry->d_un.d_val;
4141 if (val & DF_P1_LAZYLOAD)
4143 printf (" LAZYLOAD");
4144 val ^= DF_P1_LAZYLOAD;
4146 if (val & DF_P1_GROUPPERM)
4148 printf (" GROUPPERM");
4149 val ^= DF_P1_GROUPPERM;
4152 printf (" %lx", val);
4161 printf (_("Flags:"));
4162 if (entry->d_un.d_val == 0)
4163 printf (_(" None\n"));
4166 unsigned long int val = entry->d_un.d_val;
4172 if (val & DF_1_GLOBAL)
4177 if (val & DF_1_GROUP)
4182 if (val & DF_1_NODELETE)
4184 printf (" NODELETE");
4185 val ^= DF_1_NODELETE;
4187 if (val & DF_1_LOADFLTR)
4189 printf (" LOADFLTR");
4190 val ^= DF_1_LOADFLTR;
4192 if (val & DF_1_INITFIRST)
4194 printf (" INITFIRST");
4195 val ^= DF_1_INITFIRST;
4197 if (val & DF_1_NOOPEN)
4202 if (val & DF_1_ORIGIN)
4207 if (val & DF_1_DIRECT)
4212 if (val & DF_1_TRANS)
4217 if (val & DF_1_INTERPOSE)
4219 printf (" INTERPOSE");
4220 val ^= DF_1_INTERPOSE;
4222 if (val & DF_1_NODEFLIB)
4224 printf (" NODEFLIB");
4225 val ^= DF_1_NODEFLIB;
4227 if (val & DF_1_NODUMP)
4232 if (val & DF_1_CONLFAT)
4234 printf (" CONLFAT");
4235 val ^= DF_1_CONLFAT;
4238 printf (" %lx", val);
4246 puts (get_dynamic_type (entry->d_un.d_val));
4266 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4272 if (dynamic_strings == NULL)
4275 name = dynamic_strings + entry->d_un.d_val;
4279 switch (entry->d_tag)
4282 printf (_("Shared library: [%s]"), name);
4284 if (strcmp (name, program_interpreter) == 0)
4285 printf (_(" program interpreter"));
4289 printf (_("Library soname: [%s]"), name);
4293 printf (_("Library rpath: [%s]"), name);
4297 printf (_("Library runpath: [%s]"), name);
4301 print_vma (entry->d_un.d_val, PREFIX_HEX);
4306 print_vma (entry->d_un.d_val, PREFIX_HEX);
4322 case DT_INIT_ARRAYSZ:
4323 case DT_FINI_ARRAYSZ:
4326 print_vma (entry->d_un.d_val, UNSIGNED);
4327 printf (" (bytes)\n");
4337 print_vma (entry->d_un.d_val, UNSIGNED);
4350 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4354 name = dynamic_strings + entry->d_un.d_val;
4358 printf (_("Not needed object: [%s]\n"), name);
4363 print_vma (entry->d_un.d_val, PREFIX_HEX);
4369 /* The value of this entry is ignored. */
4373 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4374 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4379 switch (elf_header.e_machine)
4382 case EM_MIPS_RS3_LE:
4383 dynamic_segment_mips_val (entry);
4386 dynamic_segment_parisc_val (entry);
4389 print_vma (entry->d_un.d_val, PREFIX_HEX);
4401 get_ver_flags (flags)
4404 static char buff [32];
4411 if (flags & VER_FLG_BASE)
4412 strcat (buff, "BASE ");
4414 if (flags & VER_FLG_WEAK)
4416 if (flags & VER_FLG_BASE)
4417 strcat (buff, "| ");
4419 strcat (buff, "WEAK ");
4422 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4423 strcat (buff, "| <unknown>");
4428 /* Display the contents of the version sections. */
4430 process_version_sections (file)
4433 Elf32_Internal_Shdr * section;
4440 for (i = 0, section = section_headers;
4441 i < elf_header.e_shnum;
4444 switch (section->sh_type)
4446 case SHT_GNU_verdef:
4448 Elf_External_Verdef * edefs;
4455 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4456 SECTION_NAME (section), section->sh_info);
4458 printf (_(" Addr: 0x"));
4459 printf_vma (section->sh_addr);
4460 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4461 (unsigned long) section->sh_offset, section->sh_link,
4462 SECTION_NAME (section_headers + section->sh_link));
4464 edefs = ((Elf_External_Verdef *)
4465 get_data (NULL, file, section->sh_offset,
4467 _("version definition section")));
4471 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4474 Elf_External_Verdef * edef;
4475 Elf_Internal_Verdef ent;
4476 Elf_External_Verdaux * eaux;
4477 Elf_Internal_Verdaux aux;
4481 vstart = ((char *) edefs) + idx;
4483 edef = (Elf_External_Verdef *) vstart;
4485 ent.vd_version = BYTE_GET (edef->vd_version);
4486 ent.vd_flags = BYTE_GET (edef->vd_flags);
4487 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4488 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4489 ent.vd_hash = BYTE_GET (edef->vd_hash);
4490 ent.vd_aux = BYTE_GET (edef->vd_aux);
4491 ent.vd_next = BYTE_GET (edef->vd_next);
4493 printf (_(" %#06x: Rev: %d Flags: %s"),
4494 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4496 printf (_(" Index: %d Cnt: %d "),
4497 ent.vd_ndx, ent.vd_cnt);
4499 vstart += ent.vd_aux;
4501 eaux = (Elf_External_Verdaux *) vstart;
4503 aux.vda_name = BYTE_GET (eaux->vda_name);
4504 aux.vda_next = BYTE_GET (eaux->vda_next);
4506 if (dynamic_strings)
4507 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4509 printf (_("Name index: %ld\n"), aux.vda_name);
4511 isum = idx + ent.vd_aux;
4513 for (j = 1; j < ent.vd_cnt; j ++)
4515 isum += aux.vda_next;
4516 vstart += aux.vda_next;
4518 eaux = (Elf_External_Verdaux *) vstart;
4520 aux.vda_name = BYTE_GET (eaux->vda_name);
4521 aux.vda_next = BYTE_GET (eaux->vda_next);
4523 if (dynamic_strings)
4524 printf (_(" %#06x: Parent %d: %s\n"),
4525 isum, j, dynamic_strings + aux.vda_name);
4527 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4528 isum, j, aux.vda_name);
4538 case SHT_GNU_verneed:
4540 Elf_External_Verneed * eneed;
4546 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4547 SECTION_NAME (section), section->sh_info);
4549 printf (_(" Addr: 0x"));
4550 printf_vma (section->sh_addr);
4551 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4552 (unsigned long) section->sh_offset, section->sh_link,
4553 SECTION_NAME (section_headers + section->sh_link));
4555 eneed = ((Elf_External_Verneed *)
4556 get_data (NULL, file, section->sh_offset,
4557 section->sh_size, _("version need section")));
4561 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4563 Elf_External_Verneed * entry;
4564 Elf_Internal_Verneed ent;
4569 vstart = ((char *) eneed) + idx;
4571 entry = (Elf_External_Verneed *) vstart;
4573 ent.vn_version = BYTE_GET (entry->vn_version);
4574 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4575 ent.vn_file = BYTE_GET (entry->vn_file);
4576 ent.vn_aux = BYTE_GET (entry->vn_aux);
4577 ent.vn_next = BYTE_GET (entry->vn_next);
4579 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4581 if (dynamic_strings)
4582 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4584 printf (_(" File: %lx"), ent.vn_file);
4586 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4588 vstart += ent.vn_aux;
4590 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4592 Elf_External_Vernaux * eaux;
4593 Elf_Internal_Vernaux aux;
4595 eaux = (Elf_External_Vernaux *) vstart;
4597 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4598 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4599 aux.vna_other = BYTE_GET (eaux->vna_other);
4600 aux.vna_name = BYTE_GET (eaux->vna_name);
4601 aux.vna_next = BYTE_GET (eaux->vna_next);
4603 if (dynamic_strings)
4604 printf (_(" %#06x: Name: %s"),
4605 isum, dynamic_strings + aux.vna_name);
4607 printf (_(" %#06x: Name index: %lx"),
4608 isum, aux.vna_name);
4610 printf (_(" Flags: %s Version: %d\n"),
4611 get_ver_flags (aux.vna_flags), aux.vna_other);
4613 isum += aux.vna_next;
4614 vstart += aux.vna_next;
4624 case SHT_GNU_versym:
4626 Elf32_Internal_Shdr * link_section;
4629 unsigned char * edata;
4630 unsigned short * data;
4632 Elf_Internal_Sym * symbols;
4633 Elf32_Internal_Shdr * string_sec;
4635 link_section = section_headers + section->sh_link;
4636 total = section->sh_size / section->sh_entsize;
4640 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
4641 link_section->sh_size / link_section->sh_entsize);
4643 string_sec = section_headers + link_section->sh_link;
4645 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4646 string_sec->sh_size,
4647 _("version string table"));
4651 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4652 SECTION_NAME (section), total);
4654 printf (_(" Addr: "));
4655 printf_vma (section->sh_addr);
4656 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4657 (unsigned long) section->sh_offset, section->sh_link,
4658 SECTION_NAME (link_section));
4662 get_data (NULL, file,
4663 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4664 total * sizeof (short), _("version symbol data")));
4671 data = (unsigned short *) malloc (total * sizeof (short));
4673 for (cnt = total; cnt --;)
4674 data [cnt] = byte_get (edata + cnt * sizeof (short),
4679 for (cnt = 0; cnt < total; cnt += 4)
4682 int check_def, check_need;
4685 printf (" %03x:", cnt);
4687 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4688 switch (data [cnt + j])
4691 fputs (_(" 0 (*local*) "), stdout);
4695 fputs (_(" 1 (*global*) "), stdout);
4699 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4700 data [cnt + j] & 0x8000 ? 'h' : ' ');
4704 if (symbols [cnt + j].st_shndx >= SHN_LORESERVE
4705 || section_headers[symbols [cnt + j].st_shndx].sh_type
4708 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4715 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4717 Elf_Internal_Verneed ivn;
4718 unsigned long offset;
4720 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4725 Elf_Internal_Vernaux ivna;
4726 Elf_External_Verneed evn;
4727 Elf_External_Vernaux evna;
4728 unsigned long a_off;
4730 get_data (&evn, file, offset, sizeof (evn),
4733 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4734 ivn.vn_next = BYTE_GET (evn.vn_next);
4736 a_off = offset + ivn.vn_aux;
4740 get_data (&evna, file, a_off, sizeof (evna),
4741 _("version need aux (2)"));
4743 ivna.vna_next = BYTE_GET (evna.vna_next);
4744 ivna.vna_other = BYTE_GET (evna.vna_other);
4746 a_off += ivna.vna_next;
4748 while (ivna.vna_other != data [cnt + j]
4749 && ivna.vna_next != 0);
4751 if (ivna.vna_other == data [cnt + j])
4753 ivna.vna_name = BYTE_GET (evna.vna_name);
4755 name = strtab + ivna.vna_name;
4756 nn += printf ("(%s%-*s",
4758 12 - (int) strlen (name),
4764 offset += ivn.vn_next;
4766 while (ivn.vn_next);
4769 if (check_def && data [cnt + j] != 0x8001
4770 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4772 Elf_Internal_Verdef ivd;
4773 Elf_External_Verdef evd;
4774 unsigned long offset;
4776 offset = version_info
4777 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4781 get_data (&evd, file, offset, sizeof (evd),
4784 ivd.vd_next = BYTE_GET (evd.vd_next);
4785 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4787 offset += ivd.vd_next;
4789 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4790 && ivd.vd_next != 0);
4792 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4794 Elf_External_Verdaux evda;
4795 Elf_Internal_Verdaux ivda;
4797 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4799 get_data (&evda, file,
4800 offset - ivd.vd_next + ivd.vd_aux,
4801 sizeof (evda), _("version def aux"));
4803 ivda.vda_name = BYTE_GET (evda.vda_name);
4805 name = strtab + ivda.vda_name;
4806 nn += printf ("(%s%-*s",
4808 12 - (int) strlen (name),
4814 printf ("%*c", 18 - nn, ' ');
4832 printf (_("\nNo version information found in this file.\n"));
4838 get_symbol_binding (binding)
4839 unsigned int binding;
4841 static char buff [32];
4845 case STB_LOCAL: return "LOCAL";
4846 case STB_GLOBAL: return "GLOBAL";
4847 case STB_WEAK: return "WEAK";
4849 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4850 sprintf (buff, _("<processor specific>: %d"), binding);
4851 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4852 sprintf (buff, _("<OS specific>: %d"), binding);
4854 sprintf (buff, _("<unknown>: %d"), binding);
4860 get_symbol_type (type)
4863 static char buff [32];
4867 case STT_NOTYPE: return "NOTYPE";
4868 case STT_OBJECT: return "OBJECT";
4869 case STT_FUNC: return "FUNC";
4870 case STT_SECTION: return "SECTION";
4871 case STT_FILE: return "FILE";
4872 case STT_COMMON: return "COMMON";
4874 if (type >= STT_LOPROC && type <= STT_HIPROC)
4876 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4877 return "THUMB_FUNC";
4879 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4882 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4883 return "PARISC_MILLI";
4885 sprintf (buff, _("<processor specific>: %d"), type);
4887 else if (type >= STT_LOOS && type <= STT_HIOS)
4889 if (elf_header.e_machine == EM_PARISC)
4891 if (type == STT_HP_OPAQUE)
4893 if (type == STT_HP_STUB)
4897 sprintf (buff, _("<OS specific>: %d"), type);
4900 sprintf (buff, _("<unknown>: %d"), type);
4906 get_symbol_visibility (visibility)
4907 unsigned int visibility;
4911 case STV_DEFAULT: return "DEFAULT";
4912 case STV_INTERNAL: return "INTERNAL";
4913 case STV_HIDDEN: return "HIDDEN";
4914 case STV_PROTECTED: return "PROTECTED";
4920 get_symbol_index_type (type)
4925 case SHN_UNDEF: return "UND";
4926 case SHN_ABS: return "ABS";
4927 case SHN_COMMON: return "COM";
4929 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4931 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4933 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4937 static char buff [32];
4939 sprintf (buff, "%3d", type);
4946 get_dynamic_data (file, number)
4948 unsigned int number;
4950 unsigned char * e_data;
4953 e_data = (unsigned char *) malloc (number * 4);
4957 error (_("Out of memory\n"));
4961 if (fread (e_data, 4, number, file) != number)
4963 error (_("Unable to read in dynamic data\n"));
4967 i_data = (int *) malloc (number * sizeof (* i_data));
4971 error (_("Out of memory\n"));
4977 i_data [number] = byte_get (e_data + number * 4, 4);
4984 /* Dump the symbol table */
4986 process_symbol_table (file)
4989 Elf32_Internal_Shdr * section;
4990 unsigned char nb [4];
4991 unsigned char nc [4];
4994 int * buckets = NULL;
4995 int * chains = NULL;
4997 if (! do_syms && !do_histogram)
5000 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5003 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5005 error (_("Unable to seek to start of dynamic information"));
5009 if (fread (nb, sizeof (nb), 1, file) != 1)
5011 error (_("Failed to read in number of buckets\n"));
5015 if (fread (nc, sizeof (nc), 1, file) != 1)
5017 error (_("Failed to read in number of chains\n"));
5021 nbuckets = byte_get (nb, 4);
5022 nchains = byte_get (nc, 4);
5024 buckets = get_dynamic_data (file, nbuckets);
5025 chains = get_dynamic_data (file, nchains);
5027 if (buckets == NULL || chains == NULL)
5032 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5037 printf (_("\nSymbol table for image:\n"));
5039 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5041 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5043 for (hn = 0; hn < nbuckets; hn++)
5048 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5050 Elf_Internal_Sym * psym;
5052 psym = dynamic_symbols + si;
5054 printf (" %3d %3d: ", si, hn);
5055 print_vma (psym->st_value, LONG_HEX);
5057 print_vma (psym->st_size, DEC_5);
5059 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5060 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5061 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5062 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
5063 printf (" %s\n", dynamic_strings + psym->st_name);
5067 else if (do_syms && !do_using_dynamic)
5071 for (i = 0, section = section_headers;
5072 i < elf_header.e_shnum;
5077 Elf_Internal_Sym * symtab;
5078 Elf_Internal_Sym * psym;
5081 if ( section->sh_type != SHT_SYMTAB
5082 && section->sh_type != SHT_DYNSYM)
5085 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5086 SECTION_NAME (section),
5087 (unsigned long) (section->sh_size / section->sh_entsize));
5089 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5091 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5093 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
5094 section->sh_size / section->sh_entsize);
5098 if (section->sh_link == elf_header.e_shstrndx)
5099 strtab = string_table;
5102 Elf32_Internal_Shdr * string_sec;
5104 string_sec = section_headers + section->sh_link;
5106 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5107 string_sec->sh_size,
5111 for (si = 0, psym = symtab;
5112 si < section->sh_size / section->sh_entsize;
5115 printf ("%6d: ", si);
5116 print_vma (psym->st_value, LONG_HEX);
5118 print_vma (psym->st_size, DEC_5);
5119 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5120 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5121 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5122 printf (" %4s", get_symbol_index_type (psym->st_shndx));
5123 printf (" %s", strtab + psym->st_name);
5125 if (section->sh_type == SHT_DYNSYM &&
5126 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5128 unsigned char data[2];
5129 unsigned short vers_data;
5130 unsigned long offset;
5134 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5137 get_data (&data, file, offset + si * sizeof (vers_data),
5138 sizeof (data), _("version data"));
5140 vers_data = byte_get (data, 2);
5142 is_nobits = psym->st_shndx < SHN_LORESERVE ?
5143 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
5146 check_def = (psym->st_shndx != SHN_UNDEF);
5148 if ((vers_data & 0x8000) || vers_data > 1)
5150 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5151 && (is_nobits || ! check_def))
5153 Elf_External_Verneed evn;
5154 Elf_Internal_Verneed ivn;
5155 Elf_Internal_Vernaux ivna;
5157 /* We must test both. */
5158 offset = version_info
5159 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5163 unsigned long vna_off;
5165 get_data (&evn, file, offset, sizeof (evn),
5168 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5169 ivn.vn_next = BYTE_GET (evn.vn_next);
5171 vna_off = offset + ivn.vn_aux;
5175 Elf_External_Vernaux evna;
5177 get_data (&evna, file, vna_off,
5179 _("version need aux (3)"));
5181 ivna.vna_other = BYTE_GET (evna.vna_other);
5182 ivna.vna_next = BYTE_GET (evna.vna_next);
5183 ivna.vna_name = BYTE_GET (evna.vna_name);
5185 vna_off += ivna.vna_next;
5187 while (ivna.vna_other != vers_data
5188 && ivna.vna_next != 0);
5190 if (ivna.vna_other == vers_data)
5193 offset += ivn.vn_next;
5195 while (ivn.vn_next != 0);
5197 if (ivna.vna_other == vers_data)
5200 strtab + ivna.vna_name, ivna.vna_other);
5203 else if (! is_nobits)
5204 error (_("bad dynamic symbol"));
5211 if (vers_data != 0x8001
5212 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5214 Elf_Internal_Verdef ivd;
5215 Elf_Internal_Verdaux ivda;
5216 Elf_External_Verdaux evda;
5217 unsigned long offset;
5220 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5225 Elf_External_Verdef evd;
5227 get_data (&evd, file, offset, sizeof (evd),
5230 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5231 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5232 ivd.vd_next = BYTE_GET (evd.vd_next);
5234 offset += ivd.vd_next;
5236 while (ivd.vd_ndx != (vers_data & 0x7fff)
5237 && ivd.vd_next != 0);
5239 offset -= ivd.vd_next;
5240 offset += ivd.vd_aux;
5242 get_data (&evda, file, offset, sizeof (evda),
5243 _("version def aux"));
5245 ivda.vda_name = BYTE_GET (evda.vda_name);
5247 if (psym->st_name != ivda.vda_name)
5248 printf ((vers_data & 0x8000)
5250 strtab + ivda.vda_name);
5260 if (strtab != string_table)
5266 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5268 if (do_histogram && buckets != NULL)
5275 int nzero_counts = 0;
5278 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5280 printf (_(" Length Number %% of total Coverage\n"));
5282 lengths = (int *) calloc (nbuckets, sizeof (int));
5283 if (lengths == NULL)
5285 error (_("Out of memory"));
5288 for (hn = 0; hn < nbuckets; ++hn)
5293 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5296 if (maxlength < ++lengths[hn])
5301 counts = (int *) calloc (maxlength + 1, sizeof (int));
5304 error (_("Out of memory"));
5308 for (hn = 0; hn < nbuckets; ++hn)
5309 ++ counts [lengths [hn]];
5313 printf (" 0 %-10d (%5.1f%%)\n",
5314 counts[0], (counts[0] * 100.0) / nbuckets);
5315 for (si = 1; si <= maxlength; ++si)
5317 nzero_counts += counts[si] * si;
5318 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5319 si, counts[si], (counts[si] * 100.0) / nbuckets,
5320 (nzero_counts * 100.0) / nsyms);
5328 if (buckets != NULL)
5338 process_syminfo (file)
5339 FILE * file ATTRIBUTE_UNUSED;
5343 if (dynamic_syminfo == NULL
5345 /* No syminfo, this is ok. */
5348 /* There better should be a dynamic symbol section. */
5349 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5353 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5354 dynamic_syminfo_offset, dynamic_syminfo_nent);
5356 printf (_(" Num: Name BoundTo Flags\n"));
5357 for (i = 0; i < dynamic_syminfo_nent; ++i)
5359 unsigned short int flags = dynamic_syminfo[i].si_flags;
5361 printf ("%4d: %-30s ", i,
5362 dynamic_strings + dynamic_symbols[i].st_name);
5364 switch (dynamic_syminfo[i].si_boundto)
5366 case SYMINFO_BT_SELF:
5367 fputs ("SELF ", stdout);
5369 case SYMINFO_BT_PARENT:
5370 fputs ("PARENT ", stdout);
5373 if (dynamic_syminfo[i].si_boundto > 0
5374 && dynamic_syminfo[i].si_boundto < dynamic_size)
5377 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5379 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5383 if (flags & SYMINFO_FLG_DIRECT)
5385 if (flags & SYMINFO_FLG_PASSTHRU)
5386 printf (" PASSTHRU");
5387 if (flags & SYMINFO_FLG_COPY)
5389 if (flags & SYMINFO_FLG_LAZYLOAD)
5390 printf (" LAZYLOAD");
5398 #ifdef SUPPORT_DISASSEMBLY
5400 disassemble_section (section, file)
5401 Elf32_Internal_Shdr * section;
5404 printf (_("\nAssembly dump of section %s\n"),
5405 SECTION_NAME (section));
5407 /* XXX -- to be done --- XXX */
5414 dump_section (section, file)
5415 Elf32_Internal_Shdr * section;
5418 bfd_size_type bytes;
5420 unsigned char * data;
5421 unsigned char * start;
5423 bytes = section->sh_size;
5427 printf (_("\nSection '%s' has no data to dump.\n"),
5428 SECTION_NAME (section));
5432 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5434 addr = section->sh_addr;
5436 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5449 lbytes = (bytes > 16 ? 16 : bytes);
5451 printf (" 0x%8.8lx ", (unsigned long) addr);
5453 switch (elf_header.e_ident [EI_DATA])
5457 for (j = 15; j >= 0; j --)
5460 printf ("%2.2x", data [j]);
5470 for (j = 0; j < 16; j++)
5473 printf ("%2.2x", data [j]);
5483 for (j = 0; j < lbytes; j++)
5486 if (k >= ' ' && k < 0x80)
5505 static unsigned long int
5506 read_leb128 (data, length_return, sign)
5507 unsigned char * data;
5508 int * length_return;
5511 unsigned long int result = 0;
5512 unsigned int num_read = 0;
5521 result |= (byte & 0x7f) << shift;
5526 while (byte & 0x80);
5528 if (length_return != NULL)
5529 * length_return = num_read;
5531 if (sign && (shift < 32) && (byte & 0x40))
5532 result |= -1 << shift;
5537 typedef struct State_Machine_Registers
5539 unsigned long address;
5542 unsigned int column;
5546 /* This variable hold the number of the last entry seen
5547 in the File Table. */
5548 unsigned int last_file_entry;
5551 static SMR state_machine_regs;
5554 reset_state_machine (is_stmt)
5557 state_machine_regs.address = 0;
5558 state_machine_regs.file = 1;
5559 state_machine_regs.line = 1;
5560 state_machine_regs.column = 0;
5561 state_machine_regs.is_stmt = is_stmt;
5562 state_machine_regs.basic_block = 0;
5563 state_machine_regs.end_sequence = 0;
5564 state_machine_regs.last_file_entry = 0;
5567 /* Handled an extend line op. Returns true if this is the end
5570 process_extended_line_op (data, is_stmt, pointer_size)
5571 unsigned char * data;
5575 unsigned char op_code;
5578 unsigned char * name;
5581 len = read_leb128 (data, & bytes_read, 0);
5586 warn (_("badly formed extended line op encountered!"));
5591 op_code = * data ++;
5593 printf (_(" Extended opcode %d: "), op_code);
5597 case DW_LNE_end_sequence:
5598 printf (_("End of Sequence\n\n"));
5599 reset_state_machine (is_stmt);
5602 case DW_LNE_set_address:
5603 adr = byte_get (data, pointer_size);
5604 printf (_("set Address to 0x%lx\n"), adr);
5605 state_machine_regs.address = adr;
5608 case DW_LNE_define_file:
5609 printf (_(" define new File Table entry\n"));
5610 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5612 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5614 data += strlen ((char *) data) + 1;
5615 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5617 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5619 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5620 printf (_("%s\n\n"), name);
5624 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5631 /* Size of pointers in the .debug_line section. This information is not
5632 really present in that section. It's obtained before dumping the debug
5633 sections by doing some pre-scan of the .debug_info section. */
5634 static int debug_line_pointer_size = 4;
5637 display_debug_lines (section, start, file)
5638 Elf32_Internal_Shdr * section;
5639 unsigned char * start;
5640 FILE * file ATTRIBUTE_UNUSED;
5642 DWARF2_External_LineInfo * external;
5643 DWARF2_Internal_LineInfo info;
5644 unsigned char * standard_opcodes;
5645 unsigned char * data = start;
5646 unsigned char * end = start + section->sh_size;
5647 unsigned char * end_of_sequence;
5650 printf (_("\nDump of debug contents of section %s:\n\n"),
5651 SECTION_NAME (section));
5655 external = (DWARF2_External_LineInfo *) data;
5657 /* Check the length of the block. */
5658 info.li_length = BYTE_GET (external->li_length);
5659 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5662 (_("The line info appears to be corrupt - the section is too small\n"));
5666 /* Check its version number. */
5667 info.li_version = BYTE_GET (external->li_version);
5668 if (info.li_version != 2)
5670 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5674 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5675 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5676 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5677 info.li_line_base = BYTE_GET (external->li_line_base);
5678 info.li_line_range = BYTE_GET (external->li_line_range);
5679 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5681 /* Sign extend the line base field. */
5682 info.li_line_base <<= 24;
5683 info.li_line_base >>= 24;
5685 printf (_(" Length: %ld\n"), info.li_length);
5686 printf (_(" DWARF Version: %d\n"), info.li_version);
5687 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
5688 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5689 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5690 printf (_(" Line Base: %d\n"), info.li_line_base);
5691 printf (_(" Line Range: %d\n"), info.li_line_range);
5692 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5694 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5696 reset_state_machine (info.li_default_is_stmt);
5698 /* Display the contents of the Opcodes table. */
5699 standard_opcodes = data + sizeof (* external);
5701 printf (_("\n Opcodes:\n"));
5703 for (i = 1; i < info.li_opcode_base; i++)
5704 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5706 /* Display the contents of the Directory table. */
5707 data = standard_opcodes + info.li_opcode_base - 1;
5710 printf (_("\n The Directory Table is empty.\n"));
5713 printf (_("\n The Directory Table:\n"));
5717 printf (_(" %s\n"), data);
5719 data += strlen ((char *) data) + 1;
5723 /* Skip the NUL at the end of the table. */
5726 /* Display the contents of the File Name table. */
5728 printf (_("\n The File Name Table is empty.\n"));
5731 printf (_("\n The File Name Table:\n"));
5732 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5736 unsigned char * name;
5739 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5742 data += strlen ((char *) data) + 1;
5744 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5746 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5748 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5750 printf (_("%s\n"), name);
5754 /* Skip the NUL at the end of the table. */
5757 /* Now display the statements. */
5758 printf (_("\n Line Number Statements:\n"));
5761 while (data < end_of_sequence)
5763 unsigned char op_code;
5767 op_code = * data ++;
5771 case DW_LNS_extended_op:
5772 data += process_extended_line_op (data, info.li_default_is_stmt,
5773 debug_line_pointer_size);
5777 printf (_(" Copy\n"));
5780 case DW_LNS_advance_pc:
5781 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5783 state_machine_regs.address += adv;
5784 printf (_(" Advance PC by %d to %lx\n"), adv,
5785 state_machine_regs.address);
5788 case DW_LNS_advance_line:
5789 adv = read_leb128 (data, & bytes_read, 1);
5791 state_machine_regs.line += adv;
5792 printf (_(" Advance Line by %d to %d\n"), adv,
5793 state_machine_regs.line);
5796 case DW_LNS_set_file:
5797 adv = read_leb128 (data, & bytes_read, 0);
5799 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5801 state_machine_regs.file = adv;
5804 case DW_LNS_set_column:
5805 adv = read_leb128 (data, & bytes_read, 0);
5807 printf (_(" Set column to %d\n"), adv);
5808 state_machine_regs.column = adv;
5811 case DW_LNS_negate_stmt:
5812 adv = state_machine_regs.is_stmt;
5814 printf (_(" Set is_stmt to %d\n"), adv);
5815 state_machine_regs.is_stmt = adv;
5818 case DW_LNS_set_basic_block:
5819 printf (_(" Set basic block\n"));
5820 state_machine_regs.basic_block = 1;
5823 case DW_LNS_const_add_pc:
5824 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5825 * info.li_min_insn_length);
5826 state_machine_regs.address += adv;
5827 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5828 state_machine_regs.address);
5831 case DW_LNS_fixed_advance_pc:
5832 adv = byte_get (data, 2);
5834 state_machine_regs.address += adv;
5835 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5836 adv, state_machine_regs.address);
5840 op_code -= info.li_opcode_base;
5841 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5842 state_machine_regs.address += adv;
5843 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5844 op_code, adv, state_machine_regs.address);
5845 adv = (op_code % info.li_line_range) + info.li_line_base;
5846 state_machine_regs.line += adv;
5847 printf (_(" and Line by %d to %d\n"),
5848 adv, state_machine_regs.line);
5859 display_debug_pubnames (section, start, file)
5860 Elf32_Internal_Shdr * section;
5861 unsigned char * start;
5862 FILE * file ATTRIBUTE_UNUSED;
5864 DWARF2_External_PubNames * external;
5865 DWARF2_Internal_PubNames pubnames;
5866 unsigned char * end;
5868 end = start + section->sh_size;
5870 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5874 unsigned char * data;
5875 unsigned long offset;
5877 external = (DWARF2_External_PubNames *) start;
5879 pubnames.pn_length = BYTE_GET (external->pn_length);
5880 pubnames.pn_version = BYTE_GET (external->pn_version);
5881 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5882 pubnames.pn_size = BYTE_GET (external->pn_size);
5884 data = start + sizeof (* external);
5885 start += pubnames.pn_length + sizeof (external->pn_length);
5887 if (pubnames.pn_version != 2)
5889 static int warned = 0;
5893 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5900 printf (_(" Length: %ld\n"),
5901 pubnames.pn_length);
5902 printf (_(" Version: %d\n"),
5903 pubnames.pn_version);
5904 printf (_(" Offset into .debug_info section: %ld\n"),
5905 pubnames.pn_offset);
5906 printf (_(" Size of area in .debug_info section: %ld\n"),
5909 printf (_("\n Offset\tName\n"));
5913 offset = byte_get (data, 4);
5918 printf (" %ld\t\t%s\n", offset, data);
5919 data += strlen ((char *) data) + 1;
5922 while (offset != 0);
5935 case DW_TAG_padding: return "DW_TAG_padding";
5936 case DW_TAG_array_type: return "DW_TAG_array_type";
5937 case DW_TAG_class_type: return "DW_TAG_class_type";
5938 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5939 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5940 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5941 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5942 case DW_TAG_label: return "DW_TAG_label";
5943 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5944 case DW_TAG_member: return "DW_TAG_member";
5945 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5946 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5947 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5948 case DW_TAG_string_type: return "DW_TAG_string_type";
5949 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5950 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5951 case DW_TAG_typedef: return "DW_TAG_typedef";
5952 case DW_TAG_union_type: return "DW_TAG_union_type";
5953 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5954 case DW_TAG_variant: return "DW_TAG_variant";
5955 case DW_TAG_common_block: return "DW_TAG_common_block";
5956 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5957 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5958 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5959 case DW_TAG_module: return "DW_TAG_module";
5960 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5961 case DW_TAG_set_type: return "DW_TAG_set_type";
5962 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5963 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5964 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5965 case DW_TAG_base_type: return "DW_TAG_base_type";
5966 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5967 case DW_TAG_const_type: return "DW_TAG_const_type";
5968 case DW_TAG_constant: return "DW_TAG_constant";
5969 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5970 case DW_TAG_file_type: return "DW_TAG_file_type";
5971 case DW_TAG_friend: return "DW_TAG_friend";
5972 case DW_TAG_namelist: return "DW_TAG_namelist";
5973 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5974 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5975 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5976 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5977 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5978 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5979 case DW_TAG_try_block: return "DW_TAG_try_block";
5980 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5981 case DW_TAG_variable: return "DW_TAG_variable";
5982 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5983 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5984 case DW_TAG_format_label: return "DW_TAG_format_label";
5985 case DW_TAG_function_template: return "DW_TAG_function_template";
5986 case DW_TAG_class_template: return "DW_TAG_class_template";
5987 /* DWARF 2.1 values. */
5988 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
5989 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
5990 case DW_TAG_interface_type: return "DW_TAG_interface_type";
5991 case DW_TAG_namespace: return "DW_TAG_namespace";
5992 case DW_TAG_imported_module: return "DW_TAG_imported_module";
5993 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
5994 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
5995 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
5998 static char buffer [100];
6000 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6007 get_AT_name (attribute)
6008 unsigned long attribute;
6012 case DW_AT_sibling: return "DW_AT_sibling";
6013 case DW_AT_location: return "DW_AT_location";
6014 case DW_AT_name: return "DW_AT_name";
6015 case DW_AT_ordering: return "DW_AT_ordering";
6016 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6017 case DW_AT_byte_size: return "DW_AT_byte_size";
6018 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6019 case DW_AT_bit_size: return "DW_AT_bit_size";
6020 case DW_AT_element_list: return "DW_AT_element_list";
6021 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6022 case DW_AT_low_pc: return "DW_AT_low_pc";
6023 case DW_AT_high_pc: return "DW_AT_high_pc";
6024 case DW_AT_language: return "DW_AT_language";
6025 case DW_AT_member: return "DW_AT_member";
6026 case DW_AT_discr: return "DW_AT_discr";
6027 case DW_AT_discr_value: return "DW_AT_discr_value";
6028 case DW_AT_visibility: return "DW_AT_visibility";
6029 case DW_AT_import: return "DW_AT_import";
6030 case DW_AT_string_length: return "DW_AT_string_length";
6031 case DW_AT_common_reference: return "DW_AT_common_reference";
6032 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6033 case DW_AT_const_value: return "DW_AT_const_value";
6034 case DW_AT_containing_type: return "DW_AT_containing_type";
6035 case DW_AT_default_value: return "DW_AT_default_value";
6036 case DW_AT_inline: return "DW_AT_inline";
6037 case DW_AT_is_optional: return "DW_AT_is_optional";
6038 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6039 case DW_AT_producer: return "DW_AT_producer";
6040 case DW_AT_prototyped: return "DW_AT_prototyped";
6041 case DW_AT_return_addr: return "DW_AT_return_addr";
6042 case DW_AT_start_scope: return "DW_AT_start_scope";
6043 case DW_AT_stride_size: return "DW_AT_stride_size";
6044 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6045 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6046 case DW_AT_accessibility: return "DW_AT_accessibility";
6047 case DW_AT_address_class: return "DW_AT_address_class";
6048 case DW_AT_artificial: return "DW_AT_artificial";
6049 case DW_AT_base_types: return "DW_AT_base_types";
6050 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6051 case DW_AT_count: return "DW_AT_count";
6052 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6053 case DW_AT_decl_column: return "DW_AT_decl_column";
6054 case DW_AT_decl_file: return "DW_AT_decl_file";
6055 case DW_AT_decl_line: return "DW_AT_decl_line";
6056 case DW_AT_declaration: return "DW_AT_declaration";
6057 case DW_AT_discr_list: return "DW_AT_discr_list";
6058 case DW_AT_encoding: return "DW_AT_encoding";
6059 case DW_AT_external: return "DW_AT_external";
6060 case DW_AT_frame_base: return "DW_AT_frame_base";
6061 case DW_AT_friend: return "DW_AT_friend";
6062 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6063 case DW_AT_macro_info: return "DW_AT_macro_info";
6064 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6065 case DW_AT_priority: return "DW_AT_priority";
6066 case DW_AT_segment: return "DW_AT_segment";
6067 case DW_AT_specification: return "DW_AT_specification";
6068 case DW_AT_static_link: return "DW_AT_static_link";
6069 case DW_AT_type: return "DW_AT_type";
6070 case DW_AT_use_location: return "DW_AT_use_location";
6071 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6072 case DW_AT_virtuality: return "DW_AT_virtuality";
6073 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6074 /* DWARF 2.1 values. */
6075 case DW_AT_allocated: return "DW_AT_allocated";
6076 case DW_AT_associated: return "DW_AT_associated";
6077 case DW_AT_data_location: return "DW_AT_data_location";
6078 case DW_AT_stride: return "DW_AT_stride";
6079 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6080 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6081 case DW_AT_extension: return "DW_AT_extension";
6082 case DW_AT_ranges: return "DW_AT_ranges";
6083 case DW_AT_trampoline: return "DW_AT_trampoline";
6084 case DW_AT_call_column: return "DW_AT_call_column";
6085 case DW_AT_call_file: return "DW_AT_call_file";
6086 case DW_AT_call_line: return "DW_AT_call_line";
6087 /* SGI/MIPS extensions. */
6088 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6089 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6090 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6091 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6092 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6093 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6094 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6095 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6096 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6097 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6098 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6099 /* GNU extensions. */
6100 case DW_AT_sf_names: return "DW_AT_sf_names";
6101 case DW_AT_src_info: return "DW_AT_src_info";
6102 case DW_AT_mac_info: return "DW_AT_mac_info";
6103 case DW_AT_src_coords: return "DW_AT_src_coords";
6104 case DW_AT_body_begin: return "DW_AT_body_begin";
6105 case DW_AT_body_end: return "DW_AT_body_end";
6108 static char buffer [100];
6110 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6117 get_FORM_name (form)
6122 case DW_FORM_addr: return "DW_FORM_addr";
6123 case DW_FORM_block2: return "DW_FORM_block2";
6124 case DW_FORM_block4: return "DW_FORM_block4";
6125 case DW_FORM_data2: return "DW_FORM_data2";
6126 case DW_FORM_data4: return "DW_FORM_data4";
6127 case DW_FORM_data8: return "DW_FORM_data8";
6128 case DW_FORM_string: return "DW_FORM_string";
6129 case DW_FORM_block: return "DW_FORM_block";
6130 case DW_FORM_block1: return "DW_FORM_block1";
6131 case DW_FORM_data1: return "DW_FORM_data1";
6132 case DW_FORM_flag: return "DW_FORM_flag";
6133 case DW_FORM_sdata: return "DW_FORM_sdata";
6134 case DW_FORM_strp: return "DW_FORM_strp";
6135 case DW_FORM_udata: return "DW_FORM_udata";
6136 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6137 case DW_FORM_ref1: return "DW_FORM_ref1";
6138 case DW_FORM_ref2: return "DW_FORM_ref2";
6139 case DW_FORM_ref4: return "DW_FORM_ref4";
6140 case DW_FORM_ref8: return "DW_FORM_ref8";
6141 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6142 case DW_FORM_indirect: return "DW_FORM_indirect";
6145 static char buffer [100];
6147 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6153 /* FIXME: There are better and more effiecint ways to handle
6154 these structures. For now though, I just want something that
6155 is simple to implement. */
6156 typedef struct abbrev_attr
6158 unsigned long attribute;
6160 struct abbrev_attr * next;
6164 typedef struct abbrev_entry
6166 unsigned long entry;
6169 struct abbrev_attr * first_attr;
6170 struct abbrev_attr * last_attr;
6171 struct abbrev_entry * next;
6175 static abbrev_entry * first_abbrev = NULL;
6176 static abbrev_entry * last_abbrev = NULL;
6179 free_abbrevs PARAMS ((void))
6181 abbrev_entry * abbrev;
6183 for (abbrev = first_abbrev; abbrev;)
6185 abbrev_entry * next = abbrev->next;
6188 for (attr = abbrev->first_attr; attr;)
6190 abbrev_attr * next = attr->next;
6200 last_abbrev = first_abbrev = NULL;
6204 add_abbrev (number, tag, children)
6205 unsigned long number;
6209 abbrev_entry * entry;
6211 entry = (abbrev_entry *) malloc (sizeof (* entry));
6217 entry->entry = number;
6219 entry->children = children;
6220 entry->first_attr = NULL;
6221 entry->last_attr = NULL;
6224 if (first_abbrev == NULL)
6225 first_abbrev = entry;
6227 last_abbrev->next = entry;
6229 last_abbrev = entry;
6233 add_abbrev_attr (attribute, form)
6234 unsigned long attribute;
6239 attr = (abbrev_attr *) malloc (sizeof (* attr));
6245 attr->attribute = attribute;
6249 if (last_abbrev->first_attr == NULL)
6250 last_abbrev->first_attr = attr;
6252 last_abbrev->last_attr->next = attr;
6254 last_abbrev->last_attr = attr;
6257 /* Processes the (partial) contents of a .debug_abbrev section.
6258 Returns NULL if the end of the section was encountered.
6259 Returns the address after the last byte read if the end of
6260 an abbreviation set was found. */
6262 static unsigned char *
6263 process_abbrev_section (start, end)
6264 unsigned char * start;
6265 unsigned char * end;
6267 if (first_abbrev != NULL)
6273 unsigned long entry;
6275 unsigned long attribute;
6278 entry = read_leb128 (start, & bytes_read, 0);
6279 start += bytes_read;
6281 /* A single zero is supposed to end the section according
6282 to the standard. If there's more, then signal that to
6285 return start == end ? NULL : start;
6287 tag = read_leb128 (start, & bytes_read, 0);
6288 start += bytes_read;
6290 children = * start ++;
6292 add_abbrev (entry, tag, children);
6298 attribute = read_leb128 (start, & bytes_read, 0);
6299 start += bytes_read;
6301 form = read_leb128 (start, & bytes_read, 0);
6302 start += bytes_read;
6305 add_abbrev_attr (attribute, form);
6307 while (attribute != 0);
6315 display_debug_macinfo (section, start, file)
6316 Elf32_Internal_Shdr * section;
6317 unsigned char * start;
6318 FILE * file ATTRIBUTE_UNUSED;
6320 unsigned char * end = start + section->sh_size;
6321 unsigned char * curr = start;
6322 unsigned int bytes_read;
6323 enum dwarf_macinfo_record_type op;
6325 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6329 unsigned int lineno;
6330 const char * string;
6337 case DW_MACINFO_start_file:
6339 unsigned int filenum;
6341 lineno = read_leb128 (curr, & bytes_read, 0);
6343 filenum = read_leb128 (curr, & bytes_read, 0);
6346 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6350 case DW_MACINFO_end_file:
6351 printf (_(" DW_MACINFO_end_file\n"));
6354 case DW_MACINFO_define:
6355 lineno = read_leb128 (curr, & bytes_read, 0);
6358 curr += strlen (string) + 1;
6359 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6362 case DW_MACINFO_undef:
6363 lineno = read_leb128 (curr, & bytes_read, 0);
6366 curr += strlen (string) + 1;
6367 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6370 case DW_MACINFO_vendor_ext:
6372 unsigned int constant;
6374 constant = read_leb128 (curr, & bytes_read, 0);
6377 curr += strlen (string) + 1;
6378 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6389 display_debug_abbrev (section, start, file)
6390 Elf32_Internal_Shdr * section;
6391 unsigned char * start;
6392 FILE * file ATTRIBUTE_UNUSED;
6394 abbrev_entry * entry;
6395 unsigned char * end = start + section->sh_size;
6397 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6401 start = process_abbrev_section (start, end);
6403 printf (_(" Number TAG\n"));
6405 for (entry = first_abbrev; entry; entry = entry->next)
6409 printf (_(" %ld %s [%s]\n"),
6411 get_TAG_name (entry->tag),
6412 entry->children ? _("has children") : _("no children"));
6414 for (attr = entry->first_attr; attr; attr = attr->next)
6416 printf (_(" %-18s %s\n"),
6417 get_AT_name (attr->attribute),
6418 get_FORM_name (attr->form));
6430 static unsigned char *
6431 display_block (data, length)
6432 unsigned char * data;
6433 unsigned long length;
6435 printf (_(" %lu byte block: "), length);
6438 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6444 decode_location_expression (data, pointer_size, length)
6445 unsigned char * data;
6446 unsigned int pointer_size;
6447 unsigned long length;
6451 unsigned long uvalue;
6452 unsigned char * end = data + length;
6461 printf ("DW_OP_addr: %lx",
6462 (unsigned long) byte_get (data, pointer_size));
6463 data += pointer_size;
6466 printf ("DW_OP_deref");
6469 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6472 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6475 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6479 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6483 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6487 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6491 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6492 (unsigned long) byte_get (data + 4, 4));
6496 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6497 (long) byte_get (data + 4, 4));
6501 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6505 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6509 printf ("DW_OP_dup");
6512 printf ("DW_OP_drop");
6515 printf ("DW_OP_over");
6518 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6521 printf ("DW_OP_swap");
6524 printf ("DW_OP_rot");
6527 printf ("DW_OP_xderef");
6530 printf ("DW_OP_abs");
6533 printf ("DW_OP_and");
6536 printf ("DW_OP_div");
6539 printf ("DW_OP_minus");
6542 printf ("DW_OP_mod");
6545 printf ("DW_OP_mul");
6548 printf ("DW_OP_neg");
6551 printf ("DW_OP_not");
6554 printf ("DW_OP_or");
6557 printf ("DW_OP_plus");
6559 case DW_OP_plus_uconst:
6560 printf ("DW_OP_plus_uconst: %lu",
6561 read_leb128 (data, &bytes_read, 0));
6565 printf ("DW_OP_shl");
6568 printf ("DW_OP_shr");
6571 printf ("DW_OP_shra");
6574 printf ("DW_OP_xor");
6577 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6581 printf ("DW_OP_eq");
6584 printf ("DW_OP_ge");
6587 printf ("DW_OP_gt");
6590 printf ("DW_OP_le");
6593 printf ("DW_OP_lt");
6596 printf ("DW_OP_ne");
6599 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6635 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6670 printf ("DW_OP_reg%d", op - DW_OP_reg0);
6705 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6706 read_leb128 (data, &bytes_read, 1));
6711 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
6715 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
6719 uvalue = read_leb128 (data, &bytes_read, 0);
6721 printf ("DW_OP_bregx: %lu %ld", uvalue,
6722 read_leb128 (data, &bytes_read, 1));
6726 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6729 case DW_OP_deref_size:
6730 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6732 case DW_OP_xderef_size:
6733 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6736 printf ("DW_OP_nop");
6739 /* DWARF 2.1 extensions. */
6740 case DW_OP_push_object_address:
6741 printf ("DW_OP_push_object_address");
6744 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
6748 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
6752 printf ("DW_OP_calli");
6756 if (op >= DW_OP_lo_user
6757 && op <= DW_OP_hi_user)
6758 printf (_("(User defined location op)"));
6760 printf (_("(Unknown location op)"));
6761 /* No way to tell where the next op is, so just bail. */
6765 /* Separate the ops. */
6771 static unsigned char *
6772 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
6773 unsigned long attribute;
6775 unsigned char * data;
6776 unsigned long cu_offset;
6777 unsigned long pointer_size;
6779 unsigned long uvalue = 0;
6780 unsigned char * block_start = NULL;
6783 printf (" %-18s:", get_AT_name (attribute));
6790 case DW_FORM_ref_addr:
6792 uvalue = byte_get (data, pointer_size);
6793 data += pointer_size;
6799 uvalue = byte_get (data ++, 1);
6804 uvalue = byte_get (data, 2);
6810 uvalue = byte_get (data, 4);
6815 uvalue = read_leb128 (data, & bytes_read, 1);
6819 case DW_FORM_ref_udata:
6821 uvalue = read_leb128 (data, & bytes_read, 0);
6828 case DW_FORM_ref_addr:
6829 printf (" <#%lx>", uvalue);
6835 case DW_FORM_ref_udata:
6836 printf (" <%lx>", uvalue + cu_offset);
6840 printf (" %#lx", uvalue);
6848 printf (" %ld", uvalue);
6853 uvalue = byte_get (data, 4);
6854 printf (" %lx", uvalue);
6855 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6859 case DW_FORM_string:
6860 printf (" %s", data);
6861 data += strlen ((char *) data) + 1;
6865 uvalue = read_leb128 (data, & bytes_read, 0);
6866 block_start = data + bytes_read;
6867 data = display_block (block_start, uvalue);
6870 case DW_FORM_block1:
6871 uvalue = byte_get (data, 1);
6872 block_start = data + 1;
6873 data = display_block (block_start, uvalue);
6876 case DW_FORM_block2:
6877 uvalue = byte_get (data, 2);
6878 block_start = data + 2;
6879 data = display_block (block_start, uvalue);
6882 case DW_FORM_block4:
6883 uvalue = byte_get (data, 4);
6884 block_start = data + 4;
6885 data = display_block (block_start, uvalue);
6889 case DW_FORM_indirect:
6890 warn (_("Unable to handle FORM: %d"), form);
6894 warn (_("Unrecognised form: %d"), form);
6898 /* For some attributes we can display futher information. */
6907 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6908 case DW_INL_inlined: printf (_("(inlined)")); break;
6909 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6910 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6911 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6915 case DW_AT_language:
6918 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6919 case DW_LANG_C89: printf ("(ANSI C)"); break;
6920 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6921 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6922 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6923 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6924 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6925 case DW_LANG_Ada83: printf ("(Ada)"); break;
6926 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6927 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6928 /* DWARF 2.1 values. */
6929 case DW_LANG_C99: printf ("(ANSI C99)"); break;
6930 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
6931 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
6932 /* MIPS extension. */
6933 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6934 default: printf ("(Unknown: %lx)", uvalue); break;
6938 case DW_AT_encoding:
6941 case DW_ATE_void: printf ("(void)"); break;
6942 case DW_ATE_address: printf ("(machine address)"); break;
6943 case DW_ATE_boolean: printf ("(boolean)"); break;
6944 case DW_ATE_complex_float: printf ("(complex float)"); break;
6945 case DW_ATE_float: printf ("(float)"); break;
6946 case DW_ATE_signed: printf ("(signed)"); break;
6947 case DW_ATE_signed_char: printf ("(signed char)"); break;
6948 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6949 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6950 /* DWARF 2.1 value. */
6951 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
6953 if (uvalue >= DW_ATE_lo_user
6954 && uvalue <= DW_ATE_hi_user)
6955 printf ("(user defined type)");
6957 printf ("(unknown type)");
6962 case DW_AT_accessibility:
6965 case DW_ACCESS_public: printf ("(public)"); break;
6966 case DW_ACCESS_protected: printf ("(protected)"); break;
6967 case DW_ACCESS_private: printf ("(private)"); break;
6968 default: printf ("(unknown accessibility)"); break;
6972 case DW_AT_visibility:
6975 case DW_VIS_local: printf ("(local)"); break;
6976 case DW_VIS_exported: printf ("(exported)"); break;
6977 case DW_VIS_qualified: printf ("(qualified)"); break;
6978 default: printf ("(unknown visibility)"); break;
6982 case DW_AT_virtuality:
6985 case DW_VIRTUALITY_none: printf ("(none)"); break;
6986 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6987 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6988 default: printf ("(unknown virtuality)"); break;
6992 case DW_AT_identifier_case:
6995 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6996 case DW_ID_up_case: printf ("(up_case)"); break;
6997 case DW_ID_down_case: printf ("(down_case)"); break;
6998 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6999 default: printf ("(unknown case)"); break;
7003 case DW_AT_calling_convention:
7006 case DW_CC_normal: printf ("(normal)"); break;
7007 case DW_CC_program: printf ("(program)"); break;
7008 case DW_CC_nocall: printf ("(nocall)"); break;
7010 if (uvalue >= DW_CC_lo_user
7011 && uvalue <= DW_CC_hi_user)
7012 printf ("(user defined)");
7014 printf ("(unknown convention)");
7018 case DW_AT_ordering:
7021 case -1: printf ("(undefined)"); break;
7022 case 0: printf ("(row major)"); break;
7023 case 1: printf ("(column major)"); break;
7027 case DW_AT_frame_base:
7028 case DW_AT_location:
7029 case DW_AT_data_member_location:
7030 case DW_AT_vtable_elem_location:
7031 case DW_AT_allocated:
7032 case DW_AT_associated:
7033 case DW_AT_data_location:
7035 case DW_AT_upper_bound:
7036 case DW_AT_lower_bound:
7040 decode_location_expression (block_start, pointer_size, uvalue);
7054 display_debug_info (section, start, file)
7055 Elf32_Internal_Shdr * section;
7056 unsigned char * start;
7059 unsigned char * end = start + section->sh_size;
7060 unsigned char * section_begin = start;
7062 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7066 DWARF2_External_CompUnit * external;
7067 DWARF2_Internal_CompUnit compunit;
7068 Elf32_Internal_Shdr * relsec;
7069 unsigned char * tags;
7072 unsigned long cu_offset;
7074 external = (DWARF2_External_CompUnit *) start;
7076 compunit.cu_length = BYTE_GET (external->cu_length);
7077 compunit.cu_version = BYTE_GET (external->cu_version);
7078 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7079 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7081 /* Check for RELA relocations in the abbrev_offset address, and
7083 for (relsec = section_headers;
7084 relsec < section_headers + elf_header.e_shnum;
7087 unsigned long nrelas, nsyms;
7088 Elf_Internal_Rela *rela, *rp;
7089 Elf32_Internal_Shdr *symsec;
7090 Elf_Internal_Sym *symtab;
7091 Elf_Internal_Sym *sym;
7093 if (relsec->sh_type != SHT_RELA
7094 || section_headers + relsec->sh_info != section)
7097 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7101 symsec = section_headers + relsec->sh_link;
7102 nsyms = symsec->sh_size / symsec->sh_entsize;
7103 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
7105 for (rp = rela; rp < rela + nrelas; ++rp)
7108 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7114 sym = symtab + ELF32_R_SYM (rp->r_info);
7116 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7118 warn (_("Skipping unexpected symbol type %u"),
7119 ELF32_ST_TYPE (sym->st_info));
7125 sym = symtab + ELF64_R_SYM (rp->r_info);
7127 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7129 warn (_("Skipping unexpected symbol type %u"),
7130 ELF64_ST_TYPE (sym->st_info));
7135 compunit.cu_abbrev_offset += rp->r_addend;
7143 tags = start + sizeof (* external);
7144 cu_offset = start - section_begin;
7145 start += compunit.cu_length + sizeof (external->cu_length);
7147 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7148 printf (_(" Length: %ld\n"), compunit.cu_length);
7149 printf (_(" Version: %d\n"), compunit.cu_version);
7150 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7151 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7153 if (compunit.cu_version != 2)
7155 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7159 if (first_abbrev != NULL)
7162 /* Read in the abbrevs used by this compilation unit. */
7165 Elf32_Internal_Shdr * sec;
7166 unsigned char * begin;
7168 /* Locate the .debug_abbrev section and process it. */
7169 for (i = 0, sec = section_headers;
7170 i < elf_header.e_shnum;
7172 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7175 if (i == -1 || sec->sh_size == 0)
7177 warn (_("Unable to locate .debug_abbrev section!\n"));
7181 begin = ((unsigned char *)
7182 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7183 _("debug_abbrev section data")));
7187 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7188 begin + sec->sh_size);
7194 while (tags < start)
7197 unsigned long abbrev_number;
7198 abbrev_entry * entry;
7201 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7204 /* A null DIE marks the end of a list of children. */
7205 if (abbrev_number == 0)
7211 /* Scan through the abbreviation list until we reach the
7213 for (entry = first_abbrev;
7214 entry && entry->entry != abbrev_number;
7215 entry = entry->next)
7220 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7225 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7227 (unsigned long) (tags - section_begin - bytes_read),
7229 get_TAG_name (entry->tag));
7231 for (attr = entry->first_attr; attr; attr = attr->next)
7232 tags = read_and_display_attr (attr->attribute,
7235 compunit.cu_pointer_size);
7237 if (entry->children)
7248 display_debug_aranges (section, start, file)
7249 Elf32_Internal_Shdr * section;
7250 unsigned char * start;
7251 FILE * file ATTRIBUTE_UNUSED;
7253 unsigned char * end = start + section->sh_size;
7255 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7259 DWARF2_External_ARange * external;
7260 DWARF2_Internal_ARange arange;
7261 unsigned char * ranges;
7262 unsigned long length;
7263 unsigned long address;
7266 external = (DWARF2_External_ARange *) start;
7268 arange.ar_length = BYTE_GET (external->ar_length);
7269 arange.ar_version = BYTE_GET (external->ar_version);
7270 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7271 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7272 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7274 if (arange.ar_version != 2)
7276 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7280 printf (_(" Length: %ld\n"), arange.ar_length);
7281 printf (_(" Version: %d\n"), arange.ar_version);
7282 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7283 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7284 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7286 printf (_("\n Address Length\n"));
7288 ranges = start + sizeof (* external);
7290 /* Must pad to an alignment boundary that is twice the pointer size. */
7291 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7293 ranges += (2 * arange.ar_pointer_size) - excess;
7297 address = byte_get (ranges, arange.ar_pointer_size);
7299 ranges += arange.ar_pointer_size;
7301 length = byte_get (ranges, arange.ar_pointer_size);
7303 ranges += arange.ar_pointer_size;
7305 /* A pair of zeros marks the end of the list. */
7306 if (address == 0 && length == 0)
7309 printf (" %8.8lx %lu\n", address, length);
7312 start += arange.ar_length + sizeof (external->ar_length);
7320 typedef struct Frame_Chunk
7322 struct Frame_Chunk * next;
7323 unsigned char * chunk_start;
7325 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7326 short int * col_type;
7328 char * augmentation;
7329 unsigned int code_factor;
7331 unsigned long pc_begin;
7332 unsigned long pc_range;
7336 unsigned char fde_encoding;
7340 /* A marker for a col_type that means this column was never referenced
7341 in the frame info. */
7342 #define DW_CFA_unreferenced (-1)
7344 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7345 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7346 static int size_of_encoded_value PARAMS ((int));
7349 frame_need_space (fc, reg)
7353 int prev = fc->ncols;
7355 if (reg < fc->ncols)
7358 fc->ncols = reg + 1;
7359 fc->col_type = (short int *) xrealloc (fc->col_type,
7360 fc->ncols * sizeof (short int));
7361 fc->col_offset = (int *) xrealloc (fc->col_offset,
7362 fc->ncols * sizeof (int));
7364 while (prev < fc->ncols)
7366 fc->col_type[prev] = DW_CFA_unreferenced;
7367 fc->col_offset[prev] = 0;
7373 frame_display_row (fc, need_col_headers, max_regs)
7375 int * need_col_headers;
7381 if (* max_regs < fc->ncols)
7382 * max_regs = fc->ncols;
7384 if (* need_col_headers)
7386 * need_col_headers = 0;
7388 printf (" LOC CFA ");
7390 for (r = 0; r < * max_regs; r++)
7391 if (fc->col_type[r] != DW_CFA_unreferenced)
7396 printf ("r%-4d", r);
7402 printf ("%08lx ", fc->pc_begin);
7403 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7404 printf ("%-8s ", tmp);
7406 for (r = 0; r < fc->ncols; r++)
7408 if (fc->col_type[r] != DW_CFA_unreferenced)
7410 switch (fc->col_type[r])
7412 case DW_CFA_undefined:
7415 case DW_CFA_same_value:
7419 sprintf (tmp, "c%+d", fc->col_offset[r]);
7421 case DW_CFA_register:
7422 sprintf (tmp, "r%d", fc->col_offset[r]);
7425 strcpy (tmp, "n/a");
7428 printf ("%-5s", tmp);
7435 size_of_encoded_value (encoding)
7438 switch (encoding & 0x7)
7441 case 0: return is_32bit_elf ? 4 : 8;
7448 #define GET(N) byte_get (start, N); start += N
7449 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7450 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7453 display_debug_frames (section, start, file)
7454 Elf32_Internal_Shdr * section;
7455 unsigned char * start;
7456 FILE * file ATTRIBUTE_UNUSED;
7458 unsigned char * end = start + section->sh_size;
7459 unsigned char * section_start = start;
7460 Frame_Chunk * chunks = 0;
7461 Frame_Chunk * remembered_state = 0;
7463 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7466 int addr_size = is_32bit_elf ? 4 : 8;
7468 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7472 unsigned char * saved_start;
7473 unsigned char * block_end;
7474 unsigned long length;
7475 unsigned long cie_id;
7478 int need_col_headers = 1;
7479 unsigned char * augmentation_data = NULL;
7480 unsigned long augmentation_data_len = 0;
7481 int encoded_ptr_size = addr_size;
7483 saved_start = start;
7484 length = byte_get (start, 4); start += 4;
7489 block_end = saved_start + length + 4;
7490 cie_id = byte_get (start, 4); start += 4;
7492 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7496 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7497 memset (fc, 0, sizeof (Frame_Chunk));
7501 fc->chunk_start = saved_start;
7503 fc->col_type = (short int *) xmalloc (sizeof (short int));
7504 fc->col_offset = (int *) xmalloc (sizeof (int));
7505 frame_need_space (fc, max_regs-1);
7509 fc->augmentation = start;
7510 start = strchr (start, '\0') + 1;
7512 if (fc->augmentation[0] == 'z')
7514 fc->code_factor = LEB ();
7515 fc->data_factor = SLEB ();
7516 fc->ra = byte_get (start, 1); start += 1;
7517 augmentation_data_len = LEB ();
7518 augmentation_data = start;
7519 start += augmentation_data_len;
7521 else if (strcmp (fc->augmentation, "eh") == 0)
7524 fc->code_factor = LEB ();
7525 fc->data_factor = SLEB ();
7526 fc->ra = byte_get (start, 1); start += 1;
7530 fc->code_factor = LEB ();
7531 fc->data_factor = SLEB ();
7532 fc->ra = byte_get (start, 1); start += 1;
7536 if (do_debug_frames_interp)
7537 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7538 (unsigned long)(saved_start - section_start), length, cie_id,
7539 fc->augmentation, fc->code_factor, fc->data_factor,
7543 printf ("\n%08lx %08lx %08lx CIE\n",
7544 (unsigned long)(saved_start - section_start), length, cie_id);
7545 printf (" Version: %d\n", version);
7546 printf (" Augmentation: \"%s\"\n", fc->augmentation);
7547 printf (" Code alignment factor: %u\n", fc->code_factor);
7548 printf (" Data alignment factor: %d\n", fc->data_factor);
7549 printf (" Return address column: %d\n", fc->ra);
7551 if (augmentation_data_len)
7554 printf (" Augmentation data: ");
7555 for (i = 0; i < augmentation_data_len; ++i)
7556 printf (" %02x", augmentation_data[i]);
7562 if (augmentation_data_len)
7564 unsigned char *p, *q;
7565 p = fc->augmentation + 1;
7566 q = augmentation_data;
7573 q += 1 + size_of_encoded_value (*q);
7575 fc->fde_encoding = *q++;
7581 if (fc->fde_encoding)
7582 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7585 frame_need_space (fc, fc->ra);
7589 unsigned char * look_for;
7590 static Frame_Chunk fde_fc;
7593 memset (fc, 0, sizeof (Frame_Chunk));
7595 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
7597 for (cie=chunks; cie ; cie = cie->next)
7598 if (cie->chunk_start == look_for)
7603 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7604 cie_id, saved_start);
7607 fc->col_type = (short int *) xmalloc (sizeof (short int));
7608 fc->col_offset = (int *) xmalloc (sizeof (int));
7609 frame_need_space (fc, max_regs - 1);
7611 fc->augmentation = "";
7612 fc->fde_encoding = 0;
7616 fc->ncols = cie->ncols;
7617 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
7618 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
7619 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7620 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7621 fc->augmentation = cie->augmentation;
7622 fc->code_factor = cie->code_factor;
7623 fc->data_factor = cie->data_factor;
7624 fc->cfa_reg = cie->cfa_reg;
7625 fc->cfa_offset = cie->cfa_offset;
7627 frame_need_space (fc, max_regs-1);
7628 fc->fde_encoding = cie->fde_encoding;
7631 if (fc->fde_encoding)
7632 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7634 fc->pc_begin = byte_get (start, encoded_ptr_size);
7635 start += encoded_ptr_size;
7636 fc->pc_range = byte_get (start, encoded_ptr_size);
7637 start += encoded_ptr_size;
7639 if (cie->augmentation[0] == 'z')
7641 augmentation_data_len = LEB ();
7642 augmentation_data = start;
7643 start += augmentation_data_len;
7646 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
7647 (unsigned long)(saved_start - section_start), length, cie_id,
7648 (unsigned long)(cie->chunk_start - section_start),
7649 fc->pc_begin, fc->pc_begin + fc->pc_range);
7650 if (! do_debug_frames_interp && augmentation_data_len)
7653 printf (" Augmentation data: ");
7654 for (i = 0; i < augmentation_data_len; ++i)
7655 printf (" %02x", augmentation_data[i]);
7661 /* At this point, fc is the current chunk, cie (if any) is set, and we're
7662 about to interpret instructions for the chunk. */
7664 if (do_debug_frames_interp)
7666 /* Start by making a pass over the chunk, allocating storage
7667 and taking note of what registers are used. */
7668 unsigned char * tmp = start;
7670 while (start < block_end)
7680 /* Warning: if you add any more cases to this switch, be
7681 sure to add them to the corresponding switch below. */
7684 case DW_CFA_advance_loc:
7688 frame_need_space (fc, opa);
7689 fc->col_type[opa] = DW_CFA_undefined;
7691 case DW_CFA_restore:
7692 frame_need_space (fc, opa);
7693 fc->col_type[opa] = DW_CFA_undefined;
7695 case DW_CFA_set_loc:
7696 start += encoded_ptr_size;
7698 case DW_CFA_advance_loc1:
7701 case DW_CFA_advance_loc2:
7704 case DW_CFA_advance_loc4:
7707 case DW_CFA_offset_extended:
7708 reg = LEB (); LEB ();
7709 frame_need_space (fc, reg);
7710 fc->col_type[reg] = DW_CFA_undefined;
7712 case DW_CFA_restore_extended:
7714 frame_need_space (fc, reg);
7715 fc->col_type[reg] = DW_CFA_undefined;
7717 case DW_CFA_undefined:
7719 frame_need_space (fc, reg);
7720 fc->col_type[reg] = DW_CFA_undefined;
7722 case DW_CFA_same_value:
7724 frame_need_space (fc, reg);
7725 fc->col_type[reg] = DW_CFA_undefined;
7727 case DW_CFA_register:
7728 reg = LEB (); LEB ();
7729 frame_need_space (fc, reg);
7730 fc->col_type[reg] = DW_CFA_undefined;
7732 case DW_CFA_def_cfa:
7735 case DW_CFA_def_cfa_register:
7738 case DW_CFA_def_cfa_offset:
7741 #ifndef DW_CFA_GNU_args_size
7742 #define DW_CFA_GNU_args_size 0x2e
7744 case DW_CFA_GNU_args_size:
7747 #ifndef DW_CFA_GNU_negative_offset_extended
7748 #define DW_CFA_GNU_negative_offset_extended 0x2f
7750 case DW_CFA_GNU_negative_offset_extended:
7751 reg = LEB (); LEB ();
7752 frame_need_space (fc, reg);
7753 fc->col_type[reg] = DW_CFA_undefined;
7762 /* Now we know what registers are used, make a second pass over
7763 the chunk, this time actually printing out the info. */
7765 while (start < block_end)
7768 unsigned long ul, reg, roffs;
7777 /* Warning: if you add any more cases to this switch, be
7778 sure to add them to the corresponding switch above. */
7781 case DW_CFA_advance_loc:
7782 if (do_debug_frames_interp)
7783 frame_display_row (fc, &need_col_headers, &max_regs);
7785 printf (" DW_CFA_advance_loc: %d to %08lx\n",
7786 opa * fc->code_factor,
7787 fc->pc_begin + opa * fc->code_factor);
7788 fc->pc_begin += opa * fc->code_factor;
7793 if (! do_debug_frames_interp)
7794 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
7795 opa, roffs * fc->data_factor);
7796 fc->col_type[opa] = DW_CFA_offset;
7797 fc->col_offset[opa] = roffs * fc->data_factor;
7800 case DW_CFA_restore:
7801 if (! do_debug_frames_interp)
7802 printf (" DW_CFA_restore: r%d\n", opa);
7803 fc->col_type[opa] = cie->col_type[opa];
7804 fc->col_offset[opa] = cie->col_offset[opa];
7807 case DW_CFA_set_loc:
7808 vma = byte_get (start, encoded_ptr_size);
7809 start += encoded_ptr_size;
7810 if (do_debug_frames_interp)
7811 frame_display_row (fc, &need_col_headers, &max_regs);
7813 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
7817 case DW_CFA_advance_loc1:
7818 ofs = byte_get (start, 1); start += 1;
7819 if (do_debug_frames_interp)
7820 frame_display_row (fc, &need_col_headers, &max_regs);
7822 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
7823 ofs * fc->code_factor,
7824 fc->pc_begin + ofs * fc->code_factor);
7825 fc->pc_begin += ofs * fc->code_factor;
7828 case DW_CFA_advance_loc2:
7829 ofs = byte_get (start, 2); start += 2;
7830 if (do_debug_frames_interp)
7831 frame_display_row (fc, &need_col_headers, &max_regs);
7833 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
7834 ofs * fc->code_factor,
7835 fc->pc_begin + ofs * fc->code_factor);
7836 fc->pc_begin += ofs * fc->code_factor;
7839 case DW_CFA_advance_loc4:
7840 ofs = byte_get (start, 4); start += 4;
7841 if (do_debug_frames_interp)
7842 frame_display_row (fc, &need_col_headers, &max_regs);
7844 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
7845 ofs * fc->code_factor,
7846 fc->pc_begin + ofs * fc->code_factor);
7847 fc->pc_begin += ofs * fc->code_factor;
7850 case DW_CFA_offset_extended:
7853 if (! do_debug_frames_interp)
7854 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
7855 reg, roffs * fc->data_factor);
7856 fc->col_type[reg] = DW_CFA_offset;
7857 fc->col_offset[reg] = roffs * fc->data_factor;
7860 case DW_CFA_restore_extended:
7862 if (! do_debug_frames_interp)
7863 printf (" DW_CFA_restore_extended: r%ld\n", reg);
7864 fc->col_type[reg] = cie->col_type[reg];
7865 fc->col_offset[reg] = cie->col_offset[reg];
7868 case DW_CFA_undefined:
7870 if (! do_debug_frames_interp)
7871 printf (" DW_CFA_undefined: r%ld\n", reg);
7872 fc->col_type[reg] = DW_CFA_undefined;
7873 fc->col_offset[reg] = 0;
7876 case DW_CFA_same_value:
7878 if (! do_debug_frames_interp)
7879 printf (" DW_CFA_same_value: r%ld\n", reg);
7880 fc->col_type[reg] = DW_CFA_same_value;
7881 fc->col_offset[reg] = 0;
7884 case DW_CFA_register:
7887 if (! do_debug_frames_interp)
7888 printf (" DW_CFA_register: r%ld\n", reg);
7889 fc->col_type[reg] = DW_CFA_register;
7890 fc->col_offset[reg] = roffs;
7893 case DW_CFA_remember_state:
7894 if (! do_debug_frames_interp)
7895 printf (" DW_CFA_remember_state\n");
7896 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7897 rs->ncols = fc->ncols;
7898 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
7899 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
7900 memcpy (rs->col_type, fc->col_type, rs->ncols);
7901 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
7902 rs->next = remembered_state;
7903 remembered_state = rs;
7906 case DW_CFA_restore_state:
7907 if (! do_debug_frames_interp)
7908 printf (" DW_CFA_restore_state\n");
7909 rs = remembered_state;
7910 remembered_state = rs->next;
7911 frame_need_space (fc, rs->ncols-1);
7912 memcpy (fc->col_type, rs->col_type, rs->ncols);
7913 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
7914 free (rs->col_type);
7915 free (rs->col_offset);
7919 case DW_CFA_def_cfa:
7920 fc->cfa_reg = LEB ();
7921 fc->cfa_offset = LEB ();
7922 if (! do_debug_frames_interp)
7923 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
7924 fc->cfa_reg, fc->cfa_offset);
7927 case DW_CFA_def_cfa_register:
7928 fc->cfa_reg = LEB ();
7929 if (! do_debug_frames_interp)
7930 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
7933 case DW_CFA_def_cfa_offset:
7934 fc->cfa_offset = LEB ();
7935 if (! do_debug_frames_interp)
7936 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
7940 if (! do_debug_frames_interp)
7941 printf (" DW_CFA_nop\n");
7944 #ifndef DW_CFA_GNU_window_save
7945 #define DW_CFA_GNU_window_save 0x2d
7947 case DW_CFA_GNU_window_save:
7948 if (! do_debug_frames_interp)
7949 printf (" DW_CFA_GNU_window_save\n");
7952 case DW_CFA_GNU_args_size:
7954 if (! do_debug_frames_interp)
7955 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
7958 case DW_CFA_GNU_negative_offset_extended:
7961 frame_need_space (fc, reg);
7962 if (! do_debug_frames_interp)
7963 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
7964 reg, l * fc->data_factor);
7965 fc->col_type[reg] = DW_CFA_offset;
7966 fc->col_offset[reg] = l * fc->data_factor;
7970 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
7975 if (do_debug_frames_interp)
7976 frame_display_row (fc, &need_col_headers, &max_regs);
7991 display_debug_not_supported (section, start, file)
7992 Elf32_Internal_Shdr * section;
7993 unsigned char * start ATTRIBUTE_UNUSED;
7994 FILE * file ATTRIBUTE_UNUSED;
7996 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7997 SECTION_NAME (section));
8002 /* Pre-scan the .debug_info section to record the size of address.
8003 When dumping the .debug_line, we use that size information, assuming
8004 that all compilation units have the same address size. */
8006 prescan_debug_info (section, start, file)
8007 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8008 unsigned char * start;
8009 FILE * file ATTRIBUTE_UNUSED;
8011 DWARF2_External_CompUnit * external;
8013 external = (DWARF2_External_CompUnit *) start;
8015 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8019 /* A structure containing the name of a debug section and a pointer
8020 to a function that can decode it. The third field is a prescan
8021 function to be run over the section before displaying any of the
8026 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8027 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8031 { ".debug_info", display_debug_info, prescan_debug_info },
8032 { ".debug_abbrev", display_debug_abbrev, NULL },
8033 { ".debug_line", display_debug_lines, NULL },
8034 { ".debug_aranges", display_debug_aranges, NULL },
8035 { ".debug_pubnames", display_debug_pubnames, NULL },
8036 { ".debug_frame", display_debug_frames, NULL },
8037 { ".eh_frame", display_debug_frames, NULL },
8038 { ".debug_macinfo", display_debug_macinfo, NULL },
8039 { ".debug_str", display_debug_not_supported, NULL },
8040 { ".debug_static_func", display_debug_not_supported, NULL },
8041 { ".debug_static_vars", display_debug_not_supported, NULL },
8042 { ".debug_types", display_debug_not_supported, NULL },
8043 { ".debug_weaknames", display_debug_not_supported, NULL }
8047 display_debug_section (section, file)
8048 Elf32_Internal_Shdr * section;
8051 char * name = SECTION_NAME (section);
8052 bfd_size_type length;
8053 unsigned char * start;
8056 length = section->sh_size;
8059 printf (_("\nSection '%s' has no debugging data.\n"), name);
8063 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8064 _("debug section data"));
8068 /* See if we know how to display the contents of this section. */
8069 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8070 name = ".debug_info";
8072 for (i = NUM_ELEM (debug_displays); i--;)
8073 if (strcmp (debug_displays[i].name, name) == 0)
8075 debug_displays[i].display (section, start, file);
8080 printf (_("Unrecognised debug section: %s\n"), name);
8084 /* If we loaded in the abbrev section at some point,
8085 we must release it here. */
8086 if (first_abbrev != NULL)
8093 process_section_contents (file)
8096 Elf32_Internal_Shdr * section;
8102 /* Pre-scan the debug sections to find some debug information not
8103 present in some of them. For the .debug_line, we must find out the
8104 size of address (specified in .debug_info and .debug_aranges). */
8105 for (i = 0, section = section_headers;
8106 i < elf_header.e_shnum && i < num_dump_sects;
8109 char * name = SECTION_NAME (section);
8112 if (section->sh_size == 0)
8115 /* See if there is some pre-scan operation for this section. */
8116 for (j = NUM_ELEM (debug_displays); j--;)
8117 if (strcmp (debug_displays[j].name, name) == 0)
8119 if (debug_displays[j].prescan != NULL)
8121 bfd_size_type length;
8122 unsigned char * start;
8124 length = section->sh_size;
8125 start = ((unsigned char *)
8126 get_data (NULL, file, section->sh_offset, length,
8127 _("debug section data")));
8131 debug_displays[j].prescan (section, start, file);
8139 for (i = 0, section = section_headers;
8140 i < elf_header.e_shnum && i < num_dump_sects;
8143 #ifdef SUPPORT_DISASSEMBLY
8144 if (dump_sects[i] & DISASS_DUMP)
8145 disassemble_section (section, file);
8147 if (dump_sects[i] & HEX_DUMP)
8148 dump_section (section, file);
8150 if (dump_sects[i] & DEBUG_DUMP)
8151 display_debug_section (section, file);
8154 if (i < num_dump_sects)
8155 warn (_("Some sections were not dumped because they do not exist!\n"));
8161 process_mips_fpe_exception (mask)
8167 if (mask & OEX_FPU_INEX)
8168 fputs ("INEX", stdout), first = 0;
8169 if (mask & OEX_FPU_UFLO)
8170 printf ("%sUFLO", first ? "" : "|"), first = 0;
8171 if (mask & OEX_FPU_OFLO)
8172 printf ("%sOFLO", first ? "" : "|"), first = 0;
8173 if (mask & OEX_FPU_DIV0)
8174 printf ("%sDIV0", first ? "" : "|"), first = 0;
8175 if (mask & OEX_FPU_INVAL)
8176 printf ("%sINVAL", first ? "" : "|");
8179 fputs ("0", stdout);
8183 process_mips_specific (file)
8186 Elf_Internal_Dyn * entry;
8187 size_t liblist_offset = 0;
8188 size_t liblistno = 0;
8189 size_t conflictsno = 0;
8190 size_t options_offset = 0;
8191 size_t conflicts_offset = 0;
8193 /* We have a lot of special sections. Thanks SGI! */
8194 if (dynamic_segment == NULL)
8195 /* No information available. */
8198 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8199 switch (entry->d_tag)
8201 case DT_MIPS_LIBLIST:
8202 liblist_offset = entry->d_un.d_val - loadaddr;
8204 case DT_MIPS_LIBLISTNO:
8205 liblistno = entry->d_un.d_val;
8207 case DT_MIPS_OPTIONS:
8208 options_offset = entry->d_un.d_val - loadaddr;
8210 case DT_MIPS_CONFLICT:
8211 conflicts_offset = entry->d_un.d_val - loadaddr;
8213 case DT_MIPS_CONFLICTNO:
8214 conflictsno = entry->d_un.d_val;
8220 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8222 Elf32_External_Lib * elib;
8225 elib = ((Elf32_External_Lib *)
8226 get_data (NULL, file, liblist_offset,
8227 liblistno * sizeof (Elf32_External_Lib),
8231 printf ("\nSection '.liblist' contains %lu entries:\n",
8232 (unsigned long) liblistno);
8233 fputs (" Library Time Stamp Checksum Version Flags\n",
8236 for (cnt = 0; cnt < liblistno; ++cnt)
8243 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8244 time = BYTE_GET (elib[cnt].l_time_stamp);
8245 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8246 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8247 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8249 tmp = gmtime (&time);
8250 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8251 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8252 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8254 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
8255 dynamic_strings + liblist.l_name, timebuf,
8256 liblist.l_checksum, liblist.l_version);
8258 if (liblist.l_flags == 0)
8269 { " EXACT_MATCH", LL_EXACT_MATCH },
8270 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8271 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8272 { " EXPORTS", LL_EXPORTS },
8273 { " DELAY_LOAD", LL_DELAY_LOAD },
8274 { " DELTA", LL_DELTA }
8276 int flags = liblist.l_flags;
8280 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8282 if ((flags & l_flags_vals[fcnt].bit) != 0)
8284 fputs (l_flags_vals[fcnt].name, stdout);
8285 flags ^= l_flags_vals[fcnt].bit;
8288 printf (" %#x", (unsigned int) flags);
8298 if (options_offset != 0)
8300 Elf_External_Options * eopt;
8301 Elf_Internal_Shdr * sect = section_headers;
8302 Elf_Internal_Options * iopt;
8303 Elf_Internal_Options * option;
8307 /* Find the section header so that we get the size. */
8308 while (sect->sh_type != SHT_MIPS_OPTIONS)
8311 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8312 sect->sh_size, _("options"));
8315 iopt = ((Elf_Internal_Options *)
8316 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8319 error (_("Out of memory"));
8326 while (offset < sect->sh_size)
8328 Elf_External_Options * eoption;
8330 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8332 option->kind = BYTE_GET (eoption->kind);
8333 option->size = BYTE_GET (eoption->size);
8334 option->section = BYTE_GET (eoption->section);
8335 option->info = BYTE_GET (eoption->info);
8337 offset += option->size;
8343 printf (_("\nSection '%s' contains %d entries:\n"),
8344 SECTION_NAME (sect), cnt);
8352 switch (option->kind)
8355 /* This shouldn't happen. */
8356 printf (" NULL %d %lx", option->section, option->info);
8359 printf (" REGINFO ");
8360 if (elf_header.e_machine == EM_MIPS)
8363 Elf32_External_RegInfo * ereg;
8364 Elf32_RegInfo reginfo;
8366 ereg = (Elf32_External_RegInfo *) (option + 1);
8367 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8368 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8369 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8370 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8371 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8372 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8374 printf ("GPR %08lx GP 0x%lx\n",
8376 (unsigned long) reginfo.ri_gp_value);
8377 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8378 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8379 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8384 Elf64_External_RegInfo * ereg;
8385 Elf64_Internal_RegInfo reginfo;
8387 ereg = (Elf64_External_RegInfo *) (option + 1);
8388 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8389 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8390 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8391 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8392 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8393 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8395 printf ("GPR %08lx GP 0x",
8396 reginfo.ri_gprmask);
8397 printf_vma (reginfo.ri_gp_value);
8400 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8401 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8402 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8406 case ODK_EXCEPTIONS:
8407 fputs (" EXCEPTIONS fpe_min(", stdout);
8408 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8409 fputs (") fpe_max(", stdout);
8410 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8411 fputs (")", stdout);
8413 if (option->info & OEX_PAGE0)
8414 fputs (" PAGE0", stdout);
8415 if (option->info & OEX_SMM)
8416 fputs (" SMM", stdout);
8417 if (option->info & OEX_FPDBUG)
8418 fputs (" FPDBUG", stdout);
8419 if (option->info & OEX_DISMISS)
8420 fputs (" DISMISS", stdout);
8423 fputs (" PAD ", stdout);
8424 if (option->info & OPAD_PREFIX)
8425 fputs (" PREFIX", stdout);
8426 if (option->info & OPAD_POSTFIX)
8427 fputs (" POSTFIX", stdout);
8428 if (option->info & OPAD_SYMBOL)
8429 fputs (" SYMBOL", stdout);
8432 fputs (" HWPATCH ", stdout);
8433 if (option->info & OHW_R4KEOP)
8434 fputs (" R4KEOP", stdout);
8435 if (option->info & OHW_R8KPFETCH)
8436 fputs (" R8KPFETCH", stdout);
8437 if (option->info & OHW_R5KEOP)
8438 fputs (" R5KEOP", stdout);
8439 if (option->info & OHW_R5KCVTL)
8440 fputs (" R5KCVTL", stdout);
8443 fputs (" FILL ", stdout);
8444 /* XXX Print content of info word? */
8447 fputs (" TAGS ", stdout);
8448 /* XXX Print content of info word? */
8451 fputs (" HWAND ", stdout);
8452 if (option->info & OHWA0_R4KEOP_CHECKED)
8453 fputs (" R4KEOP_CHECKED", stdout);
8454 if (option->info & OHWA0_R4KEOP_CLEAN)
8455 fputs (" R4KEOP_CLEAN", stdout);
8458 fputs (" HWOR ", stdout);
8459 if (option->info & OHWA0_R4KEOP_CHECKED)
8460 fputs (" R4KEOP_CHECKED", stdout);
8461 if (option->info & OHWA0_R4KEOP_CLEAN)
8462 fputs (" R4KEOP_CLEAN", stdout);
8465 printf (" GP_GROUP %#06lx self-contained %#06lx",
8466 option->info & OGP_GROUP,
8467 (option->info & OGP_SELF) >> 16);
8470 printf (" IDENT %#06lx self-contained %#06lx",
8471 option->info & OGP_GROUP,
8472 (option->info & OGP_SELF) >> 16);
8475 /* This shouldn't happen. */
8476 printf (" %3d ??? %d %lx",
8477 option->kind, option->section, option->info);
8481 len = sizeof (* eopt);
8482 while (len < option->size)
8483 if (((char *) option)[len] >= ' '
8484 && ((char *) option)[len] < 0x7f)
8485 printf ("%c", ((char *) option)[len++]);
8487 printf ("\\%03o", ((char *) option)[len++]);
8489 fputs ("\n", stdout);
8497 if (conflicts_offset != 0 && conflictsno != 0)
8499 Elf32_Conflict * iconf;
8502 if (dynamic_symbols == NULL)
8504 error (_("conflict list with without table"));
8508 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
8511 error (_("Out of memory"));
8517 Elf32_External_Conflict * econf32;
8519 econf32 = ((Elf32_External_Conflict *)
8520 get_data (NULL, file, conflicts_offset,
8521 conflictsno * sizeof (* econf32),
8526 for (cnt = 0; cnt < conflictsno; ++cnt)
8527 iconf[cnt] = BYTE_GET (econf32[cnt]);
8533 Elf64_External_Conflict * econf64;
8535 econf64 = ((Elf64_External_Conflict *)
8536 get_data (NULL, file, conflicts_offset,
8537 conflictsno * sizeof (* econf64),
8542 for (cnt = 0; cnt < conflictsno; ++cnt)
8543 iconf[cnt] = BYTE_GET (econf64[cnt]);
8548 printf (_("\nSection '.conflict' contains %ld entries:\n"),
8549 (long) conflictsno);
8550 puts (_(" Num: Index Value Name"));
8552 for (cnt = 0; cnt < conflictsno; ++cnt)
8554 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
8556 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
8557 print_vma (psym->st_value, FULL_HEX);
8558 printf (" %s\n", dynamic_strings + psym->st_name);
8568 get_note_type (e_type)
8571 static char buff[64];
8575 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
8576 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
8577 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
8578 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
8579 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
8580 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
8581 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
8582 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
8583 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8584 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8585 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8587 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
8592 /* Note that by the ELF standard, the name field is already null byte
8593 terminated, and namesz includes the terminating null byte.
8594 I.E. the value of namesz for the name "FSF" is 4.
8596 If the value of namesz is zero, there is no name present. */
8598 process_note (pnote)
8599 Elf32_Internal_Note * pnote;
8601 printf (" %s\t\t0x%08lx\t%s\n",
8602 pnote->namesz ? pnote->namedata : "(NONE)",
8603 pnote->descsz, get_note_type (pnote->type));
8609 process_corefile_note_segment (file, offset, length)
8614 Elf_External_Note * pnotes;
8615 Elf_External_Note * external;
8621 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
8628 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8629 (unsigned long) offset, (unsigned long) length);
8630 printf (_(" Owner\t\tData size\tDescription\n"));
8632 while (external < (Elf_External_Note *)((char *) pnotes + length))
8634 Elf32_Internal_Note inote;
8637 inote.type = BYTE_GET (external->type);
8638 inote.namesz = BYTE_GET (external->namesz);
8639 inote.namedata = external->name;
8640 inote.descsz = BYTE_GET (external->descsz);
8641 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
8642 inote.descpos = offset + (inote.descdata - (char *) pnotes);
8644 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
8646 /* Verify that name is null terminated. It appears that at least
8647 one version of Linux (RedHat 6.0) generates corefiles that don't
8648 comply with the ELF spec by failing to include the null byte in
8650 if (inote.namedata[inote.namesz] != '\0')
8652 temp = malloc (inote.namesz + 1);
8656 error (_("Out of memory\n"));
8661 strncpy (temp, inote.namedata, inote.namesz);
8662 temp[inote.namesz] = 0;
8664 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8665 inote.namedata = temp;
8668 res &= process_note (& inote);
8683 process_corefile_note_segments (file)
8686 Elf_Internal_Phdr * program_headers;
8687 Elf_Internal_Phdr * segment;
8691 program_headers = (Elf_Internal_Phdr *) malloc
8692 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
8694 if (program_headers == NULL)
8696 error (_("Out of memory\n"));
8701 i = get_32bit_program_headers (file, program_headers);
8703 i = get_64bit_program_headers (file, program_headers);
8707 free (program_headers);
8711 for (i = 0, segment = program_headers;
8712 i < elf_header.e_phnum;
8715 if (segment->p_type == PT_NOTE)
8716 res &= process_corefile_note_segment (file,
8717 (bfd_vma) segment->p_offset,
8718 (bfd_vma) segment->p_filesz);
8721 free (program_headers);
8727 process_corefile_contents (file)
8730 /* If we have not been asked to display the notes then do nothing. */
8734 /* If file is not a core file then exit. */
8735 if (elf_header.e_type != ET_CORE)
8738 /* No program headers means no NOTE segment. */
8739 if (elf_header.e_phnum == 0)
8741 printf (_("No note segments present in the core file.\n"));
8745 return process_corefile_note_segments (file);
8749 process_arch_specific (file)
8755 switch (elf_header.e_machine)
8758 case EM_MIPS_RS3_LE:
8759 return process_mips_specific (file);
8768 get_file_header (file)
8771 /* Read in the identity array. */
8772 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
8775 /* Determine how to read the rest of the header. */
8776 switch (elf_header.e_ident [EI_DATA])
8778 default: /* fall through */
8779 case ELFDATANONE: /* fall through */
8780 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
8781 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
8784 /* For now we only support 32 bit and 64 bit ELF files. */
8785 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
8787 /* Read in the rest of the header. */
8790 Elf32_External_Ehdr ehdr32;
8792 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
8795 elf_header.e_type = BYTE_GET (ehdr32.e_type);
8796 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
8797 elf_header.e_version = BYTE_GET (ehdr32.e_version);
8798 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
8799 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
8800 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
8801 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
8802 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
8803 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
8804 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
8805 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
8806 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
8807 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
8811 Elf64_External_Ehdr ehdr64;
8813 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8814 we will not be able to cope with the 64bit data found in
8815 64 ELF files. Detect this now and abort before we start
8816 overwritting things. */
8817 if (sizeof (bfd_vma) < 8)
8819 error (_("This instance of readelf has been built without support for a\n"));
8820 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
8824 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
8827 elf_header.e_type = BYTE_GET (ehdr64.e_type);
8828 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
8829 elf_header.e_version = BYTE_GET (ehdr64.e_version);
8830 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
8831 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
8832 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
8833 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
8834 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
8835 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
8836 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
8837 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
8838 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
8839 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
8846 process_file (file_name)
8850 struct stat statbuf;
8853 if (stat (file_name, & statbuf) < 0)
8855 error (_("Cannot stat input file %s.\n"), file_name);
8859 file = fopen (file_name, "rb");
8862 error (_("Input file %s not found.\n"), file_name);
8866 if (! get_file_header (file))
8868 error (_("%s: Failed to read file header\n"), file_name);
8873 /* Initialise per file variables. */
8874 for (i = NUM_ELEM (version_info); i--;)
8875 version_info[i] = 0;
8877 for (i = NUM_ELEM (dynamic_info); i--;)
8878 dynamic_info[i] = 0;
8880 /* Process the file. */
8882 printf (_("\nFile: %s\n"), file_name);
8884 if (! process_file_header ())
8890 process_section_headers (file);
8892 process_program_headers (file);
8894 process_dynamic_segment (file);
8896 process_relocs (file);
8898 process_unwind (file);
8900 process_symbol_table (file);
8902 process_syminfo (file);
8904 process_version_sections (file);
8906 process_section_contents (file);
8908 process_corefile_contents (file);
8910 process_arch_specific (file);
8914 if (section_headers)
8916 free (section_headers);
8917 section_headers = NULL;
8922 free (string_table);
8923 string_table = NULL;
8924 string_table_length = 0;
8927 if (dynamic_strings)
8929 free (dynamic_strings);
8930 dynamic_strings = NULL;
8933 if (dynamic_symbols)
8935 free (dynamic_symbols);
8936 dynamic_symbols = NULL;
8937 num_dynamic_syms = 0;
8940 if (dynamic_syminfo)
8942 free (dynamic_syminfo);
8943 dynamic_syminfo = NULL;
8949 #ifdef SUPPORT_DISASSEMBLY
8950 /* Needed by the i386 disassembler. For extra credit, someone could
8951 fix this so that we insert symbolic addresses here, esp for GOT/PLT
8955 print_address (unsigned int addr, FILE * outfile)
8957 fprintf (outfile,"0x%8.8x", addr);
8960 /* Needed by the i386 disassembler. */
8962 db_task_printsym (unsigned int addr)
8964 print_address (addr, stderr);
8975 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
8976 setlocale (LC_MESSAGES, "");
8978 bindtextdomain (PACKAGE, LOCALEDIR);
8979 textdomain (PACKAGE);
8981 parse_args (argc, argv);
8983 if (optind < (argc - 1))
8987 while (optind < argc)
8988 err |= process_file (argv [optind ++]);
8990 if (dump_sects != NULL)