1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
52 #include "elf/alpha.h"
68 #include "elf/mcore.h"
71 #include "elf/mn10200.h"
72 #include "elf/mn10300.h"
78 #include "elf/sparc.h"
80 #include "elf/x86-64.h"
81 #include "elf/xstormy16.h"
86 char * program_name = "readelf";
87 unsigned int dynamic_addr;
88 bfd_size_type dynamic_size;
89 unsigned int rela_addr;
90 unsigned int rela_size;
91 char * dynamic_strings;
93 unsigned long string_table_length;
94 unsigned long num_dynamic_syms;
95 Elf_Internal_Sym * dynamic_symbols;
96 Elf_Internal_Syminfo * dynamic_syminfo;
97 unsigned long dynamic_syminfo_offset;
98 unsigned int dynamic_syminfo_nent;
99 char program_interpreter [64];
100 int dynamic_info[DT_JMPREL + 1];
101 int version_info[16];
103 Elf_Internal_Ehdr elf_header;
104 Elf_Internal_Shdr * section_headers;
105 Elf_Internal_Dyn * dynamic_segment;
106 Elf_Internal_Shdr * symtab_shndx_hdr;
114 int do_using_dynamic;
122 int do_debug_abbrevs;
124 int do_debug_pubnames;
125 int do_debug_aranges;
127 int do_debug_frames_interp;
128 int do_debug_macinfo;
134 /* A dynamic array of flags indicating which sections require dumping. */
135 char * dump_sects = NULL;
136 unsigned int num_dump_sects = 0;
138 #define HEX_DUMP (1 << 0)
139 #define DISASS_DUMP (1 << 1)
140 #define DEBUG_DUMP (1 << 2)
142 /* How to rpint a vma value. */
143 typedef enum print_mode
155 /* Forward declarations for dumb compilers. */
156 static void print_vma PARAMS ((bfd_vma, print_mode));
157 static void print_symbol PARAMS ((int, char *));
158 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
159 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
160 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
161 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
162 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
163 static const char * get_ppc64_dynamic_type PARAMS ((unsigned long));
164 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
165 static const char * get_dynamic_type PARAMS ((unsigned long));
166 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
167 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
168 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
169 static char * get_file_type PARAMS ((unsigned));
170 static char * get_machine_name PARAMS ((unsigned));
171 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
172 static char * get_machine_flags PARAMS ((unsigned, unsigned));
173 static const char * get_mips_segment_type PARAMS ((unsigned long));
174 static const char * get_parisc_segment_type PARAMS ((unsigned long));
175 static const char * get_ia64_segment_type PARAMS ((unsigned long));
176 static const char * get_segment_type PARAMS ((unsigned long));
177 static const char * get_mips_section_type_name PARAMS ((unsigned int));
178 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
179 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
180 static const char * get_section_type_name PARAMS ((unsigned int));
181 static const char * get_symbol_binding PARAMS ((unsigned int));
182 static const char * get_symbol_type PARAMS ((unsigned int));
183 static const char * get_symbol_visibility PARAMS ((unsigned int));
184 static const char * get_symbol_index_type PARAMS ((unsigned int));
185 static const char * get_dynamic_flags PARAMS ((bfd_vma));
186 static void usage PARAMS ((void));
187 static void parse_args PARAMS ((int, char **));
188 static int process_file_header PARAMS ((void));
189 static int process_program_headers PARAMS ((FILE *));
190 static int process_section_headers PARAMS ((FILE *));
191 static int process_unwind PARAMS ((FILE *));
192 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
193 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
194 static int process_dynamic_segment PARAMS ((FILE *));
195 static int process_symbol_table PARAMS ((FILE *));
196 static int process_syminfo PARAMS ((FILE *));
197 static int process_section_contents PARAMS ((FILE *));
198 static void process_mips_fpe_exception PARAMS ((int));
199 static int process_mips_specific PARAMS ((FILE *));
200 static int process_file PARAMS ((char *));
201 static int process_relocs PARAMS ((FILE *));
202 static int process_version_sections PARAMS ((FILE *));
203 static char * get_ver_flags PARAMS ((unsigned int));
204 static int get_32bit_section_headers PARAMS ((FILE *, unsigned int));
205 static int get_64bit_section_headers PARAMS ((FILE *, unsigned int));
206 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
207 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
208 static int get_file_header PARAMS ((FILE *));
209 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
210 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
211 static const char * get_elf_section_flags PARAMS ((bfd_vma));
212 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
213 static int get_32bit_dynamic_segment PARAMS ((FILE *));
214 static int get_64bit_dynamic_segment PARAMS ((FILE *));
215 #ifdef SUPPORT_DISASSEMBLY
216 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
218 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
219 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
220 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
221 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
222 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
223 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
224 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
225 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
226 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
227 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
228 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
229 static int display_debug_str PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
230 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
231 static void load_debug_str PARAMS ((FILE *));
232 static void free_debug_str PARAMS ((void));
233 static const char * fetch_indirect_string PARAMS ((unsigned long));
234 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
235 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
236 static void reset_state_machine PARAMS ((int));
237 static char * get_TAG_name PARAMS ((unsigned long));
238 static char * get_AT_name PARAMS ((unsigned long));
239 static char * get_FORM_name PARAMS ((unsigned long));
240 static void free_abbrevs PARAMS ((void));
241 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
242 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
243 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
244 static unsigned char * read_and_display_attr_value PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
245 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
246 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
247 static void request_dump PARAMS ((unsigned int, int));
248 static const char * get_elf_class PARAMS ((unsigned int));
249 static const char * get_data_encoding PARAMS ((unsigned int));
250 static const char * get_osabi_name PARAMS ((unsigned int));
251 static int guess_is_rela PARAMS ((unsigned long));
252 static const char * get_note_type PARAMS ((unsigned int));
253 static const char * get_netbsd_elfcore_note_type PARAMS ((unsigned int));
254 static int process_note PARAMS ((Elf32_Internal_Note *));
255 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
256 static int process_corefile_note_segments PARAMS ((FILE *));
257 static int process_corefile_contents PARAMS ((FILE *));
258 static int process_arch_specific PARAMS ((FILE *));
260 typedef int Elf32_Word;
268 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
269 ((X)->sh_name >= string_table_length \
270 ? "<corrupt>" : string_table + (X)->sh_name))
272 /* Given st_shndx I, map to section_headers index. */
273 #define SECTION_HEADER_INDEX(I) \
274 ((I) < SHN_LORESERVE \
276 : ((I) <= SHN_HIRESERVE \
278 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
280 /* Reverse of the above. */
281 #define SECTION_HEADER_NUM(N) \
282 ((N) < SHN_LORESERVE \
284 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
286 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
288 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
290 #define BYTE_GET(field) byte_get (field, sizeof (field))
292 /* If we can support a 64 bit data type then BFD64 should be defined
293 and sizeof (bfd_vma) == 8. In this case when translating from an
294 external 8 byte field to an internal field, we can assume that the
295 internal field is also 8 bytes wide and so we can extract all the data.
296 If, however, BFD64 is not defined, then we must assume that the
297 internal data structure only has 4 byte wide fields that are the
298 equivalent of the 8 byte wide external counterparts, and so we must
299 truncate the data. */
301 #define BYTE_GET8(field) byte_get (field, -8)
303 #define BYTE_GET8(field) byte_get (field, 8)
306 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
308 #define GET_ELF_SYMBOLS(file, section) \
309 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
310 : get_64bit_elf_symbols (file, section))
314 error VPARAMS ((const char *message, ...))
316 VA_OPEN (args, message);
317 VA_FIXEDARG (args, const char *, message);
319 fprintf (stderr, _("%s: Error: "), program_name);
320 vfprintf (stderr, message, args);
325 warn VPARAMS ((const char *message, ...))
327 VA_OPEN (args, message);
328 VA_FIXEDARG (args, const char *, message);
330 fprintf (stderr, _("%s: Warning: "), program_name);
331 vfprintf (stderr, message, args);
335 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
338 get_data (var, file, offset, size, reason)
350 if (fseek (file, offset, SEEK_SET))
352 error (_("Unable to seek to %x for %s\n"), offset, reason);
359 mvar = (PTR) malloc (size);
363 error (_("Out of memory allocating %d bytes for %s\n"),
369 if (fread (mvar, size, 1, file) != 1)
371 error (_("Unable to read in %d bytes of %s\n"), size, reason);
381 byte_get_little_endian (field, size)
382 unsigned char * field;
391 return ((unsigned int) (field [0]))
392 | (((unsigned int) (field [1])) << 8);
396 /* We want to extract data from an 8 byte wide field and
397 place it into a 4 byte wide field. Since this is a little
398 endian source we can juts use the 4 byte extraction code. */
402 return ((unsigned long) (field [0]))
403 | (((unsigned long) (field [1])) << 8)
404 | (((unsigned long) (field [2])) << 16)
405 | (((unsigned long) (field [3])) << 24);
410 /* This is a special case, generated by the BYTE_GET8 macro.
411 It means that we are loading an 8 byte value from a field
412 in an external structure into an 8 byte value in a field
413 in an internal strcuture. */
414 return ((bfd_vma) (field [0]))
415 | (((bfd_vma) (field [1])) << 8)
416 | (((bfd_vma) (field [2])) << 16)
417 | (((bfd_vma) (field [3])) << 24)
418 | (((bfd_vma) (field [4])) << 32)
419 | (((bfd_vma) (field [5])) << 40)
420 | (((bfd_vma) (field [6])) << 48)
421 | (((bfd_vma) (field [7])) << 56);
424 error (_("Unhandled data length: %d\n"), size);
429 /* Print a VMA value. */
431 print_vma (vma, mode)
441 case FULL_HEX: printf ("0x"); /* drop through */
442 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
443 case PREFIX_HEX: printf ("0x"); /* drop through */
444 case HEX: printf ("%lx", (unsigned long) vma); break;
445 case DEC: printf ("%ld", (unsigned long) vma); break;
446 case DEC_5: printf ("%5ld", (long) vma); break;
447 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
468 #if BFD_HOST_64BIT_LONG
471 if (_bfd_int64_high (vma))
472 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
474 printf ("%lx", _bfd_int64_low (vma));
479 #if BFD_HOST_64BIT_LONG
482 if (_bfd_int64_high (vma))
484 printf ("++%ld", _bfd_int64_low (vma));
486 printf ("%ld", _bfd_int64_low (vma));
491 #if BFD_HOST_64BIT_LONG
492 printf ("%5ld", vma);
494 if (_bfd_int64_high (vma))
496 printf ("++%ld", _bfd_int64_low (vma));
498 printf ("%5ld", _bfd_int64_low (vma));
503 #if BFD_HOST_64BIT_LONG
506 if (_bfd_int64_high (vma))
508 printf ("++%lu", _bfd_int64_low (vma));
510 printf ("%lu", _bfd_int64_low (vma));
518 /* Display a symbol on stdout. If do_wide is not true then
519 format the symbol to be at most WIDTH characters,
520 truhncating as necessary. If WIDTH is negative then
521 format the string to be exactly - WIDTH characters,
522 truncating or padding as necessary. */
525 print_symbol (width, symbol)
532 printf ("%-*.*s", width, width, symbol);
534 printf ("%-.*s", width, symbol);
538 byte_get_big_endian (field, size)
539 unsigned char * field;
548 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
551 return ((unsigned long) (field [3]))
552 | (((unsigned long) (field [2])) << 8)
553 | (((unsigned long) (field [1])) << 16)
554 | (((unsigned long) (field [0])) << 24);
558 /* Although we are extracing data from an 8 byte wide field, we
559 are returning only 4 bytes of data. */
560 return ((unsigned long) (field [7]))
561 | (((unsigned long) (field [6])) << 8)
562 | (((unsigned long) (field [5])) << 16)
563 | (((unsigned long) (field [4])) << 24);
567 /* This is a special case, generated by the BYTE_GET8 macro.
568 It means that we are loading an 8 byte value from a field
569 in an external structure into an 8 byte value in a field
570 in an internal strcuture. */
571 return ((bfd_vma) (field [7]))
572 | (((bfd_vma) (field [6])) << 8)
573 | (((bfd_vma) (field [5])) << 16)
574 | (((bfd_vma) (field [4])) << 24)
575 | (((bfd_vma) (field [3])) << 32)
576 | (((bfd_vma) (field [2])) << 40)
577 | (((bfd_vma) (field [1])) << 48)
578 | (((bfd_vma) (field [0])) << 56);
582 error (_("Unhandled data length: %d\n"), size);
587 /* Guess the relocation size commonly used by the specific machines. */
590 guess_is_rela (e_machine)
591 unsigned long e_machine;
595 /* Targets that use REL relocations. */
610 /* Targets that use RELA relocations. */
625 case EM_CYGNUS_MN10200:
627 case EM_CYGNUS_MN10300:
664 warn (_("Don't know about relocations on this machine architecture\n"));
670 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
672 unsigned long rel_offset;
673 unsigned long rel_size;
674 Elf_Internal_Rela **relasp;
675 unsigned long *nrelasp;
677 Elf_Internal_Rela *relas;
678 unsigned long nrelas;
683 Elf32_External_Rela * erelas;
685 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
686 rel_size, _("relocs"));
690 nrelas = rel_size / sizeof (Elf32_External_Rela);
692 relas = (Elf_Internal_Rela *)
693 malloc (nrelas * sizeof (Elf_Internal_Rela));
697 error(_("out of memory parsing relocs"));
701 for (i = 0; i < nrelas; i++)
703 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
704 relas[i].r_info = BYTE_GET (erelas[i].r_info);
705 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
712 Elf64_External_Rela * erelas;
714 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
715 rel_size, _("relocs"));
719 nrelas = rel_size / sizeof (Elf64_External_Rela);
721 relas = (Elf_Internal_Rela *)
722 malloc (nrelas * sizeof (Elf_Internal_Rela));
726 error(_("out of memory parsing relocs"));
730 for (i = 0; i < nrelas; i++)
732 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
733 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
734 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
745 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
747 unsigned long rel_offset;
748 unsigned long rel_size;
749 Elf_Internal_Rel **relsp;
750 unsigned long *nrelsp;
752 Elf_Internal_Rel *rels;
758 Elf32_External_Rel * erels;
760 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
761 rel_size, _("relocs"));
765 nrels = rel_size / sizeof (Elf32_External_Rel);
767 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
771 error(_("out of memory parsing relocs"));
775 for (i = 0; i < nrels; i++)
777 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
778 rels[i].r_info = BYTE_GET (erels[i].r_info);
785 Elf64_External_Rel * erels;
787 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
788 rel_size, _("relocs"));
792 nrels = rel_size / sizeof (Elf64_External_Rel);
794 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
798 error(_("out of memory parsing relocs"));
802 for (i = 0; i < nrels; i++)
804 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
805 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
815 /* Display the contents of the relocation data found at the specified offset. */
817 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
819 unsigned long rel_offset;
820 unsigned long rel_size;
821 Elf_Internal_Sym * symtab;
827 Elf_Internal_Rel * rels;
828 Elf_Internal_Rela * relas;
831 if (is_rela == UNKNOWN)
832 is_rela = guess_is_rela (elf_header.e_machine);
836 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
841 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
849 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
852 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
858 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
861 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
864 for (i = 0; i < rel_size; i++)
869 bfd_vma symtab_index;
874 offset = relas [i].r_offset;
875 info = relas [i].r_info;
879 offset = rels [i].r_offset;
880 info = rels [i].r_info;
885 type = ELF32_R_TYPE (info);
886 symtab_index = ELF32_R_SYM (info);
890 if (elf_header.e_machine == EM_SPARCV9)
891 type = ELF64_R_TYPE_ID (info);
893 type = ELF64_R_TYPE (info);
894 /* The #ifdef BFD64 below is to prevent a compile time warning.
895 We know that if we do not have a 64 bit data type that we
896 will never execute this code anyway. */
898 symtab_index = ELF64_R_SYM (info);
904 #ifdef _bfd_int64_low
905 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
907 printf ("%8.8lx %8.8lx ", offset, info);
912 #ifdef _bfd_int64_low
913 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
914 _bfd_int64_high (offset),
915 _bfd_int64_low (offset),
916 _bfd_int64_high (info),
917 _bfd_int64_low (info));
919 printf ("%16.16lx %16.16lx ", offset, info);
923 switch (elf_header.e_machine)
931 rtype = elf_m32r_reloc_type (type);
936 rtype = elf_i386_reloc_type (type);
940 rtype = elf_m68k_reloc_type (type);
944 rtype = elf_i960_reloc_type (type);
949 rtype = elf_avr_reloc_type (type);
956 rtype = elf_sparc_reloc_type (type);
961 rtype = v850_reloc_type (type);
966 rtype = elf_d10v_reloc_type (type);
971 rtype = elf_d30v_reloc_type (type);
975 rtype = elf_sh_reloc_type (type);
979 case EM_CYGNUS_MN10300:
980 rtype = elf_mn10300_reloc_type (type);
984 case EM_CYGNUS_MN10200:
985 rtype = elf_mn10200_reloc_type (type);
990 rtype = elf_fr30_reloc_type (type);
994 rtype = elf_mcore_reloc_type (type);
998 rtype = elf_mmix_reloc_type (type);
1003 rtype = elf_ppc_reloc_type (type);
1007 case EM_MIPS_RS3_LE:
1008 rtype = elf_mips_reloc_type (type);
1012 rtype = elf_alpha_reloc_type (type);
1016 rtype = elf_arm_reloc_type (type);
1020 rtype = elf_arc_reloc_type (type);
1024 rtype = elf_hppa_reloc_type (type);
1030 rtype = elf_h8_reloc_type (type);
1035 rtype = elf_or32_reloc_type (type);
1040 rtype = elf_pj_reloc_type (type);
1043 rtype = elf_ia64_reloc_type (type);
1047 rtype = elf_cris_reloc_type (type);
1051 rtype = elf_i860_reloc_type (type);
1055 rtype = elf_x86_64_reloc_type (type);
1060 rtype = elf_s390_reloc_type (type);
1064 rtype = elf_xstormy16_reloc_type (type);
1069 #ifdef _bfd_int64_low
1070 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
1072 printf (_("unrecognised: %-7lx"), type);
1075 printf ("%-21.21s", rtype);
1079 if (symtab == NULL || symtab_index >= nsyms)
1080 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1083 Elf_Internal_Sym * psym;
1085 psym = symtab + symtab_index;
1088 print_vma (psym->st_value, LONG_HEX);
1091 if (psym->st_name == 0)
1092 print_symbol (-25, SECTION_NAME (section_headers + psym->st_shndx));
1093 else if (strtab == NULL)
1094 printf (_("<string table index %3ld>"), psym->st_name);
1096 print_symbol (-25, strtab + psym->st_name);
1099 printf (" + %lx", (unsigned long) relas [i].r_addend);
1104 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1105 print_vma (relas[i].r_addend, LONG_HEX);
1108 if (elf_header.e_machine == EM_SPARCV9
1109 && !strcmp (rtype, "R_SPARC_OLO10"))
1110 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1124 get_mips_dynamic_type (type)
1129 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1130 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1131 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1132 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1133 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1134 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1135 case DT_MIPS_MSYM: return "MIPS_MSYM";
1136 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1137 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1138 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1139 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1140 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1141 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1142 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1143 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1144 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1145 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1146 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1147 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1148 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1149 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1150 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1151 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1152 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1153 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1154 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1155 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1156 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1157 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1158 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1159 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1160 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1161 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1162 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1163 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1164 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1165 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1166 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1167 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1168 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1169 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1170 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1171 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1178 get_sparc64_dynamic_type (type)
1183 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1190 get_ppc64_dynamic_type (type)
1195 case DT_PPC64_GLINK: return "PPC64_GLINK";
1196 case DT_PPC64_OPD: return "PPC64_OPD";
1197 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1204 get_parisc_dynamic_type (type)
1209 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1210 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1211 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1212 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1213 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1214 case DT_HP_PREINIT: return "HP_PREINIT";
1215 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1216 case DT_HP_NEEDED: return "HP_NEEDED";
1217 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1218 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1219 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1220 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1221 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1228 get_dynamic_type (type)
1231 static char buff [32];
1235 case DT_NULL: return "NULL";
1236 case DT_NEEDED: return "NEEDED";
1237 case DT_PLTRELSZ: return "PLTRELSZ";
1238 case DT_PLTGOT: return "PLTGOT";
1239 case DT_HASH: return "HASH";
1240 case DT_STRTAB: return "STRTAB";
1241 case DT_SYMTAB: return "SYMTAB";
1242 case DT_RELA: return "RELA";
1243 case DT_RELASZ: return "RELASZ";
1244 case DT_RELAENT: return "RELAENT";
1245 case DT_STRSZ: return "STRSZ";
1246 case DT_SYMENT: return "SYMENT";
1247 case DT_INIT: return "INIT";
1248 case DT_FINI: return "FINI";
1249 case DT_SONAME: return "SONAME";
1250 case DT_RPATH: return "RPATH";
1251 case DT_SYMBOLIC: return "SYMBOLIC";
1252 case DT_REL: return "REL";
1253 case DT_RELSZ: return "RELSZ";
1254 case DT_RELENT: return "RELENT";
1255 case DT_PLTREL: return "PLTREL";
1256 case DT_DEBUG: return "DEBUG";
1257 case DT_TEXTREL: return "TEXTREL";
1258 case DT_JMPREL: return "JMPREL";
1259 case DT_BIND_NOW: return "BIND_NOW";
1260 case DT_INIT_ARRAY: return "INIT_ARRAY";
1261 case DT_FINI_ARRAY: return "FINI_ARRAY";
1262 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1263 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1264 case DT_RUNPATH: return "RUNPATH";
1265 case DT_FLAGS: return "FLAGS";
1267 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1268 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1270 case DT_CHECKSUM: return "CHECKSUM";
1271 case DT_PLTPADSZ: return "PLTPADSZ";
1272 case DT_MOVEENT: return "MOVEENT";
1273 case DT_MOVESZ: return "MOVESZ";
1274 case DT_FEATURE: return "FEATURE";
1275 case DT_POSFLAG_1: return "POSFLAG_1";
1276 case DT_SYMINSZ: return "SYMINSZ";
1277 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1279 case DT_ADDRRNGLO: return "ADDRRNGLO";
1280 case DT_CONFIG: return "CONFIG";
1281 case DT_DEPAUDIT: return "DEPAUDIT";
1282 case DT_AUDIT: return "AUDIT";
1283 case DT_PLTPAD: return "PLTPAD";
1284 case DT_MOVETAB: return "MOVETAB";
1285 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1287 case DT_VERSYM: return "VERSYM";
1289 case DT_RELACOUNT: return "RELACOUNT";
1290 case DT_RELCOUNT: return "RELCOUNT";
1291 case DT_FLAGS_1: return "FLAGS_1";
1292 case DT_VERDEF: return "VERDEF";
1293 case DT_VERDEFNUM: return "VERDEFNUM";
1294 case DT_VERNEED: return "VERNEED";
1295 case DT_VERNEEDNUM: return "VERNEEDNUM";
1297 case DT_AUXILIARY: return "AUXILIARY";
1298 case DT_USED: return "USED";
1299 case DT_FILTER: return "FILTER";
1302 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1304 const char * result;
1306 switch (elf_header.e_machine)
1309 case EM_MIPS_RS3_LE:
1310 result = get_mips_dynamic_type (type);
1313 result = get_sparc64_dynamic_type (type);
1316 result = get_ppc64_dynamic_type (type);
1326 sprintf (buff, _("Processor Specific: %lx"), type);
1328 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1330 const char * result;
1332 switch (elf_header.e_machine)
1335 result = get_parisc_dynamic_type (type);
1345 sprintf (buff, _("Operating System specific: %lx"), type);
1348 sprintf (buff, _("<unknown>: %lx"), type);
1355 get_file_type (e_type)
1358 static char buff [32];
1362 case ET_NONE: return _("NONE (None)");
1363 case ET_REL: return _("REL (Relocatable file)");
1364 case ET_EXEC: return _("EXEC (Executable file)");
1365 case ET_DYN: return _("DYN (Shared object file)");
1366 case ET_CORE: return _("CORE (Core file)");
1369 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1370 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1371 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1372 sprintf (buff, _("OS Specific: (%x)"), e_type);
1374 sprintf (buff, _("<unknown>: %x"), e_type);
1380 get_machine_name (e_machine)
1383 static char buff [64]; /* XXX */
1387 case EM_NONE: return _("None");
1388 case EM_M32: return "WE32100";
1389 case EM_SPARC: return "Sparc";
1390 case EM_386: return "Intel 80386";
1391 case EM_68K: return "MC68000";
1392 case EM_88K: return "MC88000";
1393 case EM_486: return "Intel 80486";
1394 case EM_860: return "Intel 80860";
1395 case EM_MIPS: return "MIPS R3000";
1396 case EM_S370: return "IBM System/370";
1397 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1398 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1399 case EM_PARISC: return "HPPA";
1400 case EM_PPC_OLD: return "Power PC (old)";
1401 case EM_SPARC32PLUS: return "Sparc v8+" ;
1402 case EM_960: return "Intel 90860";
1403 case EM_PPC: return "PowerPC";
1404 case EM_PPC64: return "PowerPC64";
1405 case EM_V800: return "NEC V800";
1406 case EM_FR20: return "Fujitsu FR20";
1407 case EM_RH32: return "TRW RH32";
1408 case EM_MCORE: return "MCORE";
1409 case EM_ARM: return "ARM";
1410 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1411 case EM_SH: return "Hitachi SH";
1412 case EM_SPARCV9: return "Sparc v9";
1413 case EM_TRICORE: return "Siemens Tricore";
1414 case EM_ARC: return "ARC";
1415 case EM_H8_300: return "Hitachi H8/300";
1416 case EM_H8_300H: return "Hitachi H8/300H";
1417 case EM_H8S: return "Hitachi H8S";
1418 case EM_H8_500: return "Hitachi H8/500";
1419 case EM_IA_64: return "Intel IA-64";
1420 case EM_MIPS_X: return "Stanford MIPS-X";
1421 case EM_COLDFIRE: return "Motorola Coldfire";
1422 case EM_68HC12: return "Motorola M68HC12";
1423 case EM_ALPHA: return "Alpha";
1424 case EM_CYGNUS_D10V:
1425 case EM_D10V: return "d10v";
1426 case EM_CYGNUS_D30V:
1427 case EM_D30V: return "d30v";
1428 case EM_CYGNUS_M32R:
1429 case EM_M32R: return "Mitsubishi M32r";
1430 case EM_CYGNUS_V850:
1431 case EM_V850: return "NEC v850";
1432 case EM_CYGNUS_MN10300:
1433 case EM_MN10300: return "mn10300";
1434 case EM_CYGNUS_MN10200:
1435 case EM_MN10200: return "mn10200";
1436 case EM_CYGNUS_FR30:
1437 case EM_FR30: return "Fujitsu FR30";
1439 case EM_PJ: return "picoJava";
1440 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1441 case EM_PCP: return "Siemens PCP";
1442 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1443 case EM_NDR1: return "Denso NDR1 microprocesspr";
1444 case EM_STARCORE: return "Motorola Star*Core processor";
1445 case EM_ME16: return "Toyota ME16 processor";
1446 case EM_ST100: return "STMicroelectronics ST100 processor";
1447 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1448 case EM_FX66: return "Siemens FX66 microcontroller";
1449 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1450 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1451 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1452 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1453 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1454 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1455 case EM_SVX: return "Silicon Graphics SVx";
1456 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1457 case EM_VAX: return "Digital VAX";
1459 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1460 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1461 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1462 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1463 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1464 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1465 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1466 case EM_PRISM: return "SiTera Prism";
1467 case EM_X86_64: return "Advanced Micro Devices X86-64";
1469 case EM_S390: return "IBM S/390";
1470 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1472 case EM_OR32: return "OpenRISC";
1474 sprintf (buff, _("<unknown>: %x"), e_machine);
1480 decode_ARM_machine_flags (e_flags, buf)
1487 eabi = EF_ARM_EABI_VERSION (e_flags);
1488 e_flags &= ~ EF_ARM_EABIMASK;
1490 /* Handle "generic" ARM flags. */
1491 if (e_flags & EF_ARM_RELEXEC)
1493 strcat (buf, ", relocatable executable");
1494 e_flags &= ~ EF_ARM_RELEXEC;
1497 if (e_flags & EF_ARM_HASENTRY)
1499 strcat (buf, ", has entry point");
1500 e_flags &= ~ EF_ARM_HASENTRY;
1503 /* Now handle EABI specific flags. */
1507 strcat (buf, ", <unrecognised EABI>");
1512 case EF_ARM_EABI_VER1:
1513 strcat (buf, ", Version1 EABI");
1518 /* Process flags one bit at a time. */
1519 flag = e_flags & - e_flags;
1524 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1525 strcat (buf, ", sorted symbol tables");
1535 case EF_ARM_EABI_VER2:
1536 strcat (buf, ", Version2 EABI");
1541 /* Process flags one bit at a time. */
1542 flag = e_flags & - e_flags;
1547 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1548 strcat (buf, ", sorted symbol tables");
1551 case EF_ARM_DYNSYMSUSESEGIDX:
1552 strcat (buf, ", dynamic symbols use segment index");
1555 case EF_ARM_MAPSYMSFIRST:
1556 strcat (buf, ", mapping symbols precede others");
1566 case EF_ARM_EABI_UNKNOWN:
1567 strcat (buf, ", GNU EABI");
1572 /* Process flags one bit at a time. */
1573 flag = e_flags & - e_flags;
1578 case EF_ARM_INTERWORK:
1579 strcat (buf, ", interworking enabled");
1582 case EF_ARM_APCS_26:
1583 strcat (buf, ", uses APCS/26");
1586 case EF_ARM_APCS_FLOAT:
1587 strcat (buf, ", uses APCS/float");
1591 strcat (buf, ", position independent");
1595 strcat (buf, ", 8 bit structure alignment");
1598 case EF_ARM_NEW_ABI:
1599 strcat (buf, ", uses new ABI");
1602 case EF_ARM_OLD_ABI:
1603 strcat (buf, ", uses old ABI");
1606 case EF_ARM_SOFT_FLOAT:
1607 strcat (buf, ", software FP");
1618 strcat (buf,", <unknown>");
1622 get_machine_flags (e_flags, e_machine)
1626 static char buf [1024];
1638 decode_ARM_machine_flags (e_flags, buf);
1642 if (e_flags & EF_CPU32)
1643 strcat (buf, ", cpu32");
1647 if (e_flags & EF_PPC_EMB)
1648 strcat (buf, ", emb");
1650 if (e_flags & EF_PPC_RELOCATABLE)
1651 strcat (buf, ", relocatable");
1653 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1654 strcat (buf, ", relocatable-lib");
1658 case EM_CYGNUS_V850:
1659 switch (e_flags & EF_V850_ARCH)
1662 strcat (buf, ", v850e");
1665 strcat (buf, ", v850ea");
1668 strcat (buf, ", v850");
1671 strcat (buf, ", unknown v850 architecture variant");
1677 case EM_CYGNUS_M32R:
1678 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1679 strcat (buf, ", m32r");
1684 case EM_MIPS_RS3_LE:
1685 if (e_flags & EF_MIPS_NOREORDER)
1686 strcat (buf, ", noreorder");
1688 if (e_flags & EF_MIPS_PIC)
1689 strcat (buf, ", pic");
1691 if (e_flags & EF_MIPS_CPIC)
1692 strcat (buf, ", cpic");
1694 if (e_flags & EF_MIPS_UCODE)
1695 strcat (buf, ", ugen_reserved");
1697 if (e_flags & EF_MIPS_ABI2)
1698 strcat (buf, ", abi2");
1700 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1701 strcat (buf, ", odk first");
1703 if (e_flags & EF_MIPS_32BITMODE)
1704 strcat (buf, ", 32bitmode");
1706 switch ((e_flags & EF_MIPS_MACH))
1708 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1709 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1710 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1711 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1712 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1713 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1715 /* We simply ignore the field in this case to avoid confusion:
1716 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1719 default: strcat (buf, ", unknown CPU"); break;
1722 switch ((e_flags & EF_MIPS_ABI))
1724 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1725 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1726 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1727 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
1729 /* We simply ignore the field in this case to avoid confusion:
1730 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1731 This means it is likely to be an o32 file, but not for
1734 default: strcat (buf, ", unknown ABI"); break;
1737 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
1738 strcat (buf, ", mdmx");
1740 if (e_flags & EF_MIPS_ARCH_ASE_M16)
1741 strcat (buf, ", mips16");
1743 switch ((e_flags & EF_MIPS_ARCH))
1745 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
1746 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
1747 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
1748 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
1749 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
1750 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
1751 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
1752 default: strcat (buf, ", unknown ISA"); break;
1758 if (e_flags & EF_SPARC_32PLUS)
1759 strcat (buf, ", v8+");
1761 if (e_flags & EF_SPARC_SUN_US1)
1762 strcat (buf, ", ultrasparcI");
1764 if (e_flags & EF_SPARC_SUN_US3)
1765 strcat (buf, ", ultrasparcIII");
1767 if (e_flags & EF_SPARC_HAL_R1)
1768 strcat (buf, ", halr1");
1770 if (e_flags & EF_SPARC_LEDATA)
1771 strcat (buf, ", ledata");
1773 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1774 strcat (buf, ", tso");
1776 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1777 strcat (buf, ", pso");
1779 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1780 strcat (buf, ", rmo");
1784 switch (e_flags & EF_PARISC_ARCH)
1786 case EFA_PARISC_1_0:
1787 strcpy (buf, ", PA-RISC 1.0");
1789 case EFA_PARISC_1_1:
1790 strcpy (buf, ", PA-RISC 1.1");
1792 case EFA_PARISC_2_0:
1793 strcpy (buf, ", PA-RISC 2.0");
1798 if (e_flags & EF_PARISC_TRAPNIL)
1799 strcat (buf, ", trapnil");
1800 if (e_flags & EF_PARISC_EXT)
1801 strcat (buf, ", ext");
1802 if (e_flags & EF_PARISC_LSB)
1803 strcat (buf, ", lsb");
1804 if (e_flags & EF_PARISC_WIDE)
1805 strcat (buf, ", wide");
1806 if (e_flags & EF_PARISC_NO_KABP)
1807 strcat (buf, ", no kabp");
1808 if (e_flags & EF_PARISC_LAZYSWAP)
1809 strcat (buf, ", lazyswap");
1814 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1815 strcat (buf, ", new calling convention");
1817 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1818 strcat (buf, ", gnu calling convention");
1822 if ((e_flags & EF_IA_64_ABI64))
1823 strcat (buf, ", 64-bit");
1825 strcat (buf, ", 32-bit");
1826 if ((e_flags & EF_IA_64_REDUCEDFP))
1827 strcat (buf, ", reduced fp model");
1828 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1829 strcat (buf, ", no function descriptors, constant gp");
1830 else if ((e_flags & EF_IA_64_CONS_GP))
1831 strcat (buf, ", constant gp");
1832 if ((e_flags & EF_IA_64_ABSOLUTE))
1833 strcat (buf, ", absolute");
1842 get_mips_segment_type (type)
1847 case PT_MIPS_REGINFO:
1849 case PT_MIPS_RTPROC:
1851 case PT_MIPS_OPTIONS:
1861 get_parisc_segment_type (type)
1866 case PT_HP_TLS: return "HP_TLS";
1867 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1868 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1869 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1870 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1871 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1872 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1873 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1874 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1875 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1876 case PT_HP_PARALLEL: return "HP_PARALLEL";
1877 case PT_HP_FASTBIND: return "HP_FASTBIND";
1878 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1879 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1888 get_ia64_segment_type (type)
1893 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1894 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1895 case PT_HP_TLS: return "HP_TLS";
1896 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
1897 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
1898 case PT_IA_64_HP_STACK: return "HP_STACK";
1907 get_segment_type (p_type)
1908 unsigned long p_type;
1910 static char buff [32];
1914 case PT_NULL: return "NULL";
1915 case PT_LOAD: return "LOAD";
1916 case PT_DYNAMIC: return "DYNAMIC";
1917 case PT_INTERP: return "INTERP";
1918 case PT_NOTE: return "NOTE";
1919 case PT_SHLIB: return "SHLIB";
1920 case PT_PHDR: return "PHDR";
1922 case PT_GNU_EH_FRAME:
1923 return "GNU_EH_FRAME";
1926 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1928 const char * result;
1930 switch (elf_header.e_machine)
1933 case EM_MIPS_RS3_LE:
1934 result = get_mips_segment_type (p_type);
1937 result = get_parisc_segment_type (p_type);
1940 result = get_ia64_segment_type (p_type);
1950 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1952 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1954 const char * result;
1956 switch (elf_header.e_machine)
1959 result = get_parisc_segment_type (p_type);
1962 result = get_ia64_segment_type (p_type);
1972 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1975 sprintf (buff, _("<unknown>: %lx"), p_type);
1982 get_mips_section_type_name (sh_type)
1983 unsigned int sh_type;
1987 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1988 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1989 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1990 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1991 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1992 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1993 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1994 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1995 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1996 case SHT_MIPS_RELD: return "MIPS_RELD";
1997 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1998 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1999 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2000 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2001 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2002 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2003 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2004 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2005 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2006 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2007 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2008 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2009 case SHT_MIPS_LINE: return "MIPS_LINE";
2010 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2011 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2012 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2013 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2014 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2015 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2016 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2017 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2018 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2019 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2020 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2021 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2022 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2023 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2024 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2025 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2033 get_parisc_section_type_name (sh_type)
2034 unsigned int sh_type;
2038 case SHT_PARISC_EXT: return "PARISC_EXT";
2039 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2040 case SHT_PARISC_DOC: return "PARISC_DOC";
2048 get_ia64_section_type_name (sh_type)
2049 unsigned int sh_type;
2053 case SHT_IA_64_EXT: return "IA_64_EXT";
2054 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2062 get_section_type_name (sh_type)
2063 unsigned int sh_type;
2065 static char buff [32];
2069 case SHT_NULL: return "NULL";
2070 case SHT_PROGBITS: return "PROGBITS";
2071 case SHT_SYMTAB: return "SYMTAB";
2072 case SHT_STRTAB: return "STRTAB";
2073 case SHT_RELA: return "RELA";
2074 case SHT_HASH: return "HASH";
2075 case SHT_DYNAMIC: return "DYNAMIC";
2076 case SHT_NOTE: return "NOTE";
2077 case SHT_NOBITS: return "NOBITS";
2078 case SHT_REL: return "REL";
2079 case SHT_SHLIB: return "SHLIB";
2080 case SHT_DYNSYM: return "DYNSYM";
2081 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2082 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2083 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2084 case SHT_GROUP: return "GROUP";
2085 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2086 case SHT_GNU_verdef: return "VERDEF";
2087 case SHT_GNU_verneed: return "VERNEED";
2088 case SHT_GNU_versym: return "VERSYM";
2089 case 0x6ffffff0: return "VERSYM";
2090 case 0x6ffffffc: return "VERDEF";
2091 case 0x7ffffffd: return "AUXILIARY";
2092 case 0x7fffffff: return "FILTER";
2095 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2097 const char * result;
2099 switch (elf_header.e_machine)
2102 case EM_MIPS_RS3_LE:
2103 result = get_mips_section_type_name (sh_type);
2106 result = get_parisc_section_type_name (sh_type);
2109 result = get_ia64_section_type_name (sh_type);
2119 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2121 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2122 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2123 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2124 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2126 sprintf (buff, _("<unknown>: %x"), sh_type);
2132 struct option options [] =
2134 {"all", no_argument, 0, 'a'},
2135 {"file-header", no_argument, 0, 'h'},
2136 {"program-headers", no_argument, 0, 'l'},
2137 {"headers", no_argument, 0, 'e'},
2138 {"histogram", no_argument, 0, 'I'},
2139 {"segments", no_argument, 0, 'l'},
2140 {"sections", no_argument, 0, 'S'},
2141 {"section-headers", no_argument, 0, 'S'},
2142 {"symbols", no_argument, 0, 's'},
2143 {"syms", no_argument, 0, 's'},
2144 {"relocs", no_argument, 0, 'r'},
2145 {"notes", no_argument, 0, 'n'},
2146 {"dynamic", no_argument, 0, 'd'},
2147 {"arch-specific", no_argument, 0, 'A'},
2148 {"version-info", no_argument, 0, 'V'},
2149 {"use-dynamic", no_argument, 0, 'D'},
2150 {"hex-dump", required_argument, 0, 'x'},
2151 {"debug-dump", optional_argument, 0, 'w'},
2152 {"unwind", no_argument, 0, 'u'},
2153 #ifdef SUPPORT_DISASSEMBLY
2154 {"instruction-dump", required_argument, 0, 'i'},
2157 {"version", no_argument, 0, 'v'},
2158 {"wide", no_argument, 0, 'W'},
2159 {"help", no_argument, 0, 'H'},
2160 {0, no_argument, 0, 0}
2166 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2167 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2168 fprintf (stdout, _(" Options are:\n\
2169 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2170 -h --file-header Display the ELF file header\n\
2171 -l --program-headers Display the program headers\n\
2172 --segments An alias for --program-headers\n\
2173 -S --section-headers Display the sections' header\n\
2174 --sections An alias for --section-headers\n\
2175 -e --headers Equivalent to: -h -l -S\n\
2176 -s --syms Display the symbol table\n\
2177 --symbols An alias for --syms\n\
2178 -n --notes Display the core notes (if present)\n\
2179 -r --relocs Display the relocations (if present)\n\
2180 -u --unwind Display the unwind info (if present)\n\
2181 -d --dynamic Display the dynamic segment (if present)\n\
2182 -V --version-info Display the version sections (if present)\n\
2183 -A --arch-specific Display architecture specific information (if any).\n\
2184 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2185 -x --hex-dump=<number> Dump the contents of section <number>\n\
2186 -w --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n\
2187 Display the contents of DWARF2 debug sections\n"));
2188 #ifdef SUPPORT_DISASSEMBLY
2189 fprintf (stdout, _("\
2190 -i --instruction-dump=<number>\n\
2191 Disassemble the contents of section <number>\n"));
2193 fprintf (stdout, _("\
2194 -I --histogram Display histogram of bucket list lengths\n\
2195 -W --wide Allow output width to exceed 80 characters\n\
2196 -H --help Display this information\n\
2197 -v --version Display the version number of readelf\n"));
2198 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2204 request_dump (section, type)
2205 unsigned int section;
2208 if (section >= num_dump_sects)
2210 char * new_dump_sects;
2212 new_dump_sects = (char *) calloc (section + 1, 1);
2214 if (new_dump_sects == NULL)
2215 error (_("Out of memory allocating dump request table."));
2218 /* Copy current flag settings. */
2219 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2223 dump_sects = new_dump_sects;
2224 num_dump_sects = section + 1;
2229 dump_sects [section] |= type;
2235 parse_args (argc, argv)
2244 while ((c = getopt_long
2245 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2281 do_using_dynamic ++;
2312 section = strtoul (optarg, & cp, 0);
2313 if (! * cp && section >= 0)
2315 request_dump (section, HEX_DUMP);
2325 unsigned int index = 0;
2329 while (optarg[index])
2330 switch (optarg[index++])
2339 do_debug_abbrevs = 1;
2349 do_debug_pubnames = 1;
2354 do_debug_aranges = 1;
2358 do_debug_frames_interp = 1;
2360 do_debug_frames = 1;
2365 do_debug_macinfo = 1;
2374 warn (_("Unrecognised debug option '%s'\n"), optarg);
2379 #ifdef SUPPORT_DISASSEMBLY
2382 section = strtoul (optarg, & cp, 0);
2383 if (! * cp && section >= 0)
2385 request_dump (section, DISASS_DUMP);
2391 print_version (program_name);
2401 /* xgettext:c-format */
2402 error (_("Invalid option '-%c'\n"), c);
2409 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2410 && !do_segments && !do_header && !do_dump && !do_version
2411 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2415 warn (_("Nothing to do.\n"));
2421 get_elf_class (elf_class)
2422 unsigned int elf_class;
2424 static char buff [32];
2428 case ELFCLASSNONE: return _("none");
2429 case ELFCLASS32: return "ELF32";
2430 case ELFCLASS64: return "ELF64";
2432 sprintf (buff, _("<unknown: %x>"), elf_class);
2438 get_data_encoding (encoding)
2439 unsigned int encoding;
2441 static char buff [32];
2445 case ELFDATANONE: return _("none");
2446 case ELFDATA2LSB: return _("2's complement, little endian");
2447 case ELFDATA2MSB: return _("2's complement, big endian");
2449 sprintf (buff, _("<unknown: %x>"), encoding);
2455 get_osabi_name (osabi)
2458 static char buff [32];
2462 case ELFOSABI_NONE: return "UNIX - System V";
2463 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2464 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2465 case ELFOSABI_LINUX: return "UNIX - Linux";
2466 case ELFOSABI_HURD: return "GNU/Hurd";
2467 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2468 case ELFOSABI_AIX: return "UNIX - AIX";
2469 case ELFOSABI_IRIX: return "UNIX - IRIX";
2470 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2471 case ELFOSABI_TRU64: return "UNIX - TRU64";
2472 case ELFOSABI_MODESTO: return "Novell - Modesto";
2473 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2474 case ELFOSABI_STANDALONE: return _("Standalone App");
2475 case ELFOSABI_ARM: return "ARM";
2477 sprintf (buff, _("<unknown: %x>"), osabi);
2482 /* Decode the data held in 'elf_header'. */
2484 process_file_header ()
2486 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2487 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2488 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2489 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2492 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2500 printf (_("ELF Header:\n"));
2501 printf (_(" Magic: "));
2502 for (i = 0; i < EI_NIDENT; i ++)
2503 printf ("%2.2x ", elf_header.e_ident [i]);
2505 printf (_(" Class: %s\n"),
2506 get_elf_class (elf_header.e_ident [EI_CLASS]));
2507 printf (_(" Data: %s\n"),
2508 get_data_encoding (elf_header.e_ident [EI_DATA]));
2509 printf (_(" Version: %d %s\n"),
2510 elf_header.e_ident [EI_VERSION],
2511 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2513 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2516 printf (_(" OS/ABI: %s\n"),
2517 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2518 printf (_(" ABI Version: %d\n"),
2519 elf_header.e_ident [EI_ABIVERSION]);
2520 printf (_(" Type: %s\n"),
2521 get_file_type (elf_header.e_type));
2522 printf (_(" Machine: %s\n"),
2523 get_machine_name (elf_header.e_machine));
2524 printf (_(" Version: 0x%lx\n"),
2525 (unsigned long) elf_header.e_version);
2527 printf (_(" Entry point address: "));
2528 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2529 printf (_("\n Start of program headers: "));
2530 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2531 printf (_(" (bytes into file)\n Start of section headers: "));
2532 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2533 printf (_(" (bytes into file)\n"));
2535 printf (_(" Flags: 0x%lx%s\n"),
2536 (unsigned long) elf_header.e_flags,
2537 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2538 printf (_(" Size of this header: %ld (bytes)\n"),
2539 (long) elf_header.e_ehsize);
2540 printf (_(" Size of program headers: %ld (bytes)\n"),
2541 (long) elf_header.e_phentsize);
2542 printf (_(" Number of program headers: %ld\n"),
2543 (long) elf_header.e_phnum);
2544 printf (_(" Size of section headers: %ld (bytes)\n"),
2545 (long) elf_header.e_shentsize);
2546 printf (_(" Number of section headers: %ld"),
2547 (long) elf_header.e_shnum);
2548 if (section_headers != NULL && elf_header.e_shnum == 0)
2549 printf (" (%ld)", (long) section_headers[0].sh_size);
2550 putc ('\n', stdout);
2551 printf (_(" Section header string table index: %ld"),
2552 (long) elf_header.e_shstrndx);
2553 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2554 printf (" (%ld)", (long) section_headers[0].sh_link);
2555 putc ('\n', stdout);
2558 if (section_headers != NULL)
2560 if (elf_header.e_shnum == 0)
2561 elf_header.e_shnum = section_headers[0].sh_size;
2562 if (elf_header.e_shstrndx == SHN_XINDEX)
2563 elf_header.e_shstrndx = section_headers[0].sh_link;
2564 free (section_headers);
2565 section_headers = NULL;
2573 get_32bit_program_headers (file, program_headers)
2575 Elf_Internal_Phdr * program_headers;
2577 Elf32_External_Phdr * phdrs;
2578 Elf32_External_Phdr * external;
2579 Elf32_Internal_Phdr * internal;
2582 phdrs = ((Elf32_External_Phdr *)
2583 get_data (NULL, file, elf_header.e_phoff,
2584 elf_header.e_phentsize * elf_header.e_phnum,
2585 _("program headers")));
2589 for (i = 0, internal = program_headers, external = phdrs;
2590 i < elf_header.e_phnum;
2591 i ++, internal ++, external ++)
2593 internal->p_type = BYTE_GET (external->p_type);
2594 internal->p_offset = BYTE_GET (external->p_offset);
2595 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2596 internal->p_paddr = BYTE_GET (external->p_paddr);
2597 internal->p_filesz = BYTE_GET (external->p_filesz);
2598 internal->p_memsz = BYTE_GET (external->p_memsz);
2599 internal->p_flags = BYTE_GET (external->p_flags);
2600 internal->p_align = BYTE_GET (external->p_align);
2609 get_64bit_program_headers (file, program_headers)
2611 Elf_Internal_Phdr * program_headers;
2613 Elf64_External_Phdr * phdrs;
2614 Elf64_External_Phdr * external;
2615 Elf64_Internal_Phdr * internal;
2618 phdrs = ((Elf64_External_Phdr *)
2619 get_data (NULL, file, elf_header.e_phoff,
2620 elf_header.e_phentsize * elf_header.e_phnum,
2621 _("program headers")));
2625 for (i = 0, internal = program_headers, external = phdrs;
2626 i < elf_header.e_phnum;
2627 i ++, internal ++, external ++)
2629 internal->p_type = BYTE_GET (external->p_type);
2630 internal->p_flags = BYTE_GET (external->p_flags);
2631 internal->p_offset = BYTE_GET8 (external->p_offset);
2632 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2633 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2634 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2635 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2636 internal->p_align = BYTE_GET8 (external->p_align);
2645 process_program_headers (file)
2648 Elf_Internal_Phdr * program_headers;
2649 Elf_Internal_Phdr * segment;
2652 if (elf_header.e_phnum == 0)
2655 printf (_("\nThere are no program headers in this file.\n"));
2659 if (do_segments && !do_header)
2661 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2662 printf (_("Entry point "));
2663 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2664 printf (_("\nThere are %d program headers, starting at offset "),
2665 elf_header.e_phnum);
2666 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2670 program_headers = (Elf_Internal_Phdr *) malloc
2671 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2673 if (program_headers == NULL)
2675 error (_("Out of memory\n"));
2680 i = get_32bit_program_headers (file, program_headers);
2682 i = get_64bit_program_headers (file, program_headers);
2686 free (program_headers);
2693 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2697 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2700 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2704 (_(" Type Offset VirtAddr PhysAddr\n"));
2706 (_(" FileSiz MemSiz Flags Align\n"));
2714 for (i = 0, segment = program_headers;
2715 i < elf_header.e_phnum;
2720 printf (" %-14.14s ", get_segment_type (segment->p_type));
2724 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2725 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2726 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2727 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2728 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2730 (segment->p_flags & PF_R ? 'R' : ' '),
2731 (segment->p_flags & PF_W ? 'W' : ' '),
2732 (segment->p_flags & PF_X ? 'E' : ' '));
2733 printf ("%#lx", (unsigned long) segment->p_align);
2737 if ((unsigned long) segment->p_offset == segment->p_offset)
2738 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2741 print_vma (segment->p_offset, FULL_HEX);
2745 print_vma (segment->p_vaddr, FULL_HEX);
2747 print_vma (segment->p_paddr, FULL_HEX);
2750 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2751 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2754 print_vma (segment->p_filesz, FULL_HEX);
2758 if ((unsigned long) segment->p_memsz == segment->p_memsz)
2759 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2762 print_vma (segment->p_offset, FULL_HEX);
2766 (segment->p_flags & PF_R ? 'R' : ' '),
2767 (segment->p_flags & PF_W ? 'W' : ' '),
2768 (segment->p_flags & PF_X ? 'E' : ' '));
2770 if ((unsigned long) segment->p_align == segment->p_align)
2771 printf ("%#lx", (unsigned long) segment->p_align);
2774 print_vma (segment->p_align, PREFIX_HEX);
2779 print_vma (segment->p_offset, FULL_HEX);
2781 print_vma (segment->p_vaddr, FULL_HEX);
2783 print_vma (segment->p_paddr, FULL_HEX);
2785 print_vma (segment->p_filesz, FULL_HEX);
2787 print_vma (segment->p_memsz, FULL_HEX);
2789 (segment->p_flags & PF_R ? 'R' : ' '),
2790 (segment->p_flags & PF_W ? 'W' : ' '),
2791 (segment->p_flags & PF_X ? 'E' : ' '));
2792 print_vma (segment->p_align, HEX);
2796 switch (segment->p_type)
2800 loadaddr = (segment->p_vaddr & 0xfffff000)
2801 - (segment->p_offset & 0xfffff000);
2806 error (_("more than one dynamic segment\n"));
2808 dynamic_addr = segment->p_offset;
2809 dynamic_size = segment->p_filesz;
2813 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2814 error (_("Unable to find program interpreter name\n"));
2817 program_interpreter[0] = 0;
2818 fscanf (file, "%63s", program_interpreter);
2821 printf (_("\n [Requesting program interpreter: %s]"),
2822 program_interpreter);
2828 putc ('\n', stdout);
2837 if (do_segments && section_headers != NULL)
2839 printf (_("\n Section to Segment mapping:\n"));
2840 printf (_(" Segment Sections...\n"));
2842 assert (string_table != NULL);
2844 for (i = 0; i < elf_header.e_phnum; i++)
2847 Elf_Internal_Shdr * section;
2849 segment = program_headers + i;
2850 section = section_headers;
2852 printf (" %2.2d ", i);
2854 for (j = 1; j < elf_header.e_shnum; j++, section ++)
2856 if (section->sh_size > 0
2857 /* Compare allocated sections by VMA, unallocated
2858 sections by file offset. */
2859 && (section->sh_flags & SHF_ALLOC
2860 ? (section->sh_addr >= segment->p_vaddr
2861 && section->sh_addr + section->sh_size
2862 <= segment->p_vaddr + segment->p_memsz)
2863 : ((bfd_vma) section->sh_offset >= segment->p_offset
2864 && (section->sh_offset + section->sh_size
2865 <= segment->p_offset + segment->p_filesz))))
2866 printf ("%s ", SECTION_NAME (section));
2873 free (program_headers);
2880 get_32bit_section_headers (file, num)
2884 Elf32_External_Shdr * shdrs;
2885 Elf32_Internal_Shdr * internal;
2888 shdrs = ((Elf32_External_Shdr *)
2889 get_data (NULL, file, elf_header.e_shoff,
2890 elf_header.e_shentsize * num,
2891 _("section headers")));
2895 section_headers = ((Elf_Internal_Shdr *)
2896 malloc (num * sizeof (Elf_Internal_Shdr)));
2898 if (section_headers == NULL)
2900 error (_("Out of memory\n"));
2904 for (i = 0, internal = section_headers;
2908 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2909 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2910 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2911 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2912 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2913 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2914 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2915 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2916 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2917 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2926 get_64bit_section_headers (file, num)
2930 Elf64_External_Shdr * shdrs;
2931 Elf64_Internal_Shdr * internal;
2934 shdrs = ((Elf64_External_Shdr *)
2935 get_data (NULL, file, elf_header.e_shoff,
2936 elf_header.e_shentsize * num,
2937 _("section headers")));
2941 section_headers = ((Elf_Internal_Shdr *)
2942 malloc (num * sizeof (Elf_Internal_Shdr)));
2944 if (section_headers == NULL)
2946 error (_("Out of memory\n"));
2950 for (i = 0, internal = section_headers;
2954 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2955 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2956 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2957 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2958 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2959 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2960 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2961 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2962 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2963 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2971 static Elf_Internal_Sym *
2972 get_32bit_elf_symbols (file, section)
2974 Elf_Internal_Shdr *section;
2976 unsigned long number;
2977 Elf32_External_Sym * esyms;
2978 Elf_External_Sym_Shndx *shndx;
2979 Elf_Internal_Sym * isyms;
2980 Elf_Internal_Sym * psym;
2983 esyms = ((Elf32_External_Sym *)
2984 get_data (NULL, file, section->sh_offset,
2985 section->sh_size, _("symbols")));
2990 if (symtab_shndx_hdr != NULL
2991 && (symtab_shndx_hdr->sh_link
2992 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
2994 shndx = ((Elf_External_Sym_Shndx *)
2995 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
2996 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3004 number = section->sh_size / section->sh_entsize;
3005 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3009 error (_("Out of memory\n"));
3016 for (j = 0, psym = isyms;
3020 psym->st_name = BYTE_GET (esyms[j].st_name);
3021 psym->st_value = BYTE_GET (esyms[j].st_value);
3022 psym->st_size = BYTE_GET (esyms[j].st_size);
3023 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3024 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3026 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3027 psym->st_info = BYTE_GET (esyms[j].st_info);
3028 psym->st_other = BYTE_GET (esyms[j].st_other);
3038 static Elf_Internal_Sym *
3039 get_64bit_elf_symbols (file, section)
3041 Elf_Internal_Shdr *section;
3043 unsigned long number;
3044 Elf64_External_Sym * esyms;
3045 Elf_External_Sym_Shndx *shndx;
3046 Elf_Internal_Sym * isyms;
3047 Elf_Internal_Sym * psym;
3050 esyms = ((Elf64_External_Sym *)
3051 get_data (NULL, file, section->sh_offset,
3052 section->sh_size, _("symbols")));
3057 if (symtab_shndx_hdr != NULL
3058 && (symtab_shndx_hdr->sh_link
3059 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3061 shndx = ((Elf_External_Sym_Shndx *)
3062 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3063 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3071 number = section->sh_size / section->sh_entsize;
3072 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3076 error (_("Out of memory\n"));
3083 for (j = 0, psym = isyms;
3087 psym->st_name = BYTE_GET (esyms[j].st_name);
3088 psym->st_info = BYTE_GET (esyms[j].st_info);
3089 psym->st_other = BYTE_GET (esyms[j].st_other);
3090 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3091 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3093 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3094 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3095 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3106 get_elf_section_flags (sh_flags)
3109 static char buff [32];
3117 flag = sh_flags & - sh_flags;
3122 case SHF_WRITE: strcat (buff, "W"); break;
3123 case SHF_ALLOC: strcat (buff, "A"); break;
3124 case SHF_EXECINSTR: strcat (buff, "X"); break;
3125 case SHF_MERGE: strcat (buff, "M"); break;
3126 case SHF_STRINGS: strcat (buff, "S"); break;
3127 case SHF_INFO_LINK: strcat (buff, "I"); break;
3128 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3129 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3130 case SHF_GROUP: strcat (buff, "G"); break;
3133 if (flag & SHF_MASKOS)
3136 sh_flags &= ~ SHF_MASKOS;
3138 else if (flag & SHF_MASKPROC)
3141 sh_flags &= ~ SHF_MASKPROC;
3153 process_section_headers (file)
3156 Elf_Internal_Shdr * section;
3159 section_headers = NULL;
3161 if (elf_header.e_shnum == 0)
3164 printf (_("\nThere are no sections in this file.\n"));
3169 if (do_sections && !do_header)
3170 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3171 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3175 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3178 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3181 /* Read in the string table, so that we have names to display. */
3182 section = SECTION_HEADER (elf_header.e_shstrndx);
3184 if (section->sh_size != 0)
3186 string_table = (char *) get_data (NULL, file, section->sh_offset,
3187 section->sh_size, _("string table"));
3189 string_table_length = section->sh_size;
3192 /* Scan the sections for the dynamic symbol table
3193 and dynamic string table and debug sections. */
3194 dynamic_symbols = NULL;
3195 dynamic_strings = NULL;
3196 dynamic_syminfo = NULL;
3198 for (i = 0, section = section_headers;
3199 i < elf_header.e_shnum;
3202 char * name = SECTION_NAME (section);
3204 if (section->sh_type == SHT_DYNSYM)
3206 if (dynamic_symbols != NULL)
3208 error (_("File contains multiple dynamic symbol tables\n"));
3212 num_dynamic_syms = section->sh_size / section->sh_entsize;
3213 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3215 else if (section->sh_type == SHT_STRTAB
3216 && strcmp (name, ".dynstr") == 0)
3218 if (dynamic_strings != NULL)
3220 error (_("File contains multiple dynamic string tables\n"));
3224 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3226 _("dynamic strings"));
3228 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3230 if (symtab_shndx_hdr != NULL)
3232 error (_("File contains multiple symtab shndx tables\n"));
3235 symtab_shndx_hdr = section;
3237 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3238 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3239 || do_debug_frames || do_debug_macinfo || do_debug_str)
3240 && strncmp (name, ".debug_", 7) == 0)
3245 || (do_debug_info && (strcmp (name, "info") == 0))
3246 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3247 || (do_debug_lines && (strcmp (name, "line") == 0))
3248 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3249 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3250 || (do_debug_frames && (strcmp (name, "frame") == 0))
3251 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3252 || (do_debug_str && (strcmp (name, "str") == 0))
3254 request_dump (i, DEBUG_DUMP);
3256 /* linkonce section to be combined with .debug_info at link time. */
3257 else if ((do_debugging || do_debug_info)
3258 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3259 request_dump (i, DEBUG_DUMP);
3260 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3261 request_dump (i, DEBUG_DUMP);
3267 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3271 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3274 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3277 printf (_(" [Nr] Name Type Address Offset\n"));
3278 printf (_(" Size EntSize Flags Link Info Align\n"));
3281 for (i = 0, section = section_headers;
3282 i < elf_header.e_shnum;
3285 printf (" [%2u] %-17.17s %-15.15s ",
3286 SECTION_HEADER_NUM (i),
3287 SECTION_NAME (section),
3288 get_section_type_name (section->sh_type));
3292 print_vma (section->sh_addr, LONG_HEX);
3294 printf ( " %6.6lx %6.6lx %2.2lx",
3295 (unsigned long) section->sh_offset,
3296 (unsigned long) section->sh_size,
3297 (unsigned long) section->sh_entsize);
3299 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3301 printf ("%2ld %3lx %2ld\n",
3302 (unsigned long) section->sh_link,
3303 (unsigned long) section->sh_info,
3304 (unsigned long) section->sh_addralign);
3308 print_vma (section->sh_addr, LONG_HEX);
3310 if ((long) section->sh_offset == section->sh_offset)
3311 printf (" %6.6lx", (unsigned long) section->sh_offset);
3315 print_vma (section->sh_offset, LONG_HEX);
3318 if ((unsigned long) section->sh_size == section->sh_size)
3319 printf (" %6.6lx", (unsigned long) section->sh_size);
3323 print_vma (section->sh_size, LONG_HEX);
3326 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3327 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3331 print_vma (section->sh_entsize, LONG_HEX);
3334 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3336 printf ("%2ld %3lx ",
3337 (unsigned long) section->sh_link,
3338 (unsigned long) section->sh_info);
3340 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3341 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3344 print_vma (section->sh_addralign, DEC);
3351 print_vma (section->sh_addr, LONG_HEX);
3352 if ((long) section->sh_offset == section->sh_offset)
3353 printf (" %8.8lx", (unsigned long) section->sh_offset);
3357 print_vma (section->sh_offset, LONG_HEX);
3360 print_vma (section->sh_size, LONG_HEX);
3362 print_vma (section->sh_entsize, LONG_HEX);
3364 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3366 printf (" %2ld %3lx %ld\n",
3367 (unsigned long) section->sh_link,
3368 (unsigned long) section->sh_info,
3369 (unsigned long) section->sh_addralign);
3373 printf (_("Key to Flags:\n\
3374 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3375 I (info), L (link order), G (group), x (unknown)\n\
3376 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3381 /* Process the reloc section. */
3383 process_relocs (file)
3386 unsigned long rel_size;
3387 unsigned long rel_offset;
3393 if (do_using_dynamic)
3395 int is_rela = FALSE;
3400 if (dynamic_info[DT_REL])
3402 rel_offset = dynamic_info[DT_REL];
3403 rel_size = dynamic_info[DT_RELSZ];
3406 else if (dynamic_info [DT_RELA])
3408 rel_offset = dynamic_info[DT_RELA];
3409 rel_size = dynamic_info[DT_RELASZ];
3412 else if (dynamic_info[DT_JMPREL])
3414 rel_offset = dynamic_info[DT_JMPREL];
3415 rel_size = dynamic_info[DT_PLTRELSZ];
3417 switch (dynamic_info[DT_PLTREL])
3434 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3435 rel_offset, rel_size);
3437 dump_relocations (file, rel_offset - loadaddr, rel_size,
3438 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3441 printf (_("\nThere are no dynamic relocations in this file.\n"));
3445 Elf32_Internal_Shdr * section;
3449 for (i = 0, section = section_headers;
3450 i < elf_header.e_shnum;
3453 if ( section->sh_type != SHT_RELA
3454 && section->sh_type != SHT_REL)
3457 rel_offset = section->sh_offset;
3458 rel_size = section->sh_size;
3462 Elf32_Internal_Shdr * strsec;
3463 Elf_Internal_Sym * symtab;
3466 unsigned long nsyms;
3468 printf (_("\nRelocation section "));
3470 if (string_table == NULL)
3471 printf ("%d", section->sh_name);
3473 printf ("'%s'", SECTION_NAME (section));
3475 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3476 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3481 if (section->sh_link)
3483 Elf32_Internal_Shdr * symsec;
3485 symsec = SECTION_HEADER (section->sh_link);
3486 nsyms = symsec->sh_size / symsec->sh_entsize;
3487 symtab = GET_ELF_SYMBOLS (file, symsec);
3492 strsec = SECTION_HEADER (symsec->sh_link);
3494 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3498 is_rela = section->sh_type == SHT_RELA;
3500 dump_relocations (file, rel_offset, rel_size,
3501 symtab, nsyms, strtab, is_rela);
3513 printf (_("\nThere are no relocations in this file.\n"));
3519 #include "unwind-ia64.h"
3521 /* An absolute address consists of a section and an offset. If the
3522 section is NULL, the offset itself is the address, otherwise, the
3523 address equals to LOAD_ADDRESS(section) + offset. */
3527 unsigned short section;
3533 struct unw_table_entry
3535 struct absaddr start;
3537 struct absaddr info;
3539 *table; /* Unwind table. */
3540 unsigned long table_len; /* Length of unwind table. */
3541 unsigned char * info; /* Unwind info. */
3542 unsigned long info_size; /* Size of unwind info. */
3543 bfd_vma info_addr; /* starting address of unwind info. */
3544 bfd_vma seg_base; /* Starting address of segment. */
3545 Elf_Internal_Sym * symtab; /* The symbol table. */
3546 unsigned long nsyms; /* Number of symbols. */
3547 char * strtab; /* The string table. */
3548 unsigned long strtab_size; /* Size of string table. */
3551 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3552 struct absaddr, const char **,
3554 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3555 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3556 Elf32_Internal_Shdr *));
3559 find_symbol_for_address (aux, addr, symname, offset)
3560 struct unw_aux_info *aux;
3561 struct absaddr addr;
3562 const char **symname;
3565 bfd_vma dist = (bfd_vma) 0x100000;
3566 Elf_Internal_Sym *sym, *best = NULL;
3569 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3571 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3572 && sym->st_name != 0
3573 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3574 && addr.offset >= sym->st_value
3575 && addr.offset - sym->st_value < dist)
3578 dist = addr.offset - sym->st_value;
3585 *symname = (best->st_name >= aux->strtab_size
3586 ? "<corrupt>" : aux->strtab + best->st_name);
3591 *offset = addr.offset;
3595 dump_ia64_unwind (aux)
3596 struct unw_aux_info *aux;
3599 struct unw_table_entry * tp;
3602 addr_size = is_32bit_elf ? 4 : 8;
3604 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3608 const unsigned char * dp;
3609 const unsigned char * head;
3610 const char * procname;
3612 find_symbol_for_address (aux, tp->start, &procname, &offset);
3614 fputs ("\n<", stdout);
3618 fputs (procname, stdout);
3621 printf ("+%lx", (unsigned long) offset);
3624 fputs (">: [", stdout);
3625 print_vma (tp->start.offset, PREFIX_HEX);
3626 fputc ('-', stdout);
3627 print_vma (tp->end.offset, PREFIX_HEX);
3628 printf ("), info at +0x%lx\n",
3629 (unsigned long) (tp->info.offset - aux->seg_base));
3631 head = aux->info + (tp->info.offset - aux->info_addr);
3632 stamp = BYTE_GET8 ((unsigned char *) head);
3634 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3635 (unsigned) UNW_VER (stamp),
3636 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3637 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3638 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3639 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3641 if (UNW_VER (stamp) != 1)
3643 printf ("\tUnknown version.\n");
3648 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3649 dp = unw_decode (dp, in_body, & in_body);
3654 slurp_ia64_unwind_table (file, aux, sec)
3656 struct unw_aux_info *aux;
3657 Elf32_Internal_Shdr *sec;
3659 unsigned long size, addr_size, nrelas, i;
3660 Elf_Internal_Phdr *prog_hdrs, *seg;
3661 struct unw_table_entry *tep;
3662 Elf32_Internal_Shdr *relsec;
3663 Elf_Internal_Rela *rela, *rp;
3664 unsigned char *table, *tp;
3665 Elf_Internal_Sym *sym;
3666 const char *relname;
3669 addr_size = is_32bit_elf ? 4 : 8;
3671 /* First, find the starting address of the segment that includes
3674 if (elf_header.e_phnum)
3676 prog_hdrs = (Elf_Internal_Phdr *)
3677 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3680 result = get_32bit_program_headers (file, prog_hdrs);
3682 result = get_64bit_program_headers (file, prog_hdrs);
3690 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3692 if (seg->p_type != PT_LOAD)
3695 if (sec->sh_addr >= seg->p_vaddr
3696 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3698 aux->seg_base = seg->p_vaddr;
3706 /* Second, build the unwind table from the contents of the unwind section: */
3707 size = sec->sh_size;
3708 table = (char *) get_data (NULL, file, sec->sh_offset,
3709 size, _("unwind table"));
3713 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3714 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3716 tep->start.section = SHN_UNDEF;
3717 tep->end.section = SHN_UNDEF;
3718 tep->info.section = SHN_UNDEF;
3721 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3722 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3723 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3727 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3728 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3729 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3731 tep->start.offset += aux->seg_base;
3732 tep->end.offset += aux->seg_base;
3733 tep->info.offset += aux->seg_base;
3737 /* Third, apply any relocations to the unwind table: */
3739 for (relsec = section_headers;
3740 relsec < section_headers + elf_header.e_shnum;
3743 if (relsec->sh_type != SHT_RELA
3744 || SECTION_HEADER (relsec->sh_info) != sec)
3747 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3751 for (rp = rela; rp < rela + nrelas; ++rp)
3755 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3756 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3758 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3760 warn (_("Skipping unexpected symbol type %u\n"),
3761 ELF32_ST_TYPE (sym->st_info));
3767 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3768 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3770 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3772 warn (_("Skipping unexpected symbol type %u\n"),
3773 ELF64_ST_TYPE (sym->st_info));
3778 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3780 warn (_("Skipping unexpected relocation type %s\n"), relname);
3784 i = rp->r_offset / (3 * addr_size);
3786 switch (rp->r_offset/addr_size % 3)
3789 aux->table[i].start.section = sym->st_shndx;
3790 aux->table[i].start.offset += rp->r_addend;
3793 aux->table[i].end.section = sym->st_shndx;
3794 aux->table[i].end.offset += rp->r_addend;
3797 aux->table[i].info.section = sym->st_shndx;
3798 aux->table[i].info.offset += rp->r_addend;
3808 aux->table_len = size / (3 * addr_size);
3813 process_unwind (file)
3816 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3817 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3818 struct unw_aux_info aux;
3823 if (elf_header.e_machine != EM_IA_64)
3825 printf (_("\nThere are no unwind sections in this file.\n"));
3829 memset (& aux, 0, sizeof (aux));
3831 addr_size = is_32bit_elf ? 4 : 8;
3833 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3835 if (sec->sh_type == SHT_SYMTAB)
3837 aux.nsyms = sec->sh_size / sec->sh_entsize;
3838 aux.symtab = GET_ELF_SYMBOLS (file, sec);
3840 strsec = SECTION_HEADER (sec->sh_link);
3841 aux.strtab_size = strsec->sh_size;
3842 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3843 aux.strtab_size, _("string table"));
3845 else if (sec->sh_type == SHT_IA_64_UNWIND)
3850 printf (_("\nThere are no unwind sections in this file.\n"));
3852 while (unwcount-- > 0)
3857 for (i = unwstart, sec = section_headers + unwstart;
3858 i < elf_header.e_shnum; ++i, ++sec)
3859 if (sec->sh_type == SHT_IA_64_UNWIND)
3866 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3868 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3871 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3872 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3873 suffix = SECTION_NAME (unwsec) + len;
3874 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3876 if (strncmp (SECTION_NAME (sec),
3877 ELF_STRING_ia64_unwind_info_once, len2) == 0
3878 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3883 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3884 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3885 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3886 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3888 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3890 suffix = SECTION_NAME (unwsec) + len;
3891 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3893 if (strncmp (SECTION_NAME (sec),
3894 ELF_STRING_ia64_unwind_info, len2) == 0
3895 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3899 if (i == elf_header.e_shnum)
3901 printf (_("\nCould not find unwind info section for "));
3903 if (string_table == NULL)
3904 printf ("%d", unwsec->sh_name);
3906 printf ("'%s'", SECTION_NAME (unwsec));
3910 aux.info_size = sec->sh_size;
3911 aux.info_addr = sec->sh_addr;
3912 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3913 aux.info_size, _("unwind info"));
3915 printf (_("\nUnwind section "));
3917 if (string_table == NULL)
3918 printf ("%d", unwsec->sh_name);
3920 printf ("'%s'", SECTION_NAME (unwsec));
3922 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3923 (unsigned long) unwsec->sh_offset,
3924 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3926 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3928 if (aux.table_len > 0)
3929 dump_ia64_unwind (& aux);
3932 free ((char *) aux.table);
3934 free ((char *) aux.info);
3943 free ((char *) aux.strtab);
3949 dynamic_segment_mips_val (entry)
3950 Elf_Internal_Dyn * entry;
3952 switch (entry->d_tag)
3955 if (entry->d_un.d_val == 0)
3959 static const char * opts[] =
3961 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3962 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3963 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3964 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3969 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3970 if (entry->d_un.d_val & (1 << cnt))
3972 printf ("%s%s", first ? "" : " ", opts[cnt]);
3979 case DT_MIPS_IVERSION:
3980 if (dynamic_strings != NULL)
3981 printf ("Interface Version: %s\n",
3982 dynamic_strings + entry->d_un.d_val);
3984 printf ("%ld\n", (long) entry->d_un.d_ptr);
3987 case DT_MIPS_TIME_STAMP:
3992 time_t time = entry->d_un.d_val;
3993 tmp = gmtime (&time);
3994 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3995 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3996 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3997 printf ("Time Stamp: %s\n", timebuf);
4001 case DT_MIPS_RLD_VERSION:
4002 case DT_MIPS_LOCAL_GOTNO:
4003 case DT_MIPS_CONFLICTNO:
4004 case DT_MIPS_LIBLISTNO:
4005 case DT_MIPS_SYMTABNO:
4006 case DT_MIPS_UNREFEXTNO:
4007 case DT_MIPS_HIPAGENO:
4008 case DT_MIPS_DELTA_CLASS_NO:
4009 case DT_MIPS_DELTA_INSTANCE_NO:
4010 case DT_MIPS_DELTA_RELOC_NO:
4011 case DT_MIPS_DELTA_SYM_NO:
4012 case DT_MIPS_DELTA_CLASSSYM_NO:
4013 case DT_MIPS_COMPACT_SIZE:
4014 printf ("%ld\n", (long) entry->d_un.d_ptr);
4018 printf ("%#lx\n", (long) entry->d_un.d_ptr);
4024 dynamic_segment_parisc_val (entry)
4025 Elf_Internal_Dyn * entry;
4027 switch (entry->d_tag)
4029 case DT_HP_DLD_FLAGS:
4038 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4039 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4040 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4041 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4042 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4043 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4044 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4045 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4046 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4047 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4048 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4052 bfd_vma val = entry->d_un.d_val;
4054 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4055 if (val & flags[cnt].bit)
4059 fputs (flags[cnt].str, stdout);
4061 val ^= flags[cnt].bit;
4064 if (val != 0 || first)
4068 print_vma (val, HEX);
4074 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4080 get_32bit_dynamic_segment (file)
4083 Elf32_External_Dyn * edyn;
4084 Elf_Internal_Dyn * entry;
4087 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4088 dynamic_size, _("dynamic segment"));
4092 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4093 how large this .dynamic is now. We can do this even before the byte
4094 swapping since the DT_NULL tag is recognizable. */
4096 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
4099 dynamic_segment = (Elf_Internal_Dyn *)
4100 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4102 if (dynamic_segment == NULL)
4104 error (_("Out of memory\n"));
4109 for (i = 0, entry = dynamic_segment;
4113 entry->d_tag = BYTE_GET (edyn [i].d_tag);
4114 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
4123 get_64bit_dynamic_segment (file)
4126 Elf64_External_Dyn * edyn;
4127 Elf_Internal_Dyn * entry;
4130 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4131 dynamic_size, _("dynamic segment"));
4135 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4136 how large this .dynamic is now. We can do this even before the byte
4137 swapping since the DT_NULL tag is recognizable. */
4139 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
4142 dynamic_segment = (Elf_Internal_Dyn *)
4143 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4145 if (dynamic_segment == NULL)
4147 error (_("Out of memory\n"));
4152 for (i = 0, entry = dynamic_segment;
4156 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
4157 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
4166 get_dynamic_flags (flags)
4169 static char buff [64];
4174 flag = flags & - flags;
4179 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
4180 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
4181 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
4182 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
4183 default: strcat (buff, "unknown "); break;
4189 /* Parse and display the contents of the dynamic segment. */
4191 process_dynamic_segment (file)
4194 Elf_Internal_Dyn * entry;
4197 if (dynamic_size == 0)
4200 printf (_("\nThere is no dynamic segment in this file.\n"));
4207 if (! get_32bit_dynamic_segment (file))
4210 else if (! get_64bit_dynamic_segment (file))
4213 /* Find the appropriate symbol table. */
4214 if (dynamic_symbols == NULL)
4216 for (i = 0, entry = dynamic_segment;
4220 Elf32_Internal_Shdr section;
4222 if (entry->d_tag != DT_SYMTAB)
4225 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4227 /* Since we do not know how big the symbol table is,
4228 we default to reading in the entire file (!) and
4229 processing that. This is overkill, I know, but it
4231 section.sh_offset = entry->d_un.d_val - loadaddr;
4233 if (fseek (file, 0, SEEK_END))
4234 error (_("Unable to seek to end of file!"));
4236 section.sh_size = ftell (file) - section.sh_offset;
4238 section.sh_entsize = sizeof (Elf32_External_Sym);
4240 section.sh_entsize = sizeof (Elf64_External_Sym);
4242 num_dynamic_syms = section.sh_size / section.sh_entsize;
4243 if (num_dynamic_syms < 1)
4245 error (_("Unable to determine the number of symbols to load\n"));
4249 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
4253 /* Similarly find a string table. */
4254 if (dynamic_strings == NULL)
4256 for (i = 0, entry = dynamic_segment;
4260 unsigned long offset;
4263 if (entry->d_tag != DT_STRTAB)
4266 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4268 /* Since we do not know how big the string table is,
4269 we default to reading in the entire file (!) and
4270 processing that. This is overkill, I know, but it
4273 offset = entry->d_un.d_val - loadaddr;
4274 if (fseek (file, 0, SEEK_END))
4275 error (_("Unable to seek to end of file\n"));
4276 str_tab_len = ftell (file) - offset;
4278 if (str_tab_len < 1)
4281 (_("Unable to determine the length of the dynamic string table\n"));
4285 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4286 _("dynamic string table"));
4291 /* And find the syminfo section if available. */
4292 if (dynamic_syminfo == NULL)
4294 unsigned int syminsz = 0;
4296 for (i = 0, entry = dynamic_segment;
4300 if (entry->d_tag == DT_SYMINENT)
4302 /* Note: these braces are necessary to avoid a syntax
4303 error from the SunOS4 C compiler. */
4304 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4306 else if (entry->d_tag == DT_SYMINSZ)
4307 syminsz = entry->d_un.d_val;
4308 else if (entry->d_tag == DT_SYMINFO)
4309 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4312 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4314 Elf_External_Syminfo * extsyminfo;
4315 Elf_Internal_Syminfo * syminfo;
4317 /* There is a syminfo section. Read the data. */
4318 extsyminfo = ((Elf_External_Syminfo *)
4319 get_data (NULL, file, dynamic_syminfo_offset,
4320 syminsz, _("symbol information")));
4324 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4325 if (dynamic_syminfo == NULL)
4327 error (_("Out of memory\n"));
4331 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4332 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4335 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4336 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4343 if (do_dynamic && dynamic_addr)
4344 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4345 dynamic_addr, (long) dynamic_size);
4347 printf (_(" Tag Type Name/Value\n"));
4349 for (i = 0, entry = dynamic_segment;
4358 print_vma (entry->d_tag, FULL_HEX);
4359 dtype = get_dynamic_type (entry->d_tag);
4360 printf (" (%s)%*s", dtype,
4361 ((is_32bit_elf ? 27 : 19)
4362 - (int) strlen (dtype)),
4366 switch (entry->d_tag)
4370 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4380 switch (entry->d_tag)
4383 printf (_("Auxiliary library"));
4387 printf (_("Filter library"));
4391 printf (_("Configuration file"));
4395 printf (_("Dependency audit library"));
4399 printf (_("Audit library"));
4403 if (dynamic_strings)
4404 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4408 print_vma (entry->d_un.d_val, PREFIX_HEX);
4417 printf (_("Flags:"));
4418 if (entry->d_un.d_val == 0)
4419 printf (_(" None\n"));
4422 unsigned long int val = entry->d_un.d_val;
4423 if (val & DTF_1_PARINIT)
4425 printf (" PARINIT");
4426 val ^= DTF_1_PARINIT;
4428 if (val & DTF_1_CONFEXP)
4430 printf (" CONFEXP");
4431 val ^= DTF_1_CONFEXP;
4434 printf (" %lx", val);
4443 printf (_("Flags:"));
4444 if (entry->d_un.d_val == 0)
4445 printf (_(" None\n"));
4448 unsigned long int val = entry->d_un.d_val;
4449 if (val & DF_P1_LAZYLOAD)
4451 printf (" LAZYLOAD");
4452 val ^= DF_P1_LAZYLOAD;
4454 if (val & DF_P1_GROUPPERM)
4456 printf (" GROUPPERM");
4457 val ^= DF_P1_GROUPPERM;
4460 printf (" %lx", val);
4469 printf (_("Flags:"));
4470 if (entry->d_un.d_val == 0)
4471 printf (_(" None\n"));
4474 unsigned long int val = entry->d_un.d_val;
4480 if (val & DF_1_GLOBAL)
4485 if (val & DF_1_GROUP)
4490 if (val & DF_1_NODELETE)
4492 printf (" NODELETE");
4493 val ^= DF_1_NODELETE;
4495 if (val & DF_1_LOADFLTR)
4497 printf (" LOADFLTR");
4498 val ^= DF_1_LOADFLTR;
4500 if (val & DF_1_INITFIRST)
4502 printf (" INITFIRST");
4503 val ^= DF_1_INITFIRST;
4505 if (val & DF_1_NOOPEN)
4510 if (val & DF_1_ORIGIN)
4515 if (val & DF_1_DIRECT)
4520 if (val & DF_1_TRANS)
4525 if (val & DF_1_INTERPOSE)
4527 printf (" INTERPOSE");
4528 val ^= DF_1_INTERPOSE;
4530 if (val & DF_1_NODEFLIB)
4532 printf (" NODEFLIB");
4533 val ^= DF_1_NODEFLIB;
4535 if (val & DF_1_NODUMP)
4540 if (val & DF_1_CONLFAT)
4542 printf (" CONLFAT");
4543 val ^= DF_1_CONLFAT;
4546 printf (" %lx", val);
4554 puts (get_dynamic_type (entry->d_un.d_val));
4574 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4580 if (dynamic_strings == NULL)
4583 name = dynamic_strings + entry->d_un.d_val;
4587 switch (entry->d_tag)
4590 printf (_("Shared library: [%s]"), name);
4592 if (strcmp (name, program_interpreter) == 0)
4593 printf (_(" program interpreter"));
4597 printf (_("Library soname: [%s]"), name);
4601 printf (_("Library rpath: [%s]"), name);
4605 printf (_("Library runpath: [%s]"), name);
4609 print_vma (entry->d_un.d_val, PREFIX_HEX);
4614 print_vma (entry->d_un.d_val, PREFIX_HEX);
4630 case DT_INIT_ARRAYSZ:
4631 case DT_FINI_ARRAYSZ:
4634 print_vma (entry->d_un.d_val, UNSIGNED);
4635 printf (" (bytes)\n");
4645 print_vma (entry->d_un.d_val, UNSIGNED);
4658 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4662 name = dynamic_strings + entry->d_un.d_val;
4666 printf (_("Not needed object: [%s]\n"), name);
4671 print_vma (entry->d_un.d_val, PREFIX_HEX);
4677 /* The value of this entry is ignored. */
4681 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4682 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4687 switch (elf_header.e_machine)
4690 case EM_MIPS_RS3_LE:
4691 dynamic_segment_mips_val (entry);
4694 dynamic_segment_parisc_val (entry);
4697 print_vma (entry->d_un.d_val, PREFIX_HEX);
4709 get_ver_flags (flags)
4712 static char buff [32];
4719 if (flags & VER_FLG_BASE)
4720 strcat (buff, "BASE ");
4722 if (flags & VER_FLG_WEAK)
4724 if (flags & VER_FLG_BASE)
4725 strcat (buff, "| ");
4727 strcat (buff, "WEAK ");
4730 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4731 strcat (buff, "| <unknown>");
4736 /* Display the contents of the version sections. */
4738 process_version_sections (file)
4741 Elf32_Internal_Shdr * section;
4748 for (i = 0, section = section_headers;
4749 i < elf_header.e_shnum;
4752 switch (section->sh_type)
4754 case SHT_GNU_verdef:
4756 Elf_External_Verdef * edefs;
4763 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4764 SECTION_NAME (section), section->sh_info);
4766 printf (_(" Addr: 0x"));
4767 printf_vma (section->sh_addr);
4768 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4769 (unsigned long) section->sh_offset, section->sh_link,
4770 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4772 edefs = ((Elf_External_Verdef *)
4773 get_data (NULL, file, section->sh_offset,
4775 _("version definition section")));
4779 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4782 Elf_External_Verdef * edef;
4783 Elf_Internal_Verdef ent;
4784 Elf_External_Verdaux * eaux;
4785 Elf_Internal_Verdaux aux;
4789 vstart = ((char *) edefs) + idx;
4791 edef = (Elf_External_Verdef *) vstart;
4793 ent.vd_version = BYTE_GET (edef->vd_version);
4794 ent.vd_flags = BYTE_GET (edef->vd_flags);
4795 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4796 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4797 ent.vd_hash = BYTE_GET (edef->vd_hash);
4798 ent.vd_aux = BYTE_GET (edef->vd_aux);
4799 ent.vd_next = BYTE_GET (edef->vd_next);
4801 printf (_(" %#06x: Rev: %d Flags: %s"),
4802 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4804 printf (_(" Index: %d Cnt: %d "),
4805 ent.vd_ndx, ent.vd_cnt);
4807 vstart += ent.vd_aux;
4809 eaux = (Elf_External_Verdaux *) vstart;
4811 aux.vda_name = BYTE_GET (eaux->vda_name);
4812 aux.vda_next = BYTE_GET (eaux->vda_next);
4814 if (dynamic_strings)
4815 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4817 printf (_("Name index: %ld\n"), aux.vda_name);
4819 isum = idx + ent.vd_aux;
4821 for (j = 1; j < ent.vd_cnt; j ++)
4823 isum += aux.vda_next;
4824 vstart += aux.vda_next;
4826 eaux = (Elf_External_Verdaux *) vstart;
4828 aux.vda_name = BYTE_GET (eaux->vda_name);
4829 aux.vda_next = BYTE_GET (eaux->vda_next);
4831 if (dynamic_strings)
4832 printf (_(" %#06x: Parent %d: %s\n"),
4833 isum, j, dynamic_strings + aux.vda_name);
4835 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4836 isum, j, aux.vda_name);
4846 case SHT_GNU_verneed:
4848 Elf_External_Verneed * eneed;
4854 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4855 SECTION_NAME (section), section->sh_info);
4857 printf (_(" Addr: 0x"));
4858 printf_vma (section->sh_addr);
4859 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4860 (unsigned long) section->sh_offset, section->sh_link,
4861 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4863 eneed = ((Elf_External_Verneed *)
4864 get_data (NULL, file, section->sh_offset,
4865 section->sh_size, _("version need section")));
4869 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4871 Elf_External_Verneed * entry;
4872 Elf_Internal_Verneed ent;
4877 vstart = ((char *) eneed) + idx;
4879 entry = (Elf_External_Verneed *) vstart;
4881 ent.vn_version = BYTE_GET (entry->vn_version);
4882 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4883 ent.vn_file = BYTE_GET (entry->vn_file);
4884 ent.vn_aux = BYTE_GET (entry->vn_aux);
4885 ent.vn_next = BYTE_GET (entry->vn_next);
4887 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4889 if (dynamic_strings)
4890 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4892 printf (_(" File: %lx"), ent.vn_file);
4894 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4896 vstart += ent.vn_aux;
4898 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4900 Elf_External_Vernaux * eaux;
4901 Elf_Internal_Vernaux aux;
4903 eaux = (Elf_External_Vernaux *) vstart;
4905 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4906 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4907 aux.vna_other = BYTE_GET (eaux->vna_other);
4908 aux.vna_name = BYTE_GET (eaux->vna_name);
4909 aux.vna_next = BYTE_GET (eaux->vna_next);
4911 if (dynamic_strings)
4912 printf (_(" %#06x: Name: %s"),
4913 isum, dynamic_strings + aux.vna_name);
4915 printf (_(" %#06x: Name index: %lx"),
4916 isum, aux.vna_name);
4918 printf (_(" Flags: %s Version: %d\n"),
4919 get_ver_flags (aux.vna_flags), aux.vna_other);
4921 isum += aux.vna_next;
4922 vstart += aux.vna_next;
4932 case SHT_GNU_versym:
4934 Elf32_Internal_Shdr * link_section;
4937 unsigned char * edata;
4938 unsigned short * data;
4940 Elf_Internal_Sym * symbols;
4941 Elf32_Internal_Shdr * string_sec;
4943 link_section = SECTION_HEADER (section->sh_link);
4944 total = section->sh_size / section->sh_entsize;
4948 symbols = GET_ELF_SYMBOLS (file, link_section);
4950 string_sec = SECTION_HEADER (link_section->sh_link);
4952 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4953 string_sec->sh_size,
4954 _("version string table"));
4958 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4959 SECTION_NAME (section), total);
4961 printf (_(" Addr: "));
4962 printf_vma (section->sh_addr);
4963 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4964 (unsigned long) section->sh_offset, section->sh_link,
4965 SECTION_NAME (link_section));
4969 get_data (NULL, file,
4970 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4971 total * sizeof (short), _("version symbol data")));
4978 data = (unsigned short *) malloc (total * sizeof (short));
4980 for (cnt = total; cnt --;)
4981 data [cnt] = byte_get (edata + cnt * sizeof (short),
4986 for (cnt = 0; cnt < total; cnt += 4)
4989 int check_def, check_need;
4992 printf (" %03x:", cnt);
4994 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4995 switch (data [cnt + j])
4998 fputs (_(" 0 (*local*) "), stdout);
5002 fputs (_(" 1 (*global*) "), stdout);
5006 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
5007 data [cnt + j] & 0x8000 ? 'h' : ' ');
5011 if (SECTION_HEADER (symbols [cnt + j].st_shndx)->sh_type
5014 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
5021 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
5023 Elf_Internal_Verneed ivn;
5024 unsigned long offset;
5026 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5031 Elf_Internal_Vernaux ivna;
5032 Elf_External_Verneed evn;
5033 Elf_External_Vernaux evna;
5034 unsigned long a_off;
5036 get_data (&evn, file, offset, sizeof (evn),
5039 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5040 ivn.vn_next = BYTE_GET (evn.vn_next);
5042 a_off = offset + ivn.vn_aux;
5046 get_data (&evna, file, a_off, sizeof (evna),
5047 _("version need aux (2)"));
5049 ivna.vna_next = BYTE_GET (evna.vna_next);
5050 ivna.vna_other = BYTE_GET (evna.vna_other);
5052 a_off += ivna.vna_next;
5054 while (ivna.vna_other != data [cnt + j]
5055 && ivna.vna_next != 0);
5057 if (ivna.vna_other == data [cnt + j])
5059 ivna.vna_name = BYTE_GET (evna.vna_name);
5061 name = strtab + ivna.vna_name;
5062 nn += printf ("(%s%-*s",
5064 12 - (int) strlen (name),
5070 offset += ivn.vn_next;
5072 while (ivn.vn_next);
5075 if (check_def && data [cnt + j] != 0x8001
5076 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5078 Elf_Internal_Verdef ivd;
5079 Elf_External_Verdef evd;
5080 unsigned long offset;
5082 offset = version_info
5083 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
5087 get_data (&evd, file, offset, sizeof (evd),
5090 ivd.vd_next = BYTE_GET (evd.vd_next);
5091 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5093 offset += ivd.vd_next;
5095 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
5096 && ivd.vd_next != 0);
5098 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
5100 Elf_External_Verdaux evda;
5101 Elf_Internal_Verdaux ivda;
5103 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5105 get_data (&evda, file,
5106 offset - ivd.vd_next + ivd.vd_aux,
5107 sizeof (evda), _("version def aux"));
5109 ivda.vda_name = BYTE_GET (evda.vda_name);
5111 name = strtab + ivda.vda_name;
5112 nn += printf ("(%s%-*s",
5114 12 - (int) strlen (name),
5120 printf ("%*c", 18 - nn, ' ');
5138 printf (_("\nNo version information found in this file.\n"));
5144 get_symbol_binding (binding)
5145 unsigned int binding;
5147 static char buff [32];
5151 case STB_LOCAL: return "LOCAL";
5152 case STB_GLOBAL: return "GLOBAL";
5153 case STB_WEAK: return "WEAK";
5155 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5156 sprintf (buff, _("<processor specific>: %d"), binding);
5157 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5158 sprintf (buff, _("<OS specific>: %d"), binding);
5160 sprintf (buff, _("<unknown>: %d"), binding);
5166 get_symbol_type (type)
5169 static char buff [32];
5173 case STT_NOTYPE: return "NOTYPE";
5174 case STT_OBJECT: return "OBJECT";
5175 case STT_FUNC: return "FUNC";
5176 case STT_SECTION: return "SECTION";
5177 case STT_FILE: return "FILE";
5178 case STT_COMMON: return "COMMON";
5180 if (type >= STT_LOPROC && type <= STT_HIPROC)
5182 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5183 return "THUMB_FUNC";
5185 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5188 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5189 return "PARISC_MILLI";
5191 sprintf (buff, _("<processor specific>: %d"), type);
5193 else if (type >= STT_LOOS && type <= STT_HIOS)
5195 if (elf_header.e_machine == EM_PARISC)
5197 if (type == STT_HP_OPAQUE)
5199 if (type == STT_HP_STUB)
5203 sprintf (buff, _("<OS specific>: %d"), type);
5206 sprintf (buff, _("<unknown>: %d"), type);
5212 get_symbol_visibility (visibility)
5213 unsigned int visibility;
5217 case STV_DEFAULT: return "DEFAULT";
5218 case STV_INTERNAL: return "INTERNAL";
5219 case STV_HIDDEN: return "HIDDEN";
5220 case STV_PROTECTED: return "PROTECTED";
5226 get_symbol_index_type (type)
5231 case SHN_UNDEF: return "UND";
5232 case SHN_ABS: return "ABS";
5233 case SHN_COMMON: return "COM";
5235 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5237 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5239 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5243 static char buff [32];
5245 sprintf (buff, "%3d", type);
5252 get_dynamic_data (file, number)
5254 unsigned int number;
5256 unsigned char * e_data;
5259 e_data = (unsigned char *) malloc (number * 4);
5263 error (_("Out of memory\n"));
5267 if (fread (e_data, 4, number, file) != number)
5269 error (_("Unable to read in dynamic data\n"));
5273 i_data = (int *) malloc (number * sizeof (* i_data));
5277 error (_("Out of memory\n"));
5283 i_data [number] = byte_get (e_data + number * 4, 4);
5290 /* Dump the symbol table. */
5292 process_symbol_table (file)
5295 Elf32_Internal_Shdr * section;
5296 unsigned char nb [4];
5297 unsigned char nc [4];
5300 int * buckets = NULL;
5301 int * chains = NULL;
5303 if (! do_syms && !do_histogram)
5306 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5309 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5311 error (_("Unable to seek to start of dynamic information"));
5315 if (fread (nb, sizeof (nb), 1, file) != 1)
5317 error (_("Failed to read in number of buckets\n"));
5321 if (fread (nc, sizeof (nc), 1, file) != 1)
5323 error (_("Failed to read in number of chains\n"));
5327 nbuckets = byte_get (nb, 4);
5328 nchains = byte_get (nc, 4);
5330 buckets = get_dynamic_data (file, nbuckets);
5331 chains = get_dynamic_data (file, nchains);
5333 if (buckets == NULL || chains == NULL)
5338 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5343 printf (_("\nSymbol table for image:\n"));
5345 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5347 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5349 for (hn = 0; hn < nbuckets; hn++)
5354 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5356 Elf_Internal_Sym * psym;
5358 psym = dynamic_symbols + si;
5360 printf (" %3d %3d: ", si, hn);
5361 print_vma (psym->st_value, LONG_HEX);
5363 print_vma (psym->st_size, DEC_5);
5365 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5366 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5367 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5368 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5369 print_symbol (25, dynamic_strings + psym->st_name);
5374 else if (do_syms && !do_using_dynamic)
5378 for (i = 0, section = section_headers;
5379 i < elf_header.e_shnum;
5384 Elf_Internal_Sym * symtab;
5385 Elf_Internal_Sym * psym;
5388 if ( section->sh_type != SHT_SYMTAB
5389 && section->sh_type != SHT_DYNSYM)
5392 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5393 SECTION_NAME (section),
5394 (unsigned long) (section->sh_size / section->sh_entsize));
5396 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5398 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5400 symtab = GET_ELF_SYMBOLS (file, section);
5404 if (section->sh_link == elf_header.e_shstrndx)
5405 strtab = string_table;
5408 Elf32_Internal_Shdr * string_sec;
5410 string_sec = SECTION_HEADER (section->sh_link);
5412 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5413 string_sec->sh_size,
5417 for (si = 0, psym = symtab;
5418 si < section->sh_size / section->sh_entsize;
5421 printf ("%6d: ", si);
5422 print_vma (psym->st_value, LONG_HEX);
5424 print_vma (psym->st_size, DEC_5);
5425 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5426 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5427 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5428 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
5429 print_symbol (25, strtab + psym->st_name);
5431 if (section->sh_type == SHT_DYNSYM &&
5432 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5434 unsigned char data[2];
5435 unsigned short vers_data;
5436 unsigned long offset;
5440 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5443 get_data (&data, file, offset + si * sizeof (vers_data),
5444 sizeof (data), _("version data"));
5446 vers_data = byte_get (data, 2);
5448 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5451 check_def = (psym->st_shndx != SHN_UNDEF);
5453 if ((vers_data & 0x8000) || vers_data > 1)
5455 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5456 && (is_nobits || ! check_def))
5458 Elf_External_Verneed evn;
5459 Elf_Internal_Verneed ivn;
5460 Elf_Internal_Vernaux ivna;
5462 /* We must test both. */
5463 offset = version_info
5464 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5468 unsigned long vna_off;
5470 get_data (&evn, file, offset, sizeof (evn),
5473 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5474 ivn.vn_next = BYTE_GET (evn.vn_next);
5476 vna_off = offset + ivn.vn_aux;
5480 Elf_External_Vernaux evna;
5482 get_data (&evna, file, vna_off,
5484 _("version need aux (3)"));
5486 ivna.vna_other = BYTE_GET (evna.vna_other);
5487 ivna.vna_next = BYTE_GET (evna.vna_next);
5488 ivna.vna_name = BYTE_GET (evna.vna_name);
5490 vna_off += ivna.vna_next;
5492 while (ivna.vna_other != vers_data
5493 && ivna.vna_next != 0);
5495 if (ivna.vna_other == vers_data)
5498 offset += ivn.vn_next;
5500 while (ivn.vn_next != 0);
5502 if (ivna.vna_other == vers_data)
5505 strtab + ivna.vna_name, ivna.vna_other);
5508 else if (! is_nobits)
5509 error (_("bad dynamic symbol"));
5516 if (vers_data != 0x8001
5517 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5519 Elf_Internal_Verdef ivd;
5520 Elf_Internal_Verdaux ivda;
5521 Elf_External_Verdaux evda;
5522 unsigned long offset;
5525 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5530 Elf_External_Verdef evd;
5532 get_data (&evd, file, offset, sizeof (evd),
5535 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5536 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5537 ivd.vd_next = BYTE_GET (evd.vd_next);
5539 offset += ivd.vd_next;
5541 while (ivd.vd_ndx != (vers_data & 0x7fff)
5542 && ivd.vd_next != 0);
5544 offset -= ivd.vd_next;
5545 offset += ivd.vd_aux;
5547 get_data (&evda, file, offset, sizeof (evda),
5548 _("version def aux"));
5550 ivda.vda_name = BYTE_GET (evda.vda_name);
5552 if (psym->st_name != ivda.vda_name)
5553 printf ((vers_data & 0x8000)
5555 strtab + ivda.vda_name);
5565 if (strtab != string_table)
5571 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5573 if (do_histogram && buckets != NULL)
5580 int nzero_counts = 0;
5583 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5585 printf (_(" Length Number %% of total Coverage\n"));
5587 lengths = (int *) calloc (nbuckets, sizeof (int));
5588 if (lengths == NULL)
5590 error (_("Out of memory"));
5593 for (hn = 0; hn < nbuckets; ++hn)
5598 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5601 if (maxlength < ++lengths[hn])
5606 counts = (int *) calloc (maxlength + 1, sizeof (int));
5609 error (_("Out of memory"));
5613 for (hn = 0; hn < nbuckets; ++hn)
5614 ++ counts [lengths [hn]];
5618 printf (" 0 %-10d (%5.1f%%)\n",
5619 counts[0], (counts[0] * 100.0) / nbuckets);
5620 for (si = 1; si <= maxlength; ++si)
5622 nzero_counts += counts[si] * si;
5623 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5624 si, counts[si], (counts[si] * 100.0) / nbuckets,
5625 (nzero_counts * 100.0) / nsyms);
5633 if (buckets != NULL)
5643 process_syminfo (file)
5644 FILE * file ATTRIBUTE_UNUSED;
5648 if (dynamic_syminfo == NULL
5650 /* No syminfo, this is ok. */
5653 /* There better should be a dynamic symbol section. */
5654 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5658 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5659 dynamic_syminfo_offset, dynamic_syminfo_nent);
5661 printf (_(" Num: Name BoundTo Flags\n"));
5662 for (i = 0; i < dynamic_syminfo_nent; ++i)
5664 unsigned short int flags = dynamic_syminfo[i].si_flags;
5666 printf ("%4d: ", i);
5667 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
5670 switch (dynamic_syminfo[i].si_boundto)
5672 case SYMINFO_BT_SELF:
5673 fputs ("SELF ", stdout);
5675 case SYMINFO_BT_PARENT:
5676 fputs ("PARENT ", stdout);
5679 if (dynamic_syminfo[i].si_boundto > 0
5680 && dynamic_syminfo[i].si_boundto < dynamic_size)
5682 print_symbol (10, dynamic_strings
5684 [dynamic_syminfo[i].si_boundto].d_un.d_val);
5688 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5692 if (flags & SYMINFO_FLG_DIRECT)
5694 if (flags & SYMINFO_FLG_PASSTHRU)
5695 printf (" PASSTHRU");
5696 if (flags & SYMINFO_FLG_COPY)
5698 if (flags & SYMINFO_FLG_LAZYLOAD)
5699 printf (" LAZYLOAD");
5707 #ifdef SUPPORT_DISASSEMBLY
5709 disassemble_section (section, file)
5710 Elf32_Internal_Shdr * section;
5713 printf (_("\nAssembly dump of section %s\n"),
5714 SECTION_NAME (section));
5716 /* XXX -- to be done --- XXX */
5723 dump_section (section, file)
5724 Elf32_Internal_Shdr * section;
5727 bfd_size_type bytes;
5729 unsigned char * data;
5730 unsigned char * start;
5732 bytes = section->sh_size;
5736 printf (_("\nSection '%s' has no data to dump.\n"),
5737 SECTION_NAME (section));
5741 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5743 addr = section->sh_addr;
5745 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5758 lbytes = (bytes > 16 ? 16 : bytes);
5760 printf (" 0x%8.8lx ", (unsigned long) addr);
5762 switch (elf_header.e_ident [EI_DATA])
5766 for (j = 15; j >= 0; j --)
5769 printf ("%2.2x", data [j]);
5779 for (j = 0; j < 16; j++)
5782 printf ("%2.2x", data [j]);
5792 for (j = 0; j < lbytes; j++)
5795 if (k >= ' ' && k < 0x80)
5814 static unsigned long int
5815 read_leb128 (data, length_return, sign)
5816 unsigned char * data;
5817 int * length_return;
5820 unsigned long int result = 0;
5821 unsigned int num_read = 0;
5830 result |= (byte & 0x7f) << shift;
5835 while (byte & 0x80);
5837 if (length_return != NULL)
5838 * length_return = num_read;
5840 if (sign && (shift < 32) && (byte & 0x40))
5841 result |= -1 << shift;
5846 typedef struct State_Machine_Registers
5848 unsigned long address;
5851 unsigned int column;
5855 /* This variable hold the number of the last entry seen
5856 in the File Table. */
5857 unsigned int last_file_entry;
5860 static SMR state_machine_regs;
5863 reset_state_machine (is_stmt)
5866 state_machine_regs.address = 0;
5867 state_machine_regs.file = 1;
5868 state_machine_regs.line = 1;
5869 state_machine_regs.column = 0;
5870 state_machine_regs.is_stmt = is_stmt;
5871 state_machine_regs.basic_block = 0;
5872 state_machine_regs.end_sequence = 0;
5873 state_machine_regs.last_file_entry = 0;
5876 /* Handled an extend line op. Returns true if this is the end
5879 process_extended_line_op (data, is_stmt, pointer_size)
5880 unsigned char * data;
5884 unsigned char op_code;
5887 unsigned char * name;
5890 len = read_leb128 (data, & bytes_read, 0);
5895 warn (_("badly formed extended line op encountered!\n"));
5900 op_code = * data ++;
5902 printf (_(" Extended opcode %d: "), op_code);
5906 case DW_LNE_end_sequence:
5907 printf (_("End of Sequence\n\n"));
5908 reset_state_machine (is_stmt);
5911 case DW_LNE_set_address:
5912 adr = byte_get (data, pointer_size);
5913 printf (_("set Address to 0x%lx\n"), adr);
5914 state_machine_regs.address = adr;
5917 case DW_LNE_define_file:
5918 printf (_(" define new File Table entry\n"));
5919 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5921 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5923 data += strlen ((char *) data) + 1;
5924 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5926 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5928 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5929 printf (_("%s\n\n"), name);
5933 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5940 /* Size of pointers in the .debug_line section. This information is not
5941 really present in that section. It's obtained before dumping the debug
5942 sections by doing some pre-scan of the .debug_info section. */
5943 static int debug_line_pointer_size = 4;
5946 display_debug_lines (section, start, file)
5947 Elf32_Internal_Shdr * section;
5948 unsigned char * start;
5949 FILE * file ATTRIBUTE_UNUSED;
5951 DWARF2_External_LineInfo * external;
5952 DWARF2_Internal_LineInfo info;
5953 unsigned char * standard_opcodes;
5954 unsigned char * data = start;
5955 unsigned char * end = start + section->sh_size;
5956 unsigned char * end_of_sequence;
5959 printf (_("\nDump of debug contents of section %s:\n\n"),
5960 SECTION_NAME (section));
5964 external = (DWARF2_External_LineInfo *) data;
5966 /* Check the length of the block. */
5967 info.li_length = BYTE_GET (external->li_length);
5969 if (info.li_length == 0xffffffff)
5971 warn (_("64-bit DWARF line info is not supported yet.\n"));
5975 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5978 (_("The line info appears to be corrupt - the section is too small\n"));
5982 /* Check its version number. */
5983 info.li_version = BYTE_GET (external->li_version);
5984 if (info.li_version != 2)
5986 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5990 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5991 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5992 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5993 info.li_line_base = BYTE_GET (external->li_line_base);
5994 info.li_line_range = BYTE_GET (external->li_line_range);
5995 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5997 /* Sign extend the line base field. */
5998 info.li_line_base <<= 24;
5999 info.li_line_base >>= 24;
6001 printf (_(" Length: %ld\n"), info.li_length);
6002 printf (_(" DWARF Version: %d\n"), info.li_version);
6003 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
6004 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
6005 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
6006 printf (_(" Line Base: %d\n"), info.li_line_base);
6007 printf (_(" Line Range: %d\n"), info.li_line_range);
6008 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
6010 end_of_sequence = data + info.li_length + sizeof (external->li_length);
6012 reset_state_machine (info.li_default_is_stmt);
6014 /* Display the contents of the Opcodes table. */
6015 standard_opcodes = data + sizeof (* external);
6017 printf (_("\n Opcodes:\n"));
6019 for (i = 1; i < info.li_opcode_base; i++)
6020 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
6022 /* Display the contents of the Directory table. */
6023 data = standard_opcodes + info.li_opcode_base - 1;
6026 printf (_("\n The Directory Table is empty.\n"));
6029 printf (_("\n The Directory Table:\n"));
6033 printf (_(" %s\n"), data);
6035 data += strlen ((char *) data) + 1;
6039 /* Skip the NUL at the end of the table. */
6042 /* Display the contents of the File Name table. */
6044 printf (_("\n The File Name Table is empty.\n"));
6047 printf (_("\n The File Name Table:\n"));
6048 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6052 unsigned char * name;
6055 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
6058 data += strlen ((char *) data) + 1;
6060 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6062 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6064 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6066 printf (_("%s\n"), name);
6070 /* Skip the NUL at the end of the table. */
6073 /* Now display the statements. */
6074 printf (_("\n Line Number Statements:\n"));
6077 while (data < end_of_sequence)
6079 unsigned char op_code;
6083 op_code = * data ++;
6085 if (op_code >= info.li_opcode_base)
6087 op_code -= info.li_opcode_base;
6088 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6089 state_machine_regs.address += adv;
6090 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6091 op_code, adv, state_machine_regs.address);
6092 adv = (op_code % info.li_line_range) + info.li_line_base;
6093 state_machine_regs.line += adv;
6094 printf (_(" and Line by %d to %d\n"),
6095 adv, state_machine_regs.line);
6097 else switch (op_code)
6099 case DW_LNS_extended_op:
6100 data += process_extended_line_op (data, info.li_default_is_stmt,
6101 debug_line_pointer_size);
6105 printf (_(" Copy\n"));
6108 case DW_LNS_advance_pc:
6109 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6111 state_machine_regs.address += adv;
6112 printf (_(" Advance PC by %d to %lx\n"), adv,
6113 state_machine_regs.address);
6116 case DW_LNS_advance_line:
6117 adv = read_leb128 (data, & bytes_read, 1);
6119 state_machine_regs.line += adv;
6120 printf (_(" Advance Line by %d to %d\n"), adv,
6121 state_machine_regs.line);
6124 case DW_LNS_set_file:
6125 adv = read_leb128 (data, & bytes_read, 0);
6127 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6129 state_machine_regs.file = adv;
6132 case DW_LNS_set_column:
6133 adv = read_leb128 (data, & bytes_read, 0);
6135 printf (_(" Set column to %d\n"), adv);
6136 state_machine_regs.column = adv;
6139 case DW_LNS_negate_stmt:
6140 adv = state_machine_regs.is_stmt;
6142 printf (_(" Set is_stmt to %d\n"), adv);
6143 state_machine_regs.is_stmt = adv;
6146 case DW_LNS_set_basic_block:
6147 printf (_(" Set basic block\n"));
6148 state_machine_regs.basic_block = 1;
6151 case DW_LNS_const_add_pc:
6152 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6153 * info.li_min_insn_length);
6154 state_machine_regs.address += adv;
6155 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6156 state_machine_regs.address);
6159 case DW_LNS_fixed_advance_pc:
6160 adv = byte_get (data, 2);
6162 state_machine_regs.address += adv;
6163 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6164 adv, state_machine_regs.address);
6167 case DW_LNS_set_prologue_end:
6168 printf (_(" Set prologue_end to true\n"));
6171 case DW_LNS_set_epilogue_begin:
6172 printf (_(" Set epilogue_begin to true\n"));
6175 case DW_LNS_set_isa:
6176 adv = read_leb128 (data, & bytes_read, 0);
6178 printf (_(" Set ISA to %d\n"), adv);
6182 printf (_(" Unknown opcode %d with operands: "), op_code);
6185 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6187 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6188 i == 1 ? "" : ", ");
6203 display_debug_pubnames (section, start, file)
6204 Elf32_Internal_Shdr * section;
6205 unsigned char * start;
6206 FILE * file ATTRIBUTE_UNUSED;
6208 DWARF2_External_PubNames * external;
6209 DWARF2_Internal_PubNames pubnames;
6210 unsigned char * end;
6212 end = start + section->sh_size;
6214 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6218 unsigned char * data;
6219 unsigned long offset;
6221 external = (DWARF2_External_PubNames *) start;
6223 pubnames.pn_length = BYTE_GET (external->pn_length);
6224 pubnames.pn_version = BYTE_GET (external->pn_version);
6225 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6226 pubnames.pn_size = BYTE_GET (external->pn_size);
6228 data = start + sizeof (* external);
6229 start += pubnames.pn_length + sizeof (external->pn_length);
6231 if (pubnames.pn_length == 0xffffffff)
6233 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6237 if (pubnames.pn_version != 2)
6239 static int warned = 0;
6243 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6250 printf (_(" Length: %ld\n"),
6251 pubnames.pn_length);
6252 printf (_(" Version: %d\n"),
6253 pubnames.pn_version);
6254 printf (_(" Offset into .debug_info section: %ld\n"),
6255 pubnames.pn_offset);
6256 printf (_(" Size of area in .debug_info section: %ld\n"),
6259 printf (_("\n Offset\tName\n"));
6263 offset = byte_get (data, 4);
6268 printf (" %ld\t\t%s\n", offset, data);
6269 data += strlen ((char *) data) + 1;
6272 while (offset != 0);
6285 case DW_TAG_padding: return "DW_TAG_padding";
6286 case DW_TAG_array_type: return "DW_TAG_array_type";
6287 case DW_TAG_class_type: return "DW_TAG_class_type";
6288 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6289 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6290 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6291 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6292 case DW_TAG_label: return "DW_TAG_label";
6293 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6294 case DW_TAG_member: return "DW_TAG_member";
6295 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6296 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6297 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6298 case DW_TAG_string_type: return "DW_TAG_string_type";
6299 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6300 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6301 case DW_TAG_typedef: return "DW_TAG_typedef";
6302 case DW_TAG_union_type: return "DW_TAG_union_type";
6303 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6304 case DW_TAG_variant: return "DW_TAG_variant";
6305 case DW_TAG_common_block: return "DW_TAG_common_block";
6306 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6307 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6308 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6309 case DW_TAG_module: return "DW_TAG_module";
6310 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6311 case DW_TAG_set_type: return "DW_TAG_set_type";
6312 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6313 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6314 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6315 case DW_TAG_base_type: return "DW_TAG_base_type";
6316 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6317 case DW_TAG_const_type: return "DW_TAG_const_type";
6318 case DW_TAG_constant: return "DW_TAG_constant";
6319 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6320 case DW_TAG_file_type: return "DW_TAG_file_type";
6321 case DW_TAG_friend: return "DW_TAG_friend";
6322 case DW_TAG_namelist: return "DW_TAG_namelist";
6323 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6324 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6325 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6326 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6327 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6328 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6329 case DW_TAG_try_block: return "DW_TAG_try_block";
6330 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6331 case DW_TAG_variable: return "DW_TAG_variable";
6332 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6333 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6334 case DW_TAG_format_label: return "DW_TAG_format_label";
6335 case DW_TAG_function_template: return "DW_TAG_function_template";
6336 case DW_TAG_class_template: return "DW_TAG_class_template";
6337 /* DWARF 2.1 values. */
6338 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6339 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6340 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6341 case DW_TAG_namespace: return "DW_TAG_namespace";
6342 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6343 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6344 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6345 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6348 static char buffer [100];
6350 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6357 get_AT_name (attribute)
6358 unsigned long attribute;
6362 case DW_AT_sibling: return "DW_AT_sibling";
6363 case DW_AT_location: return "DW_AT_location";
6364 case DW_AT_name: return "DW_AT_name";
6365 case DW_AT_ordering: return "DW_AT_ordering";
6366 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6367 case DW_AT_byte_size: return "DW_AT_byte_size";
6368 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6369 case DW_AT_bit_size: return "DW_AT_bit_size";
6370 case DW_AT_element_list: return "DW_AT_element_list";
6371 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6372 case DW_AT_low_pc: return "DW_AT_low_pc";
6373 case DW_AT_high_pc: return "DW_AT_high_pc";
6374 case DW_AT_language: return "DW_AT_language";
6375 case DW_AT_member: return "DW_AT_member";
6376 case DW_AT_discr: return "DW_AT_discr";
6377 case DW_AT_discr_value: return "DW_AT_discr_value";
6378 case DW_AT_visibility: return "DW_AT_visibility";
6379 case DW_AT_import: return "DW_AT_import";
6380 case DW_AT_string_length: return "DW_AT_string_length";
6381 case DW_AT_common_reference: return "DW_AT_common_reference";
6382 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6383 case DW_AT_const_value: return "DW_AT_const_value";
6384 case DW_AT_containing_type: return "DW_AT_containing_type";
6385 case DW_AT_default_value: return "DW_AT_default_value";
6386 case DW_AT_inline: return "DW_AT_inline";
6387 case DW_AT_is_optional: return "DW_AT_is_optional";
6388 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6389 case DW_AT_producer: return "DW_AT_producer";
6390 case DW_AT_prototyped: return "DW_AT_prototyped";
6391 case DW_AT_return_addr: return "DW_AT_return_addr";
6392 case DW_AT_start_scope: return "DW_AT_start_scope";
6393 case DW_AT_stride_size: return "DW_AT_stride_size";
6394 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6395 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6396 case DW_AT_accessibility: return "DW_AT_accessibility";
6397 case DW_AT_address_class: return "DW_AT_address_class";
6398 case DW_AT_artificial: return "DW_AT_artificial";
6399 case DW_AT_base_types: return "DW_AT_base_types";
6400 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6401 case DW_AT_count: return "DW_AT_count";
6402 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6403 case DW_AT_decl_column: return "DW_AT_decl_column";
6404 case DW_AT_decl_file: return "DW_AT_decl_file";
6405 case DW_AT_decl_line: return "DW_AT_decl_line";
6406 case DW_AT_declaration: return "DW_AT_declaration";
6407 case DW_AT_discr_list: return "DW_AT_discr_list";
6408 case DW_AT_encoding: return "DW_AT_encoding";
6409 case DW_AT_external: return "DW_AT_external";
6410 case DW_AT_frame_base: return "DW_AT_frame_base";
6411 case DW_AT_friend: return "DW_AT_friend";
6412 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6413 case DW_AT_macro_info: return "DW_AT_macro_info";
6414 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6415 case DW_AT_priority: return "DW_AT_priority";
6416 case DW_AT_segment: return "DW_AT_segment";
6417 case DW_AT_specification: return "DW_AT_specification";
6418 case DW_AT_static_link: return "DW_AT_static_link";
6419 case DW_AT_type: return "DW_AT_type";
6420 case DW_AT_use_location: return "DW_AT_use_location";
6421 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6422 case DW_AT_virtuality: return "DW_AT_virtuality";
6423 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6424 /* DWARF 2.1 values. */
6425 case DW_AT_allocated: return "DW_AT_allocated";
6426 case DW_AT_associated: return "DW_AT_associated";
6427 case DW_AT_data_location: return "DW_AT_data_location";
6428 case DW_AT_stride: return "DW_AT_stride";
6429 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6430 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6431 case DW_AT_extension: return "DW_AT_extension";
6432 case DW_AT_ranges: return "DW_AT_ranges";
6433 case DW_AT_trampoline: return "DW_AT_trampoline";
6434 case DW_AT_call_column: return "DW_AT_call_column";
6435 case DW_AT_call_file: return "DW_AT_call_file";
6436 case DW_AT_call_line: return "DW_AT_call_line";
6437 /* SGI/MIPS extensions. */
6438 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6439 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6440 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6441 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6442 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6443 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6444 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6445 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6446 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6447 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6448 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6449 /* GNU extensions. */
6450 case DW_AT_sf_names: return "DW_AT_sf_names";
6451 case DW_AT_src_info: return "DW_AT_src_info";
6452 case DW_AT_mac_info: return "DW_AT_mac_info";
6453 case DW_AT_src_coords: return "DW_AT_src_coords";
6454 case DW_AT_body_begin: return "DW_AT_body_begin";
6455 case DW_AT_body_end: return "DW_AT_body_end";
6458 static char buffer [100];
6460 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6467 get_FORM_name (form)
6472 case DW_FORM_addr: return "DW_FORM_addr";
6473 case DW_FORM_block2: return "DW_FORM_block2";
6474 case DW_FORM_block4: return "DW_FORM_block4";
6475 case DW_FORM_data2: return "DW_FORM_data2";
6476 case DW_FORM_data4: return "DW_FORM_data4";
6477 case DW_FORM_data8: return "DW_FORM_data8";
6478 case DW_FORM_string: return "DW_FORM_string";
6479 case DW_FORM_block: return "DW_FORM_block";
6480 case DW_FORM_block1: return "DW_FORM_block1";
6481 case DW_FORM_data1: return "DW_FORM_data1";
6482 case DW_FORM_flag: return "DW_FORM_flag";
6483 case DW_FORM_sdata: return "DW_FORM_sdata";
6484 case DW_FORM_strp: return "DW_FORM_strp";
6485 case DW_FORM_udata: return "DW_FORM_udata";
6486 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6487 case DW_FORM_ref1: return "DW_FORM_ref1";
6488 case DW_FORM_ref2: return "DW_FORM_ref2";
6489 case DW_FORM_ref4: return "DW_FORM_ref4";
6490 case DW_FORM_ref8: return "DW_FORM_ref8";
6491 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6492 case DW_FORM_indirect: return "DW_FORM_indirect";
6495 static char buffer [100];
6497 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6503 /* FIXME: There are better and more effiecint ways to handle
6504 these structures. For now though, I just want something that
6505 is simple to implement. */
6506 typedef struct abbrev_attr
6508 unsigned long attribute;
6510 struct abbrev_attr * next;
6514 typedef struct abbrev_entry
6516 unsigned long entry;
6519 struct abbrev_attr * first_attr;
6520 struct abbrev_attr * last_attr;
6521 struct abbrev_entry * next;
6525 static abbrev_entry * first_abbrev = NULL;
6526 static abbrev_entry * last_abbrev = NULL;
6529 free_abbrevs PARAMS ((void))
6531 abbrev_entry * abbrev;
6533 for (abbrev = first_abbrev; abbrev;)
6535 abbrev_entry * next = abbrev->next;
6538 for (attr = abbrev->first_attr; attr;)
6540 abbrev_attr * next = attr->next;
6550 last_abbrev = first_abbrev = NULL;
6554 add_abbrev (number, tag, children)
6555 unsigned long number;
6559 abbrev_entry * entry;
6561 entry = (abbrev_entry *) malloc (sizeof (* entry));
6567 entry->entry = number;
6569 entry->children = children;
6570 entry->first_attr = NULL;
6571 entry->last_attr = NULL;
6574 if (first_abbrev == NULL)
6575 first_abbrev = entry;
6577 last_abbrev->next = entry;
6579 last_abbrev = entry;
6583 add_abbrev_attr (attribute, form)
6584 unsigned long attribute;
6589 attr = (abbrev_attr *) malloc (sizeof (* attr));
6595 attr->attribute = attribute;
6599 if (last_abbrev->first_attr == NULL)
6600 last_abbrev->first_attr = attr;
6602 last_abbrev->last_attr->next = attr;
6604 last_abbrev->last_attr = attr;
6607 /* Processes the (partial) contents of a .debug_abbrev section.
6608 Returns NULL if the end of the section was encountered.
6609 Returns the address after the last byte read if the end of
6610 an abbreviation set was found. */
6612 static unsigned char *
6613 process_abbrev_section (start, end)
6614 unsigned char * start;
6615 unsigned char * end;
6617 if (first_abbrev != NULL)
6623 unsigned long entry;
6625 unsigned long attribute;
6628 entry = read_leb128 (start, & bytes_read, 0);
6629 start += bytes_read;
6631 /* A single zero is supposed to end the section according
6632 to the standard. If there's more, then signal that to
6635 return start == end ? NULL : start;
6637 tag = read_leb128 (start, & bytes_read, 0);
6638 start += bytes_read;
6640 children = * start ++;
6642 add_abbrev (entry, tag, children);
6648 attribute = read_leb128 (start, & bytes_read, 0);
6649 start += bytes_read;
6651 form = read_leb128 (start, & bytes_read, 0);
6652 start += bytes_read;
6655 add_abbrev_attr (attribute, form);
6657 while (attribute != 0);
6665 display_debug_macinfo (section, start, file)
6666 Elf32_Internal_Shdr * section;
6667 unsigned char * start;
6668 FILE * file ATTRIBUTE_UNUSED;
6670 unsigned char * end = start + section->sh_size;
6671 unsigned char * curr = start;
6672 unsigned int bytes_read;
6673 enum dwarf_macinfo_record_type op;
6675 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6679 unsigned int lineno;
6680 const char * string;
6687 case DW_MACINFO_start_file:
6689 unsigned int filenum;
6691 lineno = read_leb128 (curr, & bytes_read, 0);
6693 filenum = read_leb128 (curr, & bytes_read, 0);
6696 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6700 case DW_MACINFO_end_file:
6701 printf (_(" DW_MACINFO_end_file\n"));
6704 case DW_MACINFO_define:
6705 lineno = read_leb128 (curr, & bytes_read, 0);
6708 curr += strlen (string) + 1;
6709 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6712 case DW_MACINFO_undef:
6713 lineno = read_leb128 (curr, & bytes_read, 0);
6716 curr += strlen (string) + 1;
6717 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6720 case DW_MACINFO_vendor_ext:
6722 unsigned int constant;
6724 constant = read_leb128 (curr, & bytes_read, 0);
6727 curr += strlen (string) + 1;
6728 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6739 display_debug_abbrev (section, start, file)
6740 Elf32_Internal_Shdr * section;
6741 unsigned char * start;
6742 FILE * file ATTRIBUTE_UNUSED;
6744 abbrev_entry * entry;
6745 unsigned char * end = start + section->sh_size;
6747 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6751 start = process_abbrev_section (start, end);
6753 if (first_abbrev == NULL)
6756 printf (_(" Number TAG\n"));
6758 for (entry = first_abbrev; entry; entry = entry->next)
6762 printf (_(" %ld %s [%s]\n"),
6764 get_TAG_name (entry->tag),
6765 entry->children ? _("has children") : _("no children"));
6767 for (attr = entry->first_attr; attr; attr = attr->next)
6769 printf (_(" %-18s %s\n"),
6770 get_AT_name (attr->attribute),
6771 get_FORM_name (attr->form));
6785 static unsigned char *
6786 display_block (data, length)
6787 unsigned char * data;
6788 unsigned long length;
6790 printf (_(" %lu byte block: "), length);
6793 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6799 decode_location_expression (data, pointer_size, length)
6800 unsigned char * data;
6801 unsigned int pointer_size;
6802 unsigned long length;
6806 unsigned long uvalue;
6807 unsigned char * end = data + length;
6816 printf ("DW_OP_addr: %lx",
6817 (unsigned long) byte_get (data, pointer_size));
6818 data += pointer_size;
6821 printf ("DW_OP_deref");
6824 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6827 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6830 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6834 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6838 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6842 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6846 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6847 (unsigned long) byte_get (data + 4, 4));
6851 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6852 (long) byte_get (data + 4, 4));
6856 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6860 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6864 printf ("DW_OP_dup");
6867 printf ("DW_OP_drop");
6870 printf ("DW_OP_over");
6873 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6876 printf ("DW_OP_swap");
6879 printf ("DW_OP_rot");
6882 printf ("DW_OP_xderef");
6885 printf ("DW_OP_abs");
6888 printf ("DW_OP_and");
6891 printf ("DW_OP_div");
6894 printf ("DW_OP_minus");
6897 printf ("DW_OP_mod");
6900 printf ("DW_OP_mul");
6903 printf ("DW_OP_neg");
6906 printf ("DW_OP_not");
6909 printf ("DW_OP_or");
6912 printf ("DW_OP_plus");
6914 case DW_OP_plus_uconst:
6915 printf ("DW_OP_plus_uconst: %lu",
6916 read_leb128 (data, &bytes_read, 0));
6920 printf ("DW_OP_shl");
6923 printf ("DW_OP_shr");
6926 printf ("DW_OP_shra");
6929 printf ("DW_OP_xor");
6932 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6936 printf ("DW_OP_eq");
6939 printf ("DW_OP_ge");
6942 printf ("DW_OP_gt");
6945 printf ("DW_OP_le");
6948 printf ("DW_OP_lt");
6951 printf ("DW_OP_ne");
6954 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6990 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7025 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7060 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7061 read_leb128 (data, &bytes_read, 1));
7066 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7070 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7074 uvalue = read_leb128 (data, &bytes_read, 0);
7076 printf ("DW_OP_bregx: %lu %ld", uvalue,
7077 read_leb128 (data, &bytes_read, 1));
7081 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7084 case DW_OP_deref_size:
7085 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7087 case DW_OP_xderef_size:
7088 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7091 printf ("DW_OP_nop");
7094 /* DWARF 2.1 extensions. */
7095 case DW_OP_push_object_address:
7096 printf ("DW_OP_push_object_address");
7099 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7103 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7107 printf ("DW_OP_calli");
7111 if (op >= DW_OP_lo_user
7112 && op <= DW_OP_hi_user)
7113 printf (_("(User defined location op)"));
7115 printf (_("(Unknown location op)"));
7116 /* No way to tell where the next op is, so just bail. */
7120 /* Separate the ops. */
7126 static const char * debug_str_contents;
7127 static bfd_vma debug_str_size;
7130 load_debug_str (file)
7133 Elf32_Internal_Shdr * sec;
7136 /* If it is already loaded, do nothing. */
7137 if (debug_str_contents != NULL)
7140 /* Locate the .debug_str section. */
7141 for (i = 0, sec = section_headers;
7142 i < elf_header.e_shnum;
7144 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7147 if (i == elf_header.e_shnum || sec->sh_size == 0)
7150 debug_str_size = sec->sh_size;
7152 debug_str_contents = ((char *)
7153 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7154 _("debug_str section data")));
7160 if (debug_str_contents == NULL)
7163 free ((char *) debug_str_contents);
7164 debug_str_contents = NULL;
7169 fetch_indirect_string (offset)
7170 unsigned long offset;
7172 if (debug_str_contents == NULL)
7173 return _("<no .debug_str section>");
7175 if (offset > debug_str_size)
7176 return _("<offset is too big>");
7178 return debug_str_contents + offset;
7183 display_debug_str (section, start, file)
7184 Elf32_Internal_Shdr * section;
7185 unsigned char * start;
7186 FILE * file ATTRIBUTE_UNUSED;
7188 unsigned long bytes;
7191 addr = section->sh_addr;
7192 bytes = section->sh_size;
7196 printf (_("\nThe .debug_str section is empty.\n"));
7200 printf (_("Contents of the .debug_str section:\n\n"));
7208 lbytes = (bytes > 16 ? 16 : bytes);
7210 printf (" 0x%8.8lx ", (unsigned long) addr);
7212 for (j = 0; j < 16; j++)
7215 printf ("%2.2x", start [j]);
7223 for (j = 0; j < lbytes; j++)
7226 if (k >= ' ' && k < 0x80)
7243 static unsigned char *
7244 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7245 unsigned long attribute;
7247 unsigned char * data;
7248 unsigned long cu_offset;
7249 unsigned long pointer_size;
7251 unsigned long uvalue = 0;
7252 unsigned char * block_start = NULL;
7260 case DW_FORM_ref_addr:
7262 uvalue = byte_get (data, pointer_size);
7263 data += pointer_size;
7267 uvalue = byte_get (data, /* offset_size */ 4);
7268 data += /* offset_size */ 4;
7274 uvalue = byte_get (data ++, 1);
7279 uvalue = byte_get (data, 2);
7285 uvalue = byte_get (data, 4);
7290 uvalue = read_leb128 (data, & bytes_read, 1);
7294 case DW_FORM_ref_udata:
7296 uvalue = read_leb128 (data, & bytes_read, 0);
7300 case DW_FORM_indirect:
7301 form = read_leb128 (data, & bytes_read, 0);
7303 printf (" %s", get_FORM_name (form));
7304 return read_and_display_attr_value (attribute, form, data, cu_offset,
7310 case DW_FORM_ref_addr:
7311 printf (" <#%lx>", uvalue);
7317 case DW_FORM_ref_udata:
7318 printf (" <%lx>", uvalue + cu_offset);
7322 printf (" %#lx", uvalue);
7330 printf (" %ld", uvalue);
7335 uvalue = byte_get (data, 4);
7336 printf (" %lx", uvalue);
7337 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7341 case DW_FORM_string:
7342 printf (" %s", data);
7343 data += strlen ((char *) data) + 1;
7347 uvalue = read_leb128 (data, & bytes_read, 0);
7348 block_start = data + bytes_read;
7349 data = display_block (block_start, uvalue);
7352 case DW_FORM_block1:
7353 uvalue = byte_get (data, 1);
7354 block_start = data + 1;
7355 data = display_block (block_start, uvalue);
7358 case DW_FORM_block2:
7359 uvalue = byte_get (data, 2);
7360 block_start = data + 2;
7361 data = display_block (block_start, uvalue);
7364 case DW_FORM_block4:
7365 uvalue = byte_get (data, 4);
7366 block_start = data + 4;
7367 data = display_block (block_start, uvalue);
7371 printf (_(" (indirect string, offset: 0x%lx): "), uvalue);
7372 printf (fetch_indirect_string (uvalue));
7375 case DW_FORM_indirect:
7376 /* Handled above. */
7380 warn (_("Unrecognised form: %d\n"), form);
7384 /* For some attributes we can display futher information. */
7393 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7394 case DW_INL_inlined: printf (_("(inlined)")); break;
7395 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7396 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7397 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7401 case DW_AT_language:
7404 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7405 case DW_LANG_C89: printf ("(ANSI C)"); break;
7406 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7407 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7408 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7409 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7410 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7411 case DW_LANG_Ada83: printf ("(Ada)"); break;
7412 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7413 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7414 /* DWARF 2.1 values. */
7415 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7416 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7417 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7418 /* MIPS extension. */
7419 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7420 default: printf ("(Unknown: %lx)", uvalue); break;
7424 case DW_AT_encoding:
7427 case DW_ATE_void: printf ("(void)"); break;
7428 case DW_ATE_address: printf ("(machine address)"); break;
7429 case DW_ATE_boolean: printf ("(boolean)"); break;
7430 case DW_ATE_complex_float: printf ("(complex float)"); break;
7431 case DW_ATE_float: printf ("(float)"); break;
7432 case DW_ATE_signed: printf ("(signed)"); break;
7433 case DW_ATE_signed_char: printf ("(signed char)"); break;
7434 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7435 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7436 /* DWARF 2.1 value. */
7437 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7439 if (uvalue >= DW_ATE_lo_user
7440 && uvalue <= DW_ATE_hi_user)
7441 printf ("(user defined type)");
7443 printf ("(unknown type)");
7448 case DW_AT_accessibility:
7451 case DW_ACCESS_public: printf ("(public)"); break;
7452 case DW_ACCESS_protected: printf ("(protected)"); break;
7453 case DW_ACCESS_private: printf ("(private)"); break;
7454 default: printf ("(unknown accessibility)"); break;
7458 case DW_AT_visibility:
7461 case DW_VIS_local: printf ("(local)"); break;
7462 case DW_VIS_exported: printf ("(exported)"); break;
7463 case DW_VIS_qualified: printf ("(qualified)"); break;
7464 default: printf ("(unknown visibility)"); break;
7468 case DW_AT_virtuality:
7471 case DW_VIRTUALITY_none: printf ("(none)"); break;
7472 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7473 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7474 default: printf ("(unknown virtuality)"); break;
7478 case DW_AT_identifier_case:
7481 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7482 case DW_ID_up_case: printf ("(up_case)"); break;
7483 case DW_ID_down_case: printf ("(down_case)"); break;
7484 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7485 default: printf ("(unknown case)"); break;
7489 case DW_AT_calling_convention:
7492 case DW_CC_normal: printf ("(normal)"); break;
7493 case DW_CC_program: printf ("(program)"); break;
7494 case DW_CC_nocall: printf ("(nocall)"); break;
7496 if (uvalue >= DW_CC_lo_user
7497 && uvalue <= DW_CC_hi_user)
7498 printf ("(user defined)");
7500 printf ("(unknown convention)");
7504 case DW_AT_ordering:
7507 case -1: printf ("(undefined)"); break;
7508 case 0: printf ("(row major)"); break;
7509 case 1: printf ("(column major)"); break;
7513 case DW_AT_frame_base:
7514 case DW_AT_location:
7515 case DW_AT_data_member_location:
7516 case DW_AT_vtable_elem_location:
7517 case DW_AT_allocated:
7518 case DW_AT_associated:
7519 case DW_AT_data_location:
7521 case DW_AT_upper_bound:
7522 case DW_AT_lower_bound:
7526 decode_location_expression (block_start, pointer_size, uvalue);
7538 static unsigned char *
7539 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7540 unsigned long attribute;
7542 unsigned char * data;
7543 unsigned long cu_offset;
7544 unsigned long pointer_size;
7546 printf (" %-18s:", get_AT_name (attribute));
7547 data = read_and_display_attr_value (attribute, form, data, cu_offset,
7554 display_debug_info (section, start, file)
7555 Elf32_Internal_Shdr * section;
7556 unsigned char * start;
7559 unsigned char * end = start + section->sh_size;
7560 unsigned char * section_begin = start;
7562 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7564 load_debug_str (file);
7568 DWARF2_External_CompUnit * external;
7569 DWARF2_Internal_CompUnit compunit;
7570 Elf32_Internal_Shdr * relsec;
7571 unsigned char * tags;
7574 unsigned long cu_offset;
7576 external = (DWARF2_External_CompUnit *) start;
7578 compunit.cu_length = BYTE_GET (external->cu_length);
7579 compunit.cu_version = BYTE_GET (external->cu_version);
7580 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7581 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7583 if (compunit.cu_length == 0xffffffff)
7585 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7589 /* Check for RELA relocations in the abbrev_offset address, and
7591 for (relsec = section_headers;
7592 relsec < section_headers + elf_header.e_shnum;
7595 unsigned long nrelas;
7596 Elf_Internal_Rela *rela, *rp;
7597 Elf32_Internal_Shdr *symsec;
7598 Elf_Internal_Sym *symtab;
7599 Elf_Internal_Sym *sym;
7601 if (relsec->sh_type != SHT_RELA
7602 || SECTION_HEADER (relsec->sh_info) != section)
7605 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7609 symsec = SECTION_HEADER (relsec->sh_link);
7610 symtab = GET_ELF_SYMBOLS (file, symsec);
7612 for (rp = rela; rp < rela + nrelas; ++rp)
7615 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7621 sym = symtab + ELF32_R_SYM (rp->r_info);
7623 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7625 warn (_("Skipping unexpected symbol type %u\n"),
7626 ELF32_ST_TYPE (sym->st_info));
7632 sym = symtab + ELF64_R_SYM (rp->r_info);
7634 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7636 warn (_("Skipping unexpected symbol type %u\n"),
7637 ELF64_ST_TYPE (sym->st_info));
7642 compunit.cu_abbrev_offset += rp->r_addend;
7650 tags = start + sizeof (* external);
7651 cu_offset = start - section_begin;
7652 start += compunit.cu_length + sizeof (external->cu_length);
7654 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7655 printf (_(" Length: %ld\n"), compunit.cu_length);
7656 printf (_(" Version: %d\n"), compunit.cu_version);
7657 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7658 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7660 if (compunit.cu_version != 2)
7662 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7668 /* Read in the abbrevs used by this compilation unit. */
7671 Elf32_Internal_Shdr * sec;
7672 unsigned char * begin;
7674 /* Locate the .debug_abbrev section and process it. */
7675 for (i = 0, sec = section_headers;
7676 i < elf_header.e_shnum;
7678 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7681 if (i == elf_header.e_shnum || sec->sh_size == 0)
7683 warn (_("Unable to locate .debug_abbrev section!\n"));
7687 begin = ((unsigned char *)
7688 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7689 _("debug_abbrev section data")));
7693 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7694 begin + sec->sh_size);
7700 while (tags < start)
7703 unsigned long abbrev_number;
7704 abbrev_entry * entry;
7707 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7710 /* A null DIE marks the end of a list of children. */
7711 if (abbrev_number == 0)
7717 /* Scan through the abbreviation list until we reach the
7719 for (entry = first_abbrev;
7720 entry && entry->entry != abbrev_number;
7721 entry = entry->next)
7726 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7731 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7733 (unsigned long) (tags - section_begin - bytes_read),
7735 get_TAG_name (entry->tag));
7737 for (attr = entry->first_attr; attr; attr = attr->next)
7738 tags = read_and_display_attr (attr->attribute,
7741 compunit.cu_pointer_size);
7743 if (entry->children)
7756 display_debug_aranges (section, start, file)
7757 Elf32_Internal_Shdr * section;
7758 unsigned char * start;
7759 FILE * file ATTRIBUTE_UNUSED;
7761 unsigned char * end = start + section->sh_size;
7763 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7767 DWARF2_External_ARange * external;
7768 DWARF2_Internal_ARange arange;
7769 unsigned char * ranges;
7770 unsigned long length;
7771 unsigned long address;
7774 external = (DWARF2_External_ARange *) start;
7776 arange.ar_length = BYTE_GET (external->ar_length);
7777 arange.ar_version = BYTE_GET (external->ar_version);
7778 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7779 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7780 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7782 if (arange.ar_length == 0xffffffff)
7784 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7788 if (arange.ar_version != 2)
7790 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7794 printf (_(" Length: %ld\n"), arange.ar_length);
7795 printf (_(" Version: %d\n"), arange.ar_version);
7796 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7797 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7798 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7800 printf (_("\n Address Length\n"));
7802 ranges = start + sizeof (* external);
7804 /* Must pad to an alignment boundary that is twice the pointer size. */
7805 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7807 ranges += (2 * arange.ar_pointer_size) - excess;
7811 address = byte_get (ranges, arange.ar_pointer_size);
7813 ranges += arange.ar_pointer_size;
7815 length = byte_get (ranges, arange.ar_pointer_size);
7817 ranges += arange.ar_pointer_size;
7819 /* A pair of zeros marks the end of the list. */
7820 if (address == 0 && length == 0)
7823 printf (" %8.8lx %lu\n", address, length);
7826 start += arange.ar_length + sizeof (external->ar_length);
7834 typedef struct Frame_Chunk
7836 struct Frame_Chunk * next;
7837 unsigned char * chunk_start;
7839 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7840 short int * col_type;
7842 char * augmentation;
7843 unsigned int code_factor;
7845 unsigned long pc_begin;
7846 unsigned long pc_range;
7850 unsigned char fde_encoding;
7854 /* A marker for a col_type that means this column was never referenced
7855 in the frame info. */
7856 #define DW_CFA_unreferenced (-1)
7858 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7859 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7860 static int size_of_encoded_value PARAMS ((int));
7863 frame_need_space (fc, reg)
7867 int prev = fc->ncols;
7869 if (reg < fc->ncols)
7872 fc->ncols = reg + 1;
7873 fc->col_type = (short int *) xrealloc (fc->col_type,
7874 fc->ncols * sizeof (short int));
7875 fc->col_offset = (int *) xrealloc (fc->col_offset,
7876 fc->ncols * sizeof (int));
7878 while (prev < fc->ncols)
7880 fc->col_type[prev] = DW_CFA_unreferenced;
7881 fc->col_offset[prev] = 0;
7887 frame_display_row (fc, need_col_headers, max_regs)
7889 int * need_col_headers;
7895 if (* max_regs < fc->ncols)
7896 * max_regs = fc->ncols;
7898 if (* need_col_headers)
7900 * need_col_headers = 0;
7902 printf (" LOC CFA ");
7904 for (r = 0; r < * max_regs; r++)
7905 if (fc->col_type[r] != DW_CFA_unreferenced)
7910 printf ("r%-4d", r);
7916 printf ("%08lx ", fc->pc_begin);
7917 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7918 printf ("%-8s ", tmp);
7920 for (r = 0; r < fc->ncols; r++)
7922 if (fc->col_type[r] != DW_CFA_unreferenced)
7924 switch (fc->col_type[r])
7926 case DW_CFA_undefined:
7929 case DW_CFA_same_value:
7933 sprintf (tmp, "c%+d", fc->col_offset[r]);
7935 case DW_CFA_register:
7936 sprintf (tmp, "r%d", fc->col_offset[r]);
7939 strcpy (tmp, "n/a");
7942 printf ("%-5s", tmp);
7949 size_of_encoded_value (encoding)
7952 switch (encoding & 0x7)
7955 case 0: return is_32bit_elf ? 4 : 8;
7962 #define GET(N) byte_get (start, N); start += N
7963 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7964 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7967 display_debug_frames (section, start, file)
7968 Elf32_Internal_Shdr * section;
7969 unsigned char * start;
7970 FILE * file ATTRIBUTE_UNUSED;
7972 unsigned char * end = start + section->sh_size;
7973 unsigned char * section_start = start;
7974 Frame_Chunk * chunks = 0;
7975 Frame_Chunk * remembered_state = 0;
7977 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7980 int addr_size = is_32bit_elf ? 4 : 8;
7982 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7986 unsigned char * saved_start;
7987 unsigned char * block_end;
7988 unsigned long length;
7989 unsigned long cie_id;
7992 int need_col_headers = 1;
7993 unsigned char * augmentation_data = NULL;
7994 unsigned long augmentation_data_len = 0;
7995 int encoded_ptr_size = addr_size;
7997 saved_start = start;
7998 length = byte_get (start, 4); start += 4;
8003 if (length == 0xffffffff)
8005 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8009 block_end = saved_start + length + 4;
8010 cie_id = byte_get (start, 4); start += 4;
8012 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
8016 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8017 memset (fc, 0, sizeof (Frame_Chunk));
8021 fc->chunk_start = saved_start;
8023 fc->col_type = (short int *) xmalloc (sizeof (short int));
8024 fc->col_offset = (int *) xmalloc (sizeof (int));
8025 frame_need_space (fc, max_regs-1);
8029 fc->augmentation = start;
8030 start = strchr (start, '\0') + 1;
8032 if (fc->augmentation[0] == 'z')
8034 fc->code_factor = LEB ();
8035 fc->data_factor = SLEB ();
8036 fc->ra = byte_get (start, 1); start += 1;
8037 augmentation_data_len = LEB ();
8038 augmentation_data = start;
8039 start += augmentation_data_len;
8041 else if (strcmp (fc->augmentation, "eh") == 0)
8044 fc->code_factor = LEB ();
8045 fc->data_factor = SLEB ();
8046 fc->ra = byte_get (start, 1); start += 1;
8050 fc->code_factor = LEB ();
8051 fc->data_factor = SLEB ();
8052 fc->ra = byte_get (start, 1); start += 1;
8056 if (do_debug_frames_interp)
8057 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8058 (unsigned long)(saved_start - section_start), length, cie_id,
8059 fc->augmentation, fc->code_factor, fc->data_factor,
8063 printf ("\n%08lx %08lx %08lx CIE\n",
8064 (unsigned long)(saved_start - section_start), length, cie_id);
8065 printf (" Version: %d\n", version);
8066 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8067 printf (" Code alignment factor: %u\n", fc->code_factor);
8068 printf (" Data alignment factor: %d\n", fc->data_factor);
8069 printf (" Return address column: %d\n", fc->ra);
8071 if (augmentation_data_len)
8074 printf (" Augmentation data: ");
8075 for (i = 0; i < augmentation_data_len; ++i)
8076 printf (" %02x", augmentation_data[i]);
8082 if (augmentation_data_len)
8084 unsigned char *p, *q;
8085 p = fc->augmentation + 1;
8086 q = augmentation_data;
8093 q += 1 + size_of_encoded_value (*q);
8095 fc->fde_encoding = *q++;
8101 if (fc->fde_encoding)
8102 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8105 frame_need_space (fc, fc->ra);
8109 unsigned char * look_for;
8110 static Frame_Chunk fde_fc;
8113 memset (fc, 0, sizeof (Frame_Chunk));
8115 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8117 for (cie = chunks; cie ; cie = cie->next)
8118 if (cie->chunk_start == look_for)
8123 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8124 cie_id, saved_start);
8127 fc->col_type = (short int *) xmalloc (sizeof (short int));
8128 fc->col_offset = (int *) xmalloc (sizeof (int));
8129 frame_need_space (fc, max_regs - 1);
8131 fc->augmentation = "";
8132 fc->fde_encoding = 0;
8136 fc->ncols = cie->ncols;
8137 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8138 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8139 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8140 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8141 fc->augmentation = cie->augmentation;
8142 fc->code_factor = cie->code_factor;
8143 fc->data_factor = cie->data_factor;
8144 fc->cfa_reg = cie->cfa_reg;
8145 fc->cfa_offset = cie->cfa_offset;
8147 frame_need_space (fc, max_regs-1);
8148 fc->fde_encoding = cie->fde_encoding;
8151 if (fc->fde_encoding)
8152 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8154 fc->pc_begin = byte_get (start, encoded_ptr_size);
8155 start += encoded_ptr_size;
8156 fc->pc_range = byte_get (start, encoded_ptr_size);
8157 start += encoded_ptr_size;
8159 if (cie->augmentation[0] == 'z')
8161 augmentation_data_len = LEB ();
8162 augmentation_data = start;
8163 start += augmentation_data_len;
8166 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8167 (unsigned long)(saved_start - section_start), length, cie_id,
8168 (unsigned long)(cie->chunk_start - section_start),
8169 fc->pc_begin, fc->pc_begin + fc->pc_range);
8170 if (! do_debug_frames_interp && augmentation_data_len)
8173 printf (" Augmentation data: ");
8174 for (i = 0; i < augmentation_data_len; ++i)
8175 printf (" %02x", augmentation_data[i]);
8181 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8182 about to interpret instructions for the chunk. */
8184 if (do_debug_frames_interp)
8186 /* Start by making a pass over the chunk, allocating storage
8187 and taking note of what registers are used. */
8188 unsigned char * tmp = start;
8190 while (start < block_end)
8200 /* Warning: if you add any more cases to this switch, be
8201 sure to add them to the corresponding switch below. */
8204 case DW_CFA_advance_loc:
8208 frame_need_space (fc, opa);
8209 fc->col_type[opa] = DW_CFA_undefined;
8211 case DW_CFA_restore:
8212 frame_need_space (fc, opa);
8213 fc->col_type[opa] = DW_CFA_undefined;
8215 case DW_CFA_set_loc:
8216 start += encoded_ptr_size;
8218 case DW_CFA_advance_loc1:
8221 case DW_CFA_advance_loc2:
8224 case DW_CFA_advance_loc4:
8227 case DW_CFA_offset_extended:
8228 reg = LEB (); LEB ();
8229 frame_need_space (fc, reg);
8230 fc->col_type[reg] = DW_CFA_undefined;
8232 case DW_CFA_restore_extended:
8234 frame_need_space (fc, reg);
8235 fc->col_type[reg] = DW_CFA_undefined;
8237 case DW_CFA_undefined:
8239 frame_need_space (fc, reg);
8240 fc->col_type[reg] = DW_CFA_undefined;
8242 case DW_CFA_same_value:
8244 frame_need_space (fc, reg);
8245 fc->col_type[reg] = DW_CFA_undefined;
8247 case DW_CFA_register:
8248 reg = LEB (); LEB ();
8249 frame_need_space (fc, reg);
8250 fc->col_type[reg] = DW_CFA_undefined;
8252 case DW_CFA_def_cfa:
8255 case DW_CFA_def_cfa_register:
8258 case DW_CFA_def_cfa_offset:
8261 #ifndef DW_CFA_GNU_args_size
8262 #define DW_CFA_GNU_args_size 0x2e
8264 case DW_CFA_GNU_args_size:
8267 #ifndef DW_CFA_GNU_negative_offset_extended
8268 #define DW_CFA_GNU_negative_offset_extended 0x2f
8270 case DW_CFA_GNU_negative_offset_extended:
8271 reg = LEB (); LEB ();
8272 frame_need_space (fc, reg);
8273 fc->col_type[reg] = DW_CFA_undefined;
8282 /* Now we know what registers are used, make a second pass over
8283 the chunk, this time actually printing out the info. */
8285 while (start < block_end)
8288 unsigned long ul, reg, roffs;
8297 /* Warning: if you add any more cases to this switch, be
8298 sure to add them to the corresponding switch above. */
8301 case DW_CFA_advance_loc:
8302 if (do_debug_frames_interp)
8303 frame_display_row (fc, &need_col_headers, &max_regs);
8305 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8306 opa * fc->code_factor,
8307 fc->pc_begin + opa * fc->code_factor);
8308 fc->pc_begin += opa * fc->code_factor;
8313 if (! do_debug_frames_interp)
8314 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8315 opa, roffs * fc->data_factor);
8316 fc->col_type[opa] = DW_CFA_offset;
8317 fc->col_offset[opa] = roffs * fc->data_factor;
8320 case DW_CFA_restore:
8321 if (! do_debug_frames_interp)
8322 printf (" DW_CFA_restore: r%d\n", opa);
8323 fc->col_type[opa] = cie->col_type[opa];
8324 fc->col_offset[opa] = cie->col_offset[opa];
8327 case DW_CFA_set_loc:
8328 vma = byte_get (start, encoded_ptr_size);
8329 start += encoded_ptr_size;
8330 if (do_debug_frames_interp)
8331 frame_display_row (fc, &need_col_headers, &max_regs);
8333 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8337 case DW_CFA_advance_loc1:
8338 ofs = byte_get (start, 1); start += 1;
8339 if (do_debug_frames_interp)
8340 frame_display_row (fc, &need_col_headers, &max_regs);
8342 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8343 ofs * fc->code_factor,
8344 fc->pc_begin + ofs * fc->code_factor);
8345 fc->pc_begin += ofs * fc->code_factor;
8348 case DW_CFA_advance_loc2:
8349 ofs = byte_get (start, 2); start += 2;
8350 if (do_debug_frames_interp)
8351 frame_display_row (fc, &need_col_headers, &max_regs);
8353 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8354 ofs * fc->code_factor,
8355 fc->pc_begin + ofs * fc->code_factor);
8356 fc->pc_begin += ofs * fc->code_factor;
8359 case DW_CFA_advance_loc4:
8360 ofs = byte_get (start, 4); start += 4;
8361 if (do_debug_frames_interp)
8362 frame_display_row (fc, &need_col_headers, &max_regs);
8364 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8365 ofs * fc->code_factor,
8366 fc->pc_begin + ofs * fc->code_factor);
8367 fc->pc_begin += ofs * fc->code_factor;
8370 case DW_CFA_offset_extended:
8373 if (! do_debug_frames_interp)
8374 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8375 reg, roffs * fc->data_factor);
8376 fc->col_type[reg] = DW_CFA_offset;
8377 fc->col_offset[reg] = roffs * fc->data_factor;
8380 case DW_CFA_restore_extended:
8382 if (! do_debug_frames_interp)
8383 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8384 fc->col_type[reg] = cie->col_type[reg];
8385 fc->col_offset[reg] = cie->col_offset[reg];
8388 case DW_CFA_undefined:
8390 if (! do_debug_frames_interp)
8391 printf (" DW_CFA_undefined: r%ld\n", reg);
8392 fc->col_type[reg] = DW_CFA_undefined;
8393 fc->col_offset[reg] = 0;
8396 case DW_CFA_same_value:
8398 if (! do_debug_frames_interp)
8399 printf (" DW_CFA_same_value: r%ld\n", reg);
8400 fc->col_type[reg] = DW_CFA_same_value;
8401 fc->col_offset[reg] = 0;
8404 case DW_CFA_register:
8407 if (! do_debug_frames_interp)
8408 printf (" DW_CFA_register: r%ld\n", reg);
8409 fc->col_type[reg] = DW_CFA_register;
8410 fc->col_offset[reg] = roffs;
8413 case DW_CFA_remember_state:
8414 if (! do_debug_frames_interp)
8415 printf (" DW_CFA_remember_state\n");
8416 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8417 rs->ncols = fc->ncols;
8418 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8419 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8420 memcpy (rs->col_type, fc->col_type, rs->ncols);
8421 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8422 rs->next = remembered_state;
8423 remembered_state = rs;
8426 case DW_CFA_restore_state:
8427 if (! do_debug_frames_interp)
8428 printf (" DW_CFA_restore_state\n");
8429 rs = remembered_state;
8430 remembered_state = rs->next;
8431 frame_need_space (fc, rs->ncols-1);
8432 memcpy (fc->col_type, rs->col_type, rs->ncols);
8433 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8434 free (rs->col_type);
8435 free (rs->col_offset);
8439 case DW_CFA_def_cfa:
8440 fc->cfa_reg = LEB ();
8441 fc->cfa_offset = LEB ();
8442 if (! do_debug_frames_interp)
8443 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8444 fc->cfa_reg, fc->cfa_offset);
8447 case DW_CFA_def_cfa_register:
8448 fc->cfa_reg = LEB ();
8449 if (! do_debug_frames_interp)
8450 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8453 case DW_CFA_def_cfa_offset:
8454 fc->cfa_offset = LEB ();
8455 if (! do_debug_frames_interp)
8456 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8460 if (! do_debug_frames_interp)
8461 printf (" DW_CFA_nop\n");
8464 #ifndef DW_CFA_GNU_window_save
8465 #define DW_CFA_GNU_window_save 0x2d
8467 case DW_CFA_GNU_window_save:
8468 if (! do_debug_frames_interp)
8469 printf (" DW_CFA_GNU_window_save\n");
8472 case DW_CFA_GNU_args_size:
8474 if (! do_debug_frames_interp)
8475 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8478 case DW_CFA_GNU_negative_offset_extended:
8481 frame_need_space (fc, reg);
8482 if (! do_debug_frames_interp)
8483 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8484 reg, l * fc->data_factor);
8485 fc->col_type[reg] = DW_CFA_offset;
8486 fc->col_offset[reg] = l * fc->data_factor;
8490 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8495 if (do_debug_frames_interp)
8496 frame_display_row (fc, &need_col_headers, &max_regs);
8511 display_debug_not_supported (section, start, file)
8512 Elf32_Internal_Shdr * section;
8513 unsigned char * start ATTRIBUTE_UNUSED;
8514 FILE * file ATTRIBUTE_UNUSED;
8516 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8517 SECTION_NAME (section));
8522 /* Pre-scan the .debug_info section to record the size of address.
8523 When dumping the .debug_line, we use that size information, assuming
8524 that all compilation units have the same address size. */
8526 prescan_debug_info (section, start, file)
8527 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8528 unsigned char * start;
8529 FILE * file ATTRIBUTE_UNUSED;
8531 DWARF2_External_CompUnit * external;
8533 external = (DWARF2_External_CompUnit *) start;
8535 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8539 /* A structure containing the name of a debug section and a pointer
8540 to a function that can decode it. The third field is a prescan
8541 function to be run over the section before displaying any of the
8545 const char * const name;
8546 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8547 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8551 { ".debug_abbrev", display_debug_abbrev, NULL },
8552 { ".debug_aranges", display_debug_aranges, NULL },
8553 { ".debug_frame", display_debug_frames, NULL },
8554 { ".debug_info", display_debug_info, prescan_debug_info },
8555 { ".debug_line", display_debug_lines, NULL },
8556 { ".debug_pubnames", display_debug_pubnames, NULL },
8557 { ".eh_frame", display_debug_frames, NULL },
8558 { ".debug_macinfo", display_debug_macinfo, NULL },
8559 { ".debug_str", display_debug_str, NULL },
8561 { ".debug_pubtypes", display_debug_not_supported, NULL },
8562 { ".debug_ranges", display_debug_not_supported, NULL },
8563 { ".debug_static_func", display_debug_not_supported, NULL },
8564 { ".debug_static_vars", display_debug_not_supported, NULL },
8565 { ".debug_types", display_debug_not_supported, NULL },
8566 { ".debug_weaknames", display_debug_not_supported, NULL }
8570 display_debug_section (section, file)
8571 Elf32_Internal_Shdr * section;
8574 char * name = SECTION_NAME (section);
8575 bfd_size_type length;
8576 unsigned char * start;
8579 length = section->sh_size;
8582 printf (_("\nSection '%s' has no debugging data.\n"), name);
8586 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8587 _("debug section data"));
8591 /* See if we know how to display the contents of this section. */
8592 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8593 name = ".debug_info";
8595 for (i = NUM_ELEM (debug_displays); i--;)
8596 if (strcmp (debug_displays[i].name, name) == 0)
8598 debug_displays[i].display (section, start, file);
8603 printf (_("Unrecognised debug section: %s\n"), name);
8607 /* If we loaded in the abbrev section at some point,
8608 we must release it here. */
8615 process_section_contents (file)
8618 Elf32_Internal_Shdr * section;
8624 /* Pre-scan the debug sections to find some debug information not
8625 present in some of them. For the .debug_line, we must find out the
8626 size of address (specified in .debug_info and .debug_aranges). */
8627 for (i = 0, section = section_headers;
8628 i < elf_header.e_shnum && i < num_dump_sects;
8631 char * name = SECTION_NAME (section);
8634 if (section->sh_size == 0)
8637 /* See if there is some pre-scan operation for this section. */
8638 for (j = NUM_ELEM (debug_displays); j--;)
8639 if (strcmp (debug_displays[j].name, name) == 0)
8641 if (debug_displays[j].prescan != NULL)
8643 bfd_size_type length;
8644 unsigned char * start;
8646 length = section->sh_size;
8647 start = ((unsigned char *)
8648 get_data (NULL, file, section->sh_offset, length,
8649 _("debug section data")));
8653 debug_displays[j].prescan (section, start, file);
8661 for (i = 0, section = section_headers;
8662 i < elf_header.e_shnum && i < num_dump_sects;
8665 #ifdef SUPPORT_DISASSEMBLY
8666 if (dump_sects[i] & DISASS_DUMP)
8667 disassemble_section (section, file);
8669 if (dump_sects[i] & HEX_DUMP)
8670 dump_section (section, file);
8672 if (dump_sects[i] & DEBUG_DUMP)
8673 display_debug_section (section, file);
8676 if (i < num_dump_sects)
8677 warn (_("Some sections were not dumped because they do not exist!\n"));
8683 process_mips_fpe_exception (mask)
8689 if (mask & OEX_FPU_INEX)
8690 fputs ("INEX", stdout), first = 0;
8691 if (mask & OEX_FPU_UFLO)
8692 printf ("%sUFLO", first ? "" : "|"), first = 0;
8693 if (mask & OEX_FPU_OFLO)
8694 printf ("%sOFLO", first ? "" : "|"), first = 0;
8695 if (mask & OEX_FPU_DIV0)
8696 printf ("%sDIV0", first ? "" : "|"), first = 0;
8697 if (mask & OEX_FPU_INVAL)
8698 printf ("%sINVAL", first ? "" : "|");
8701 fputs ("0", stdout);
8705 process_mips_specific (file)
8708 Elf_Internal_Dyn * entry;
8709 size_t liblist_offset = 0;
8710 size_t liblistno = 0;
8711 size_t conflictsno = 0;
8712 size_t options_offset = 0;
8713 size_t conflicts_offset = 0;
8715 /* We have a lot of special sections. Thanks SGI! */
8716 if (dynamic_segment == NULL)
8717 /* No information available. */
8720 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8721 switch (entry->d_tag)
8723 case DT_MIPS_LIBLIST:
8724 liblist_offset = entry->d_un.d_val - loadaddr;
8726 case DT_MIPS_LIBLISTNO:
8727 liblistno = entry->d_un.d_val;
8729 case DT_MIPS_OPTIONS:
8730 options_offset = entry->d_un.d_val - loadaddr;
8732 case DT_MIPS_CONFLICT:
8733 conflicts_offset = entry->d_un.d_val - loadaddr;
8735 case DT_MIPS_CONFLICTNO:
8736 conflictsno = entry->d_un.d_val;
8742 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8744 Elf32_External_Lib * elib;
8747 elib = ((Elf32_External_Lib *)
8748 get_data (NULL, file, liblist_offset,
8749 liblistno * sizeof (Elf32_External_Lib),
8753 printf ("\nSection '.liblist' contains %lu entries:\n",
8754 (unsigned long) liblistno);
8755 fputs (" Library Time Stamp Checksum Version Flags\n",
8758 for (cnt = 0; cnt < liblistno; ++cnt)
8765 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8766 time = BYTE_GET (elib[cnt].l_time_stamp);
8767 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8768 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8769 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8771 tmp = gmtime (&time);
8772 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8773 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8774 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8776 printf ("%3lu: ", (unsigned long) cnt);
8777 print_symbol (20, dynamic_strings + liblist.l_name);
8778 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
8781 if (liblist.l_flags == 0)
8792 { " EXACT_MATCH", LL_EXACT_MATCH },
8793 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8794 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8795 { " EXPORTS", LL_EXPORTS },
8796 { " DELAY_LOAD", LL_DELAY_LOAD },
8797 { " DELTA", LL_DELTA }
8799 int flags = liblist.l_flags;
8803 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8805 if ((flags & l_flags_vals[fcnt].bit) != 0)
8807 fputs (l_flags_vals[fcnt].name, stdout);
8808 flags ^= l_flags_vals[fcnt].bit;
8811 printf (" %#x", (unsigned int) flags);
8821 if (options_offset != 0)
8823 Elf_External_Options * eopt;
8824 Elf_Internal_Shdr * sect = section_headers;
8825 Elf_Internal_Options * iopt;
8826 Elf_Internal_Options * option;
8830 /* Find the section header so that we get the size. */
8831 while (sect->sh_type != SHT_MIPS_OPTIONS)
8834 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8835 sect->sh_size, _("options"));
8838 iopt = ((Elf_Internal_Options *)
8839 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8842 error (_("Out of memory"));
8849 while (offset < sect->sh_size)
8851 Elf_External_Options * eoption;
8853 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8855 option->kind = BYTE_GET (eoption->kind);
8856 option->size = BYTE_GET (eoption->size);
8857 option->section = BYTE_GET (eoption->section);
8858 option->info = BYTE_GET (eoption->info);
8860 offset += option->size;
8866 printf (_("\nSection '%s' contains %d entries:\n"),
8867 SECTION_NAME (sect), cnt);
8875 switch (option->kind)
8878 /* This shouldn't happen. */
8879 printf (" NULL %d %lx", option->section, option->info);
8882 printf (" REGINFO ");
8883 if (elf_header.e_machine == EM_MIPS)
8886 Elf32_External_RegInfo * ereg;
8887 Elf32_RegInfo reginfo;
8889 ereg = (Elf32_External_RegInfo *) (option + 1);
8890 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8891 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8892 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8893 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8894 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8895 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8897 printf ("GPR %08lx GP 0x%lx\n",
8899 (unsigned long) reginfo.ri_gp_value);
8900 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8901 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8902 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8907 Elf64_External_RegInfo * ereg;
8908 Elf64_Internal_RegInfo reginfo;
8910 ereg = (Elf64_External_RegInfo *) (option + 1);
8911 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8912 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8913 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8914 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8915 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8916 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8918 printf ("GPR %08lx GP 0x",
8919 reginfo.ri_gprmask);
8920 printf_vma (reginfo.ri_gp_value);
8923 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8924 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8925 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8929 case ODK_EXCEPTIONS:
8930 fputs (" EXCEPTIONS fpe_min(", stdout);
8931 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8932 fputs (") fpe_max(", stdout);
8933 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8934 fputs (")", stdout);
8936 if (option->info & OEX_PAGE0)
8937 fputs (" PAGE0", stdout);
8938 if (option->info & OEX_SMM)
8939 fputs (" SMM", stdout);
8940 if (option->info & OEX_FPDBUG)
8941 fputs (" FPDBUG", stdout);
8942 if (option->info & OEX_DISMISS)
8943 fputs (" DISMISS", stdout);
8946 fputs (" PAD ", stdout);
8947 if (option->info & OPAD_PREFIX)
8948 fputs (" PREFIX", stdout);
8949 if (option->info & OPAD_POSTFIX)
8950 fputs (" POSTFIX", stdout);
8951 if (option->info & OPAD_SYMBOL)
8952 fputs (" SYMBOL", stdout);
8955 fputs (" HWPATCH ", stdout);
8956 if (option->info & OHW_R4KEOP)
8957 fputs (" R4KEOP", stdout);
8958 if (option->info & OHW_R8KPFETCH)
8959 fputs (" R8KPFETCH", stdout);
8960 if (option->info & OHW_R5KEOP)
8961 fputs (" R5KEOP", stdout);
8962 if (option->info & OHW_R5KCVTL)
8963 fputs (" R5KCVTL", stdout);
8966 fputs (" FILL ", stdout);
8967 /* XXX Print content of info word? */
8970 fputs (" TAGS ", stdout);
8971 /* XXX Print content of info word? */
8974 fputs (" HWAND ", stdout);
8975 if (option->info & OHWA0_R4KEOP_CHECKED)
8976 fputs (" R4KEOP_CHECKED", stdout);
8977 if (option->info & OHWA0_R4KEOP_CLEAN)
8978 fputs (" R4KEOP_CLEAN", stdout);
8981 fputs (" HWOR ", stdout);
8982 if (option->info & OHWA0_R4KEOP_CHECKED)
8983 fputs (" R4KEOP_CHECKED", stdout);
8984 if (option->info & OHWA0_R4KEOP_CLEAN)
8985 fputs (" R4KEOP_CLEAN", stdout);
8988 printf (" GP_GROUP %#06lx self-contained %#06lx",
8989 option->info & OGP_GROUP,
8990 (option->info & OGP_SELF) >> 16);
8993 printf (" IDENT %#06lx self-contained %#06lx",
8994 option->info & OGP_GROUP,
8995 (option->info & OGP_SELF) >> 16);
8998 /* This shouldn't happen. */
8999 printf (" %3d ??? %d %lx",
9000 option->kind, option->section, option->info);
9004 len = sizeof (* eopt);
9005 while (len < option->size)
9006 if (((char *) option)[len] >= ' '
9007 && ((char *) option)[len] < 0x7f)
9008 printf ("%c", ((char *) option)[len++]);
9010 printf ("\\%03o", ((char *) option)[len++]);
9012 fputs ("\n", stdout);
9020 if (conflicts_offset != 0 && conflictsno != 0)
9022 Elf32_Conflict * iconf;
9025 if (dynamic_symbols == NULL)
9027 error (_("conflict list with without table"));
9031 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
9034 error (_("Out of memory"));
9040 Elf32_External_Conflict * econf32;
9042 econf32 = ((Elf32_External_Conflict *)
9043 get_data (NULL, file, conflicts_offset,
9044 conflictsno * sizeof (* econf32),
9049 for (cnt = 0; cnt < conflictsno; ++cnt)
9050 iconf[cnt] = BYTE_GET (econf32[cnt]);
9056 Elf64_External_Conflict * econf64;
9058 econf64 = ((Elf64_External_Conflict *)
9059 get_data (NULL, file, conflicts_offset,
9060 conflictsno * sizeof (* econf64),
9065 for (cnt = 0; cnt < conflictsno; ++cnt)
9066 iconf[cnt] = BYTE_GET (econf64[cnt]);
9071 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9072 (long) conflictsno);
9073 puts (_(" Num: Index Value Name"));
9075 for (cnt = 0; cnt < conflictsno; ++cnt)
9077 Elf_Internal_Sym * psym = & dynamic_symbols [iconf [cnt]];
9079 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf [cnt]);
9080 print_vma (psym->st_value, FULL_HEX);
9082 print_symbol (25, dynamic_strings + psym->st_name);
9093 get_note_type (e_type)
9096 static char buff[64];
9100 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9101 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9102 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9103 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9104 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9105 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9106 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9107 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9108 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9109 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9110 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
9112 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9118 get_netbsd_elfcore_note_type (e_type)
9121 static char buff[64];
9123 if (e_type == NT_NETBSDCORE_PROCINFO)
9125 /* NetBSD core "procinfo" structure. */
9126 return _("NetBSD procinfo structure");
9129 /* As of Jan 2002 there are no other machine-independent notes
9130 defined for NetBSD core files. If the note type is less
9131 than the start of the machine-dependent note types, we don't
9134 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9136 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9140 switch (elf_header.e_machine)
9142 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9143 and PT_GETFPREGS == mach+2. */
9148 case EM_SPARC32PLUS:
9152 case NT_NETBSDCORE_FIRSTMACH+0:
9153 return _("PT_GETREGS (reg structure)");
9154 case NT_NETBSDCORE_FIRSTMACH+2:
9155 return _("PT_GETFPREGS (fpreg structure)");
9161 /* On all other arch's, PT_GETREGS == mach+1 and
9162 PT_GETFPREGS == mach+3. */
9166 case NT_NETBSDCORE_FIRSTMACH+1:
9167 return _("PT_GETREGS (reg structure)");
9168 case NT_NETBSDCORE_FIRSTMACH+3:
9169 return _("PT_GETFPREGS (fpreg structure)");
9175 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
9179 /* Note that by the ELF standard, the name field is already null byte
9180 terminated, and namesz includes the terminating null byte.
9181 I.E. the value of namesz for the name "FSF" is 4.
9183 If the value of namesz is zero, there is no name present. */
9185 process_note (pnote)
9186 Elf32_Internal_Note * pnote;
9190 if (pnote->namesz == 0)
9192 /* If there is no note name, then use the default set of
9193 note type strings. */
9194 nt = get_note_type (pnote->type);
9196 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
9198 /* NetBSD-specific core file notes. */
9199 nt = get_netbsd_elfcore_note_type (pnote->type);
9203 /* Don't recognize this note name; just use the default set of
9204 note type strings. */
9205 nt = get_note_type (pnote->type);
9208 printf (" %s\t\t0x%08lx\t%s\n",
9209 pnote->namesz ? pnote->namedata : "(NONE)",
9216 process_corefile_note_segment (file, offset, length)
9221 Elf_External_Note * pnotes;
9222 Elf_External_Note * external;
9228 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9235 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9236 (unsigned long) offset, (unsigned long) length);
9237 printf (_(" Owner\t\tData size\tDescription\n"));
9239 while (external < (Elf_External_Note *)((char *) pnotes + length))
9241 Elf32_Internal_Note inote;
9244 inote.type = BYTE_GET (external->type);
9245 inote.namesz = BYTE_GET (external->namesz);
9246 inote.namedata = external->name;
9247 inote.descsz = BYTE_GET (external->descsz);
9248 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9249 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9251 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9253 /* Verify that name is null terminated. It appears that at least
9254 one version of Linux (RedHat 6.0) generates corefiles that don't
9255 comply with the ELF spec by failing to include the null byte in
9257 if (inote.namedata[inote.namesz] != '\0')
9259 temp = malloc (inote.namesz + 1);
9263 error (_("Out of memory\n"));
9268 strncpy (temp, inote.namedata, inote.namesz);
9269 temp[inote.namesz] = 0;
9271 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9272 inote.namedata = temp;
9275 res &= process_note (& inote);
9290 process_corefile_note_segments (file)
9293 Elf_Internal_Phdr * program_headers;
9294 Elf_Internal_Phdr * segment;
9298 program_headers = (Elf_Internal_Phdr *) malloc
9299 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9301 if (program_headers == NULL)
9303 error (_("Out of memory\n"));
9308 i = get_32bit_program_headers (file, program_headers);
9310 i = get_64bit_program_headers (file, program_headers);
9314 free (program_headers);
9318 for (i = 0, segment = program_headers;
9319 i < elf_header.e_phnum;
9322 if (segment->p_type == PT_NOTE)
9323 res &= process_corefile_note_segment (file,
9324 (bfd_vma) segment->p_offset,
9325 (bfd_vma) segment->p_filesz);
9328 free (program_headers);
9334 process_corefile_contents (file)
9337 /* If we have not been asked to display the notes then do nothing. */
9341 /* If file is not a core file then exit. */
9342 if (elf_header.e_type != ET_CORE)
9345 /* No program headers means no NOTE segment. */
9346 if (elf_header.e_phnum == 0)
9348 printf (_("No note segments present in the core file.\n"));
9352 return process_corefile_note_segments (file);
9356 process_arch_specific (file)
9362 switch (elf_header.e_machine)
9365 case EM_MIPS_RS3_LE:
9366 return process_mips_specific (file);
9375 get_file_header (file)
9378 /* Read in the identity array. */
9379 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9382 /* Determine how to read the rest of the header. */
9383 switch (elf_header.e_ident [EI_DATA])
9385 default: /* fall through */
9386 case ELFDATANONE: /* fall through */
9387 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9388 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9391 /* For now we only support 32 bit and 64 bit ELF files. */
9392 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9394 /* Read in the rest of the header. */
9397 Elf32_External_Ehdr ehdr32;
9399 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9402 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9403 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9404 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9405 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9406 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9407 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9408 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9409 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9410 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9411 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9412 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9413 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9414 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9418 Elf64_External_Ehdr ehdr64;
9420 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9421 we will not be able to cope with the 64bit data found in
9422 64 ELF files. Detect this now and abort before we start
9423 overwritting things. */
9424 if (sizeof (bfd_vma) < 8)
9426 error (_("This instance of readelf has been built without support for a\n\
9427 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9431 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9434 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9435 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9436 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9437 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
9438 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
9439 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
9440 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9441 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9442 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9443 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9444 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9445 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9446 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9449 /* There may be some extensions in the first section header. Don't
9450 bomb if we can't read it. */
9452 get_32bit_section_headers (file, 1);
9454 get_64bit_section_headers (file, 1);
9460 process_file (file_name)
9464 struct stat statbuf;
9467 if (stat (file_name, & statbuf) < 0)
9469 error (_("Cannot stat input file %s.\n"), file_name);
9473 file = fopen (file_name, "rb");
9476 error (_("Input file %s not found.\n"), file_name);
9480 if (! get_file_header (file))
9482 error (_("%s: Failed to read file header\n"), file_name);
9487 /* Initialise per file variables. */
9488 for (i = NUM_ELEM (version_info); i--;)
9489 version_info[i] = 0;
9491 for (i = NUM_ELEM (dynamic_info); i--;)
9492 dynamic_info[i] = 0;
9494 /* Process the file. */
9496 printf (_("\nFile: %s\n"), file_name);
9498 if (! process_file_header ())
9504 process_section_headers (file);
9506 process_program_headers (file);
9508 process_dynamic_segment (file);
9510 process_relocs (file);
9512 process_unwind (file);
9514 process_symbol_table (file);
9516 process_syminfo (file);
9518 process_version_sections (file);
9520 process_section_contents (file);
9522 process_corefile_contents (file);
9524 process_arch_specific (file);
9528 if (section_headers)
9530 free (section_headers);
9531 section_headers = NULL;
9536 free (string_table);
9537 string_table = NULL;
9538 string_table_length = 0;
9541 if (dynamic_strings)
9543 free (dynamic_strings);
9544 dynamic_strings = NULL;
9547 if (dynamic_symbols)
9549 free (dynamic_symbols);
9550 dynamic_symbols = NULL;
9551 num_dynamic_syms = 0;
9554 if (dynamic_syminfo)
9556 free (dynamic_syminfo);
9557 dynamic_syminfo = NULL;
9563 #ifdef SUPPORT_DISASSEMBLY
9564 /* Needed by the i386 disassembler. For extra credit, someone could
9565 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9569 print_address (unsigned int addr, FILE * outfile)
9571 fprintf (outfile,"0x%8.8x", addr);
9574 /* Needed by the i386 disassembler. */
9576 db_task_printsym (unsigned int addr)
9578 print_address (addr, stderr);
9582 int main PARAMS ((int, char **));
9591 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9592 setlocale (LC_MESSAGES, "");
9594 #if defined (HAVE_SETLOCALE)
9595 setlocale (LC_CTYPE, "");
9597 bindtextdomain (PACKAGE, LOCALEDIR);
9598 textdomain (PACKAGE);
9600 parse_args (argc, argv);
9602 if (optind < (argc - 1))
9606 while (optind < argc)
9607 err |= process_file (argv [optind ++]);
9609 if (dump_sects != NULL)