1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
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))
815 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
818 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
820 for (i = 0; i < rel_size; i++)
825 bfd_vma symtab_index;
830 offset = relas [i].r_offset;
831 info = relas [i].r_info;
835 offset = rels [i].r_offset;
836 info = rels [i].r_info;
841 type = ELF32_R_TYPE (info);
842 symtab_index = ELF32_R_SYM (info);
846 if (elf_header.e_machine == EM_SPARCV9)
847 type = ELF64_R_TYPE_ID (info);
849 type = ELF64_R_TYPE (info);
850 /* The #ifdef BFD64 below is to prevent a compile time warning.
851 We know that if we do not have a 64 bit data type that we
852 will never execute this code anyway. */
854 symtab_index = ELF64_R_SYM (info);
858 #ifdef _bfd_int64_low
859 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
861 printf (" %8.8lx %5.5lx ", offset, info);
864 switch (elf_header.e_machine)
871 rtype = elf_m32r_reloc_type (type);
876 rtype = elf_i386_reloc_type (type);
880 rtype = elf_m68k_reloc_type (type);
884 rtype = elf_i960_reloc_type (type);
888 rtype = elf_avr_reloc_type (type);
895 rtype = elf_sparc_reloc_type (type);
899 rtype = v850_reloc_type (type);
903 rtype = elf_d10v_reloc_type (type);
907 rtype = elf_d30v_reloc_type (type);
911 rtype = elf_sh_reloc_type (type);
914 case EM_CYGNUS_MN10300:
915 rtype = elf_mn10300_reloc_type (type);
918 case EM_CYGNUS_MN10200:
919 rtype = elf_mn10200_reloc_type (type);
923 rtype = elf_fr30_reloc_type (type);
927 rtype = elf_mcore_reloc_type (type);
931 rtype = elf_ppc_reloc_type (type);
936 rtype = elf_mips_reloc_type (type);
940 rtype = elf_alpha_reloc_type (type);
944 rtype = elf_arm_reloc_type (type);
949 rtype = elf_arc_reloc_type (type);
953 rtype = elf_hppa_reloc_type (type);
957 rtype = elf_pj_reloc_type (type);
960 rtype = elf_ia64_reloc_type (type);
964 rtype = elf_cris_reloc_type (type);
968 rtype = elf_i860_reloc_type (type);
972 rtype = elf_x86_64_reloc_type (type);
977 rtype = elf_s390_reloc_type (type);
982 #ifdef _bfd_int64_low
983 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
985 printf (_("unrecognised: %-7lx"), type);
988 printf ("%-21.21s", rtype);
992 if (symtab == NULL || symtab_index >= nsyms)
993 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
996 Elf_Internal_Sym * psym;
998 psym = symtab + symtab_index;
1001 print_vma (psym->st_value, LONG_HEX);
1004 if (psym->st_name == 0)
1006 SECTION_NAME (section_headers + psym->st_shndx));
1007 else if (strtab == NULL)
1008 printf (_("<string table index %3ld>"), psym->st_name);
1010 printf ("%-25.25s", strtab + psym->st_name);
1013 printf (" + %lx", (unsigned long) relas [i].r_addend);
1018 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1019 print_vma (relas[i].r_addend, LONG_HEX);
1022 if (elf_header.e_machine == EM_SPARCV9
1023 && !strcmp (rtype, "R_SPARC_OLO10"))
1024 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1038 get_mips_dynamic_type (type)
1043 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1044 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1045 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1046 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1047 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1048 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1049 case DT_MIPS_MSYM: return "MIPS_MSYM";
1050 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1051 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1052 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1053 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1054 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1055 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1056 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1057 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1058 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1059 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1060 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1061 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1062 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1063 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1064 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1065 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1066 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1067 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1068 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1069 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1070 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1071 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1072 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1073 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1074 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1075 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1076 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1077 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1078 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1079 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1080 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1081 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1082 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1083 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1084 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1085 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1092 get_sparc64_dynamic_type (type)
1097 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1104 get_parisc_dynamic_type (type)
1109 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1110 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1111 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1112 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1113 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1114 case DT_HP_PREINIT: return "HP_PREINIT";
1115 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1116 case DT_HP_NEEDED: return "HP_NEEDED";
1117 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1118 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1119 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1120 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1121 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1128 get_dynamic_type (type)
1131 static char buff [32];
1135 case DT_NULL: return "NULL";
1136 case DT_NEEDED: return "NEEDED";
1137 case DT_PLTRELSZ: return "PLTRELSZ";
1138 case DT_PLTGOT: return "PLTGOT";
1139 case DT_HASH: return "HASH";
1140 case DT_STRTAB: return "STRTAB";
1141 case DT_SYMTAB: return "SYMTAB";
1142 case DT_RELA: return "RELA";
1143 case DT_RELASZ: return "RELASZ";
1144 case DT_RELAENT: return "RELAENT";
1145 case DT_STRSZ: return "STRSZ";
1146 case DT_SYMENT: return "SYMENT";
1147 case DT_INIT: return "INIT";
1148 case DT_FINI: return "FINI";
1149 case DT_SONAME: return "SONAME";
1150 case DT_RPATH: return "RPATH";
1151 case DT_SYMBOLIC: return "SYMBOLIC";
1152 case DT_REL: return "REL";
1153 case DT_RELSZ: return "RELSZ";
1154 case DT_RELENT: return "RELENT";
1155 case DT_PLTREL: return "PLTREL";
1156 case DT_DEBUG: return "DEBUG";
1157 case DT_TEXTREL: return "TEXTREL";
1158 case DT_JMPREL: return "JMPREL";
1159 case DT_BIND_NOW: return "BIND_NOW";
1160 case DT_INIT_ARRAY: return "INIT_ARRAY";
1161 case DT_FINI_ARRAY: return "FINI_ARRAY";
1162 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1163 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1164 case DT_RUNPATH: return "RUNPATH";
1165 case DT_FLAGS: return "FLAGS";
1167 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1168 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1170 case DT_CHECKSUM: return "CHECKSUM";
1171 case DT_PLTPADSZ: return "PLTPADSZ";
1172 case DT_MOVEENT: return "MOVEENT";
1173 case DT_MOVESZ: return "MOVESZ";
1174 case DT_FEATURE: return "FEATURE";
1175 case DT_POSFLAG_1: return "POSFLAG_1";
1176 case DT_SYMINSZ: return "SYMINSZ";
1177 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1179 case DT_ADDRRNGLO: return "ADDRRNGLO";
1180 case DT_CONFIG: return "CONFIG";
1181 case DT_DEPAUDIT: return "DEPAUDIT";
1182 case DT_AUDIT: return "AUDIT";
1183 case DT_PLTPAD: return "PLTPAD";
1184 case DT_MOVETAB: return "MOVETAB";
1185 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1187 case DT_VERSYM: return "VERSYM";
1189 case DT_RELACOUNT: return "RELACOUNT";
1190 case DT_RELCOUNT: return "RELCOUNT";
1191 case DT_FLAGS_1: return "FLAGS_1";
1192 case DT_VERDEF: return "VERDEF";
1193 case DT_VERDEFNUM: return "VERDEFNUM";
1194 case DT_VERNEED: return "VERNEED";
1195 case DT_VERNEEDNUM: return "VERNEEDNUM";
1197 case DT_AUXILIARY: return "AUXILIARY";
1198 case DT_USED: return "USED";
1199 case DT_FILTER: return "FILTER";
1202 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1204 const char * result;
1206 switch (elf_header.e_machine)
1209 case EM_MIPS_RS3_LE:
1210 result = get_mips_dynamic_type (type);
1213 result = get_sparc64_dynamic_type (type);
1223 sprintf (buff, _("Processor Specific: %lx"), type);
1225 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1227 const char * result;
1229 switch (elf_header.e_machine)
1232 result = get_parisc_dynamic_type (type);
1242 sprintf (buff, _("Operating System specific: %lx"), type);
1245 sprintf (buff, _("<unknown>: %lx"), type);
1252 get_file_type (e_type)
1255 static char buff [32];
1259 case ET_NONE: return _("NONE (None)");
1260 case ET_REL: return _("REL (Relocatable file)");
1261 case ET_EXEC: return _("EXEC (Executable file)");
1262 case ET_DYN: return _("DYN (Shared object file)");
1263 case ET_CORE: return _("CORE (Core file)");
1266 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1267 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1268 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1269 sprintf (buff, _("OS Specific: (%x)"), e_type);
1271 sprintf (buff, _("<unknown>: %x"), e_type);
1277 get_machine_name (e_machine)
1280 static char buff [64]; /* XXX */
1284 case EM_NONE: return _("None");
1285 case EM_M32: return "WE32100";
1286 case EM_SPARC: return "Sparc";
1287 case EM_386: return "Intel 80386";
1288 case EM_68K: return "MC68000";
1289 case EM_88K: return "MC88000";
1290 case EM_486: return "Intel 80486";
1291 case EM_860: return "Intel 80860";
1292 case EM_MIPS: return "MIPS R3000";
1293 case EM_S370: return "IBM System/370";
1294 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1295 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1296 case EM_PARISC: return "HPPA";
1297 case EM_PPC_OLD: return "Power PC (old)";
1298 case EM_SPARC32PLUS: return "Sparc v8+" ;
1299 case EM_960: return "Intel 90860";
1300 case EM_PPC: return "PowerPC";
1301 case EM_V800: return "NEC V800";
1302 case EM_FR20: return "Fujitsu FR20";
1303 case EM_RH32: return "TRW RH32";
1304 case EM_MCORE: return "MCORE";
1305 case EM_ARM: return "ARM";
1306 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1307 case EM_SH: return "Hitachi SH";
1308 case EM_SPARCV9: return "Sparc v9";
1309 case EM_TRICORE: return "Siemens Tricore";
1310 case EM_ARC: return "ARC";
1311 case EM_H8_300: return "Hitachi H8/300";
1312 case EM_H8_300H: return "Hitachi H8/300H";
1313 case EM_H8S: return "Hitachi H8S";
1314 case EM_H8_500: return "Hitachi H8/500";
1315 case EM_IA_64: return "Intel IA-64";
1316 case EM_MIPS_X: return "Stanford MIPS-X";
1317 case EM_COLDFIRE: return "Motorola Coldfire";
1318 case EM_68HC12: return "Motorola M68HC12";
1319 case EM_ALPHA: return "Alpha";
1320 case EM_CYGNUS_D10V: return "d10v";
1321 case EM_CYGNUS_D30V: return "d30v";
1322 case EM_CYGNUS_ARC: return "ARC";
1323 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1324 case EM_CYGNUS_V850: return "NEC v850";
1325 case EM_CYGNUS_MN10300: return "mn10300";
1326 case EM_CYGNUS_MN10200: return "mn10200";
1327 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1328 case EM_PJ: return "picoJava";
1329 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1330 case EM_PCP: return "Siemens PCP";
1331 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1332 case EM_NDR1: return "Denso NDR1 microprocesspr";
1333 case EM_STARCORE: return "Motorola Star*Core processor";
1334 case EM_ME16: return "Toyota ME16 processor";
1335 case EM_ST100: return "STMicroelectronics ST100 processor";
1336 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1337 case EM_FX66: return "Siemens FX66 microcontroller";
1338 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1339 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1340 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1341 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1342 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1343 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1344 case EM_SVX: return "Silicon Graphics SVx";
1345 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1346 case EM_VAX: return "Digital VAX";
1347 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1348 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1349 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1350 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1351 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1352 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1353 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1354 case EM_PRISM: return "SiTera Prism";
1355 case EM_X86_64: return "Advanced Micro Devices X86-64";
1357 case EM_S390: return "IBM S/390";
1359 sprintf (buff, _("<unknown>: %x"), e_machine);
1365 decode_ARM_machine_flags (e_flags, buf)
1372 eabi = EF_ARM_EABI_VERSION (e_flags);
1373 e_flags &= ~ EF_ARM_EABIMASK;
1375 /* Handle "generic" ARM flags. */
1376 if (e_flags & EF_ARM_RELEXEC)
1378 strcat (buf, ", relocatable executable");
1379 e_flags &= ~ EF_ARM_RELEXEC;
1382 if (e_flags & EF_ARM_HASENTRY)
1384 strcat (buf, ", has entry point");
1385 e_flags &= ~ EF_ARM_HASENTRY;
1388 /* Now handle EABI specific flags. */
1392 strcat (buf, ", <unrecognised EABI>");
1397 case EF_ARM_EABI_VER1:
1398 strcat (buf, ", Version1 EABI");
1403 /* Process flags one bit at a time. */
1404 flag = e_flags & - e_flags;
1409 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1410 strcat (buf, ", sorted symbol tables");
1420 case EF_ARM_EABI_VER2:
1421 strcat (buf, ", Version2 EABI");
1426 /* Process flags one bit at a time. */
1427 flag = e_flags & - e_flags;
1432 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1433 strcat (buf, ", sorted symbol tables");
1436 case EF_ARM_DYNSYMSUSESEGIDX:
1437 strcat (buf, ", dynamic symbols use segment index");
1440 case EF_ARM_MAPSYMSFIRST:
1441 strcat (buf, ", mapping symbols precede others");
1451 case EF_ARM_EABI_UNKNOWN:
1452 strcat (buf, ", GNU EABI");
1457 /* Process flags one bit at a time. */
1458 flag = e_flags & - e_flags;
1463 case EF_ARM_INTERWORK:
1464 strcat (buf, ", interworking enabled");
1467 case EF_ARM_APCS_26:
1468 strcat (buf, ", uses APCS/26");
1471 case EF_ARM_APCS_FLOAT:
1472 strcat (buf, ", uses APCS/float");
1476 strcat (buf, ", position independent");
1480 strcat (buf, ", 8 bit structure alignment");
1483 case EF_ARM_NEW_ABI:
1484 strcat (buf, ", uses new ABI");
1487 case EF_ARM_OLD_ABI:
1488 strcat (buf, ", uses old ABI");
1491 case EF_ARM_SOFT_FLOAT:
1492 strcat (buf, ", software FP");
1503 strcat (buf,", <unknown>");
1507 get_machine_flags (e_flags, e_machine)
1511 static char buf [1024];
1523 decode_ARM_machine_flags (e_flags, buf);
1527 if (e_flags & EF_CPU32)
1528 strcat (buf, ", cpu32");
1532 if (e_flags & EF_PPC_EMB)
1533 strcat (buf, ", emb");
1535 if (e_flags & EF_PPC_RELOCATABLE)
1536 strcat (buf, ", relocatable");
1538 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1539 strcat (buf, ", relocatable-lib");
1542 case EM_CYGNUS_V850:
1543 switch (e_flags & EF_V850_ARCH)
1546 strcat (buf, ", v850e");
1549 strcat (buf, ", v850ea");
1552 strcat (buf, ", v850");
1555 strcat (buf, ", unknown v850 architecture variant");
1560 case EM_CYGNUS_M32R:
1561 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1562 strcat (buf, ", m32r");
1567 case EM_MIPS_RS3_LE:
1568 if (e_flags & EF_MIPS_NOREORDER)
1569 strcat (buf, ", noreorder");
1571 if (e_flags & EF_MIPS_PIC)
1572 strcat (buf, ", pic");
1574 if (e_flags & EF_MIPS_CPIC)
1575 strcat (buf, ", cpic");
1577 if (e_flags & EF_MIPS_ABI2)
1578 strcat (buf, ", abi2");
1580 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1581 strcat (buf, ", mips1");
1583 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1584 strcat (buf, ", mips2");
1586 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1587 strcat (buf, ", mips3");
1589 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1590 strcat (buf, ", mips4");
1592 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
1593 strcat (buf, ", mips5");
1595 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
1596 strcat (buf, ", mips32");
1598 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
1599 strcat (buf, ", mips64");
1601 switch ((e_flags & EF_MIPS_MACH))
1603 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1604 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1605 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1606 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1607 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1608 case E_MIPS_MACH_MIPS32_4K: strcat (buf, ", mips32-4k"); break;
1609 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1610 default: strcat (buf, " UNKNOWN"); break;
1615 if (e_flags & EF_SPARC_32PLUS)
1616 strcat (buf, ", v8+");
1618 if (e_flags & EF_SPARC_SUN_US1)
1619 strcat (buf, ", ultrasparcI");
1621 if (e_flags & EF_SPARC_SUN_US3)
1622 strcat (buf, ", ultrasparcIII");
1624 if (e_flags & EF_SPARC_HAL_R1)
1625 strcat (buf, ", halr1");
1627 if (e_flags & EF_SPARC_LEDATA)
1628 strcat (buf, ", ledata");
1630 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1631 strcat (buf, ", tso");
1633 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1634 strcat (buf, ", pso");
1636 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1637 strcat (buf, ", rmo");
1641 switch (e_flags & EF_PARISC_ARCH)
1643 case EFA_PARISC_1_0:
1644 strcpy (buf, ", PA-RISC 1.0");
1646 case EFA_PARISC_1_1:
1647 strcpy (buf, ", PA-RISC 1.1");
1649 case EFA_PARISC_2_0:
1650 strcpy (buf, ", PA-RISC 2.0");
1655 if (e_flags & EF_PARISC_TRAPNIL)
1656 strcat (buf, ", trapnil");
1657 if (e_flags & EF_PARISC_EXT)
1658 strcat (buf, ", ext");
1659 if (e_flags & EF_PARISC_LSB)
1660 strcat (buf, ", lsb");
1661 if (e_flags & EF_PARISC_WIDE)
1662 strcat (buf, ", wide");
1663 if (e_flags & EF_PARISC_NO_KABP)
1664 strcat (buf, ", no kabp");
1665 if (e_flags & EF_PARISC_LAZYSWAP)
1666 strcat (buf, ", lazyswap");
1670 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1671 strcat (buf, ", new calling convention");
1673 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1674 strcat (buf, ", gnu calling convention");
1678 if ((e_flags & EF_IA_64_ABI64))
1679 strcat (buf, ", 64-bit");
1681 strcat (buf, ", 32-bit");
1682 if ((e_flags & EF_IA_64_REDUCEDFP))
1683 strcat (buf, ", reduced fp model");
1684 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1685 strcat (buf, ", no function descriptors, constant gp");
1686 else if ((e_flags & EF_IA_64_CONS_GP))
1687 strcat (buf, ", constant gp");
1688 if ((e_flags & EF_IA_64_ABSOLUTE))
1689 strcat (buf, ", absolute");
1698 get_mips_segment_type (type)
1703 case PT_MIPS_REGINFO:
1705 case PT_MIPS_RTPROC:
1707 case PT_MIPS_OPTIONS:
1717 get_parisc_segment_type (type)
1722 case PT_HP_TLS: return "HP_TLS";
1723 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1724 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1725 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1726 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1727 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1728 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1729 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1730 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1731 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1732 case PT_HP_PARALLEL: return "HP_PARALLEL";
1733 case PT_HP_FASTBIND: return "HP_FASTBIND";
1734 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1735 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1744 get_ia64_segment_type (type)
1749 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1750 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1759 get_segment_type (p_type)
1760 unsigned long p_type;
1762 static char buff [32];
1766 case PT_NULL: return "NULL";
1767 case PT_LOAD: return "LOAD";
1768 case PT_DYNAMIC: return "DYNAMIC";
1769 case PT_INTERP: return "INTERP";
1770 case PT_NOTE: return "NOTE";
1771 case PT_SHLIB: return "SHLIB";
1772 case PT_PHDR: return "PHDR";
1775 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1777 const char * result;
1779 switch (elf_header.e_machine)
1782 case EM_MIPS_RS3_LE:
1783 result = get_mips_segment_type (p_type);
1786 result = get_parisc_segment_type (p_type);
1789 result = get_ia64_segment_type (p_type);
1799 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1801 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1803 const char * result;
1805 switch (elf_header.e_machine)
1808 result = get_parisc_segment_type (p_type);
1818 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1821 sprintf (buff, _("<unknown>: %lx"), p_type);
1828 get_mips_section_type_name (sh_type)
1829 unsigned int sh_type;
1833 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1834 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1835 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1836 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1837 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1838 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1839 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1840 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1841 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1842 case SHT_MIPS_RELD: return "MIPS_RELD";
1843 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1844 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1845 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1846 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1847 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1848 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1849 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1850 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1851 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1852 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1853 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1854 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1855 case SHT_MIPS_LINE: return "MIPS_LINE";
1856 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1857 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1858 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1859 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1860 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1861 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1862 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1863 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1864 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1865 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1866 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1867 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1868 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1869 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1870 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1871 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1879 get_parisc_section_type_name (sh_type)
1880 unsigned int sh_type;
1884 case SHT_PARISC_EXT: return "PARISC_EXT";
1885 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1886 case SHT_PARISC_DOC: return "PARISC_DOC";
1894 get_ia64_section_type_name (sh_type)
1895 unsigned int sh_type;
1899 case SHT_IA_64_EXT: return "IA_64_EXT";
1900 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
1908 get_section_type_name (sh_type)
1909 unsigned int sh_type;
1911 static char buff [32];
1915 case SHT_NULL: return "NULL";
1916 case SHT_PROGBITS: return "PROGBITS";
1917 case SHT_SYMTAB: return "SYMTAB";
1918 case SHT_STRTAB: return "STRTAB";
1919 case SHT_RELA: return "RELA";
1920 case SHT_HASH: return "HASH";
1921 case SHT_DYNAMIC: return "DYNAMIC";
1922 case SHT_NOTE: return "NOTE";
1923 case SHT_NOBITS: return "NOBITS";
1924 case SHT_REL: return "REL";
1925 case SHT_SHLIB: return "SHLIB";
1926 case SHT_DYNSYM: return "DYNSYM";
1927 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1928 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1929 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1930 case SHT_GROUP: return "GROUP";
1931 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
1932 case SHT_GNU_verdef: return "VERDEF";
1933 case SHT_GNU_verneed: return "VERNEED";
1934 case SHT_GNU_versym: return "VERSYM";
1935 case 0x6ffffff0: return "VERSYM";
1936 case 0x6ffffffc: return "VERDEF";
1937 case 0x7ffffffd: return "AUXILIARY";
1938 case 0x7fffffff: return "FILTER";
1941 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1943 const char * result;
1945 switch (elf_header.e_machine)
1948 case EM_MIPS_RS3_LE:
1949 result = get_mips_section_type_name (sh_type);
1952 result = get_parisc_section_type_name (sh_type);
1955 result = get_ia64_section_type_name (sh_type);
1965 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1967 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1968 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1969 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1970 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1972 sprintf (buff, _("<unknown>: %x"), sh_type);
1978 struct option options [] =
1980 {"all", no_argument, 0, 'a'},
1981 {"file-header", no_argument, 0, 'h'},
1982 {"program-headers", no_argument, 0, 'l'},
1983 {"headers", no_argument, 0, 'e'},
1984 {"histogram", no_argument, 0, 'I'},
1985 {"segments", no_argument, 0, 'l'},
1986 {"sections", no_argument, 0, 'S'},
1987 {"section-headers", no_argument, 0, 'S'},
1988 {"symbols", no_argument, 0, 's'},
1989 {"syms", no_argument, 0, 's'},
1990 {"relocs", no_argument, 0, 'r'},
1991 {"notes", no_argument, 0, 'n'},
1992 {"dynamic", no_argument, 0, 'd'},
1993 {"arch-specific", no_argument, 0, 'A'},
1994 {"version-info", no_argument, 0, 'V'},
1995 {"use-dynamic", no_argument, 0, 'D'},
1996 {"hex-dump", required_argument, 0, 'x'},
1997 {"debug-dump", optional_argument, 0, 'w'},
1998 {"unwind", no_argument, 0, 'u'},
1999 #ifdef SUPPORT_DISASSEMBLY
2000 {"instruction-dump", required_argument, 0, 'i'},
2003 {"version", no_argument, 0, 'v'},
2004 {"help", no_argument, 0, 'H'},
2005 {0, no_argument, 0, 0}
2011 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
2012 fprintf (stdout, _(" Options are:\n"));
2013 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2014 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
2015 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
2016 fprintf (stdout, _(" Display the program headers\n"));
2017 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
2018 fprintf (stdout, _(" Display the sections' header\n"));
2019 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
2020 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
2021 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
2022 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
2023 fprintf (stdout, _(" -u or --unwind Display the unwind info (if present)\n"));
2024 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2025 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
2026 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2027 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2028 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
2029 fprintf (stdout, _(" Dump the contents of section <number>\n"));
2030 fprintf (stdout, _(" -w[liaprmf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames]\n"));
2031 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
2032 #ifdef SUPPORT_DISASSEMBLY
2033 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
2034 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
2036 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2037 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
2038 fprintf (stdout, _(" -H or --help Display this information\n"));
2039 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2045 request_dump (section, type)
2046 unsigned int section;
2049 if (section >= num_dump_sects)
2051 char * new_dump_sects;
2053 new_dump_sects = (char *) calloc (section + 1, 1);
2055 if (new_dump_sects == NULL)
2056 error (_("Out of memory allocating dump request table."));
2059 /* Copy current flag settings. */
2060 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2064 dump_sects = new_dump_sects;
2065 num_dump_sects = section + 1;
2070 dump_sects [section] |= type;
2076 parse_args (argc, argv)
2085 while ((c = getopt_long
2086 (argc, argv, "ersuahnldSDAIw::x:i:vV", options, NULL)) != EOF)
2122 do_using_dynamic ++;
2153 section = strtoul (optarg, & cp, 0);
2154 if (! * cp && section >= 0)
2156 request_dump (section, HEX_DUMP);
2176 do_debug_abbrevs = 1;
2186 do_debug_pubnames = 1;
2191 do_debug_aranges = 1;
2195 do_debug_frames_interp = 1;
2197 do_debug_frames = 1;
2202 do_debug_macinfo = 1;
2206 warn (_("Unrecognised debug option '%s'\n"), optarg);
2211 #ifdef SUPPORT_DISASSEMBLY
2214 section = strtoul (optarg, & cp, 0);
2215 if (! * cp && section >= 0)
2217 request_dump (section, DISASS_DUMP);
2223 print_version (program_name);
2230 /* xgettext:c-format */
2231 error (_("Invalid option '-%c'\n"), c);
2238 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2239 && !do_segments && !do_header && !do_dump && !do_version
2240 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2244 warn (_("Nothing to do.\n"));
2250 get_elf_class (elf_class)
2251 unsigned char elf_class;
2253 static char buff [32];
2257 case ELFCLASSNONE: return _("none");
2258 case ELFCLASS32: return _("ELF32");
2259 case ELFCLASS64: return _("ELF64");
2261 sprintf (buff, _("<unknown: %x>"), elf_class);
2267 get_data_encoding (encoding)
2268 unsigned char encoding;
2270 static char buff [32];
2274 case ELFDATANONE: return _("none");
2275 case ELFDATA2LSB: return _("2's complement, little endian");
2276 case ELFDATA2MSB: return _("2's complement, big endian");
2278 sprintf (buff, _("<unknown: %x>"), encoding);
2284 get_osabi_name (osabi)
2285 unsigned char osabi;
2287 static char buff [32];
2291 case ELFOSABI_NONE: return _("UNIX - System V");
2292 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2293 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2294 case ELFOSABI_LINUX: return _("UNIX - Linux");
2295 case ELFOSABI_HURD: return _("GNU/Hurd");
2296 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2297 case ELFOSABI_AIX: return _("UNIX - AIX");
2298 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2299 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2300 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2301 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2302 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2303 case ELFOSABI_STANDALONE: return _("Standalone App");
2304 case ELFOSABI_ARM: return _("ARM");
2306 sprintf (buff, _("<unknown: %x>"), osabi);
2311 /* Decode the data held in 'elf_header'. */
2313 process_file_header ()
2315 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2316 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2317 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2318 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2321 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2329 printf (_("ELF Header:\n"));
2330 printf (_(" Magic: "));
2331 for (i = 0; i < EI_NIDENT; i ++)
2332 printf ("%2.2x ", elf_header.e_ident [i]);
2334 printf (_(" Class: %s\n"),
2335 get_elf_class (elf_header.e_ident [EI_CLASS]));
2336 printf (_(" Data: %s\n"),
2337 get_data_encoding (elf_header.e_ident [EI_DATA]));
2338 printf (_(" Version: %d %s\n"),
2339 elf_header.e_ident [EI_VERSION],
2340 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2342 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2345 printf (_(" OS/ABI: %s\n"),
2346 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2347 printf (_(" ABI Version: %d\n"),
2348 elf_header.e_ident [EI_ABIVERSION]);
2349 printf (_(" Type: %s\n"),
2350 get_file_type (elf_header.e_type));
2351 printf (_(" Machine: %s\n"),
2352 get_machine_name (elf_header.e_machine));
2353 printf (_(" Version: 0x%lx\n"),
2354 (unsigned long) elf_header.e_version);
2356 printf (_(" Entry point address: "));
2357 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2358 printf (_("\n Start of program headers: "));
2359 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2360 printf (_(" (bytes into file)\n Start of section headers: "));
2361 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2362 printf (_(" (bytes into file)\n"));
2364 printf (_(" Flags: 0x%lx%s\n"),
2365 (unsigned long) elf_header.e_flags,
2366 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2367 printf (_(" Size of this header: %ld (bytes)\n"),
2368 (long) elf_header.e_ehsize);
2369 printf (_(" Size of program headers: %ld (bytes)\n"),
2370 (long) elf_header.e_phentsize);
2371 printf (_(" Number of program headers: %ld\n"),
2372 (long) elf_header.e_phnum);
2373 printf (_(" Size of section headers: %ld (bytes)\n"),
2374 (long) elf_header.e_shentsize);
2375 printf (_(" Number of section headers: %ld\n"),
2376 (long) elf_header.e_shnum);
2377 printf (_(" Section header string table index: %ld\n"),
2378 (long) elf_header.e_shstrndx);
2386 get_32bit_program_headers (file, program_headers)
2388 Elf_Internal_Phdr * program_headers;
2390 Elf32_External_Phdr * phdrs;
2391 Elf32_External_Phdr * external;
2392 Elf32_Internal_Phdr * internal;
2395 phdrs = ((Elf32_External_Phdr *)
2396 get_data (NULL, file, elf_header.e_phoff,
2397 elf_header.e_phentsize * elf_header.e_phnum,
2398 _("program headers")));
2402 for (i = 0, internal = program_headers, external = phdrs;
2403 i < elf_header.e_phnum;
2404 i ++, internal ++, external ++)
2406 internal->p_type = BYTE_GET (external->p_type);
2407 internal->p_offset = BYTE_GET (external->p_offset);
2408 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2409 internal->p_paddr = BYTE_GET (external->p_paddr);
2410 internal->p_filesz = BYTE_GET (external->p_filesz);
2411 internal->p_memsz = BYTE_GET (external->p_memsz);
2412 internal->p_flags = BYTE_GET (external->p_flags);
2413 internal->p_align = BYTE_GET (external->p_align);
2422 get_64bit_program_headers (file, program_headers)
2424 Elf_Internal_Phdr * program_headers;
2426 Elf64_External_Phdr * phdrs;
2427 Elf64_External_Phdr * external;
2428 Elf64_Internal_Phdr * internal;
2431 phdrs = ((Elf64_External_Phdr *)
2432 get_data (NULL, file, elf_header.e_phoff,
2433 elf_header.e_phentsize * elf_header.e_phnum,
2434 _("program headers")));
2438 for (i = 0, internal = program_headers, external = phdrs;
2439 i < elf_header.e_phnum;
2440 i ++, internal ++, external ++)
2442 internal->p_type = BYTE_GET (external->p_type);
2443 internal->p_flags = BYTE_GET (external->p_flags);
2444 internal->p_offset = BYTE_GET8 (external->p_offset);
2445 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2446 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2447 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2448 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2449 internal->p_align = BYTE_GET8 (external->p_align);
2458 process_program_headers (file)
2461 Elf_Internal_Phdr * program_headers;
2462 Elf_Internal_Phdr * segment;
2465 if (elf_header.e_phnum == 0)
2468 printf (_("\nThere are no program headers in this file.\n"));
2472 if (do_segments && !do_header)
2474 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2475 printf (_("Entry point "));
2476 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2477 printf (_("\nThere are %d program headers, starting at offset "),
2478 elf_header.e_phnum);
2479 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2483 program_headers = (Elf_Internal_Phdr *) malloc
2484 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2486 if (program_headers == NULL)
2488 error (_("Out of memory\n"));
2493 i = get_32bit_program_headers (file, program_headers);
2495 i = get_64bit_program_headers (file, program_headers);
2499 free (program_headers);
2506 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2510 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2514 (_(" Type Offset VirtAddr PhysAddr\n"));
2516 (_(" FileSiz MemSiz Flags Align\n"));
2524 for (i = 0, segment = program_headers;
2525 i < elf_header.e_phnum;
2530 printf (" %-14.14s ", get_segment_type (segment->p_type));
2534 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2535 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2536 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2537 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2538 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2540 (segment->p_flags & PF_R ? 'R' : ' '),
2541 (segment->p_flags & PF_W ? 'W' : ' '),
2542 (segment->p_flags & PF_X ? 'E' : ' '));
2543 printf ("%#lx", (unsigned long) segment->p_align);
2547 print_vma (segment->p_offset, FULL_HEX);
2549 print_vma (segment->p_vaddr, FULL_HEX);
2551 print_vma (segment->p_paddr, FULL_HEX);
2553 print_vma (segment->p_filesz, FULL_HEX);
2555 print_vma (segment->p_memsz, FULL_HEX);
2557 (segment->p_flags & PF_R ? 'R' : ' '),
2558 (segment->p_flags & PF_W ? 'W' : ' '),
2559 (segment->p_flags & PF_X ? 'E' : ' '));
2560 print_vma (segment->p_align, HEX);
2564 switch (segment->p_type)
2568 loadaddr = (segment->p_vaddr & 0xfffff000)
2569 - (segment->p_offset & 0xfffff000);
2574 error (_("more than one dynamic segment\n"));
2576 dynamic_addr = segment->p_offset;
2577 dynamic_size = segment->p_filesz;
2581 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2582 error (_("Unable to find program interpreter name\n"));
2585 program_interpreter[0] = 0;
2586 fscanf (file, "%63s", program_interpreter);
2589 printf (_("\n [Requesting program interpreter: %s]"),
2590 program_interpreter);
2596 putc ('\n', stdout);
2605 if (do_segments && section_headers != NULL)
2607 printf (_("\n Section to Segment mapping:\n"));
2608 printf (_(" Segment Sections...\n"));
2610 assert (string_table != NULL);
2612 for (i = 0; i < elf_header.e_phnum; i++)
2615 Elf_Internal_Shdr * section;
2617 segment = program_headers + i;
2618 section = section_headers;
2620 printf (" %2.2d ", i);
2622 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2624 if (section->sh_size > 0
2625 /* Compare allocated sections by VMA, unallocated
2626 sections by file offset. */
2627 && (section->sh_flags & SHF_ALLOC
2628 ? (section->sh_addr >= segment->p_vaddr
2629 && section->sh_addr + section->sh_size
2630 <= segment->p_vaddr + segment->p_memsz)
2631 : ((bfd_vma) section->sh_offset >= segment->p_offset
2632 && (section->sh_offset + section->sh_size
2633 <= segment->p_offset + segment->p_filesz))))
2634 printf ("%s ", SECTION_NAME (section));
2641 free (program_headers);
2648 get_32bit_section_headers (file)
2651 Elf32_External_Shdr * shdrs;
2652 Elf32_Internal_Shdr * internal;
2655 shdrs = ((Elf32_External_Shdr *)
2656 get_data (NULL, file, elf_header.e_shoff,
2657 elf_header.e_shentsize * elf_header.e_shnum,
2658 _("section headers")));
2662 section_headers = (Elf_Internal_Shdr *) malloc
2663 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2665 if (section_headers == NULL)
2667 error (_("Out of memory\n"));
2671 for (i = 0, internal = section_headers;
2672 i < elf_header.e_shnum;
2675 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2676 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2677 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2678 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2679 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2680 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2681 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2682 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2683 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2684 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2693 get_64bit_section_headers (file)
2696 Elf64_External_Shdr * shdrs;
2697 Elf64_Internal_Shdr * internal;
2700 shdrs = ((Elf64_External_Shdr *)
2701 get_data (NULL, file, elf_header.e_shoff,
2702 elf_header.e_shentsize * elf_header.e_shnum,
2703 _("section headers")));
2707 section_headers = (Elf_Internal_Shdr *) malloc
2708 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2710 if (section_headers == NULL)
2712 error (_("Out of memory\n"));
2716 for (i = 0, internal = section_headers;
2717 i < elf_header.e_shnum;
2720 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2721 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2722 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2723 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2724 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2725 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2726 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2727 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2728 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2729 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2737 static Elf_Internal_Sym *
2738 get_32bit_elf_symbols (file, offset, number)
2740 unsigned long offset;
2741 unsigned long number;
2743 Elf32_External_Sym * esyms;
2744 Elf_Internal_Sym * isyms;
2745 Elf_Internal_Sym * psym;
2748 esyms = ((Elf32_External_Sym *)
2749 get_data (NULL, file, offset,
2750 number * sizeof (Elf32_External_Sym), _("symbols")));
2754 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2758 error (_("Out of memory\n"));
2764 for (j = 0, psym = isyms;
2768 psym->st_name = BYTE_GET (esyms[j].st_name);
2769 psym->st_value = BYTE_GET (esyms[j].st_value);
2770 psym->st_size = BYTE_GET (esyms[j].st_size);
2771 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2772 psym->st_info = BYTE_GET (esyms[j].st_info);
2773 psym->st_other = BYTE_GET (esyms[j].st_other);
2781 static Elf_Internal_Sym *
2782 get_64bit_elf_symbols (file, offset, number)
2784 unsigned long offset;
2785 unsigned long number;
2787 Elf64_External_Sym * esyms;
2788 Elf_Internal_Sym * isyms;
2789 Elf_Internal_Sym * psym;
2792 esyms = ((Elf64_External_Sym *)
2793 get_data (NULL, file, offset,
2794 number * sizeof (Elf64_External_Sym), _("symbols")));
2798 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2802 error (_("Out of memory\n"));
2808 for (j = 0, psym = isyms;
2812 psym->st_name = BYTE_GET (esyms[j].st_name);
2813 psym->st_info = BYTE_GET (esyms[j].st_info);
2814 psym->st_other = BYTE_GET (esyms[j].st_other);
2815 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2816 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2817 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2826 get_elf_section_flags (sh_flags)
2829 static char buff [32];
2837 flag = sh_flags & - sh_flags;
2842 case SHF_WRITE: strcat (buff, "W"); break;
2843 case SHF_ALLOC: strcat (buff, "A"); break;
2844 case SHF_EXECINSTR: strcat (buff, "X"); break;
2845 case SHF_MERGE: strcat (buff, "M"); break;
2846 case SHF_STRINGS: strcat (buff, "S"); break;
2847 case SHF_INFO_LINK: strcat (buff, "I"); break;
2848 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2849 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2850 case SHF_GROUP: strcat (buff, "G"); break;
2853 if (flag & SHF_MASKOS)
2856 sh_flags &= ~ SHF_MASKOS;
2858 else if (flag & SHF_MASKPROC)
2861 sh_flags &= ~ SHF_MASKPROC;
2873 process_section_headers (file)
2876 Elf_Internal_Shdr * section;
2879 section_headers = NULL;
2881 if (elf_header.e_shnum == 0)
2884 printf (_("\nThere are no sections in this file.\n"));
2889 if (do_sections && !do_header)
2890 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2891 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2895 if (! get_32bit_section_headers (file))
2898 else if (! get_64bit_section_headers (file))
2901 /* Read in the string table, so that we have names to display. */
2902 section = section_headers + elf_header.e_shstrndx;
2904 if (section->sh_size != 0)
2906 string_table = (char *) get_data (NULL, file, section->sh_offset,
2907 section->sh_size, _("string table"));
2909 string_table_length = section->sh_size;
2912 /* Scan the sections for the dynamic symbol table
2913 and dynamic string table and debug sections. */
2914 dynamic_symbols = NULL;
2915 dynamic_strings = NULL;
2916 dynamic_syminfo = NULL;
2918 for (i = 0, section = section_headers;
2919 i < elf_header.e_shnum;
2922 char * name = SECTION_NAME (section);
2924 if (section->sh_type == SHT_DYNSYM)
2926 if (dynamic_symbols != NULL)
2928 error (_("File contains multiple dynamic symbol tables\n"));
2932 num_dynamic_syms = section->sh_size / section->sh_entsize;
2934 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2936 else if (section->sh_type == SHT_STRTAB
2937 && strcmp (name, ".dynstr") == 0)
2939 if (dynamic_strings != NULL)
2941 error (_("File contains multiple dynamic string tables\n"));
2945 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
2947 _("dynamic strings"));
2949 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2950 || do_debug_lines || do_debug_pubnames || do_debug_aranges
2951 || do_debug_frames || do_debug_macinfo)
2952 && strncmp (name, ".debug_", 7) == 0)
2957 || (do_debug_info && (strcmp (name, "info") == 0))
2958 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2959 || (do_debug_lines && (strcmp (name, "line") == 0))
2960 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2961 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2962 || (do_debug_frames && (strcmp (name, "frame") == 0))
2963 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
2965 request_dump (i, DEBUG_DUMP);
2967 /* linkonce section to be combined with .debug_info at link time. */
2968 else if ((do_debugging || do_debug_info)
2969 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
2970 request_dump (i, DEBUG_DUMP);
2971 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
2972 request_dump (i, DEBUG_DUMP);
2978 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2982 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2985 printf (_(" [Nr] Name Type Address Offset\n"));
2986 printf (_(" Size EntSize Flags Link Info Align\n"));
2989 for (i = 0, section = section_headers;
2990 i < elf_header.e_shnum;
2993 printf (" [%2d] %-17.17s %-15.15s ",
2995 SECTION_NAME (section),
2996 get_section_type_name (section->sh_type));
3000 print_vma (section->sh_addr, LONG_HEX);
3002 printf ( " %6.6lx %6.6lx %2.2lx",
3003 (unsigned long) section->sh_offset,
3004 (unsigned long) section->sh_size,
3005 (unsigned long) section->sh_entsize);
3007 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3009 printf ("%2ld %3lx %2ld\n",
3010 (unsigned long) section->sh_link,
3011 (unsigned long) section->sh_info,
3012 (unsigned long) section->sh_addralign);
3017 print_vma (section->sh_addr, LONG_HEX);
3018 printf (" %8.8lx", section->sh_offset);
3020 print_vma (section->sh_size, LONG_HEX);
3022 print_vma (section->sh_entsize, LONG_HEX);
3024 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3026 printf (" %2ld %3lx %ld\n",
3027 (unsigned long) section->sh_link,
3028 (unsigned long) section->sh_info,
3029 (unsigned long) section->sh_addralign);
3033 printf (_("Key to Flags:\n"));
3034 printf (_(" W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
3035 printf (_(" I (info), L (link order), G (group), x (unknown)\n"));
3036 printf (_(" O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3041 /* Process the reloc section. */
3043 process_relocs (file)
3046 unsigned long rel_size;
3047 unsigned long rel_offset;
3053 if (do_using_dynamic)
3055 int is_rela = FALSE;
3060 if (dynamic_info[DT_REL])
3062 rel_offset = dynamic_info[DT_REL];
3063 rel_size = dynamic_info[DT_RELSZ];
3066 else if (dynamic_info [DT_RELA])
3068 rel_offset = dynamic_info[DT_RELA];
3069 rel_size = dynamic_info[DT_RELASZ];
3072 else if (dynamic_info[DT_JMPREL])
3074 rel_offset = dynamic_info[DT_JMPREL];
3075 rel_size = dynamic_info[DT_PLTRELSZ];
3077 switch (dynamic_info[DT_PLTREL])
3094 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3095 rel_offset, rel_size);
3097 dump_relocations (file, rel_offset - loadaddr, rel_size,
3098 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3101 printf (_("\nThere are no dynamic relocations in this file.\n"));
3105 Elf32_Internal_Shdr * section;
3109 for (i = 0, section = section_headers;
3110 i < elf_header.e_shnum;
3113 if ( section->sh_type != SHT_RELA
3114 && section->sh_type != SHT_REL)
3117 rel_offset = section->sh_offset;
3118 rel_size = section->sh_size;
3122 Elf32_Internal_Shdr * strsec;
3123 Elf_Internal_Sym * symtab;
3126 unsigned long nsyms;
3128 printf (_("\nRelocation section "));
3130 if (string_table == NULL)
3131 printf ("%d", section->sh_name);
3133 printf ("'%s'", SECTION_NAME (section));
3135 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3136 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3141 if (section->sh_link)
3143 Elf32_Internal_Shdr * symsec;
3145 symsec = section_headers + section->sh_link;
3146 nsyms = symsec->sh_size / symsec->sh_entsize;
3147 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
3152 strsec = section_headers + symsec->sh_link;
3154 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3158 is_rela = section->sh_type == SHT_RELA;
3160 dump_relocations (file, rel_offset, rel_size,
3161 symtab, nsyms, strtab, is_rela);
3173 printf (_("\nThere are no relocations in this file.\n"));
3179 #include "unwind-ia64.h"
3181 /* An absolute address consists of a section and an offset. If the
3182 section is NULL, the offset itself is the address, otherwise, the
3183 address equals to LOAD_ADDRESS(section) + offset. */
3187 unsigned short section;
3193 struct unw_table_entry
3195 struct absaddr start;
3197 struct absaddr info;
3199 *table; /* Unwind table. */
3200 unsigned long table_len; /* Length of unwind table. */
3201 unsigned char * info; /* Unwind info. */
3202 unsigned long info_size; /* Size of unwind info. */
3203 bfd_vma info_addr; /* starting address of unwind info. */
3204 bfd_vma seg_base; /* Starting address of segment. */
3205 Elf_Internal_Sym * symtab; /* The symbol table. */
3206 unsigned long nsyms; /* Number of symbols. */
3207 char * strtab; /* The string table. */
3208 unsigned long strtab_size; /* Size of string table. */
3211 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3212 struct absaddr, const char **,
3214 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3215 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3216 Elf32_Internal_Shdr *));
3219 find_symbol_for_address (aux, addr, symname, offset)
3220 struct unw_aux_info *aux;
3221 struct absaddr addr;
3222 const char **symname;
3225 bfd_vma dist = (bfd_vma) 0x100000;
3226 Elf_Internal_Sym *sym, *best = NULL;
3229 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3231 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3232 && sym->st_name != 0
3233 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3234 && addr.offset >= sym->st_value
3235 && addr.offset - sym->st_value < dist)
3238 dist = addr.offset - sym->st_value;
3245 *symname = (best->st_name >= aux->strtab_size
3246 ? "<corrupt>" : aux->strtab + best->st_name);
3251 *offset = addr.offset;
3255 dump_ia64_unwind (aux)
3256 struct unw_aux_info *aux;
3259 struct unw_table_entry * tp;
3262 addr_size = is_32bit_elf ? 4 : 8;
3264 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3268 const unsigned char * dp;
3269 const unsigned char * head;
3270 const char * procname;
3272 find_symbol_for_address (aux, tp->start, &procname, &offset);
3274 fputs ("\n<", stdout);
3278 fputs (procname, stdout);
3281 printf ("+%lx", (unsigned long) offset);
3284 fputs (">: [", stdout);
3285 print_vma (tp->start.offset, PREFIX_HEX);
3286 fputc ('-', stdout);
3287 print_vma (tp->end.offset, PREFIX_HEX);
3288 printf ("), info at +0x%lx\n",
3289 (unsigned long) (tp->info.offset - aux->seg_base));
3291 head = aux->info + (tp->info.offset - aux->info_addr);
3292 stamp = BYTE_GET8 ((unsigned char *) head);
3294 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3295 (unsigned) UNW_VER (stamp),
3296 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3297 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3298 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3299 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3301 if (UNW_VER (stamp) != 1)
3303 printf ("\tUnknown version.\n");
3308 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3309 dp = unw_decode (dp, in_body, & in_body);
3314 slurp_ia64_unwind_table (file, aux, sec)
3316 struct unw_aux_info *aux;
3317 Elf32_Internal_Shdr *sec;
3319 unsigned long size, addr_size, nrelas, i;
3320 Elf_Internal_Phdr *prog_hdrs, *seg;
3321 struct unw_table_entry *tep;
3322 Elf32_Internal_Shdr *relsec;
3323 Elf_Internal_Rela *rela, *rp;
3324 unsigned char *table, *tp;
3325 Elf_Internal_Sym *sym;
3326 const char *relname;
3329 addr_size = is_32bit_elf ? 4 : 8;
3331 /* First, find the starting address of the segment that includes
3334 if (elf_header.e_phnum)
3336 prog_hdrs = (Elf_Internal_Phdr *)
3337 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3340 result = get_32bit_program_headers (file, prog_hdrs);
3342 result = get_64bit_program_headers (file, prog_hdrs);
3350 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3352 if (seg->p_type != PT_LOAD)
3355 if (sec->sh_addr >= seg->p_vaddr
3356 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3358 aux->seg_base = seg->p_vaddr;
3366 /* Second, build the unwind table from the contents of the unwind section: */
3367 size = sec->sh_size;
3368 table = (char *) get_data (NULL, file, sec->sh_offset,
3369 size, _("unwind table"));
3373 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3374 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3376 tep->start.section = SHN_UNDEF;
3377 tep->end.section = SHN_UNDEF;
3378 tep->info.section = SHN_UNDEF;
3381 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3382 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3383 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3387 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3388 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3389 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3391 tep->start.offset += aux->seg_base;
3392 tep->end.offset += aux->seg_base;
3393 tep->info.offset += aux->seg_base;
3397 /* Third, apply any relocations to the unwind table: */
3399 for (relsec = section_headers;
3400 relsec < section_headers + elf_header.e_shnum;
3403 if (relsec->sh_type != SHT_RELA
3404 || section_headers + relsec->sh_info != sec)
3407 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3411 for (rp = rela; rp < rela + nrelas; ++rp)
3415 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3416 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3418 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3420 warn (_("Skipping unexpected symbol type %u"),
3421 ELF32_ST_TYPE (sym->st_info));
3427 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3428 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3430 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3432 warn (_("Skipping unexpected symbol type %u"),
3433 ELF64_ST_TYPE (sym->st_info));
3438 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3440 warn (_("Skipping unexpected relocation type %s"), relname);
3444 i = rp->r_offset / (3 * addr_size);
3446 switch (rp->r_offset/addr_size % 3)
3449 aux->table[i].start.section = sym->st_shndx;
3450 aux->table[i].start.offset += rp->r_addend;
3453 aux->table[i].end.section = sym->st_shndx;
3454 aux->table[i].end.offset += rp->r_addend;
3457 aux->table[i].info.section = sym->st_shndx;
3458 aux->table[i].info.offset += rp->r_addend;
3468 aux->table_len = size / (3 * addr_size);
3473 process_unwind (file)
3476 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3477 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3478 struct unw_aux_info aux;
3483 if (elf_header.e_machine != EM_IA_64)
3485 printf (_("\nThere are no unwind sections in this file.\n"));
3489 memset (& aux, 0, sizeof (aux));
3491 addr_size = is_32bit_elf ? 4 : 8;
3493 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3495 if (sec->sh_type == SHT_SYMTAB)
3497 aux.nsyms = sec->sh_size / sec->sh_entsize;
3498 aux.symtab = GET_ELF_SYMBOLS (file, sec->sh_offset, aux.nsyms);
3500 strsec = section_headers + sec->sh_link;
3501 aux.strtab_size = strsec->sh_size;
3502 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3503 aux.strtab_size, _("string table"));
3505 else if (sec->sh_type == SHT_IA_64_UNWIND)
3510 printf (_("\nThere are no unwind sections in this file.\n"));
3512 while (unwcount-- > 0)
3517 for (i = unwstart, sec = section_headers + unwstart;
3518 i < elf_header.e_shnum; ++i, ++sec)
3519 if (sec->sh_type == SHT_IA_64_UNWIND)
3526 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3528 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3531 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3532 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3533 suffix = SECTION_NAME (unwsec) + len;
3534 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3536 if (strncmp (SECTION_NAME (sec),
3537 ELF_STRING_ia64_unwind_info_once, len2) == 0
3538 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3543 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3544 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3545 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3546 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3548 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3550 suffix = SECTION_NAME (unwsec) + len;
3551 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3553 if (strncmp (SECTION_NAME (sec),
3554 ELF_STRING_ia64_unwind_info, len2) == 0
3555 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3559 if (i == elf_header.e_shnum)
3561 printf (_("\nCould not find unwind info section for "));
3563 if (string_table == NULL)
3564 printf ("%d", unwsec->sh_name);
3566 printf ("'%s'", SECTION_NAME (unwsec));
3570 aux.info_size = sec->sh_size;
3571 aux.info_addr = sec->sh_addr;
3572 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3573 aux.info_size, _("unwind info"));
3575 printf (_("\nUnwind section "));
3577 if (string_table == NULL)
3578 printf ("%d", unwsec->sh_name);
3580 printf ("'%s'", SECTION_NAME (unwsec));
3582 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3584 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3586 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3588 if (aux.table_len > 0)
3589 dump_ia64_unwind (& aux);
3592 free ((char *) aux.table);
3594 free ((char *) aux.info);
3603 free ((char *) aux.strtab);
3609 dynamic_segment_mips_val (entry)
3610 Elf_Internal_Dyn * entry;
3612 switch (entry->d_tag)
3615 if (entry->d_un.d_val == 0)
3619 static const char * opts[] =
3621 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3622 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3623 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3624 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3629 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3630 if (entry->d_un.d_val & (1 << cnt))
3632 printf ("%s%s", first ? "" : " ", opts[cnt]);
3639 case DT_MIPS_IVERSION:
3640 if (dynamic_strings != NULL)
3641 printf ("Interface Version: %s\n",
3642 dynamic_strings + entry->d_un.d_val);
3644 printf ("%ld\n", (long) entry->d_un.d_ptr);
3647 case DT_MIPS_TIME_STAMP:
3652 time_t time = entry->d_un.d_val;
3653 tmp = gmtime (&time);
3654 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3655 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3656 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3657 printf ("Time Stamp: %s\n", timebuf);
3661 case DT_MIPS_RLD_VERSION:
3662 case DT_MIPS_LOCAL_GOTNO:
3663 case DT_MIPS_CONFLICTNO:
3664 case DT_MIPS_LIBLISTNO:
3665 case DT_MIPS_SYMTABNO:
3666 case DT_MIPS_UNREFEXTNO:
3667 case DT_MIPS_HIPAGENO:
3668 case DT_MIPS_DELTA_CLASS_NO:
3669 case DT_MIPS_DELTA_INSTANCE_NO:
3670 case DT_MIPS_DELTA_RELOC_NO:
3671 case DT_MIPS_DELTA_SYM_NO:
3672 case DT_MIPS_DELTA_CLASSSYM_NO:
3673 case DT_MIPS_COMPACT_SIZE:
3674 printf ("%ld\n", (long) entry->d_un.d_ptr);
3678 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3684 dynamic_segment_parisc_val (entry)
3685 Elf_Internal_Dyn * entry;
3687 switch (entry->d_tag)
3689 case DT_HP_DLD_FLAGS:
3698 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3699 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3700 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3701 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3702 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3703 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3704 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3705 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3706 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3707 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3708 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3712 bfd_vma val = entry->d_un.d_val;
3714 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3715 if (val & flags[cnt].bit)
3719 fputs (flags[cnt].str, stdout);
3721 val ^= flags[cnt].bit;
3724 if (val != 0 || first)
3728 print_vma (val, HEX);
3734 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3740 get_32bit_dynamic_segment (file)
3743 Elf32_External_Dyn * edyn;
3744 Elf_Internal_Dyn * entry;
3747 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
3748 dynamic_size, _("dynamic segment"));
3752 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3753 how large this .dynamic is now. We can do this even before the byte
3754 swapping since the DT_NULL tag is recognizable. */
3756 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3759 dynamic_segment = (Elf_Internal_Dyn *)
3760 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3762 if (dynamic_segment == NULL)
3764 error (_("Out of memory\n"));
3769 for (i = 0, entry = dynamic_segment;
3773 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3774 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3783 get_64bit_dynamic_segment (file)
3786 Elf64_External_Dyn * edyn;
3787 Elf_Internal_Dyn * entry;
3790 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
3791 dynamic_size, _("dynamic segment"));
3795 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3796 how large this .dynamic is now. We can do this even before the byte
3797 swapping since the DT_NULL tag is recognizable. */
3799 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3802 dynamic_segment = (Elf_Internal_Dyn *)
3803 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3805 if (dynamic_segment == NULL)
3807 error (_("Out of memory\n"));
3812 for (i = 0, entry = dynamic_segment;
3816 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3817 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3826 get_dynamic_flags (flags)
3829 static char buff [64];
3834 flag = flags & - flags;
3839 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3840 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3841 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3842 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3843 default: strcat (buff, "unknown "); break;
3849 /* Parse and display the contents of the dynamic segment. */
3851 process_dynamic_segment (file)
3854 Elf_Internal_Dyn * entry;
3857 if (dynamic_size == 0)
3860 printf (_("\nThere is no dynamic segment in this file.\n"));
3867 if (! get_32bit_dynamic_segment (file))
3870 else if (! get_64bit_dynamic_segment (file))
3873 /* Find the appropriate symbol table. */
3874 if (dynamic_symbols == NULL)
3876 for (i = 0, entry = dynamic_segment;
3880 unsigned long offset;
3882 if (entry->d_tag != DT_SYMTAB)
3885 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3887 /* Since we do not know how big the symbol table is,
3888 we default to reading in the entire file (!) and
3889 processing that. This is overkill, I know, but it
3891 offset = entry->d_un.d_val - loadaddr;
3893 if (fseek (file, 0, SEEK_END))
3894 error (_("Unable to seek to end of file!"));
3897 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3899 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3901 if (num_dynamic_syms < 1)
3903 error (_("Unable to determine the number of symbols to load\n"));
3907 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3911 /* Similarly find a string table. */
3912 if (dynamic_strings == NULL)
3914 for (i = 0, entry = dynamic_segment;
3918 unsigned long offset;
3921 if (entry->d_tag != DT_STRTAB)
3924 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3926 /* Since we do not know how big the string table is,
3927 we default to reading in the entire file (!) and
3928 processing that. This is overkill, I know, but it
3931 offset = entry->d_un.d_val - loadaddr;
3932 if (fseek (file, 0, SEEK_END))
3933 error (_("Unable to seek to end of file\n"));
3934 str_tab_len = ftell (file) - offset;
3936 if (str_tab_len < 1)
3939 (_("Unable to determine the length of the dynamic string table\n"));
3943 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
3944 _("dynamic string table"));
3950 /* And find the syminfo section if available. */
3951 if (dynamic_syminfo == NULL)
3953 unsigned int syminsz = 0;
3955 for (i = 0, entry = dynamic_segment;
3959 if (entry->d_tag == DT_SYMINENT)
3961 /* Note: these braces are necessary to avoid a syntax
3962 error from the SunOS4 C compiler. */
3963 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3965 else if (entry->d_tag == DT_SYMINSZ)
3966 syminsz = entry->d_un.d_val;
3967 else if (entry->d_tag == DT_SYMINFO)
3968 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
3971 if (dynamic_syminfo_offset != 0 && syminsz != 0)
3973 Elf_External_Syminfo * extsyminfo;
3974 Elf_Internal_Syminfo * syminfo;
3976 /* There is a syminfo section. Read the data. */
3977 extsyminfo = ((Elf_External_Syminfo *)
3978 get_data (NULL, file, dynamic_syminfo_offset,
3979 syminsz, _("symbol information")));
3983 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3984 if (dynamic_syminfo == NULL)
3986 error (_("Out of memory\n"));
3990 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3991 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3994 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3995 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4002 if (do_dynamic && dynamic_addr)
4003 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4004 dynamic_addr, (long) dynamic_size);
4006 printf (_(" Tag Type Name/Value\n"));
4008 for (i = 0, entry = dynamic_segment;
4017 print_vma (entry->d_tag, FULL_HEX);
4018 dtype = get_dynamic_type (entry->d_tag);
4019 printf (" (%s)%*s", dtype,
4020 ((is_32bit_elf ? 27 : 19)
4021 - (int) strlen (dtype)),
4025 switch (entry->d_tag)
4029 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4039 switch (entry->d_tag)
4042 printf (_("Auxiliary library"));
4046 printf (_("Filter library"));
4050 printf (_("Configuration file"));
4054 printf (_("Dependency audit library"));
4058 printf (_("Audit library"));
4062 if (dynamic_strings)
4063 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4067 print_vma (entry->d_un.d_val, PREFIX_HEX);
4076 printf (_("Flags:"));
4077 if (entry->d_un.d_val == 0)
4078 printf (_(" None\n"));
4081 unsigned long int val = entry->d_un.d_val;
4082 if (val & DTF_1_PARINIT)
4084 printf (" PARINIT");
4085 val ^= DTF_1_PARINIT;
4087 if (val & DTF_1_CONFEXP)
4089 printf (" CONFEXP");
4090 val ^= DTF_1_CONFEXP;
4093 printf (" %lx", val);
4102 printf (_("Flags:"));
4103 if (entry->d_un.d_val == 0)
4104 printf (_(" None\n"));
4107 unsigned long int val = entry->d_un.d_val;
4108 if (val & DF_P1_LAZYLOAD)
4110 printf (" LAZYLOAD");
4111 val ^= DF_P1_LAZYLOAD;
4113 if (val & DF_P1_GROUPPERM)
4115 printf (" GROUPPERM");
4116 val ^= DF_P1_GROUPPERM;
4119 printf (" %lx", val);
4128 printf (_("Flags:"));
4129 if (entry->d_un.d_val == 0)
4130 printf (_(" None\n"));
4133 unsigned long int val = entry->d_un.d_val;
4139 if (val & DF_1_GLOBAL)
4144 if (val & DF_1_GROUP)
4149 if (val & DF_1_NODELETE)
4151 printf (" NODELETE");
4152 val ^= DF_1_NODELETE;
4154 if (val & DF_1_LOADFLTR)
4156 printf (" LOADFLTR");
4157 val ^= DF_1_LOADFLTR;
4159 if (val & DF_1_INITFIRST)
4161 printf (" INITFIRST");
4162 val ^= DF_1_INITFIRST;
4164 if (val & DF_1_NOOPEN)
4169 if (val & DF_1_ORIGIN)
4174 if (val & DF_1_DIRECT)
4179 if (val & DF_1_TRANS)
4184 if (val & DF_1_INTERPOSE)
4186 printf (" INTERPOSE");
4187 val ^= DF_1_INTERPOSE;
4189 if (val & DF_1_NODEFLIB)
4191 printf (" NODEFLIB");
4192 val ^= DF_1_NODEFLIB;
4194 if (val & DF_1_NODUMP)
4199 if (val & DF_1_CONLFAT)
4201 printf (" CONLFAT");
4202 val ^= DF_1_CONLFAT;
4205 printf (" %lx", val);
4213 puts (get_dynamic_type (entry->d_un.d_val));
4233 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4239 if (dynamic_strings == NULL)
4242 name = dynamic_strings + entry->d_un.d_val;
4246 switch (entry->d_tag)
4249 printf (_("Shared library: [%s]"), name);
4251 if (strcmp (name, program_interpreter) == 0)
4252 printf (_(" program interpreter"));
4256 printf (_("Library soname: [%s]"), name);
4260 printf (_("Library rpath: [%s]"), name);
4264 printf (_("Library runpath: [%s]"), name);
4268 print_vma (entry->d_un.d_val, PREFIX_HEX);
4273 print_vma (entry->d_un.d_val, PREFIX_HEX);
4289 case DT_INIT_ARRAYSZ:
4290 case DT_FINI_ARRAYSZ:
4293 print_vma (entry->d_un.d_val, UNSIGNED);
4294 printf (" (bytes)\n");
4304 print_vma (entry->d_un.d_val, UNSIGNED);
4317 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4321 name = dynamic_strings + entry->d_un.d_val;
4325 printf (_("Not needed object: [%s]\n"), name);
4330 print_vma (entry->d_un.d_val, PREFIX_HEX);
4336 /* The value of this entry is ignored. */
4340 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4341 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4346 switch (elf_header.e_machine)
4349 case EM_MIPS_RS3_LE:
4350 dynamic_segment_mips_val (entry);
4353 dynamic_segment_parisc_val (entry);
4356 print_vma (entry->d_un.d_val, PREFIX_HEX);
4368 get_ver_flags (flags)
4371 static char buff [32];
4378 if (flags & VER_FLG_BASE)
4379 strcat (buff, "BASE ");
4381 if (flags & VER_FLG_WEAK)
4383 if (flags & VER_FLG_BASE)
4384 strcat (buff, "| ");
4386 strcat (buff, "WEAK ");
4389 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4390 strcat (buff, "| <unknown>");
4395 /* Display the contents of the version sections. */
4397 process_version_sections (file)
4400 Elf32_Internal_Shdr * section;
4407 for (i = 0, section = section_headers;
4408 i < elf_header.e_shnum;
4411 switch (section->sh_type)
4413 case SHT_GNU_verdef:
4415 Elf_External_Verdef * edefs;
4422 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4423 SECTION_NAME (section), section->sh_info);
4425 printf (_(" Addr: 0x"));
4426 printf_vma (section->sh_addr);
4427 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4428 (unsigned long) section->sh_offset, section->sh_link,
4429 SECTION_NAME (section_headers + section->sh_link));
4431 edefs = ((Elf_External_Verdef *)
4432 get_data (NULL, file, section->sh_offset,
4434 _("version definition section")));
4438 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4441 Elf_External_Verdef * edef;
4442 Elf_Internal_Verdef ent;
4443 Elf_External_Verdaux * eaux;
4444 Elf_Internal_Verdaux aux;
4448 vstart = ((char *) edefs) + idx;
4450 edef = (Elf_External_Verdef *) vstart;
4452 ent.vd_version = BYTE_GET (edef->vd_version);
4453 ent.vd_flags = BYTE_GET (edef->vd_flags);
4454 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4455 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4456 ent.vd_hash = BYTE_GET (edef->vd_hash);
4457 ent.vd_aux = BYTE_GET (edef->vd_aux);
4458 ent.vd_next = BYTE_GET (edef->vd_next);
4460 printf (_(" %#06x: Rev: %d Flags: %s"),
4461 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4463 printf (_(" Index: %d Cnt: %d "),
4464 ent.vd_ndx, ent.vd_cnt);
4466 vstart += ent.vd_aux;
4468 eaux = (Elf_External_Verdaux *) vstart;
4470 aux.vda_name = BYTE_GET (eaux->vda_name);
4471 aux.vda_next = BYTE_GET (eaux->vda_next);
4473 if (dynamic_strings)
4474 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4476 printf (_("Name index: %ld\n"), aux.vda_name);
4478 isum = idx + ent.vd_aux;
4480 for (j = 1; j < ent.vd_cnt; j ++)
4482 isum += aux.vda_next;
4483 vstart += aux.vda_next;
4485 eaux = (Elf_External_Verdaux *) vstart;
4487 aux.vda_name = BYTE_GET (eaux->vda_name);
4488 aux.vda_next = BYTE_GET (eaux->vda_next);
4490 if (dynamic_strings)
4491 printf (_(" %#06x: Parent %d: %s\n"),
4492 isum, j, dynamic_strings + aux.vda_name);
4494 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4495 isum, j, aux.vda_name);
4505 case SHT_GNU_verneed:
4507 Elf_External_Verneed * eneed;
4513 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4514 SECTION_NAME (section), section->sh_info);
4516 printf (_(" Addr: 0x"));
4517 printf_vma (section->sh_addr);
4518 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4519 (unsigned long) section->sh_offset, section->sh_link,
4520 SECTION_NAME (section_headers + section->sh_link));
4522 eneed = ((Elf_External_Verneed *)
4523 get_data (NULL, file, section->sh_offset,
4524 section->sh_size, _("version need section")));
4528 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4530 Elf_External_Verneed * entry;
4531 Elf_Internal_Verneed ent;
4536 vstart = ((char *) eneed) + idx;
4538 entry = (Elf_External_Verneed *) vstart;
4540 ent.vn_version = BYTE_GET (entry->vn_version);
4541 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4542 ent.vn_file = BYTE_GET (entry->vn_file);
4543 ent.vn_aux = BYTE_GET (entry->vn_aux);
4544 ent.vn_next = BYTE_GET (entry->vn_next);
4546 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4548 if (dynamic_strings)
4549 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4551 printf (_(" File: %lx"), ent.vn_file);
4553 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4555 vstart += ent.vn_aux;
4557 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4559 Elf_External_Vernaux * eaux;
4560 Elf_Internal_Vernaux aux;
4562 eaux = (Elf_External_Vernaux *) vstart;
4564 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4565 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4566 aux.vna_other = BYTE_GET (eaux->vna_other);
4567 aux.vna_name = BYTE_GET (eaux->vna_name);
4568 aux.vna_next = BYTE_GET (eaux->vna_next);
4570 if (dynamic_strings)
4571 printf (_(" %#06x: Name: %s"),
4572 isum, dynamic_strings + aux.vna_name);
4574 printf (_(" %#06x: Name index: %lx"),
4575 isum, aux.vna_name);
4577 printf (_(" Flags: %s Version: %d\n"),
4578 get_ver_flags (aux.vna_flags), aux.vna_other);
4580 isum += aux.vna_next;
4581 vstart += aux.vna_next;
4591 case SHT_GNU_versym:
4593 Elf32_Internal_Shdr * link_section;
4596 unsigned char * edata;
4597 unsigned short * data;
4599 Elf_Internal_Sym * symbols;
4600 Elf32_Internal_Shdr * string_sec;
4602 link_section = section_headers + section->sh_link;
4603 total = section->sh_size / section->sh_entsize;
4607 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
4608 link_section->sh_size / link_section->sh_entsize);
4610 string_sec = section_headers + link_section->sh_link;
4612 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4613 string_sec->sh_size,
4614 _("version string table"));
4618 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4619 SECTION_NAME (section), total);
4621 printf (_(" Addr: "));
4622 printf_vma (section->sh_addr);
4623 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4624 (unsigned long) section->sh_offset, section->sh_link,
4625 SECTION_NAME (link_section));
4629 get_data (NULL, file,
4630 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4631 total * sizeof (short), _("version symbol data")));
4638 data = (unsigned short *) malloc (total * sizeof (short));
4640 for (cnt = total; cnt --;)
4641 data [cnt] = byte_get (edata + cnt * sizeof (short),
4646 for (cnt = 0; cnt < total; cnt += 4)
4649 int check_def, check_need;
4652 printf (" %03x:", cnt);
4654 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4655 switch (data [cnt + j])
4658 fputs (_(" 0 (*local*) "), stdout);
4662 fputs (_(" 1 (*global*) "), stdout);
4666 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4667 data [cnt + j] & 0x8000 ? 'h' : ' ');
4671 if (symbols [cnt + j].st_shndx >= SHN_LORESERVE
4672 || section_headers[symbols [cnt + j].st_shndx].sh_type
4675 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4682 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4684 Elf_Internal_Verneed ivn;
4685 unsigned long offset;
4687 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4692 Elf_Internal_Vernaux ivna;
4693 Elf_External_Verneed evn;
4694 Elf_External_Vernaux evna;
4695 unsigned long a_off;
4697 get_data (&evn, file, offset, sizeof (evn),
4700 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4701 ivn.vn_next = BYTE_GET (evn.vn_next);
4703 a_off = offset + ivn.vn_aux;
4707 get_data (&evna, file, a_off, sizeof (evna),
4708 _("version need aux (2)"));
4710 ivna.vna_next = BYTE_GET (evna.vna_next);
4711 ivna.vna_other = BYTE_GET (evna.vna_other);
4713 a_off += ivna.vna_next;
4715 while (ivna.vna_other != data [cnt + j]
4716 && ivna.vna_next != 0);
4718 if (ivna.vna_other == data [cnt + j])
4720 ivna.vna_name = BYTE_GET (evna.vna_name);
4722 name = strtab + ivna.vna_name;
4723 nn += printf ("(%s%-*s",
4725 12 - (int) strlen (name),
4731 offset += ivn.vn_next;
4733 while (ivn.vn_next);
4736 if (check_def && data [cnt + j] != 0x8001
4737 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4739 Elf_Internal_Verdef ivd;
4740 Elf_External_Verdef evd;
4741 unsigned long offset;
4743 offset = version_info
4744 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4748 get_data (&evd, file, offset, sizeof (evd),
4751 ivd.vd_next = BYTE_GET (evd.vd_next);
4752 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4754 offset += ivd.vd_next;
4756 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4757 && ivd.vd_next != 0);
4759 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4761 Elf_External_Verdaux evda;
4762 Elf_Internal_Verdaux ivda;
4764 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4766 get_data (&evda, file,
4767 offset - ivd.vd_next + ivd.vd_aux,
4768 sizeof (evda), _("version def aux"));
4770 ivda.vda_name = BYTE_GET (evda.vda_name);
4772 name = strtab + ivda.vda_name;
4773 nn += printf ("(%s%-*s",
4775 12 - (int) strlen (name),
4781 printf ("%*c", 18 - nn, ' ');
4799 printf (_("\nNo version information found in this file.\n"));
4805 get_symbol_binding (binding)
4806 unsigned int binding;
4808 static char buff [32];
4812 case STB_LOCAL: return "LOCAL";
4813 case STB_GLOBAL: return "GLOBAL";
4814 case STB_WEAK: return "WEAK";
4816 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4817 sprintf (buff, _("<processor specific>: %d"), binding);
4818 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4819 sprintf (buff, _("<OS specific>: %d"), binding);
4821 sprintf (buff, _("<unknown>: %d"), binding);
4827 get_symbol_type (type)
4830 static char buff [32];
4834 case STT_NOTYPE: return "NOTYPE";
4835 case STT_OBJECT: return "OBJECT";
4836 case STT_FUNC: return "FUNC";
4837 case STT_SECTION: return "SECTION";
4838 case STT_FILE: return "FILE";
4839 case STT_COMMON: return "COMMON";
4841 if (type >= STT_LOPROC && type <= STT_HIPROC)
4843 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4844 return "THUMB_FUNC";
4846 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4849 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4850 return "PARISC_MILLI";
4852 sprintf (buff, _("<processor specific>: %d"), type);
4854 else if (type >= STT_LOOS && type <= STT_HIOS)
4856 if (elf_header.e_machine == EM_PARISC)
4858 if (type == STT_HP_OPAQUE)
4860 if (type == STT_HP_STUB)
4864 sprintf (buff, _("<OS specific>: %d"), type);
4867 sprintf (buff, _("<unknown>: %d"), type);
4873 get_symbol_visibility (visibility)
4874 unsigned int visibility;
4878 case STV_DEFAULT: return "DEFAULT";
4879 case STV_INTERNAL: return "INTERNAL";
4880 case STV_HIDDEN: return "HIDDEN";
4881 case STV_PROTECTED: return "PROTECTED";
4887 get_symbol_index_type (type)
4892 case SHN_UNDEF: return "UND";
4893 case SHN_ABS: return "ABS";
4894 case SHN_COMMON: return "COM";
4896 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4898 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4900 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4904 static char buff [32];
4906 sprintf (buff, "%3d", type);
4913 get_dynamic_data (file, number)
4915 unsigned int number;
4917 unsigned char * e_data;
4920 e_data = (unsigned char *) malloc (number * 4);
4924 error (_("Out of memory\n"));
4928 if (fread (e_data, 4, number, file) != number)
4930 error (_("Unable to read in dynamic data\n"));
4934 i_data = (int *) malloc (number * sizeof (* i_data));
4938 error (_("Out of memory\n"));
4944 i_data [number] = byte_get (e_data + number * 4, 4);
4951 /* Dump the symbol table */
4953 process_symbol_table (file)
4956 Elf32_Internal_Shdr * section;
4957 unsigned char nb [4];
4958 unsigned char nc [4];
4961 int * buckets = NULL;
4962 int * chains = NULL;
4964 if (! do_syms && !do_histogram)
4967 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
4970 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
4972 error (_("Unable to seek to start of dynamic information"));
4976 if (fread (nb, sizeof (nb), 1, file) != 1)
4978 error (_("Failed to read in number of buckets\n"));
4982 if (fread (nc, sizeof (nc), 1, file) != 1)
4984 error (_("Failed to read in number of chains\n"));
4988 nbuckets = byte_get (nb, 4);
4989 nchains = byte_get (nc, 4);
4991 buckets = get_dynamic_data (file, nbuckets);
4992 chains = get_dynamic_data (file, nchains);
4994 if (buckets == NULL || chains == NULL)
4999 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5004 printf (_("\nSymbol table for image:\n"));
5006 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5008 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5010 for (hn = 0; hn < nbuckets; hn++)
5015 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5017 Elf_Internal_Sym * psym;
5019 psym = dynamic_symbols + si;
5021 printf (" %3d %3d: ", si, hn);
5022 print_vma (psym->st_value, LONG_HEX);
5024 print_vma (psym->st_size, DEC_5);
5026 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5027 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5028 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5029 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
5030 printf (" %s\n", dynamic_strings + psym->st_name);
5034 else if (do_syms && !do_using_dynamic)
5038 for (i = 0, section = section_headers;
5039 i < elf_header.e_shnum;
5044 Elf_Internal_Sym * symtab;
5045 Elf_Internal_Sym * psym;
5048 if ( section->sh_type != SHT_SYMTAB
5049 && section->sh_type != SHT_DYNSYM)
5052 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5053 SECTION_NAME (section),
5054 (unsigned long) (section->sh_size / section->sh_entsize));
5056 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5058 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5060 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
5061 section->sh_size / section->sh_entsize);
5065 if (section->sh_link == elf_header.e_shstrndx)
5066 strtab = string_table;
5069 Elf32_Internal_Shdr * string_sec;
5071 string_sec = section_headers + section->sh_link;
5073 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5074 string_sec->sh_size,
5078 for (si = 0, psym = symtab;
5079 si < section->sh_size / section->sh_entsize;
5082 printf ("%6d: ", si);
5083 print_vma (psym->st_value, LONG_HEX);
5085 print_vma (psym->st_size, DEC_5);
5086 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5087 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5088 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5089 printf (" %4s", get_symbol_index_type (psym->st_shndx));
5090 printf (" %s", strtab + psym->st_name);
5092 if (section->sh_type == SHT_DYNSYM &&
5093 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5095 unsigned char data[2];
5096 unsigned short vers_data;
5097 unsigned long offset;
5101 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5104 get_data (&data, file, offset + si * sizeof (vers_data),
5105 sizeof (data), _("version data"));
5107 vers_data = byte_get (data, 2);
5109 is_nobits = psym->st_shndx < SHN_LORESERVE ?
5110 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
5113 check_def = (psym->st_shndx != SHN_UNDEF);
5115 if ((vers_data & 0x8000) || vers_data > 1)
5117 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5118 && (is_nobits || ! check_def))
5120 Elf_External_Verneed evn;
5121 Elf_Internal_Verneed ivn;
5122 Elf_Internal_Vernaux ivna;
5124 /* We must test both. */
5125 offset = version_info
5126 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5130 unsigned long vna_off;
5132 get_data (&evn, file, offset, sizeof (evn),
5135 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5136 ivn.vn_next = BYTE_GET (evn.vn_next);
5138 vna_off = offset + ivn.vn_aux;
5142 Elf_External_Vernaux evna;
5144 get_data (&evna, file, vna_off,
5146 _("version need aux (3)"));
5148 ivna.vna_other = BYTE_GET (evna.vna_other);
5149 ivna.vna_next = BYTE_GET (evna.vna_next);
5150 ivna.vna_name = BYTE_GET (evna.vna_name);
5152 vna_off += ivna.vna_next;
5154 while (ivna.vna_other != vers_data
5155 && ivna.vna_next != 0);
5157 if (ivna.vna_other == vers_data)
5160 offset += ivn.vn_next;
5162 while (ivn.vn_next != 0);
5164 if (ivna.vna_other == vers_data)
5167 strtab + ivna.vna_name, ivna.vna_other);
5170 else if (! is_nobits)
5171 error (_("bad dynamic symbol"));
5178 if (vers_data != 0x8001
5179 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5181 Elf_Internal_Verdef ivd;
5182 Elf_Internal_Verdaux ivda;
5183 Elf_External_Verdaux evda;
5184 unsigned long offset;
5187 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5192 Elf_External_Verdef evd;
5194 get_data (&evd, file, offset, sizeof (evd),
5197 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5198 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5199 ivd.vd_next = BYTE_GET (evd.vd_next);
5201 offset += ivd.vd_next;
5203 while (ivd.vd_ndx != (vers_data & 0x7fff)
5204 && ivd.vd_next != 0);
5206 offset -= ivd.vd_next;
5207 offset += ivd.vd_aux;
5209 get_data (&evda, file, offset, sizeof (evda),
5210 _("version def aux"));
5212 ivda.vda_name = BYTE_GET (evda.vda_name);
5214 if (psym->st_name != ivda.vda_name)
5215 printf ((vers_data & 0x8000)
5217 strtab + ivda.vda_name);
5227 if (strtab != string_table)
5233 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5235 if (do_histogram && buckets != NULL)
5242 int nzero_counts = 0;
5245 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5247 printf (_(" Length Number %% of total Coverage\n"));
5249 lengths = (int *) calloc (nbuckets, sizeof (int));
5250 if (lengths == NULL)
5252 error (_("Out of memory"));
5255 for (hn = 0; hn < nbuckets; ++hn)
5260 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5263 if (maxlength < ++lengths[hn])
5268 counts = (int *) calloc (maxlength + 1, sizeof (int));
5271 error (_("Out of memory"));
5275 for (hn = 0; hn < nbuckets; ++hn)
5276 ++ counts [lengths [hn]];
5280 printf (" 0 %-10d (%5.1f%%)\n",
5281 counts[0], (counts[0] * 100.0) / nbuckets);
5282 for (si = 1; si <= maxlength; ++si)
5284 nzero_counts += counts[si] * si;
5285 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5286 si, counts[si], (counts[si] * 100.0) / nbuckets,
5287 (nzero_counts * 100.0) / nsyms);
5295 if (buckets != NULL)
5305 process_syminfo (file)
5306 FILE * file ATTRIBUTE_UNUSED;
5310 if (dynamic_syminfo == NULL
5312 /* No syminfo, this is ok. */
5315 /* There better should be a dynamic symbol section. */
5316 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5320 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5321 dynamic_syminfo_offset, dynamic_syminfo_nent);
5323 printf (_(" Num: Name BoundTo Flags\n"));
5324 for (i = 0; i < dynamic_syminfo_nent; ++i)
5326 unsigned short int flags = dynamic_syminfo[i].si_flags;
5328 printf ("%4d: %-30s ", i,
5329 dynamic_strings + dynamic_symbols[i].st_name);
5331 switch (dynamic_syminfo[i].si_boundto)
5333 case SYMINFO_BT_SELF:
5334 fputs ("SELF ", stdout);
5336 case SYMINFO_BT_PARENT:
5337 fputs ("PARENT ", stdout);
5340 if (dynamic_syminfo[i].si_boundto > 0
5341 && dynamic_syminfo[i].si_boundto < dynamic_size)
5344 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5346 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5350 if (flags & SYMINFO_FLG_DIRECT)
5352 if (flags & SYMINFO_FLG_PASSTHRU)
5353 printf (" PASSTHRU");
5354 if (flags & SYMINFO_FLG_COPY)
5356 if (flags & SYMINFO_FLG_LAZYLOAD)
5357 printf (" LAZYLOAD");
5365 #ifdef SUPPORT_DISASSEMBLY
5367 disassemble_section (section, file)
5368 Elf32_Internal_Shdr * section;
5371 printf (_("\nAssembly dump of section %s\n"),
5372 SECTION_NAME (section));
5374 /* XXX -- to be done --- XXX */
5381 dump_section (section, file)
5382 Elf32_Internal_Shdr * section;
5385 bfd_size_type bytes;
5387 unsigned char * data;
5388 unsigned char * start;
5390 bytes = section->sh_size;
5394 printf (_("\nSection '%s' has no data to dump.\n"),
5395 SECTION_NAME (section));
5399 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5401 addr = section->sh_addr;
5403 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5416 lbytes = (bytes > 16 ? 16 : bytes);
5418 printf (" 0x%8.8lx ", (unsigned long) addr);
5420 switch (elf_header.e_ident [EI_DATA])
5424 for (j = 15; j >= 0; j --)
5427 printf ("%2.2x", data [j]);
5437 for (j = 0; j < 16; j++)
5440 printf ("%2.2x", data [j]);
5450 for (j = 0; j < lbytes; j++)
5453 if (k >= ' ' && k < 0x80)
5472 static unsigned long int
5473 read_leb128 (data, length_return, sign)
5474 unsigned char * data;
5475 int * length_return;
5478 unsigned long int result = 0;
5479 unsigned int num_read = 0;
5488 result |= (byte & 0x7f) << shift;
5493 while (byte & 0x80);
5495 if (length_return != NULL)
5496 * length_return = num_read;
5498 if (sign && (shift < 32) && (byte & 0x40))
5499 result |= -1 << shift;
5504 typedef struct State_Machine_Registers
5506 unsigned long address;
5509 unsigned int column;
5513 /* This variable hold the number of the last entry seen
5514 in the File Table. */
5515 unsigned int last_file_entry;
5518 static SMR state_machine_regs;
5521 reset_state_machine (is_stmt)
5524 state_machine_regs.address = 0;
5525 state_machine_regs.file = 1;
5526 state_machine_regs.line = 1;
5527 state_machine_regs.column = 0;
5528 state_machine_regs.is_stmt = is_stmt;
5529 state_machine_regs.basic_block = 0;
5530 state_machine_regs.end_sequence = 0;
5531 state_machine_regs.last_file_entry = 0;
5534 /* Handled an extend line op. Returns true if this is the end
5537 process_extended_line_op (data, is_stmt, pointer_size)
5538 unsigned char * data;
5542 unsigned char op_code;
5545 unsigned char * name;
5548 len = read_leb128 (data, & bytes_read, 0);
5553 warn (_("badly formed extended line op encountered!"));
5558 op_code = * data ++;
5560 printf (_(" Extended opcode %d: "), op_code);
5564 case DW_LNE_end_sequence:
5565 printf (_("End of Sequence\n\n"));
5566 reset_state_machine (is_stmt);
5569 case DW_LNE_set_address:
5570 adr = byte_get (data, pointer_size);
5571 printf (_("set Address to 0x%lx\n"), adr);
5572 state_machine_regs.address = adr;
5575 case DW_LNE_define_file:
5576 printf (_(" define new File Table entry\n"));
5577 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5579 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5581 data += strlen ((char *) data) + 1;
5582 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5584 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5586 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5587 printf (_("%s\n\n"), name);
5591 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5598 /* Size of pointers in the .debug_line section. This information is not
5599 really present in that section. It's obtained before dumping the debug
5600 sections by doing some pre-scan of the .debug_info section. */
5601 static int debug_line_pointer_size = 4;
5604 display_debug_lines (section, start, file)
5605 Elf32_Internal_Shdr * section;
5606 unsigned char * start;
5607 FILE * file ATTRIBUTE_UNUSED;
5609 DWARF2_External_LineInfo * external;
5610 DWARF2_Internal_LineInfo info;
5611 unsigned char * standard_opcodes;
5612 unsigned char * data = start;
5613 unsigned char * end = start + section->sh_size;
5614 unsigned char * end_of_sequence;
5617 printf (_("\nDump of debug contents of section %s:\n\n"),
5618 SECTION_NAME (section));
5622 external = (DWARF2_External_LineInfo *) data;
5624 /* Check the length of the block. */
5625 info.li_length = BYTE_GET (external->li_length);
5626 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5629 (_("The line info appears to be corrupt - the section is too small\n"));
5633 /* Check its version number. */
5634 info.li_version = BYTE_GET (external->li_version);
5635 if (info.li_version != 2)
5637 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5641 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5642 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5643 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5644 info.li_line_base = BYTE_GET (external->li_line_base);
5645 info.li_line_range = BYTE_GET (external->li_line_range);
5646 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5648 /* Sign extend the line base field. */
5649 info.li_line_base <<= 24;
5650 info.li_line_base >>= 24;
5652 printf (_(" Length: %ld\n"), info.li_length);
5653 printf (_(" DWARF Version: %d\n"), info.li_version);
5654 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
5655 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5656 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5657 printf (_(" Line Base: %d\n"), info.li_line_base);
5658 printf (_(" Line Range: %d\n"), info.li_line_range);
5659 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5661 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5663 reset_state_machine (info.li_default_is_stmt);
5665 /* Display the contents of the Opcodes table. */
5666 standard_opcodes = data + sizeof (* external);
5668 printf (_("\n Opcodes:\n"));
5670 for (i = 1; i < info.li_opcode_base; i++)
5671 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5673 /* Display the contents of the Directory table. */
5674 data = standard_opcodes + info.li_opcode_base - 1;
5677 printf (_("\n The Directory Table is empty.\n"));
5680 printf (_("\n The Directory Table:\n"));
5684 printf (_(" %s\n"), data);
5686 data += strlen ((char *) data) + 1;
5690 /* Skip the NUL at the end of the table. */
5693 /* Display the contents of the File Name table. */
5695 printf (_("\n The File Name Table is empty.\n"));
5698 printf (_("\n The File Name Table:\n"));
5699 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5703 unsigned char * name;
5706 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5709 data += strlen ((char *) data) + 1;
5711 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5713 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5715 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5717 printf (_("%s\n"), name);
5721 /* Skip the NUL at the end of the table. */
5724 /* Now display the statements. */
5725 printf (_("\n Line Number Statements:\n"));
5728 while (data < end_of_sequence)
5730 unsigned char op_code;
5734 op_code = * data ++;
5738 case DW_LNS_extended_op:
5739 data += process_extended_line_op (data, info.li_default_is_stmt,
5740 debug_line_pointer_size);
5744 printf (_(" Copy\n"));
5747 case DW_LNS_advance_pc:
5748 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5750 state_machine_regs.address += adv;
5751 printf (_(" Advance PC by %d to %lx\n"), adv,
5752 state_machine_regs.address);
5755 case DW_LNS_advance_line:
5756 adv = read_leb128 (data, & bytes_read, 1);
5758 state_machine_regs.line += adv;
5759 printf (_(" Advance Line by %d to %d\n"), adv,
5760 state_machine_regs.line);
5763 case DW_LNS_set_file:
5764 adv = read_leb128 (data, & bytes_read, 0);
5766 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5768 state_machine_regs.file = adv;
5771 case DW_LNS_set_column:
5772 adv = read_leb128 (data, & bytes_read, 0);
5774 printf (_(" Set column to %d\n"), adv);
5775 state_machine_regs.column = adv;
5778 case DW_LNS_negate_stmt:
5779 adv = state_machine_regs.is_stmt;
5781 printf (_(" Set is_stmt to %d\n"), adv);
5782 state_machine_regs.is_stmt = adv;
5785 case DW_LNS_set_basic_block:
5786 printf (_(" Set basic block\n"));
5787 state_machine_regs.basic_block = 1;
5790 case DW_LNS_const_add_pc:
5791 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5792 * info.li_min_insn_length);
5793 state_machine_regs.address += adv;
5794 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5795 state_machine_regs.address);
5798 case DW_LNS_fixed_advance_pc:
5799 adv = byte_get (data, 2);
5801 state_machine_regs.address += adv;
5802 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5803 adv, state_machine_regs.address);
5807 op_code -= info.li_opcode_base;
5808 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5809 state_machine_regs.address += adv;
5810 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5811 op_code, adv, state_machine_regs.address);
5812 adv = (op_code % info.li_line_range) + info.li_line_base;
5813 state_machine_regs.line += adv;
5814 printf (_(" and Line by %d to %d\n"),
5815 adv, state_machine_regs.line);
5826 display_debug_pubnames (section, start, file)
5827 Elf32_Internal_Shdr * section;
5828 unsigned char * start;
5829 FILE * file ATTRIBUTE_UNUSED;
5831 DWARF2_External_PubNames * external;
5832 DWARF2_Internal_PubNames pubnames;
5833 unsigned char * end;
5835 end = start + section->sh_size;
5837 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5841 unsigned char * data;
5842 unsigned long offset;
5844 external = (DWARF2_External_PubNames *) start;
5846 pubnames.pn_length = BYTE_GET (external->pn_length);
5847 pubnames.pn_version = BYTE_GET (external->pn_version);
5848 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5849 pubnames.pn_size = BYTE_GET (external->pn_size);
5851 data = start + sizeof (* external);
5852 start += pubnames.pn_length + sizeof (external->pn_length);
5854 if (pubnames.pn_version != 2)
5856 static int warned = 0;
5860 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5867 printf (_(" Length: %ld\n"),
5868 pubnames.pn_length);
5869 printf (_(" Version: %d\n"),
5870 pubnames.pn_version);
5871 printf (_(" Offset into .debug_info section: %ld\n"),
5872 pubnames.pn_offset);
5873 printf (_(" Size of area in .debug_info section: %ld\n"),
5876 printf (_("\n Offset\tName\n"));
5880 offset = byte_get (data, 4);
5885 printf (" %ld\t\t%s\n", offset, data);
5886 data += strlen ((char *) data) + 1;
5889 while (offset != 0);
5902 case DW_TAG_padding: return "DW_TAG_padding";
5903 case DW_TAG_array_type: return "DW_TAG_array_type";
5904 case DW_TAG_class_type: return "DW_TAG_class_type";
5905 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5906 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5907 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5908 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5909 case DW_TAG_label: return "DW_TAG_label";
5910 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5911 case DW_TAG_member: return "DW_TAG_member";
5912 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5913 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5914 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5915 case DW_TAG_string_type: return "DW_TAG_string_type";
5916 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5917 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5918 case DW_TAG_typedef: return "DW_TAG_typedef";
5919 case DW_TAG_union_type: return "DW_TAG_union_type";
5920 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5921 case DW_TAG_variant: return "DW_TAG_variant";
5922 case DW_TAG_common_block: return "DW_TAG_common_block";
5923 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5924 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5925 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5926 case DW_TAG_module: return "DW_TAG_module";
5927 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5928 case DW_TAG_set_type: return "DW_TAG_set_type";
5929 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5930 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5931 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5932 case DW_TAG_base_type: return "DW_TAG_base_type";
5933 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5934 case DW_TAG_const_type: return "DW_TAG_const_type";
5935 case DW_TAG_constant: return "DW_TAG_constant";
5936 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5937 case DW_TAG_file_type: return "DW_TAG_file_type";
5938 case DW_TAG_friend: return "DW_TAG_friend";
5939 case DW_TAG_namelist: return "DW_TAG_namelist";
5940 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5941 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5942 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5943 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5944 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5945 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5946 case DW_TAG_try_block: return "DW_TAG_try_block";
5947 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5948 case DW_TAG_variable: return "DW_TAG_variable";
5949 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5950 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5951 case DW_TAG_format_label: return "DW_TAG_format_label";
5952 case DW_TAG_function_template: return "DW_TAG_function_template";
5953 case DW_TAG_class_template: return "DW_TAG_class_template";
5954 /* DWARF 2.1 values. */
5955 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
5956 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
5957 case DW_TAG_interface_type: return "DW_TAG_interface_type";
5958 case DW_TAG_namespace: return "DW_TAG_namespace";
5959 case DW_TAG_imported_module: return "DW_TAG_imported_module";
5960 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
5961 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
5962 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
5965 static char buffer [100];
5967 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
5974 get_AT_name (attribute)
5975 unsigned long attribute;
5979 case DW_AT_sibling: return "DW_AT_sibling";
5980 case DW_AT_location: return "DW_AT_location";
5981 case DW_AT_name: return "DW_AT_name";
5982 case DW_AT_ordering: return "DW_AT_ordering";
5983 case DW_AT_subscr_data: return "DW_AT_subscr_data";
5984 case DW_AT_byte_size: return "DW_AT_byte_size";
5985 case DW_AT_bit_offset: return "DW_AT_bit_offset";
5986 case DW_AT_bit_size: return "DW_AT_bit_size";
5987 case DW_AT_element_list: return "DW_AT_element_list";
5988 case DW_AT_stmt_list: return "DW_AT_stmt_list";
5989 case DW_AT_low_pc: return "DW_AT_low_pc";
5990 case DW_AT_high_pc: return "DW_AT_high_pc";
5991 case DW_AT_language: return "DW_AT_language";
5992 case DW_AT_member: return "DW_AT_member";
5993 case DW_AT_discr: return "DW_AT_discr";
5994 case DW_AT_discr_value: return "DW_AT_discr_value";
5995 case DW_AT_visibility: return "DW_AT_visibility";
5996 case DW_AT_import: return "DW_AT_import";
5997 case DW_AT_string_length: return "DW_AT_string_length";
5998 case DW_AT_common_reference: return "DW_AT_common_reference";
5999 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6000 case DW_AT_const_value: return "DW_AT_const_value";
6001 case DW_AT_containing_type: return "DW_AT_containing_type";
6002 case DW_AT_default_value: return "DW_AT_default_value";
6003 case DW_AT_inline: return "DW_AT_inline";
6004 case DW_AT_is_optional: return "DW_AT_is_optional";
6005 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6006 case DW_AT_producer: return "DW_AT_producer";
6007 case DW_AT_prototyped: return "DW_AT_prototyped";
6008 case DW_AT_return_addr: return "DW_AT_return_addr";
6009 case DW_AT_start_scope: return "DW_AT_start_scope";
6010 case DW_AT_stride_size: return "DW_AT_stride_size";
6011 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6012 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6013 case DW_AT_accessibility: return "DW_AT_accessibility";
6014 case DW_AT_address_class: return "DW_AT_address_class";
6015 case DW_AT_artificial: return "DW_AT_artificial";
6016 case DW_AT_base_types: return "DW_AT_base_types";
6017 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6018 case DW_AT_count: return "DW_AT_count";
6019 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6020 case DW_AT_decl_column: return "DW_AT_decl_column";
6021 case DW_AT_decl_file: return "DW_AT_decl_file";
6022 case DW_AT_decl_line: return "DW_AT_decl_line";
6023 case DW_AT_declaration: return "DW_AT_declaration";
6024 case DW_AT_discr_list: return "DW_AT_discr_list";
6025 case DW_AT_encoding: return "DW_AT_encoding";
6026 case DW_AT_external: return "DW_AT_external";
6027 case DW_AT_frame_base: return "DW_AT_frame_base";
6028 case DW_AT_friend: return "DW_AT_friend";
6029 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6030 case DW_AT_macro_info: return "DW_AT_macro_info";
6031 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6032 case DW_AT_priority: return "DW_AT_priority";
6033 case DW_AT_segment: return "DW_AT_segment";
6034 case DW_AT_specification: return "DW_AT_specification";
6035 case DW_AT_static_link: return "DW_AT_static_link";
6036 case DW_AT_type: return "DW_AT_type";
6037 case DW_AT_use_location: return "DW_AT_use_location";
6038 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6039 case DW_AT_virtuality: return "DW_AT_virtuality";
6040 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6041 /* DWARF 2.1 values. */
6042 case DW_AT_allocated: return "DW_AT_allocated";
6043 case DW_AT_associated: return "DW_AT_associated";
6044 case DW_AT_data_location: return "DW_AT_data_location";
6045 case DW_AT_stride: return "DW_AT_stride";
6046 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6047 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6048 case DW_AT_extension: return "DW_AT_extension";
6049 case DW_AT_ranges: return "DW_AT_ranges";
6050 case DW_AT_trampoline: return "DW_AT_trampoline";
6051 case DW_AT_call_column: return "DW_AT_call_column";
6052 case DW_AT_call_file: return "DW_AT_call_file";
6053 case DW_AT_call_line: return "DW_AT_call_line";
6054 /* SGI/MIPS extensions. */
6055 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6056 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6057 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6058 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6059 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6060 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6061 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6062 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6063 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6064 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6065 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6066 /* GNU extensions. */
6067 case DW_AT_sf_names: return "DW_AT_sf_names";
6068 case DW_AT_src_info: return "DW_AT_src_info";
6069 case DW_AT_mac_info: return "DW_AT_mac_info";
6070 case DW_AT_src_coords: return "DW_AT_src_coords";
6071 case DW_AT_body_begin: return "DW_AT_body_begin";
6072 case DW_AT_body_end: return "DW_AT_body_end";
6075 static char buffer [100];
6077 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6084 get_FORM_name (form)
6089 case DW_FORM_addr: return "DW_FORM_addr";
6090 case DW_FORM_block2: return "DW_FORM_block2";
6091 case DW_FORM_block4: return "DW_FORM_block4";
6092 case DW_FORM_data2: return "DW_FORM_data2";
6093 case DW_FORM_data4: return "DW_FORM_data4";
6094 case DW_FORM_data8: return "DW_FORM_data8";
6095 case DW_FORM_string: return "DW_FORM_string";
6096 case DW_FORM_block: return "DW_FORM_block";
6097 case DW_FORM_block1: return "DW_FORM_block1";
6098 case DW_FORM_data1: return "DW_FORM_data1";
6099 case DW_FORM_flag: return "DW_FORM_flag";
6100 case DW_FORM_sdata: return "DW_FORM_sdata";
6101 case DW_FORM_strp: return "DW_FORM_strp";
6102 case DW_FORM_udata: return "DW_FORM_udata";
6103 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6104 case DW_FORM_ref1: return "DW_FORM_ref1";
6105 case DW_FORM_ref2: return "DW_FORM_ref2";
6106 case DW_FORM_ref4: return "DW_FORM_ref4";
6107 case DW_FORM_ref8: return "DW_FORM_ref8";
6108 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6109 case DW_FORM_indirect: return "DW_FORM_indirect";
6112 static char buffer [100];
6114 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6120 /* FIXME: There are better and more effiecint ways to handle
6121 these structures. For now though, I just want something that
6122 is simple to implement. */
6123 typedef struct abbrev_attr
6125 unsigned long attribute;
6127 struct abbrev_attr * next;
6131 typedef struct abbrev_entry
6133 unsigned long entry;
6136 struct abbrev_attr * first_attr;
6137 struct abbrev_attr * last_attr;
6138 struct abbrev_entry * next;
6142 static abbrev_entry * first_abbrev = NULL;
6143 static abbrev_entry * last_abbrev = NULL;
6146 free_abbrevs PARAMS ((void))
6148 abbrev_entry * abbrev;
6150 for (abbrev = first_abbrev; abbrev;)
6152 abbrev_entry * next = abbrev->next;
6155 for (attr = abbrev->first_attr; attr;)
6157 abbrev_attr * next = attr->next;
6167 last_abbrev = first_abbrev = NULL;
6171 add_abbrev (number, tag, children)
6172 unsigned long number;
6176 abbrev_entry * entry;
6178 entry = (abbrev_entry *) malloc (sizeof (* entry));
6184 entry->entry = number;
6186 entry->children = children;
6187 entry->first_attr = NULL;
6188 entry->last_attr = NULL;
6191 if (first_abbrev == NULL)
6192 first_abbrev = entry;
6194 last_abbrev->next = entry;
6196 last_abbrev = entry;
6200 add_abbrev_attr (attribute, form)
6201 unsigned long attribute;
6206 attr = (abbrev_attr *) malloc (sizeof (* attr));
6212 attr->attribute = attribute;
6216 if (last_abbrev->first_attr == NULL)
6217 last_abbrev->first_attr = attr;
6219 last_abbrev->last_attr->next = attr;
6221 last_abbrev->last_attr = attr;
6224 /* Processes the (partial) contents of a .debug_abbrev section.
6225 Returns NULL if the end of the section was encountered.
6226 Returns the address after the last byte read if the end of
6227 an abbreviation set was found. */
6229 static unsigned char *
6230 process_abbrev_section (start, end)
6231 unsigned char * start;
6232 unsigned char * end;
6234 if (first_abbrev != NULL)
6240 unsigned long entry;
6242 unsigned long attribute;
6245 entry = read_leb128 (start, & bytes_read, 0);
6246 start += bytes_read;
6248 /* A single zero is supposed to end the section according
6249 to the standard. If there's more, then signal that to
6252 return start == end ? NULL : start;
6254 tag = read_leb128 (start, & bytes_read, 0);
6255 start += bytes_read;
6257 children = * start ++;
6259 add_abbrev (entry, tag, children);
6265 attribute = read_leb128 (start, & bytes_read, 0);
6266 start += bytes_read;
6268 form = read_leb128 (start, & bytes_read, 0);
6269 start += bytes_read;
6272 add_abbrev_attr (attribute, form);
6274 while (attribute != 0);
6282 display_debug_macinfo (section, start, file)
6283 Elf32_Internal_Shdr * section;
6284 unsigned char * start;
6285 FILE * file ATTRIBUTE_UNUSED;
6287 unsigned char * end = start + section->sh_size;
6288 unsigned char * curr = start;
6289 unsigned int bytes_read;
6290 enum dwarf_macinfo_record_type op;
6292 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6296 unsigned int lineno;
6297 const char * string;
6304 case DW_MACINFO_start_file:
6306 unsigned int filenum;
6308 lineno = read_leb128 (curr, & bytes_read, 0);
6310 filenum = read_leb128 (curr, & bytes_read, 0);
6313 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6317 case DW_MACINFO_end_file:
6318 printf (_(" DW_MACINFO_end_file\n"));
6321 case DW_MACINFO_define:
6322 lineno = read_leb128 (curr, & bytes_read, 0);
6325 curr += strlen (string) + 1;
6326 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6329 case DW_MACINFO_undef:
6330 lineno = read_leb128 (curr, & bytes_read, 0);
6333 curr += strlen (string) + 1;
6334 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6337 case DW_MACINFO_vendor_ext:
6339 unsigned int constant;
6341 constant = read_leb128 (curr, & bytes_read, 0);
6344 curr += strlen (string) + 1;
6345 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6356 display_debug_abbrev (section, start, file)
6357 Elf32_Internal_Shdr * section;
6358 unsigned char * start;
6359 FILE * file ATTRIBUTE_UNUSED;
6361 abbrev_entry * entry;
6362 unsigned char * end = start + section->sh_size;
6364 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6368 start = process_abbrev_section (start, end);
6370 printf (_(" Number TAG\n"));
6372 for (entry = first_abbrev; entry; entry = entry->next)
6376 printf (_(" %ld %s [%s]\n"),
6378 get_TAG_name (entry->tag),
6379 entry->children ? _("has children") : _("no children"));
6381 for (attr = entry->first_attr; attr; attr = attr->next)
6383 printf (_(" %-18s %s\n"),
6384 get_AT_name (attr->attribute),
6385 get_FORM_name (attr->form));
6397 static unsigned char *
6398 display_block (data, length)
6399 unsigned char * data;
6400 unsigned long length;
6402 printf (_(" %lu byte block: "), length);
6405 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6411 decode_location_expression (data, pointer_size, length)
6412 unsigned char * data;
6413 unsigned int pointer_size;
6414 unsigned long length;
6418 unsigned long uvalue;
6419 unsigned char * end = data + length;
6428 printf ("DW_OP_addr: %lx",
6429 (unsigned long) byte_get (data, pointer_size));
6430 data += pointer_size;
6433 printf ("DW_OP_deref");
6436 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6439 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6442 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6446 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6450 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6454 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6458 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6459 (unsigned long) byte_get (data + 4, 4));
6463 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6464 (long) byte_get (data + 4, 4));
6468 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6472 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6476 printf ("DW_OP_dup");
6479 printf ("DW_OP_drop");
6482 printf ("DW_OP_over");
6485 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6488 printf ("DW_OP_swap");
6491 printf ("DW_OP_rot");
6494 printf ("DW_OP_xderef");
6497 printf ("DW_OP_abs");
6500 printf ("DW_OP_and");
6503 printf ("DW_OP_div");
6506 printf ("DW_OP_minus");
6509 printf ("DW_OP_mod");
6512 printf ("DW_OP_mul");
6515 printf ("DW_OP_neg");
6518 printf ("DW_OP_not");
6521 printf ("DW_OP_or");
6524 printf ("DW_OP_plus");
6526 case DW_OP_plus_uconst:
6527 printf ("DW_OP_plus_uconst: %lu",
6528 read_leb128 (data, &bytes_read, 0));
6532 printf ("DW_OP_shl");
6535 printf ("DW_OP_shr");
6538 printf ("DW_OP_shra");
6541 printf ("DW_OP_xor");
6544 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6548 printf ("DW_OP_eq");
6551 printf ("DW_OP_ge");
6554 printf ("DW_OP_gt");
6557 printf ("DW_OP_le");
6560 printf ("DW_OP_lt");
6563 printf ("DW_OP_ne");
6566 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6602 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6637 printf ("DW_OP_reg%d", op - DW_OP_reg0);
6672 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6673 read_leb128 (data, &bytes_read, 1));
6678 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
6682 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
6686 uvalue = read_leb128 (data, &bytes_read, 0);
6688 printf ("DW_OP_bregx: %lu %ld", uvalue,
6689 read_leb128 (data, &bytes_read, 1));
6693 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6696 case DW_OP_deref_size:
6697 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6699 case DW_OP_xderef_size:
6700 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6703 printf ("DW_OP_nop");
6706 /* DWARF 2.1 extensions. */
6707 case DW_OP_push_object_address:
6708 printf ("DW_OP_push_object_address");
6711 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
6715 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
6719 printf ("DW_OP_calli");
6723 if (op >= DW_OP_lo_user
6724 && op <= DW_OP_hi_user)
6725 printf (_("(User defined location op)"));
6727 printf (_("(Unknown location op)"));
6728 /* No way to tell where the next op is, so just bail. */
6732 /* Separate the ops. */
6738 static unsigned char *
6739 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
6740 unsigned long attribute;
6742 unsigned char * data;
6743 unsigned long cu_offset;
6744 unsigned long pointer_size;
6746 unsigned long uvalue = 0;
6747 unsigned char * block_start = NULL;
6750 printf (" %-18s:", get_AT_name (attribute));
6757 case DW_FORM_ref_addr:
6759 uvalue = byte_get (data, pointer_size);
6760 data += pointer_size;
6766 uvalue = byte_get (data ++, 1);
6771 uvalue = byte_get (data, 2);
6777 uvalue = byte_get (data, 4);
6782 uvalue = read_leb128 (data, & bytes_read, 1);
6786 case DW_FORM_ref_udata:
6788 uvalue = read_leb128 (data, & bytes_read, 0);
6795 case DW_FORM_ref_addr:
6796 printf (" <#%lx>", uvalue);
6802 case DW_FORM_ref_udata:
6803 printf (" <%lx>", uvalue + cu_offset);
6807 printf (" %#lx", uvalue);
6815 printf (" %ld", uvalue);
6820 uvalue = byte_get (data, 4);
6821 printf (" %lx", uvalue);
6822 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6826 case DW_FORM_string:
6827 printf (" %s", data);
6828 data += strlen ((char *) data) + 1;
6832 uvalue = read_leb128 (data, & bytes_read, 0);
6833 block_start = data + bytes_read;
6834 data = display_block (block_start, uvalue);
6837 case DW_FORM_block1:
6838 uvalue = byte_get (data, 1);
6839 block_start = data + 1;
6840 data = display_block (block_start, uvalue);
6843 case DW_FORM_block2:
6844 uvalue = byte_get (data, 2);
6845 block_start = data + 2;
6846 data = display_block (block_start, uvalue);
6849 case DW_FORM_block4:
6850 uvalue = byte_get (data, 4);
6851 block_start = data + 4;
6852 data = display_block (block_start, uvalue);
6856 case DW_FORM_indirect:
6857 warn (_("Unable to handle FORM: %d"), form);
6861 warn (_("Unrecognised form: %d"), form);
6865 /* For some attributes we can display futher information. */
6874 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6875 case DW_INL_inlined: printf (_("(inlined)")); break;
6876 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6877 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6878 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6882 case DW_AT_language:
6885 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6886 case DW_LANG_C89: printf ("(ANSI C)"); break;
6887 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6888 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6889 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6890 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6891 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6892 case DW_LANG_Ada83: printf ("(Ada)"); break;
6893 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6894 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6895 /* DWARF 2.1 values. */
6896 case DW_LANG_C99: printf ("(ANSI C99)"); break;
6897 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
6898 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
6899 /* MIPS extension. */
6900 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6901 default: printf ("(Unknown: %lx)", uvalue); break;
6905 case DW_AT_encoding:
6908 case DW_ATE_void: printf ("(void)"); break;
6909 case DW_ATE_address: printf ("(machine address)"); break;
6910 case DW_ATE_boolean: printf ("(boolean)"); break;
6911 case DW_ATE_complex_float: printf ("(complex float)"); break;
6912 case DW_ATE_float: printf ("(float)"); break;
6913 case DW_ATE_signed: printf ("(signed)"); break;
6914 case DW_ATE_signed_char: printf ("(signed char)"); break;
6915 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6916 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6917 /* DWARF 2.1 value. */
6918 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
6920 if (uvalue >= DW_ATE_lo_user
6921 && uvalue <= DW_ATE_hi_user)
6922 printf ("(user defined type)");
6924 printf ("(unknown type)");
6929 case DW_AT_accessibility:
6932 case DW_ACCESS_public: printf ("(public)"); break;
6933 case DW_ACCESS_protected: printf ("(protected)"); break;
6934 case DW_ACCESS_private: printf ("(private)"); break;
6935 default: printf ("(unknown accessibility)"); break;
6939 case DW_AT_visibility:
6942 case DW_VIS_local: printf ("(local)"); break;
6943 case DW_VIS_exported: printf ("(exported)"); break;
6944 case DW_VIS_qualified: printf ("(qualified)"); break;
6945 default: printf ("(unknown visibility)"); break;
6949 case DW_AT_virtuality:
6952 case DW_VIRTUALITY_none: printf ("(none)"); break;
6953 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6954 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6955 default: printf ("(unknown virtuality)"); break;
6959 case DW_AT_identifier_case:
6962 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6963 case DW_ID_up_case: printf ("(up_case)"); break;
6964 case DW_ID_down_case: printf ("(down_case)"); break;
6965 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6966 default: printf ("(unknown case)"); break;
6970 case DW_AT_calling_convention:
6973 case DW_CC_normal: printf ("(normal)"); break;
6974 case DW_CC_program: printf ("(program)"); break;
6975 case DW_CC_nocall: printf ("(nocall)"); break;
6977 if (uvalue >= DW_CC_lo_user
6978 && uvalue <= DW_CC_hi_user)
6979 printf ("(user defined)");
6981 printf ("(unknown convention)");
6985 case DW_AT_ordering:
6988 case -1: printf ("(undefined)"); break;
6989 case 0: printf ("(row major)"); break;
6990 case 1: printf ("(column major)"); break;
6994 case DW_AT_frame_base:
6995 case DW_AT_location:
6996 case DW_AT_data_member_location:
6997 case DW_AT_vtable_elem_location:
6998 case DW_AT_allocated:
6999 case DW_AT_associated:
7000 case DW_AT_data_location:
7002 case DW_AT_upper_bound:
7003 case DW_AT_lower_bound:
7007 decode_location_expression (block_start, pointer_size, uvalue);
7021 display_debug_info (section, start, file)
7022 Elf32_Internal_Shdr * section;
7023 unsigned char * start;
7026 unsigned char * end = start + section->sh_size;
7027 unsigned char * section_begin = start;
7029 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7033 DWARF2_External_CompUnit * external;
7034 DWARF2_Internal_CompUnit compunit;
7035 Elf32_Internal_Shdr * relsec;
7036 unsigned char * tags;
7039 unsigned long cu_offset;
7041 external = (DWARF2_External_CompUnit *) start;
7043 compunit.cu_length = BYTE_GET (external->cu_length);
7044 compunit.cu_version = BYTE_GET (external->cu_version);
7045 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7046 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7048 /* Check for RELA relocations in the abbrev_offset address, and
7050 for (relsec = section_headers;
7051 relsec < section_headers + elf_header.e_shnum;
7054 unsigned long nrelas, nsyms;
7055 Elf_Internal_Rela *rela, *rp;
7056 Elf32_Internal_Shdr *symsec;
7057 Elf_Internal_Sym *symtab;
7058 Elf_Internal_Sym *sym;
7060 if (relsec->sh_type != SHT_RELA
7061 || section_headers + relsec->sh_info != section)
7064 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7068 symsec = section_headers + relsec->sh_link;
7069 nsyms = symsec->sh_size / symsec->sh_entsize;
7070 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
7072 for (rp = rela; rp < rela + nrelas; ++rp)
7075 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7081 sym = symtab + ELF32_R_SYM (rp->r_info);
7083 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7085 warn (_("Skipping unexpected symbol type %u"),
7086 ELF32_ST_TYPE (sym->st_info));
7092 sym = symtab + ELF64_R_SYM (rp->r_info);
7094 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7096 warn (_("Skipping unexpected symbol type %u"),
7097 ELF64_ST_TYPE (sym->st_info));
7102 compunit.cu_abbrev_offset += rp->r_addend;
7110 tags = start + sizeof (* external);
7111 cu_offset = start - section_begin;
7112 start += compunit.cu_length + sizeof (external->cu_length);
7114 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7115 printf (_(" Length: %ld\n"), compunit.cu_length);
7116 printf (_(" Version: %d\n"), compunit.cu_version);
7117 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7118 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7120 if (compunit.cu_version != 2)
7122 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7126 if (first_abbrev != NULL)
7129 /* Read in the abbrevs used by this compilation unit. */
7132 Elf32_Internal_Shdr * sec;
7133 unsigned char * begin;
7135 /* Locate the .debug_abbrev section and process it. */
7136 for (i = 0, sec = section_headers;
7137 i < elf_header.e_shnum;
7139 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7142 if (i == -1 || sec->sh_size == 0)
7144 warn (_("Unable to locate .debug_abbrev section!\n"));
7148 begin = ((unsigned char *)
7149 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7150 _("debug_abbrev section data")));
7154 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7155 begin + sec->sh_size);
7161 while (tags < start)
7164 unsigned long abbrev_number;
7165 abbrev_entry * entry;
7168 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7171 /* A null DIE marks the end of a list of children. */
7172 if (abbrev_number == 0)
7178 /* Scan through the abbreviation list until we reach the
7180 for (entry = first_abbrev;
7181 entry && entry->entry != abbrev_number;
7182 entry = entry->next)
7187 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7192 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
7193 level, tags - section_begin - bytes_read,
7195 get_TAG_name (entry->tag));
7197 for (attr = entry->first_attr; attr; attr = attr->next)
7198 tags = read_and_display_attr (attr->attribute,
7201 compunit.cu_pointer_size);
7203 if (entry->children)
7214 display_debug_aranges (section, start, file)
7215 Elf32_Internal_Shdr * section;
7216 unsigned char * start;
7217 FILE * file ATTRIBUTE_UNUSED;
7219 unsigned char * end = start + section->sh_size;
7221 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7225 DWARF2_External_ARange * external;
7226 DWARF2_Internal_ARange arange;
7227 unsigned char * ranges;
7228 unsigned long length;
7229 unsigned long address;
7232 external = (DWARF2_External_ARange *) start;
7234 arange.ar_length = BYTE_GET (external->ar_length);
7235 arange.ar_version = BYTE_GET (external->ar_version);
7236 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7237 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7238 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7240 if (arange.ar_version != 2)
7242 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7246 printf (_(" Length: %ld\n"), arange.ar_length);
7247 printf (_(" Version: %d\n"), arange.ar_version);
7248 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7249 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7250 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7252 printf (_("\n Address Length\n"));
7254 ranges = start + sizeof (* external);
7256 /* Must pad to an alignment boundary that is twice the pointer size. */
7257 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7259 ranges += (2 * arange.ar_pointer_size) - excess;
7263 address = byte_get (ranges, arange.ar_pointer_size);
7265 ranges += arange.ar_pointer_size;
7267 length = byte_get (ranges, arange.ar_pointer_size);
7269 ranges += arange.ar_pointer_size;
7271 /* A pair of zeros marks the end of the list. */
7272 if (address == 0 && length == 0)
7275 printf (" %8.8lx %lu\n", address, length);
7278 start += arange.ar_length + sizeof (external->ar_length);
7286 typedef struct Frame_Chunk
7288 struct Frame_Chunk * next;
7289 unsigned char * chunk_start;
7291 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7292 short int * col_type;
7294 char * augmentation;
7295 unsigned int code_factor;
7297 unsigned long pc_begin;
7298 unsigned long pc_range;
7302 unsigned char fde_encoding;
7306 /* A marker for a col_type that means this column was never referenced
7307 in the frame info. */
7308 #define DW_CFA_unreferenced (-1)
7310 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7311 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7312 static int size_of_encoded_value PARAMS ((int));
7315 frame_need_space (fc, reg)
7319 int prev = fc->ncols;
7321 if (reg < fc->ncols)
7324 fc->ncols = reg + 1;
7325 fc->col_type = (short int *) xrealloc (fc->col_type,
7326 fc->ncols * sizeof (short int));
7327 fc->col_offset = (int *) xrealloc (fc->col_offset,
7328 fc->ncols * sizeof (int));
7330 while (prev < fc->ncols)
7332 fc->col_type[prev] = DW_CFA_unreferenced;
7333 fc->col_offset[prev] = 0;
7339 frame_display_row (fc, need_col_headers, max_regs)
7341 int * need_col_headers;
7347 if (* max_regs < fc->ncols)
7348 * max_regs = fc->ncols;
7350 if (* need_col_headers)
7352 * need_col_headers = 0;
7354 printf (" LOC CFA ");
7356 for (r = 0; r < * max_regs; r++)
7357 if (fc->col_type[r] != DW_CFA_unreferenced)
7362 printf ("r%-4d", r);
7368 printf ("%08lx ", fc->pc_begin);
7369 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7370 printf ("%-8s ", tmp);
7372 for (r = 0; r < fc->ncols; r++)
7374 if (fc->col_type[r] != DW_CFA_unreferenced)
7376 switch (fc->col_type[r])
7378 case DW_CFA_undefined:
7381 case DW_CFA_same_value:
7385 sprintf (tmp, "c%+d", fc->col_offset[r]);
7387 case DW_CFA_register:
7388 sprintf (tmp, "r%d", fc->col_offset[r]);
7391 strcpy (tmp, "n/a");
7394 printf ("%-5s", tmp);
7401 size_of_encoded_value (encoding)
7404 switch (encoding & 0x7)
7407 case 0: return is_32bit_elf ? 4 : 8;
7414 #define GET(N) byte_get (start, N); start += N
7415 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7416 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7419 display_debug_frames (section, start, file)
7420 Elf32_Internal_Shdr * section;
7421 unsigned char * start;
7422 FILE * file ATTRIBUTE_UNUSED;
7424 unsigned char * end = start + section->sh_size;
7425 unsigned char * section_start = start;
7426 Frame_Chunk * chunks = 0;
7427 Frame_Chunk * remembered_state = 0;
7429 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7432 int addr_size = is_32bit_elf ? 4 : 8;
7434 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7438 unsigned char * saved_start;
7439 unsigned char * block_end;
7440 unsigned long length;
7441 unsigned long cie_id;
7444 int need_col_headers = 1;
7445 unsigned char * augmentation_data = NULL;
7446 unsigned long augmentation_data_len = 0;
7447 int encoded_ptr_size = addr_size;
7449 saved_start = start;
7450 length = byte_get (start, 4); start += 4;
7455 block_end = saved_start + length + 4;
7456 cie_id = byte_get (start, 4); start += 4;
7458 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7462 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7463 memset (fc, 0, sizeof (Frame_Chunk));
7467 fc->chunk_start = saved_start;
7469 fc->col_type = (short int *) xmalloc (sizeof (short int));
7470 fc->col_offset = (int *) xmalloc (sizeof (int));
7471 frame_need_space (fc, max_regs-1);
7475 fc->augmentation = start;
7476 start = strchr (start, '\0') + 1;
7478 if (fc->augmentation[0] == 'z')
7480 fc->code_factor = LEB ();
7481 fc->data_factor = SLEB ();
7482 fc->ra = byte_get (start, 1); start += 1;
7483 augmentation_data_len = LEB ();
7484 augmentation_data = start;
7485 start += augmentation_data_len;
7487 else if (strcmp (fc->augmentation, "eh") == 0)
7490 fc->code_factor = LEB ();
7491 fc->data_factor = SLEB ();
7492 fc->ra = byte_get (start, 1); start += 1;
7496 fc->code_factor = LEB ();
7497 fc->data_factor = SLEB ();
7498 fc->ra = byte_get (start, 1); start += 1;
7502 if (do_debug_frames_interp)
7503 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7504 (unsigned long)(saved_start - section_start), length, cie_id,
7505 fc->augmentation, fc->code_factor, fc->data_factor,
7509 printf ("\n%08lx %08lx %08lx CIE\n",
7510 (unsigned long)(saved_start - section_start), length, cie_id);
7511 printf (" Version: %d\n", version);
7512 printf (" Augmentation: \"%s\"\n", fc->augmentation);
7513 printf (" Code alignment factor: %u\n", fc->code_factor);
7514 printf (" Data alignment factor: %d\n", fc->data_factor);
7515 printf (" Return address column: %d\n", fc->ra);
7517 if (augmentation_data_len)
7520 printf (" Augmentation data: ");
7521 for (i = 0; i < augmentation_data_len; ++i)
7522 printf (" %02x", augmentation_data[i]);
7528 if (augmentation_data_len)
7530 unsigned char *p, *q;
7531 p = fc->augmentation + 1;
7532 q = augmentation_data;
7539 q += 1 + size_of_encoded_value (*q);
7541 fc->fde_encoding = *q++;
7547 if (fc->fde_encoding)
7548 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7551 frame_need_space (fc, fc->ra);
7555 unsigned char * look_for;
7556 static Frame_Chunk fde_fc;
7559 memset (fc, 0, sizeof (Frame_Chunk));
7561 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
7563 for (cie=chunks; cie ; cie = cie->next)
7564 if (cie->chunk_start == look_for)
7569 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7570 cie_id, saved_start);
7573 fc->col_type = (short int *) xmalloc (sizeof (short int));
7574 fc->col_offset = (int *) xmalloc (sizeof (int));
7575 frame_need_space (fc, max_regs - 1);
7577 fc->augmentation = "";
7578 fc->fde_encoding = 0;
7582 fc->ncols = cie->ncols;
7583 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
7584 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
7585 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7586 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7587 fc->augmentation = cie->augmentation;
7588 fc->code_factor = cie->code_factor;
7589 fc->data_factor = cie->data_factor;
7590 fc->cfa_reg = cie->cfa_reg;
7591 fc->cfa_offset = cie->cfa_offset;
7593 frame_need_space (fc, max_regs-1);
7594 fc->fde_encoding = cie->fde_encoding;
7597 if (fc->fde_encoding)
7598 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7600 fc->pc_begin = byte_get (start, encoded_ptr_size);
7601 start += encoded_ptr_size;
7602 fc->pc_range = byte_get (start, encoded_ptr_size);
7603 start += encoded_ptr_size;
7605 if (cie->augmentation[0] == 'z')
7607 augmentation_data_len = LEB ();
7608 augmentation_data = start;
7609 start += augmentation_data_len;
7612 printf ("\n%08lx %08lx %08lx FDE cie=%08x pc=%08lx..%08lx\n",
7613 (unsigned long)(saved_start - section_start), length, cie_id,
7614 cie->chunk_start - section_start, fc->pc_begin,
7615 fc->pc_begin + fc->pc_range);
7616 if (! do_debug_frames_interp && augmentation_data_len)
7619 printf (" Augmentation data: ");
7620 for (i = 0; i < augmentation_data_len; ++i)
7621 printf (" %02x", augmentation_data[i]);
7627 /* At this point, fc is the current chunk, cie (if any) is set, and we're
7628 about to interpret instructions for the chunk. */
7630 if (do_debug_frames_interp)
7632 /* Start by making a pass over the chunk, allocating storage
7633 and taking note of what registers are used. */
7634 unsigned char * tmp = start;
7636 while (start < block_end)
7646 /* Warning: if you add any more cases to this switch, be
7647 sure to add them to the corresponding switch below. */
7650 case DW_CFA_advance_loc:
7654 frame_need_space (fc, opa);
7655 fc->col_type[opa] = DW_CFA_undefined;
7657 case DW_CFA_restore:
7658 frame_need_space (fc, opa);
7659 fc->col_type[opa] = DW_CFA_undefined;
7661 case DW_CFA_set_loc:
7662 start += encoded_ptr_size;
7664 case DW_CFA_advance_loc1:
7667 case DW_CFA_advance_loc2:
7670 case DW_CFA_advance_loc4:
7673 case DW_CFA_offset_extended:
7674 reg = LEB (); LEB ();
7675 frame_need_space (fc, reg);
7676 fc->col_type[reg] = DW_CFA_undefined;
7678 case DW_CFA_restore_extended:
7680 frame_need_space (fc, reg);
7681 fc->col_type[reg] = DW_CFA_undefined;
7683 case DW_CFA_undefined:
7685 frame_need_space (fc, reg);
7686 fc->col_type[reg] = DW_CFA_undefined;
7688 case DW_CFA_same_value:
7690 frame_need_space (fc, reg);
7691 fc->col_type[reg] = DW_CFA_undefined;
7693 case DW_CFA_register:
7694 reg = LEB (); LEB ();
7695 frame_need_space (fc, reg);
7696 fc->col_type[reg] = DW_CFA_undefined;
7698 case DW_CFA_def_cfa:
7701 case DW_CFA_def_cfa_register:
7704 case DW_CFA_def_cfa_offset:
7707 #ifndef DW_CFA_GNU_args_size
7708 #define DW_CFA_GNU_args_size 0x2e
7710 case DW_CFA_GNU_args_size:
7713 #ifndef DW_CFA_GNU_negative_offset_extended
7714 #define DW_CFA_GNU_negative_offset_extended 0x2f
7716 case DW_CFA_GNU_negative_offset_extended:
7717 reg = LEB (); LEB ();
7718 frame_need_space (fc, reg);
7719 fc->col_type[reg] = DW_CFA_undefined;
7728 /* Now we know what registers are used, make a second pass over
7729 the chunk, this time actually printing out the info. */
7731 while (start < block_end)
7734 unsigned long ul, reg, roffs;
7743 /* Warning: if you add any more cases to this switch, be
7744 sure to add them to the corresponding switch above. */
7747 case DW_CFA_advance_loc:
7748 if (do_debug_frames_interp)
7749 frame_display_row (fc, &need_col_headers, &max_regs);
7751 printf (" DW_CFA_advance_loc: %d to %08lx\n",
7752 opa * fc->code_factor,
7753 fc->pc_begin + opa * fc->code_factor);
7754 fc->pc_begin += opa * fc->code_factor;
7759 if (! do_debug_frames_interp)
7760 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
7761 opa, roffs * fc->data_factor);
7762 fc->col_type[opa] = DW_CFA_offset;
7763 fc->col_offset[opa] = roffs * fc->data_factor;
7766 case DW_CFA_restore:
7767 if (! do_debug_frames_interp)
7768 printf (" DW_CFA_restore: r%d\n", opa);
7769 fc->col_type[opa] = cie->col_type[opa];
7770 fc->col_offset[opa] = cie->col_offset[opa];
7773 case DW_CFA_set_loc:
7774 vma = byte_get (start, encoded_ptr_size);
7775 start += encoded_ptr_size;
7776 if (do_debug_frames_interp)
7777 frame_display_row (fc, &need_col_headers, &max_regs);
7779 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
7783 case DW_CFA_advance_loc1:
7784 ofs = byte_get (start, 1); start += 1;
7785 if (do_debug_frames_interp)
7786 frame_display_row (fc, &need_col_headers, &max_regs);
7788 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
7789 ofs * fc->code_factor,
7790 fc->pc_begin + ofs * fc->code_factor);
7791 fc->pc_begin += ofs * fc->code_factor;
7794 case DW_CFA_advance_loc2:
7795 ofs = byte_get (start, 2); start += 2;
7796 if (do_debug_frames_interp)
7797 frame_display_row (fc, &need_col_headers, &max_regs);
7799 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
7800 ofs * fc->code_factor,
7801 fc->pc_begin + ofs * fc->code_factor);
7802 fc->pc_begin += ofs * fc->code_factor;
7805 case DW_CFA_advance_loc4:
7806 ofs = byte_get (start, 4); start += 4;
7807 if (do_debug_frames_interp)
7808 frame_display_row (fc, &need_col_headers, &max_regs);
7810 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
7811 ofs * fc->code_factor,
7812 fc->pc_begin + ofs * fc->code_factor);
7813 fc->pc_begin += ofs * fc->code_factor;
7816 case DW_CFA_offset_extended:
7819 if (! do_debug_frames_interp)
7820 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
7821 reg, roffs * fc->data_factor);
7822 fc->col_type[reg] = DW_CFA_offset;
7823 fc->col_offset[reg] = roffs * fc->data_factor;
7826 case DW_CFA_restore_extended:
7828 if (! do_debug_frames_interp)
7829 printf (" DW_CFA_restore_extended: r%ld\n", reg);
7830 fc->col_type[reg] = cie->col_type[reg];
7831 fc->col_offset[reg] = cie->col_offset[reg];
7834 case DW_CFA_undefined:
7836 if (! do_debug_frames_interp)
7837 printf (" DW_CFA_undefined: r%ld\n", reg);
7838 fc->col_type[reg] = DW_CFA_undefined;
7839 fc->col_offset[reg] = 0;
7842 case DW_CFA_same_value:
7844 if (! do_debug_frames_interp)
7845 printf (" DW_CFA_same_value: r%ld\n", reg);
7846 fc->col_type[reg] = DW_CFA_same_value;
7847 fc->col_offset[reg] = 0;
7850 case DW_CFA_register:
7853 if (! do_debug_frames_interp)
7854 printf (" DW_CFA_register: r%ld\n", reg);
7855 fc->col_type[reg] = DW_CFA_register;
7856 fc->col_offset[reg] = roffs;
7859 case DW_CFA_remember_state:
7860 if (! do_debug_frames_interp)
7861 printf (" DW_CFA_remember_state\n");
7862 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7863 rs->ncols = fc->ncols;
7864 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
7865 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
7866 memcpy (rs->col_type, fc->col_type, rs->ncols);
7867 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
7868 rs->next = remembered_state;
7869 remembered_state = rs;
7872 case DW_CFA_restore_state:
7873 if (! do_debug_frames_interp)
7874 printf (" DW_CFA_restore_state\n");
7875 rs = remembered_state;
7876 remembered_state = rs->next;
7877 frame_need_space (fc, rs->ncols-1);
7878 memcpy (fc->col_type, rs->col_type, rs->ncols);
7879 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
7880 free (rs->col_type);
7881 free (rs->col_offset);
7885 case DW_CFA_def_cfa:
7886 fc->cfa_reg = LEB ();
7887 fc->cfa_offset = LEB ();
7888 if (! do_debug_frames_interp)
7889 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
7890 fc->cfa_reg, fc->cfa_offset);
7893 case DW_CFA_def_cfa_register:
7894 fc->cfa_reg = LEB ();
7895 if (! do_debug_frames_interp)
7896 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
7899 case DW_CFA_def_cfa_offset:
7900 fc->cfa_offset = LEB ();
7901 if (! do_debug_frames_interp)
7902 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
7906 if (! do_debug_frames_interp)
7907 printf (" DW_CFA_nop\n");
7910 #ifndef DW_CFA_GNU_window_save
7911 #define DW_CFA_GNU_window_save 0x2d
7913 case DW_CFA_GNU_window_save:
7914 if (! do_debug_frames_interp)
7915 printf (" DW_CFA_GNU_window_save\n");
7918 case DW_CFA_GNU_args_size:
7920 if (! do_debug_frames_interp)
7921 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
7924 case DW_CFA_GNU_negative_offset_extended:
7927 frame_need_space (fc, reg);
7928 if (! do_debug_frames_interp)
7929 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
7930 reg, l * fc->data_factor);
7931 fc->col_type[reg] = DW_CFA_offset;
7932 fc->col_offset[reg] = l * fc->data_factor;
7936 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
7941 if (do_debug_frames_interp)
7942 frame_display_row (fc, &need_col_headers, &max_regs);
7957 display_debug_not_supported (section, start, file)
7958 Elf32_Internal_Shdr * section;
7959 unsigned char * start ATTRIBUTE_UNUSED;
7960 FILE * file ATTRIBUTE_UNUSED;
7962 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7963 SECTION_NAME (section));
7968 /* Pre-scan the .debug_info section to record the size of address.
7969 When dumping the .debug_line, we use that size information, assuming
7970 that all compilation units have the same address size. */
7972 prescan_debug_info (section, start, file)
7973 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
7974 unsigned char * start;
7975 FILE * file ATTRIBUTE_UNUSED;
7977 DWARF2_External_CompUnit * external;
7979 external = (DWARF2_External_CompUnit *) start;
7981 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
7985 /* A structure containing the name of a debug section and a pointer
7986 to a function that can decode it. The third field is a prescan
7987 function to be run over the section before displaying any of the
7992 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
7993 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
7997 { ".debug_info", display_debug_info, prescan_debug_info },
7998 { ".debug_abbrev", display_debug_abbrev, NULL },
7999 { ".debug_line", display_debug_lines, NULL },
8000 { ".debug_aranges", display_debug_aranges, NULL },
8001 { ".debug_pubnames", display_debug_pubnames, NULL },
8002 { ".debug_frame", display_debug_frames, NULL },
8003 { ".eh_frame", display_debug_frames, NULL },
8004 { ".debug_macinfo", display_debug_macinfo, NULL },
8005 { ".debug_str", display_debug_not_supported, NULL },
8006 { ".debug_static_func", display_debug_not_supported, NULL },
8007 { ".debug_static_vars", display_debug_not_supported, NULL },
8008 { ".debug_types", display_debug_not_supported, NULL },
8009 { ".debug_weaknames", display_debug_not_supported, NULL }
8013 display_debug_section (section, file)
8014 Elf32_Internal_Shdr * section;
8017 char * name = SECTION_NAME (section);
8018 bfd_size_type length;
8019 unsigned char * start;
8022 length = section->sh_size;
8025 printf (_("\nSection '%s' has no debugging data.\n"), name);
8029 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8030 _("debug section data"));
8034 /* See if we know how to display the contents of this section. */
8035 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8036 name = ".debug_info";
8038 for (i = NUM_ELEM (debug_displays); i--;)
8039 if (strcmp (debug_displays[i].name, name) == 0)
8041 debug_displays[i].display (section, start, file);
8046 printf (_("Unrecognised debug section: %s\n"), name);
8050 /* If we loaded in the abbrev section at some point,
8051 we must release it here. */
8052 if (first_abbrev != NULL)
8059 process_section_contents (file)
8062 Elf32_Internal_Shdr * section;
8068 /* Pre-scan the debug sections to find some debug information not
8069 present in some of them. For the .debug_line, we must find out the
8070 size of address (specified in .debug_info and .debug_aranges). */
8071 for (i = 0, section = section_headers;
8072 i < elf_header.e_shnum && i < num_dump_sects;
8075 char * name = SECTION_NAME (section);
8078 if (section->sh_size == 0)
8081 /* See if there is some pre-scan operation for this section. */
8082 for (j = NUM_ELEM (debug_displays); j--;)
8083 if (strcmp (debug_displays[j].name, name) == 0)
8085 if (debug_displays[j].prescan != NULL)
8087 bfd_size_type length;
8088 unsigned char * start;
8090 length = section->sh_size;
8091 start = ((unsigned char *)
8092 get_data (NULL, file, section->sh_offset, length,
8093 _("debug section data")));
8097 debug_displays[j].prescan (section, start, file);
8105 for (i = 0, section = section_headers;
8106 i < elf_header.e_shnum && i < num_dump_sects;
8109 #ifdef SUPPORT_DISASSEMBLY
8110 if (dump_sects[i] & DISASS_DUMP)
8111 disassemble_section (section, file);
8113 if (dump_sects[i] & HEX_DUMP)
8114 dump_section (section, file);
8116 if (dump_sects[i] & DEBUG_DUMP)
8117 display_debug_section (section, file);
8120 if (i < num_dump_sects)
8121 warn (_("Some sections were not dumped because they do not exist!\n"));
8127 process_mips_fpe_exception (mask)
8133 if (mask & OEX_FPU_INEX)
8134 fputs ("INEX", stdout), first = 0;
8135 if (mask & OEX_FPU_UFLO)
8136 printf ("%sUFLO", first ? "" : "|"), first = 0;
8137 if (mask & OEX_FPU_OFLO)
8138 printf ("%sOFLO", first ? "" : "|"), first = 0;
8139 if (mask & OEX_FPU_DIV0)
8140 printf ("%sDIV0", first ? "" : "|"), first = 0;
8141 if (mask & OEX_FPU_INVAL)
8142 printf ("%sINVAL", first ? "" : "|");
8145 fputs ("0", stdout);
8149 process_mips_specific (file)
8152 Elf_Internal_Dyn * entry;
8153 size_t liblist_offset = 0;
8154 size_t liblistno = 0;
8155 size_t conflictsno = 0;
8156 size_t options_offset = 0;
8157 size_t conflicts_offset = 0;
8159 /* We have a lot of special sections. Thanks SGI! */
8160 if (dynamic_segment == NULL)
8161 /* No information available. */
8164 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8165 switch (entry->d_tag)
8167 case DT_MIPS_LIBLIST:
8168 liblist_offset = entry->d_un.d_val - loadaddr;
8170 case DT_MIPS_LIBLISTNO:
8171 liblistno = entry->d_un.d_val;
8173 case DT_MIPS_OPTIONS:
8174 options_offset = entry->d_un.d_val - loadaddr;
8176 case DT_MIPS_CONFLICT:
8177 conflicts_offset = entry->d_un.d_val - loadaddr;
8179 case DT_MIPS_CONFLICTNO:
8180 conflictsno = entry->d_un.d_val;
8186 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8188 Elf32_External_Lib * elib;
8191 elib = ((Elf32_External_Lib *)
8192 get_data (NULL, file, liblist_offset,
8193 liblistno * sizeof (Elf32_External_Lib),
8197 printf ("\nSection '.liblist' contains %lu entries:\n",
8198 (unsigned long) liblistno);
8199 fputs (" Library Time Stamp Checksum Version Flags\n",
8202 for (cnt = 0; cnt < liblistno; ++cnt)
8209 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8210 time = BYTE_GET (elib[cnt].l_time_stamp);
8211 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8212 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8213 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8215 tmp = gmtime (&time);
8216 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8217 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8218 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8220 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
8221 dynamic_strings + liblist.l_name, timebuf,
8222 liblist.l_checksum, liblist.l_version);
8224 if (liblist.l_flags == 0)
8235 { " EXACT_MATCH", LL_EXACT_MATCH },
8236 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8237 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8238 { " EXPORTS", LL_EXPORTS },
8239 { " DELAY_LOAD", LL_DELAY_LOAD },
8240 { " DELTA", LL_DELTA }
8242 int flags = liblist.l_flags;
8246 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8248 if ((flags & l_flags_vals[fcnt].bit) != 0)
8250 fputs (l_flags_vals[fcnt].name, stdout);
8251 flags ^= l_flags_vals[fcnt].bit;
8254 printf (" %#x", (unsigned int) flags);
8264 if (options_offset != 0)
8266 Elf_External_Options * eopt;
8267 Elf_Internal_Shdr * sect = section_headers;
8268 Elf_Internal_Options * iopt;
8269 Elf_Internal_Options * option;
8273 /* Find the section header so that we get the size. */
8274 while (sect->sh_type != SHT_MIPS_OPTIONS)
8277 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8278 sect->sh_size, _("options"));
8281 iopt = ((Elf_Internal_Options *)
8282 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8285 error (_("Out of memory"));
8292 while (offset < sect->sh_size)
8294 Elf_External_Options * eoption;
8296 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8298 option->kind = BYTE_GET (eoption->kind);
8299 option->size = BYTE_GET (eoption->size);
8300 option->section = BYTE_GET (eoption->section);
8301 option->info = BYTE_GET (eoption->info);
8303 offset += option->size;
8309 printf (_("\nSection '%s' contains %d entries:\n"),
8310 SECTION_NAME (sect), cnt);
8318 switch (option->kind)
8321 /* This shouldn't happen. */
8322 printf (" NULL %d %lx", option->section, option->info);
8325 printf (" REGINFO ");
8326 if (elf_header.e_machine == EM_MIPS)
8329 Elf32_External_RegInfo * ereg;
8330 Elf32_RegInfo reginfo;
8332 ereg = (Elf32_External_RegInfo *) (option + 1);
8333 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8334 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8335 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8336 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8337 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8338 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8340 printf ("GPR %08lx GP 0x%lx\n",
8342 (unsigned long) reginfo.ri_gp_value);
8343 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8344 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8345 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8350 Elf64_External_RegInfo * ereg;
8351 Elf64_Internal_RegInfo reginfo;
8353 ereg = (Elf64_External_RegInfo *) (option + 1);
8354 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8355 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8356 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8357 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8358 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8359 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8361 printf ("GPR %08lx GP 0x",
8362 reginfo.ri_gprmask);
8363 printf_vma (reginfo.ri_gp_value);
8366 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8367 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8368 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8372 case ODK_EXCEPTIONS:
8373 fputs (" EXCEPTIONS fpe_min(", stdout);
8374 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8375 fputs (") fpe_max(", stdout);
8376 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8377 fputs (")", stdout);
8379 if (option->info & OEX_PAGE0)
8380 fputs (" PAGE0", stdout);
8381 if (option->info & OEX_SMM)
8382 fputs (" SMM", stdout);
8383 if (option->info & OEX_FPDBUG)
8384 fputs (" FPDBUG", stdout);
8385 if (option->info & OEX_DISMISS)
8386 fputs (" DISMISS", stdout);
8389 fputs (" PAD ", stdout);
8390 if (option->info & OPAD_PREFIX)
8391 fputs (" PREFIX", stdout);
8392 if (option->info & OPAD_POSTFIX)
8393 fputs (" POSTFIX", stdout);
8394 if (option->info & OPAD_SYMBOL)
8395 fputs (" SYMBOL", stdout);
8398 fputs (" HWPATCH ", stdout);
8399 if (option->info & OHW_R4KEOP)
8400 fputs (" R4KEOP", stdout);
8401 if (option->info & OHW_R8KPFETCH)
8402 fputs (" R8KPFETCH", stdout);
8403 if (option->info & OHW_R5KEOP)
8404 fputs (" R5KEOP", stdout);
8405 if (option->info & OHW_R5KCVTL)
8406 fputs (" R5KCVTL", stdout);
8409 fputs (" FILL ", stdout);
8410 /* XXX Print content of info word? */
8413 fputs (" TAGS ", stdout);
8414 /* XXX Print content of info word? */
8417 fputs (" HWAND ", stdout);
8418 if (option->info & OHWA0_R4KEOP_CHECKED)
8419 fputs (" R4KEOP_CHECKED", stdout);
8420 if (option->info & OHWA0_R4KEOP_CLEAN)
8421 fputs (" R4KEOP_CLEAN", stdout);
8424 fputs (" HWOR ", stdout);
8425 if (option->info & OHWA0_R4KEOP_CHECKED)
8426 fputs (" R4KEOP_CHECKED", stdout);
8427 if (option->info & OHWA0_R4KEOP_CLEAN)
8428 fputs (" R4KEOP_CLEAN", stdout);
8431 printf (" GP_GROUP %#06lx self-contained %#06lx",
8432 option->info & OGP_GROUP,
8433 (option->info & OGP_SELF) >> 16);
8436 printf (" IDENT %#06lx self-contained %#06lx",
8437 option->info & OGP_GROUP,
8438 (option->info & OGP_SELF) >> 16);
8441 /* This shouldn't happen. */
8442 printf (" %3d ??? %d %lx",
8443 option->kind, option->section, option->info);
8447 len = sizeof (* eopt);
8448 while (len < option->size)
8449 if (((char *) option)[len] >= ' '
8450 && ((char *) option)[len] < 0x7f)
8451 printf ("%c", ((char *) option)[len++]);
8453 printf ("\\%03o", ((char *) option)[len++]);
8455 fputs ("\n", stdout);
8463 if (conflicts_offset != 0 && conflictsno != 0)
8465 Elf32_Conflict * iconf;
8468 if (dynamic_symbols == NULL)
8470 error (_("conflict list with without table"));
8474 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
8477 error (_("Out of memory"));
8483 Elf32_External_Conflict * econf32;
8485 econf32 = ((Elf32_External_Conflict *)
8486 get_data (NULL, file, conflicts_offset,
8487 conflictsno * sizeof (* econf32),
8492 for (cnt = 0; cnt < conflictsno; ++cnt)
8493 iconf[cnt] = BYTE_GET (econf32[cnt]);
8499 Elf64_External_Conflict * econf64;
8501 econf64 = ((Elf64_External_Conflict *)
8502 get_data (NULL, file, conflicts_offset,
8503 conflictsno * sizeof (* econf64),
8508 for (cnt = 0; cnt < conflictsno; ++cnt)
8509 iconf[cnt] = BYTE_GET (econf64[cnt]);
8514 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
8515 puts (_(" Num: Index Value Name"));
8517 for (cnt = 0; cnt < conflictsno; ++cnt)
8519 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
8521 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
8522 print_vma (psym->st_value, FULL_HEX);
8523 printf (" %s\n", dynamic_strings + psym->st_name);
8533 get_note_type (e_type)
8536 static char buff[64];
8540 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
8541 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
8542 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
8543 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
8544 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
8545 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
8546 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
8547 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
8548 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8549 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8550 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8552 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
8557 /* Note that by the ELF standard, the name field is already null byte
8558 terminated, and namesz includes the terminating null byte.
8559 I.E. the value of namesz for the name "FSF" is 4.
8561 If the value of namesz is zero, there is no name present. */
8563 process_note (pnote)
8564 Elf32_Internal_Note * pnote;
8566 printf (" %s\t\t0x%08lx\t%s\n",
8567 pnote->namesz ? pnote->namedata : "(NONE)",
8568 pnote->descsz, get_note_type (pnote->type));
8574 process_corefile_note_segment (file, offset, length)
8579 Elf_External_Note * pnotes;
8580 Elf_External_Note * external;
8586 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
8593 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8594 (unsigned long) offset, (unsigned long) length);
8595 printf (_(" Owner\t\tData size\tDescription\n"));
8597 while (external < (Elf_External_Note *)((char *) pnotes + length))
8599 Elf32_Internal_Note inote;
8602 inote.type = BYTE_GET (external->type);
8603 inote.namesz = BYTE_GET (external->namesz);
8604 inote.namedata = external->name;
8605 inote.descsz = BYTE_GET (external->descsz);
8606 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
8607 inote.descpos = offset + (inote.descdata - (char *) pnotes);
8609 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
8611 /* Verify that name is null terminated. It appears that at least
8612 one version of Linux (RedHat 6.0) generates corefiles that don't
8613 comply with the ELF spec by failing to include the null byte in
8615 if (inote.namedata[inote.namesz] != '\0')
8617 temp = malloc (inote.namesz + 1);
8621 error (_("Out of memory\n"));
8626 strncpy (temp, inote.namedata, inote.namesz);
8627 temp[inote.namesz] = 0;
8629 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8630 inote.namedata = temp;
8633 res &= process_note (& inote);
8648 process_corefile_note_segments (file)
8651 Elf_Internal_Phdr * program_headers;
8652 Elf_Internal_Phdr * segment;
8656 program_headers = (Elf_Internal_Phdr *) malloc
8657 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
8659 if (program_headers == NULL)
8661 error (_("Out of memory\n"));
8666 i = get_32bit_program_headers (file, program_headers);
8668 i = get_64bit_program_headers (file, program_headers);
8672 free (program_headers);
8676 for (i = 0, segment = program_headers;
8677 i < elf_header.e_phnum;
8680 if (segment->p_type == PT_NOTE)
8681 res &= process_corefile_note_segment (file,
8682 (bfd_vma) segment->p_offset,
8683 (bfd_vma) segment->p_filesz);
8686 free (program_headers);
8692 process_corefile_contents (file)
8695 /* If we have not been asked to display the notes then do nothing. */
8699 /* If file is not a core file then exit. */
8700 if (elf_header.e_type != ET_CORE)
8703 /* No program headers means no NOTE segment. */
8704 if (elf_header.e_phnum == 0)
8706 printf (_("No note segments present in the core file.\n"));
8710 return process_corefile_note_segments (file);
8714 process_arch_specific (file)
8720 switch (elf_header.e_machine)
8723 case EM_MIPS_RS3_LE:
8724 return process_mips_specific (file);
8733 get_file_header (file)
8736 /* Read in the identity array. */
8737 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
8740 /* Determine how to read the rest of the header. */
8741 switch (elf_header.e_ident [EI_DATA])
8743 default: /* fall through */
8744 case ELFDATANONE: /* fall through */
8745 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
8746 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
8749 /* For now we only support 32 bit and 64 bit ELF files. */
8750 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
8752 /* Read in the rest of the header. */
8755 Elf32_External_Ehdr ehdr32;
8757 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
8760 elf_header.e_type = BYTE_GET (ehdr32.e_type);
8761 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
8762 elf_header.e_version = BYTE_GET (ehdr32.e_version);
8763 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
8764 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
8765 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
8766 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
8767 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
8768 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
8769 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
8770 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
8771 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
8772 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
8776 Elf64_External_Ehdr ehdr64;
8778 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8779 we will not be able to cope with the 64bit data found in
8780 64 ELF files. Detect this now and abort before we start
8781 overwritting things. */
8782 if (sizeof (bfd_vma) < 8)
8784 error (_("This instance of readelf has been built without support for a\n"));
8785 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
8789 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
8792 elf_header.e_type = BYTE_GET (ehdr64.e_type);
8793 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
8794 elf_header.e_version = BYTE_GET (ehdr64.e_version);
8795 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
8796 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
8797 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
8798 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
8799 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
8800 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
8801 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
8802 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
8803 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
8804 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
8811 process_file (file_name)
8815 struct stat statbuf;
8818 if (stat (file_name, & statbuf) < 0)
8820 error (_("Cannot stat input file %s.\n"), file_name);
8824 file = fopen (file_name, "rb");
8827 error (_("Input file %s not found.\n"), file_name);
8831 if (! get_file_header (file))
8833 error (_("%s: Failed to read file header\n"), file_name);
8838 /* Initialise per file variables. */
8839 for (i = NUM_ELEM (version_info); i--;)
8840 version_info[i] = 0;
8842 for (i = NUM_ELEM (dynamic_info); i--;)
8843 dynamic_info[i] = 0;
8845 /* Process the file. */
8847 printf (_("\nFile: %s\n"), file_name);
8849 if (! process_file_header ())
8855 process_section_headers (file);
8857 process_program_headers (file);
8859 process_dynamic_segment (file);
8861 process_relocs (file);
8863 process_unwind (file);
8865 process_symbol_table (file);
8867 process_syminfo (file);
8869 process_version_sections (file);
8871 process_section_contents (file);
8873 process_corefile_contents (file);
8875 process_arch_specific (file);
8879 if (section_headers)
8881 free (section_headers);
8882 section_headers = NULL;
8887 free (string_table);
8888 string_table = NULL;
8889 string_table_length = 0;
8892 if (dynamic_strings)
8894 free (dynamic_strings);
8895 dynamic_strings = NULL;
8898 if (dynamic_symbols)
8900 free (dynamic_symbols);
8901 dynamic_symbols = NULL;
8902 num_dynamic_syms = 0;
8905 if (dynamic_syminfo)
8907 free (dynamic_syminfo);
8908 dynamic_syminfo = NULL;
8914 #ifdef SUPPORT_DISASSEMBLY
8915 /* Needed by the i386 disassembler. For extra credit, someone could
8916 fix this so that we insert symbolic addresses here, esp for GOT/PLT
8920 print_address (unsigned int addr, FILE * outfile)
8922 fprintf (outfile,"0x%8.8x", addr);
8925 /* Needed by the i386 disassembler. */
8927 db_task_printsym (unsigned int addr)
8929 print_address (addr, stderr);
8940 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
8941 setlocale (LC_MESSAGES, "");
8943 bindtextdomain (PACKAGE, LOCALEDIR);
8944 textdomain (PACKAGE);
8946 parse_args (argc, argv);
8948 if (optind < (argc - 1))
8952 while (optind < argc)
8953 err |= process_file (argv [optind ++]);
8955 if (dump_sects != NULL)