1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
56 #include "elf/alpha.h"
59 #include "elf/sparc.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
70 #include "elf/mcore.h"
78 #include "elf/x86-64.h"
80 #include "elf/xstormy16.h"
85 char * program_name = "readelf";
86 unsigned int dynamic_addr;
87 bfd_size_type dynamic_size;
88 unsigned int rela_addr;
89 unsigned int rela_size;
90 char * dynamic_strings;
92 unsigned long string_table_length;
93 unsigned long num_dynamic_syms;
94 Elf_Internal_Sym * dynamic_symbols;
95 Elf_Internal_Syminfo * dynamic_syminfo;
96 unsigned long dynamic_syminfo_offset;
97 unsigned int dynamic_syminfo_nent;
98 char program_interpreter [64];
99 int dynamic_info[DT_JMPREL + 1];
100 int version_info[16];
102 Elf_Internal_Ehdr elf_header;
103 Elf_Internal_Shdr * section_headers;
104 Elf_Internal_Dyn * dynamic_segment;
112 int do_using_dynamic;
120 int do_debug_abbrevs;
122 int do_debug_pubnames;
123 int do_debug_aranges;
125 int do_debug_frames_interp;
126 int do_debug_macinfo;
132 /* A dynamic array of flags indicating which sections require dumping. */
133 char * dump_sects = NULL;
134 unsigned int num_dump_sects = 0;
136 #define HEX_DUMP (1 << 0)
137 #define DISASS_DUMP (1 << 1)
138 #define DEBUG_DUMP (1 << 2)
140 /* How to rpint a vma value. */
141 typedef enum print_mode
153 /* Forward declarations for dumb compilers. */
154 static void print_vma PARAMS ((bfd_vma, print_mode));
155 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
156 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
157 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
158 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
159 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
160 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
161 static const char * get_dynamic_type PARAMS ((unsigned long));
162 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
163 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
164 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
165 static char * get_file_type PARAMS ((unsigned));
166 static char * get_machine_name PARAMS ((unsigned));
167 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
168 static char * get_machine_flags PARAMS ((unsigned, unsigned));
169 static const char * get_mips_segment_type PARAMS ((unsigned long));
170 static const char * get_parisc_segment_type PARAMS ((unsigned long));
171 static const char * get_ia64_segment_type PARAMS ((unsigned long));
172 static const char * get_segment_type PARAMS ((unsigned long));
173 static const char * get_mips_section_type_name PARAMS ((unsigned int));
174 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
175 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
176 static const char * get_section_type_name PARAMS ((unsigned int));
177 static const char * get_symbol_binding PARAMS ((unsigned int));
178 static const char * get_symbol_type PARAMS ((unsigned int));
179 static const char * get_symbol_visibility PARAMS ((unsigned int));
180 static const char * get_symbol_index_type PARAMS ((unsigned int));
181 static const char * get_dynamic_flags PARAMS ((bfd_vma));
182 static void usage PARAMS ((void));
183 static void parse_args PARAMS ((int, char **));
184 static int process_file_header PARAMS ((void));
185 static int process_program_headers PARAMS ((FILE *));
186 static int process_section_headers PARAMS ((FILE *));
187 static int process_unwind PARAMS ((FILE *));
188 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
189 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
190 static int process_dynamic_segment PARAMS ((FILE *));
191 static int process_symbol_table PARAMS ((FILE *));
192 static int process_syminfo PARAMS ((FILE *));
193 static int process_section_contents PARAMS ((FILE *));
194 static void process_mips_fpe_exception PARAMS ((int));
195 static int process_mips_specific PARAMS ((FILE *));
196 static int process_file PARAMS ((char *));
197 static int process_relocs PARAMS ((FILE *));
198 static int process_version_sections PARAMS ((FILE *));
199 static char * get_ver_flags PARAMS ((unsigned int));
200 static int get_32bit_section_headers PARAMS ((FILE *));
201 static int get_64bit_section_headers PARAMS ((FILE *));
202 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
203 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
204 static int get_file_header PARAMS ((FILE *));
205 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
206 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
207 static const char * get_elf_section_flags PARAMS ((bfd_vma));
208 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
209 static int get_32bit_dynamic_segment PARAMS ((FILE *));
210 static int get_64bit_dynamic_segment PARAMS ((FILE *));
211 #ifdef SUPPORT_DISASSEMBLY
212 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
214 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
215 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
216 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
217 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
218 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
219 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
220 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
221 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
222 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
223 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
224 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
225 static int display_debug_str PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
226 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
227 static void load_debug_str PARAMS ((FILE *));
228 static void free_debug_str PARAMS ((void));
229 static const char * fetch_indirect_string PARAMS ((unsigned long));
230 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
231 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
232 static void reset_state_machine PARAMS ((int));
233 static char * get_TAG_name PARAMS ((unsigned long));
234 static char * get_AT_name PARAMS ((unsigned long));
235 static char * get_FORM_name PARAMS ((unsigned long));
236 static void free_abbrevs PARAMS ((void));
237 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
238 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
239 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
240 static unsigned char * read_and_display_attr_value PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
241 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
242 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
243 static void request_dump PARAMS ((unsigned int, int));
244 static const char * get_elf_class PARAMS ((unsigned int));
245 static const char * get_data_encoding PARAMS ((unsigned int));
246 static const char * get_osabi_name PARAMS ((unsigned int));
247 static int guess_is_rela PARAMS ((unsigned long));
248 static char * get_note_type PARAMS ((unsigned int));
249 static int process_note PARAMS ((Elf32_Internal_Note *));
250 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
251 static int process_corefile_note_segments PARAMS ((FILE *));
252 static int process_corefile_contents PARAMS ((FILE *));
253 static int process_arch_specific PARAMS ((FILE *));
255 typedef int Elf32_Word;
263 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
264 ((X)->sh_name >= string_table_length \
265 ? "<corrupt>" : string_table + (X)->sh_name))
267 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
269 #define BYTE_GET(field) byte_get (field, sizeof (field))
271 /* If we can support a 64 bit data type then BFD64 should be defined
272 and sizeof (bfd_vma) == 8. In this case when translating from an
273 external 8 byte field to an internal field, we can assume that the
274 internal field is also 8 bytes wide and so we can extract all the data.
275 If, however, BFD64 is not defined, then we must assume that the
276 internal data structure only has 4 byte wide fields that are the
277 equivalent of the 8 byte wide external counterparts, and so we must
278 truncate the data. */
280 #define BYTE_GET8(field) byte_get (field, -8)
282 #define BYTE_GET8(field) byte_get (field, 8)
285 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
287 #define GET_ELF_SYMBOLS(file, offset, size) \
288 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
289 : get_64bit_elf_symbols (file, offset, size))
293 error VPARAMS ((const char *message, ...))
295 VA_OPEN (args, message);
296 VA_FIXEDARG (args, const char *, message);
298 fprintf (stderr, _("%s: Error: "), program_name);
299 vfprintf (stderr, message, args);
304 warn VPARAMS ((const char *message, ...))
306 VA_OPEN (args, message);
307 VA_FIXEDARG (args, const char *, message);
309 fprintf (stderr, _("%s: Warning: "), program_name);
310 vfprintf (stderr, message, args);
314 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
317 get_data (var, file, offset, size, reason)
329 if (fseek (file, offset, SEEK_SET))
331 error (_("Unable to seek to %x for %s\n"), offset, reason);
338 mvar = (PTR) malloc (size);
342 error (_("Out of memory allocating %d bytes for %s\n"),
348 if (fread (mvar, size, 1, file) != 1)
350 error (_("Unable to read in %d bytes of %s\n"), size, reason);
360 byte_get_little_endian (field, size)
361 unsigned char * field;
370 return ((unsigned int) (field [0]))
371 | (((unsigned int) (field [1])) << 8);
375 /* We want to extract data from an 8 byte wide field and
376 place it into a 4 byte wide field. Since this is a little
377 endian source we can juts use the 4 byte extraction code. */
381 return ((unsigned long) (field [0]))
382 | (((unsigned long) (field [1])) << 8)
383 | (((unsigned long) (field [2])) << 16)
384 | (((unsigned long) (field [3])) << 24);
389 /* This is a special case, generated by the BYTE_GET8 macro.
390 It means that we are loading an 8 byte value from a field
391 in an external structure into an 8 byte value in a field
392 in an internal strcuture. */
393 return ((bfd_vma) (field [0]))
394 | (((bfd_vma) (field [1])) << 8)
395 | (((bfd_vma) (field [2])) << 16)
396 | (((bfd_vma) (field [3])) << 24)
397 | (((bfd_vma) (field [4])) << 32)
398 | (((bfd_vma) (field [5])) << 40)
399 | (((bfd_vma) (field [6])) << 48)
400 | (((bfd_vma) (field [7])) << 56);
403 error (_("Unhandled data length: %d\n"), size);
408 /* Print a VMA value. */
410 print_vma (vma, mode)
420 case FULL_HEX: printf ("0x"); /* drop through */
421 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
422 case PREFIX_HEX: printf ("0x"); /* drop through */
423 case HEX: printf ("%lx", (unsigned long) vma); break;
424 case DEC: printf ("%ld", (unsigned long) vma); break;
425 case DEC_5: printf ("%5ld", (long) vma); break;
426 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
447 #if BFD_HOST_64BIT_LONG
450 if (_bfd_int64_high (vma))
451 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
453 printf ("%lx", _bfd_int64_low (vma));
458 #if BFD_HOST_64BIT_LONG
461 if (_bfd_int64_high (vma))
463 printf ("++%ld", _bfd_int64_low (vma));
465 printf ("%ld", _bfd_int64_low (vma));
470 #if BFD_HOST_64BIT_LONG
471 printf ("%5ld", vma);
473 if (_bfd_int64_high (vma))
475 printf ("++%ld", _bfd_int64_low (vma));
477 printf ("%5ld", _bfd_int64_low (vma));
482 #if BFD_HOST_64BIT_LONG
485 if (_bfd_int64_high (vma))
487 printf ("++%lu", _bfd_int64_low (vma));
489 printf ("%lu", _bfd_int64_low (vma));
498 byte_get_big_endian (field, size)
499 unsigned char * field;
508 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
511 return ((unsigned long) (field [3]))
512 | (((unsigned long) (field [2])) << 8)
513 | (((unsigned long) (field [1])) << 16)
514 | (((unsigned long) (field [0])) << 24);
518 /* Although we are extracing data from an 8 byte wide field, we
519 are returning only 4 bytes of data. */
520 return ((unsigned long) (field [7]))
521 | (((unsigned long) (field [6])) << 8)
522 | (((unsigned long) (field [5])) << 16)
523 | (((unsigned long) (field [4])) << 24);
527 /* This is a special case, generated by the BYTE_GET8 macro.
528 It means that we are loading an 8 byte value from a field
529 in an external structure into an 8 byte value in a field
530 in an internal strcuture. */
531 return ((bfd_vma) (field [7]))
532 | (((bfd_vma) (field [6])) << 8)
533 | (((bfd_vma) (field [5])) << 16)
534 | (((bfd_vma) (field [4])) << 24)
535 | (((bfd_vma) (field [3])) << 32)
536 | (((bfd_vma) (field [2])) << 40)
537 | (((bfd_vma) (field [1])) << 48)
538 | (((bfd_vma) (field [0])) << 56);
542 error (_("Unhandled data length: %d\n"), size);
547 /* Guess the relocation size commonly used by the specific machines. */
550 guess_is_rela (e_machine)
551 unsigned long e_machine;
555 /* Targets that use REL relocations. */
568 /* Targets that use RELA relocations. */
582 case EM_CYGNUS_MN10200:
584 case EM_CYGNUS_MN10300:
621 warn (_("Don't know about relocations on this machine architecture\n"));
627 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
629 unsigned long rel_offset;
630 unsigned long rel_size;
631 Elf_Internal_Rela **relasp;
632 unsigned long *nrelasp;
634 Elf_Internal_Rela *relas;
635 unsigned long nrelas;
640 Elf32_External_Rela * erelas;
642 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
643 rel_size, _("relocs"));
647 nrelas = rel_size / sizeof (Elf32_External_Rela);
649 relas = (Elf_Internal_Rela *)
650 malloc (nrelas * sizeof (Elf_Internal_Rela));
654 error(_("out of memory parsing relocs"));
658 for (i = 0; i < nrelas; i++)
660 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
661 relas[i].r_info = BYTE_GET (erelas[i].r_info);
662 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
669 Elf64_External_Rela * erelas;
671 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
672 rel_size, _("relocs"));
676 nrelas = rel_size / sizeof (Elf64_External_Rela);
678 relas = (Elf_Internal_Rela *)
679 malloc (nrelas * sizeof (Elf_Internal_Rela));
683 error(_("out of memory parsing relocs"));
687 for (i = 0; i < nrelas; i++)
689 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
690 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
691 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
702 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
704 unsigned long rel_offset;
705 unsigned long rel_size;
706 Elf_Internal_Rel **relsp;
707 unsigned long *nrelsp;
709 Elf_Internal_Rel *rels;
715 Elf32_External_Rel * erels;
717 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
718 rel_size, _("relocs"));
722 nrels = rel_size / sizeof (Elf32_External_Rel);
724 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
728 error(_("out of memory parsing relocs"));
732 for (i = 0; i < nrels; i++)
734 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
735 rels[i].r_info = BYTE_GET (erels[i].r_info);
742 Elf64_External_Rel * erels;
744 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
745 rel_size, _("relocs"));
749 nrels = rel_size / sizeof (Elf64_External_Rel);
751 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
755 error(_("out of memory parsing relocs"));
759 for (i = 0; i < nrels; i++)
761 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
762 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
772 /* Display the contents of the relocation data found at the specified offset. */
774 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
776 unsigned long rel_offset;
777 unsigned long rel_size;
778 Elf_Internal_Sym * symtab;
784 Elf_Internal_Rel * rels;
785 Elf_Internal_Rela * relas;
788 if (is_rela == UNKNOWN)
789 is_rela = guess_is_rela (elf_header.e_machine);
793 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
798 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
806 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
809 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
815 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
818 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
821 for (i = 0; i < rel_size; i++)
826 bfd_vma symtab_index;
831 offset = relas [i].r_offset;
832 info = relas [i].r_info;
836 offset = rels [i].r_offset;
837 info = rels [i].r_info;
842 type = ELF32_R_TYPE (info);
843 symtab_index = ELF32_R_SYM (info);
847 if (elf_header.e_machine == EM_SPARCV9)
848 type = ELF64_R_TYPE_ID (info);
850 type = ELF64_R_TYPE (info);
851 /* The #ifdef BFD64 below is to prevent a compile time warning.
852 We know that if we do not have a 64 bit data type that we
853 will never execute this code anyway. */
855 symtab_index = ELF64_R_SYM (info);
861 #ifdef _bfd_int64_low
862 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
864 printf ("%8.8lx %8.8lx ", offset, info);
869 #ifdef _bfd_int64_low
870 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
871 _bfd_int64_high (offset),
872 _bfd_int64_low (offset),
873 _bfd_int64_high (info),
874 _bfd_int64_low (info));
876 printf ("%16.16lx %16.16lx ", offset, info);
880 switch (elf_header.e_machine)
888 rtype = elf_m32r_reloc_type (type);
893 rtype = elf_i386_reloc_type (type);
897 rtype = elf_m68k_reloc_type (type);
901 rtype = elf_i960_reloc_type (type);
906 rtype = elf_avr_reloc_type (type);
913 rtype = elf_sparc_reloc_type (type);
918 rtype = v850_reloc_type (type);
923 rtype = elf_d10v_reloc_type (type);
928 rtype = elf_d30v_reloc_type (type);
932 rtype = elf_sh_reloc_type (type);
936 case EM_CYGNUS_MN10300:
937 rtype = elf_mn10300_reloc_type (type);
941 case EM_CYGNUS_MN10200:
942 rtype = elf_mn10200_reloc_type (type);
947 rtype = elf_fr30_reloc_type (type);
951 rtype = elf_mcore_reloc_type (type);
955 rtype = elf_mmix_reloc_type (type);
960 rtype = elf_ppc_reloc_type (type);
965 rtype = elf_mips_reloc_type (type);
969 rtype = elf_alpha_reloc_type (type);
973 rtype = elf_arm_reloc_type (type);
977 rtype = elf_arc_reloc_type (type);
981 rtype = elf_hppa_reloc_type (type);
987 rtype = elf_h8_reloc_type (type);
992 rtype = elf_pj_reloc_type (type);
995 rtype = elf_ia64_reloc_type (type);
999 rtype = elf_cris_reloc_type (type);
1003 rtype = elf_i860_reloc_type (type);
1007 rtype = elf_x86_64_reloc_type (type);
1012 rtype = elf_s390_reloc_type (type);
1016 rtype = elf_xstormy16_reloc_type (type);
1021 #ifdef _bfd_int64_low
1022 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
1024 printf (_("unrecognised: %-7lx"), type);
1027 printf ("%-21.21s", rtype);
1031 if (symtab == NULL || symtab_index >= nsyms)
1032 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1035 Elf_Internal_Sym * psym;
1037 psym = symtab + symtab_index;
1040 print_vma (psym->st_value, LONG_HEX);
1043 if (psym->st_name == 0)
1045 SECTION_NAME (section_headers + psym->st_shndx));
1046 else if (strtab == NULL)
1047 printf (_("<string table index %3ld>"), psym->st_name);
1049 printf ("%-25.25s", strtab + psym->st_name);
1052 printf (" + %lx", (unsigned long) relas [i].r_addend);
1057 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1058 print_vma (relas[i].r_addend, LONG_HEX);
1061 if (elf_header.e_machine == EM_SPARCV9
1062 && !strcmp (rtype, "R_SPARC_OLO10"))
1063 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1077 get_mips_dynamic_type (type)
1082 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1083 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1084 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1085 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1086 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1087 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1088 case DT_MIPS_MSYM: return "MIPS_MSYM";
1089 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1090 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1091 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1092 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1093 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1094 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1095 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1096 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1097 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1098 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1099 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1100 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1101 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1102 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1103 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1104 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1105 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1106 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1107 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1108 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1109 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1110 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1111 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1112 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1113 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1114 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1115 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1116 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1117 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1118 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1119 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1120 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1121 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1122 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1123 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1124 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1131 get_sparc64_dynamic_type (type)
1136 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1143 get_parisc_dynamic_type (type)
1148 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1149 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1150 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1151 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1152 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1153 case DT_HP_PREINIT: return "HP_PREINIT";
1154 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1155 case DT_HP_NEEDED: return "HP_NEEDED";
1156 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1157 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1158 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1159 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1160 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1167 get_dynamic_type (type)
1170 static char buff [32];
1174 case DT_NULL: return "NULL";
1175 case DT_NEEDED: return "NEEDED";
1176 case DT_PLTRELSZ: return "PLTRELSZ";
1177 case DT_PLTGOT: return "PLTGOT";
1178 case DT_HASH: return "HASH";
1179 case DT_STRTAB: return "STRTAB";
1180 case DT_SYMTAB: return "SYMTAB";
1181 case DT_RELA: return "RELA";
1182 case DT_RELASZ: return "RELASZ";
1183 case DT_RELAENT: return "RELAENT";
1184 case DT_STRSZ: return "STRSZ";
1185 case DT_SYMENT: return "SYMENT";
1186 case DT_INIT: return "INIT";
1187 case DT_FINI: return "FINI";
1188 case DT_SONAME: return "SONAME";
1189 case DT_RPATH: return "RPATH";
1190 case DT_SYMBOLIC: return "SYMBOLIC";
1191 case DT_REL: return "REL";
1192 case DT_RELSZ: return "RELSZ";
1193 case DT_RELENT: return "RELENT";
1194 case DT_PLTREL: return "PLTREL";
1195 case DT_DEBUG: return "DEBUG";
1196 case DT_TEXTREL: return "TEXTREL";
1197 case DT_JMPREL: return "JMPREL";
1198 case DT_BIND_NOW: return "BIND_NOW";
1199 case DT_INIT_ARRAY: return "INIT_ARRAY";
1200 case DT_FINI_ARRAY: return "FINI_ARRAY";
1201 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1202 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1203 case DT_RUNPATH: return "RUNPATH";
1204 case DT_FLAGS: return "FLAGS";
1206 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1207 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1209 case DT_CHECKSUM: return "CHECKSUM";
1210 case DT_PLTPADSZ: return "PLTPADSZ";
1211 case DT_MOVEENT: return "MOVEENT";
1212 case DT_MOVESZ: return "MOVESZ";
1213 case DT_FEATURE: return "FEATURE";
1214 case DT_POSFLAG_1: return "POSFLAG_1";
1215 case DT_SYMINSZ: return "SYMINSZ";
1216 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1218 case DT_ADDRRNGLO: return "ADDRRNGLO";
1219 case DT_CONFIG: return "CONFIG";
1220 case DT_DEPAUDIT: return "DEPAUDIT";
1221 case DT_AUDIT: return "AUDIT";
1222 case DT_PLTPAD: return "PLTPAD";
1223 case DT_MOVETAB: return "MOVETAB";
1224 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1226 case DT_VERSYM: return "VERSYM";
1228 case DT_RELACOUNT: return "RELACOUNT";
1229 case DT_RELCOUNT: return "RELCOUNT";
1230 case DT_FLAGS_1: return "FLAGS_1";
1231 case DT_VERDEF: return "VERDEF";
1232 case DT_VERDEFNUM: return "VERDEFNUM";
1233 case DT_VERNEED: return "VERNEED";
1234 case DT_VERNEEDNUM: return "VERNEEDNUM";
1236 case DT_AUXILIARY: return "AUXILIARY";
1237 case DT_USED: return "USED";
1238 case DT_FILTER: return "FILTER";
1241 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1243 const char * result;
1245 switch (elf_header.e_machine)
1248 case EM_MIPS_RS3_LE:
1249 result = get_mips_dynamic_type (type);
1252 result = get_sparc64_dynamic_type (type);
1262 sprintf (buff, _("Processor Specific: %lx"), type);
1264 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1266 const char * result;
1268 switch (elf_header.e_machine)
1271 result = get_parisc_dynamic_type (type);
1281 sprintf (buff, _("Operating System specific: %lx"), type);
1284 sprintf (buff, _("<unknown>: %lx"), type);
1291 get_file_type (e_type)
1294 static char buff [32];
1298 case ET_NONE: return _("NONE (None)");
1299 case ET_REL: return _("REL (Relocatable file)");
1300 case ET_EXEC: return _("EXEC (Executable file)");
1301 case ET_DYN: return _("DYN (Shared object file)");
1302 case ET_CORE: return _("CORE (Core file)");
1305 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1306 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1307 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1308 sprintf (buff, _("OS Specific: (%x)"), e_type);
1310 sprintf (buff, _("<unknown>: %x"), e_type);
1316 get_machine_name (e_machine)
1319 static char buff [64]; /* XXX */
1323 case EM_NONE: return _("None");
1324 case EM_M32: return "WE32100";
1325 case EM_SPARC: return "Sparc";
1326 case EM_386: return "Intel 80386";
1327 case EM_68K: return "MC68000";
1328 case EM_88K: return "MC88000";
1329 case EM_486: return "Intel 80486";
1330 case EM_860: return "Intel 80860";
1331 case EM_MIPS: return "MIPS R3000";
1332 case EM_S370: return "IBM System/370";
1333 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1334 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1335 case EM_PARISC: return "HPPA";
1336 case EM_PPC_OLD: return "Power PC (old)";
1337 case EM_SPARC32PLUS: return "Sparc v8+" ;
1338 case EM_960: return "Intel 90860";
1339 case EM_PPC: return "PowerPC";
1340 case EM_V800: return "NEC V800";
1341 case EM_FR20: return "Fujitsu FR20";
1342 case EM_RH32: return "TRW RH32";
1343 case EM_MCORE: return "MCORE";
1344 case EM_ARM: return "ARM";
1345 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1346 case EM_SH: return "Hitachi SH";
1347 case EM_SPARCV9: return "Sparc v9";
1348 case EM_TRICORE: return "Siemens Tricore";
1349 case EM_ARC: return "ARC";
1350 case EM_H8_300: return "Hitachi H8/300";
1351 case EM_H8_300H: return "Hitachi H8/300H";
1352 case EM_H8S: return "Hitachi H8S";
1353 case EM_H8_500: return "Hitachi H8/500";
1354 case EM_IA_64: return "Intel IA-64";
1355 case EM_MIPS_X: return "Stanford MIPS-X";
1356 case EM_COLDFIRE: return "Motorola Coldfire";
1357 case EM_68HC12: return "Motorola M68HC12";
1358 case EM_ALPHA: return "Alpha";
1359 case EM_CYGNUS_D10V:
1360 case EM_D10V: return "d10v";
1361 case EM_CYGNUS_D30V:
1362 case EM_D30V: return "d30v";
1363 case EM_CYGNUS_M32R:
1364 case EM_M32R: return "Mitsubishi M32r";
1365 case EM_CYGNUS_V850:
1366 case EM_V850: return "NEC v850";
1367 case EM_CYGNUS_MN10300:
1368 case EM_MN10300: return "mn10300";
1369 case EM_CYGNUS_MN10200:
1370 case EM_MN10200: return "mn10200";
1371 case EM_CYGNUS_FR30:
1372 case EM_FR30: return "Fujitsu FR30";
1374 case EM_PJ: return "picoJava";
1375 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1376 case EM_PCP: return "Siemens PCP";
1377 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1378 case EM_NDR1: return "Denso NDR1 microprocesspr";
1379 case EM_STARCORE: return "Motorola Star*Core processor";
1380 case EM_ME16: return "Toyota ME16 processor";
1381 case EM_ST100: return "STMicroelectronics ST100 processor";
1382 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1383 case EM_FX66: return "Siemens FX66 microcontroller";
1384 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1385 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1386 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1387 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1388 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1389 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1390 case EM_SVX: return "Silicon Graphics SVx";
1391 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1392 case EM_VAX: return "Digital VAX";
1394 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1395 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1396 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1397 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1398 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1399 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1400 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1401 case EM_PRISM: return "SiTera Prism";
1402 case EM_X86_64: return "Advanced Micro Devices X86-64";
1404 case EM_S390: return "IBM S/390";
1405 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1407 sprintf (buff, _("<unknown>: %x"), e_machine);
1413 decode_ARM_machine_flags (e_flags, buf)
1420 eabi = EF_ARM_EABI_VERSION (e_flags);
1421 e_flags &= ~ EF_ARM_EABIMASK;
1423 /* Handle "generic" ARM flags. */
1424 if (e_flags & EF_ARM_RELEXEC)
1426 strcat (buf, ", relocatable executable");
1427 e_flags &= ~ EF_ARM_RELEXEC;
1430 if (e_flags & EF_ARM_HASENTRY)
1432 strcat (buf, ", has entry point");
1433 e_flags &= ~ EF_ARM_HASENTRY;
1436 /* Now handle EABI specific flags. */
1440 strcat (buf, ", <unrecognised EABI>");
1445 case EF_ARM_EABI_VER1:
1446 strcat (buf, ", Version1 EABI");
1451 /* Process flags one bit at a time. */
1452 flag = e_flags & - e_flags;
1457 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1458 strcat (buf, ", sorted symbol tables");
1468 case EF_ARM_EABI_VER2:
1469 strcat (buf, ", Version2 EABI");
1474 /* Process flags one bit at a time. */
1475 flag = e_flags & - e_flags;
1480 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1481 strcat (buf, ", sorted symbol tables");
1484 case EF_ARM_DYNSYMSUSESEGIDX:
1485 strcat (buf, ", dynamic symbols use segment index");
1488 case EF_ARM_MAPSYMSFIRST:
1489 strcat (buf, ", mapping symbols precede others");
1499 case EF_ARM_EABI_UNKNOWN:
1500 strcat (buf, ", GNU EABI");
1505 /* Process flags one bit at a time. */
1506 flag = e_flags & - e_flags;
1511 case EF_ARM_INTERWORK:
1512 strcat (buf, ", interworking enabled");
1515 case EF_ARM_APCS_26:
1516 strcat (buf, ", uses APCS/26");
1519 case EF_ARM_APCS_FLOAT:
1520 strcat (buf, ", uses APCS/float");
1524 strcat (buf, ", position independent");
1528 strcat (buf, ", 8 bit structure alignment");
1531 case EF_ARM_NEW_ABI:
1532 strcat (buf, ", uses new ABI");
1535 case EF_ARM_OLD_ABI:
1536 strcat (buf, ", uses old ABI");
1539 case EF_ARM_SOFT_FLOAT:
1540 strcat (buf, ", software FP");
1551 strcat (buf,", <unknown>");
1555 get_machine_flags (e_flags, e_machine)
1559 static char buf [1024];
1571 decode_ARM_machine_flags (e_flags, buf);
1575 if (e_flags & EF_CPU32)
1576 strcat (buf, ", cpu32");
1580 if (e_flags & EF_PPC_EMB)
1581 strcat (buf, ", emb");
1583 if (e_flags & EF_PPC_RELOCATABLE)
1584 strcat (buf, ", relocatable");
1586 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1587 strcat (buf, ", relocatable-lib");
1591 case EM_CYGNUS_V850:
1592 switch (e_flags & EF_V850_ARCH)
1595 strcat (buf, ", v850e");
1598 strcat (buf, ", v850ea");
1601 strcat (buf, ", v850");
1604 strcat (buf, ", unknown v850 architecture variant");
1610 case EM_CYGNUS_M32R:
1611 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1612 strcat (buf, ", m32r");
1617 case EM_MIPS_RS3_LE:
1618 if (e_flags & EF_MIPS_NOREORDER)
1619 strcat (buf, ", noreorder");
1621 if (e_flags & EF_MIPS_PIC)
1622 strcat (buf, ", pic");
1624 if (e_flags & EF_MIPS_CPIC)
1625 strcat (buf, ", cpic");
1627 if (e_flags & EF_MIPS_UCODE)
1628 strcat (buf, ", ugen_reserved");
1630 if (e_flags & EF_MIPS_ABI2)
1631 strcat (buf, ", abi2");
1633 if (e_flags & EF_MIPS_32BITMODE)
1634 strcat (buf, ", 32bitmode");
1636 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1637 strcat (buf, ", mips1");
1639 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1640 strcat (buf, ", mips2");
1642 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1643 strcat (buf, ", mips3");
1645 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1646 strcat (buf, ", mips4");
1648 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
1649 strcat (buf, ", mips5");
1651 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
1652 strcat (buf, ", mips32");
1654 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
1655 strcat (buf, ", mips64");
1657 switch ((e_flags & EF_MIPS_MACH))
1659 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1660 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1661 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1662 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1663 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1664 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1665 default: strcat (buf, " UNKNOWN"); break;
1670 if (e_flags & EF_SPARC_32PLUS)
1671 strcat (buf, ", v8+");
1673 if (e_flags & EF_SPARC_SUN_US1)
1674 strcat (buf, ", ultrasparcI");
1676 if (e_flags & EF_SPARC_SUN_US3)
1677 strcat (buf, ", ultrasparcIII");
1679 if (e_flags & EF_SPARC_HAL_R1)
1680 strcat (buf, ", halr1");
1682 if (e_flags & EF_SPARC_LEDATA)
1683 strcat (buf, ", ledata");
1685 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1686 strcat (buf, ", tso");
1688 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1689 strcat (buf, ", pso");
1691 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1692 strcat (buf, ", rmo");
1696 switch (e_flags & EF_PARISC_ARCH)
1698 case EFA_PARISC_1_0:
1699 strcpy (buf, ", PA-RISC 1.0");
1701 case EFA_PARISC_1_1:
1702 strcpy (buf, ", PA-RISC 1.1");
1704 case EFA_PARISC_2_0:
1705 strcpy (buf, ", PA-RISC 2.0");
1710 if (e_flags & EF_PARISC_TRAPNIL)
1711 strcat (buf, ", trapnil");
1712 if (e_flags & EF_PARISC_EXT)
1713 strcat (buf, ", ext");
1714 if (e_flags & EF_PARISC_LSB)
1715 strcat (buf, ", lsb");
1716 if (e_flags & EF_PARISC_WIDE)
1717 strcat (buf, ", wide");
1718 if (e_flags & EF_PARISC_NO_KABP)
1719 strcat (buf, ", no kabp");
1720 if (e_flags & EF_PARISC_LAZYSWAP)
1721 strcat (buf, ", lazyswap");
1726 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1727 strcat (buf, ", new calling convention");
1729 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1730 strcat (buf, ", gnu calling convention");
1734 if ((e_flags & EF_IA_64_ABI64))
1735 strcat (buf, ", 64-bit");
1737 strcat (buf, ", 32-bit");
1738 if ((e_flags & EF_IA_64_REDUCEDFP))
1739 strcat (buf, ", reduced fp model");
1740 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1741 strcat (buf, ", no function descriptors, constant gp");
1742 else if ((e_flags & EF_IA_64_CONS_GP))
1743 strcat (buf, ", constant gp");
1744 if ((e_flags & EF_IA_64_ABSOLUTE))
1745 strcat (buf, ", absolute");
1754 get_mips_segment_type (type)
1759 case PT_MIPS_REGINFO:
1761 case PT_MIPS_RTPROC:
1763 case PT_MIPS_OPTIONS:
1773 get_parisc_segment_type (type)
1778 case PT_HP_TLS: return "HP_TLS";
1779 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1780 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1781 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1782 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1783 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1784 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1785 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1786 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1787 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1788 case PT_HP_PARALLEL: return "HP_PARALLEL";
1789 case PT_HP_FASTBIND: return "HP_FASTBIND";
1790 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1791 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1800 get_ia64_segment_type (type)
1805 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1806 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1815 get_segment_type (p_type)
1816 unsigned long p_type;
1818 static char buff [32];
1822 case PT_NULL: return "NULL";
1823 case PT_LOAD: return "LOAD";
1824 case PT_DYNAMIC: return "DYNAMIC";
1825 case PT_INTERP: return "INTERP";
1826 case PT_NOTE: return "NOTE";
1827 case PT_SHLIB: return "SHLIB";
1828 case PT_PHDR: return "PHDR";
1831 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1833 const char * result;
1835 switch (elf_header.e_machine)
1838 case EM_MIPS_RS3_LE:
1839 result = get_mips_segment_type (p_type);
1842 result = get_parisc_segment_type (p_type);
1845 result = get_ia64_segment_type (p_type);
1855 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1857 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1859 const char * result;
1861 switch (elf_header.e_machine)
1864 result = get_parisc_segment_type (p_type);
1874 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1877 sprintf (buff, _("<unknown>: %lx"), p_type);
1884 get_mips_section_type_name (sh_type)
1885 unsigned int sh_type;
1889 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1890 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1891 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1892 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1893 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1894 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1895 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1896 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1897 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1898 case SHT_MIPS_RELD: return "MIPS_RELD";
1899 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1900 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1901 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1902 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1903 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1904 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1905 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1906 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1907 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1908 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1909 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1910 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1911 case SHT_MIPS_LINE: return "MIPS_LINE";
1912 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1913 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1914 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1915 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1916 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1917 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1918 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1919 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1920 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1921 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1922 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1923 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1924 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1925 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1926 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1927 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1935 get_parisc_section_type_name (sh_type)
1936 unsigned int sh_type;
1940 case SHT_PARISC_EXT: return "PARISC_EXT";
1941 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1942 case SHT_PARISC_DOC: return "PARISC_DOC";
1950 get_ia64_section_type_name (sh_type)
1951 unsigned int sh_type;
1955 case SHT_IA_64_EXT: return "IA_64_EXT";
1956 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
1964 get_section_type_name (sh_type)
1965 unsigned int sh_type;
1967 static char buff [32];
1971 case SHT_NULL: return "NULL";
1972 case SHT_PROGBITS: return "PROGBITS";
1973 case SHT_SYMTAB: return "SYMTAB";
1974 case SHT_STRTAB: return "STRTAB";
1975 case SHT_RELA: return "RELA";
1976 case SHT_HASH: return "HASH";
1977 case SHT_DYNAMIC: return "DYNAMIC";
1978 case SHT_NOTE: return "NOTE";
1979 case SHT_NOBITS: return "NOBITS";
1980 case SHT_REL: return "REL";
1981 case SHT_SHLIB: return "SHLIB";
1982 case SHT_DYNSYM: return "DYNSYM";
1983 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1984 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1985 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1986 case SHT_GROUP: return "GROUP";
1987 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
1988 case SHT_GNU_verdef: return "VERDEF";
1989 case SHT_GNU_verneed: return "VERNEED";
1990 case SHT_GNU_versym: return "VERSYM";
1991 case 0x6ffffff0: return "VERSYM";
1992 case 0x6ffffffc: return "VERDEF";
1993 case 0x7ffffffd: return "AUXILIARY";
1994 case 0x7fffffff: return "FILTER";
1997 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1999 const char * result;
2001 switch (elf_header.e_machine)
2004 case EM_MIPS_RS3_LE:
2005 result = get_mips_section_type_name (sh_type);
2008 result = get_parisc_section_type_name (sh_type);
2011 result = get_ia64_section_type_name (sh_type);
2021 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2023 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2024 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2025 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2026 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2028 sprintf (buff, _("<unknown>: %x"), sh_type);
2034 struct option options [] =
2036 {"all", no_argument, 0, 'a'},
2037 {"file-header", no_argument, 0, 'h'},
2038 {"program-headers", no_argument, 0, 'l'},
2039 {"headers", no_argument, 0, 'e'},
2040 {"histogram", no_argument, 0, 'I'},
2041 {"segments", no_argument, 0, 'l'},
2042 {"sections", no_argument, 0, 'S'},
2043 {"section-headers", no_argument, 0, 'S'},
2044 {"symbols", no_argument, 0, 's'},
2045 {"syms", no_argument, 0, 's'},
2046 {"relocs", no_argument, 0, 'r'},
2047 {"notes", no_argument, 0, 'n'},
2048 {"dynamic", no_argument, 0, 'd'},
2049 {"arch-specific", no_argument, 0, 'A'},
2050 {"version-info", no_argument, 0, 'V'},
2051 {"use-dynamic", no_argument, 0, 'D'},
2052 {"hex-dump", required_argument, 0, 'x'},
2053 {"debug-dump", optional_argument, 0, 'w'},
2054 {"unwind", no_argument, 0, 'u'},
2055 #ifdef SUPPORT_DISASSEMBLY
2056 {"instruction-dump", required_argument, 0, 'i'},
2059 {"version", no_argument, 0, 'v'},
2060 {"wide", no_argument, 0, 'W'},
2061 {"help", no_argument, 0, 'H'},
2062 {0, no_argument, 0, 0}
2068 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
2069 fprintf (stdout, _(" Options are:\n"));
2070 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2071 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
2072 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
2073 fprintf (stdout, _(" Display the program headers\n"));
2074 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
2075 fprintf (stdout, _(" Display the sections' header\n"));
2076 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
2077 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
2078 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
2079 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
2080 fprintf (stdout, _(" -u or --unwind Display the unwind info (if present)\n"));
2081 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2082 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
2083 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2084 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2085 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
2086 fprintf (stdout, _(" Dump the contents of section <number>\n"));
2087 fprintf (stdout, _(" -w[liaprmfs] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n"));
2088 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
2089 #ifdef SUPPORT_DISASSEMBLY
2090 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
2091 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
2093 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2094 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
2095 fprintf (stdout, _(" -W or --wide Don't split lines to fit into 80 columns\n"));
2096 fprintf (stdout, _(" -H or --help Display this information\n"));
2097 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2103 request_dump (section, type)
2104 unsigned int section;
2107 if (section >= num_dump_sects)
2109 char * new_dump_sects;
2111 new_dump_sects = (char *) calloc (section + 1, 1);
2113 if (new_dump_sects == NULL)
2114 error (_("Out of memory allocating dump request table."));
2117 /* Copy current flag settings. */
2118 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2122 dump_sects = new_dump_sects;
2123 num_dump_sects = section + 1;
2128 dump_sects [section] |= type;
2134 parse_args (argc, argv)
2143 while ((c = getopt_long
2144 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2180 do_using_dynamic ++;
2211 section = strtoul (optarg, & cp, 0);
2212 if (! * cp && section >= 0)
2214 request_dump (section, HEX_DUMP);
2224 unsigned int index = 0;
2228 while (optarg[index])
2229 switch (optarg[index++])
2238 do_debug_abbrevs = 1;
2248 do_debug_pubnames = 1;
2253 do_debug_aranges = 1;
2257 do_debug_frames_interp = 1;
2259 do_debug_frames = 1;
2264 do_debug_macinfo = 1;
2273 warn (_("Unrecognised debug option '%s'\n"), optarg);
2278 #ifdef SUPPORT_DISASSEMBLY
2281 section = strtoul (optarg, & cp, 0);
2282 if (! * cp && section >= 0)
2284 request_dump (section, DISASS_DUMP);
2290 print_version (program_name);
2300 /* xgettext:c-format */
2301 error (_("Invalid option '-%c'\n"), c);
2308 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2309 && !do_segments && !do_header && !do_dump && !do_version
2310 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2314 warn (_("Nothing to do.\n"));
2320 get_elf_class (elf_class)
2321 unsigned int elf_class;
2323 static char buff [32];
2327 case ELFCLASSNONE: return _("none");
2328 case ELFCLASS32: return "ELF32";
2329 case ELFCLASS64: return "ELF64";
2331 sprintf (buff, _("<unknown: %x>"), elf_class);
2337 get_data_encoding (encoding)
2338 unsigned int encoding;
2340 static char buff [32];
2344 case ELFDATANONE: return _("none");
2345 case ELFDATA2LSB: return _("2's complement, little endian");
2346 case ELFDATA2MSB: return _("2's complement, big endian");
2348 sprintf (buff, _("<unknown: %x>"), encoding);
2354 get_osabi_name (osabi)
2357 static char buff [32];
2361 case ELFOSABI_NONE: return "UNIX - System V";
2362 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2363 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2364 case ELFOSABI_LINUX: return "UNIX - Linux";
2365 case ELFOSABI_HURD: return "GNU/Hurd";
2366 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2367 case ELFOSABI_AIX: return "UNIX - AIX";
2368 case ELFOSABI_IRIX: return "UNIX - IRIX";
2369 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2370 case ELFOSABI_TRU64: return "UNIX - TRU64";
2371 case ELFOSABI_MODESTO: return "Novell - Modesto";
2372 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2373 case ELFOSABI_STANDALONE: return _("Standalone App");
2374 case ELFOSABI_ARM: return "ARM";
2376 sprintf (buff, _("<unknown: %x>"), osabi);
2381 /* Decode the data held in 'elf_header'. */
2383 process_file_header ()
2385 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2386 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2387 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2388 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2391 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2399 printf (_("ELF Header:\n"));
2400 printf (_(" Magic: "));
2401 for (i = 0; i < EI_NIDENT; i ++)
2402 printf ("%2.2x ", elf_header.e_ident [i]);
2404 printf (_(" Class: %s\n"),
2405 get_elf_class (elf_header.e_ident [EI_CLASS]));
2406 printf (_(" Data: %s\n"),
2407 get_data_encoding (elf_header.e_ident [EI_DATA]));
2408 printf (_(" Version: %d %s\n"),
2409 elf_header.e_ident [EI_VERSION],
2410 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2412 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2415 printf (_(" OS/ABI: %s\n"),
2416 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2417 printf (_(" ABI Version: %d\n"),
2418 elf_header.e_ident [EI_ABIVERSION]);
2419 printf (_(" Type: %s\n"),
2420 get_file_type (elf_header.e_type));
2421 printf (_(" Machine: %s\n"),
2422 get_machine_name (elf_header.e_machine));
2423 printf (_(" Version: 0x%lx\n"),
2424 (unsigned long) elf_header.e_version);
2426 printf (_(" Entry point address: "));
2427 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2428 printf (_("\n Start of program headers: "));
2429 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2430 printf (_(" (bytes into file)\n Start of section headers: "));
2431 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2432 printf (_(" (bytes into file)\n"));
2434 printf (_(" Flags: 0x%lx%s\n"),
2435 (unsigned long) elf_header.e_flags,
2436 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2437 printf (_(" Size of this header: %ld (bytes)\n"),
2438 (long) elf_header.e_ehsize);
2439 printf (_(" Size of program headers: %ld (bytes)\n"),
2440 (long) elf_header.e_phentsize);
2441 printf (_(" Number of program headers: %ld\n"),
2442 (long) elf_header.e_phnum);
2443 printf (_(" Size of section headers: %ld (bytes)\n"),
2444 (long) elf_header.e_shentsize);
2445 printf (_(" Number of section headers: %ld\n"),
2446 (long) elf_header.e_shnum);
2447 printf (_(" Section header string table index: %ld\n"),
2448 (long) elf_header.e_shstrndx);
2456 get_32bit_program_headers (file, program_headers)
2458 Elf_Internal_Phdr * program_headers;
2460 Elf32_External_Phdr * phdrs;
2461 Elf32_External_Phdr * external;
2462 Elf32_Internal_Phdr * internal;
2465 phdrs = ((Elf32_External_Phdr *)
2466 get_data (NULL, file, elf_header.e_phoff,
2467 elf_header.e_phentsize * elf_header.e_phnum,
2468 _("program headers")));
2472 for (i = 0, internal = program_headers, external = phdrs;
2473 i < elf_header.e_phnum;
2474 i ++, internal ++, external ++)
2476 internal->p_type = BYTE_GET (external->p_type);
2477 internal->p_offset = BYTE_GET (external->p_offset);
2478 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2479 internal->p_paddr = BYTE_GET (external->p_paddr);
2480 internal->p_filesz = BYTE_GET (external->p_filesz);
2481 internal->p_memsz = BYTE_GET (external->p_memsz);
2482 internal->p_flags = BYTE_GET (external->p_flags);
2483 internal->p_align = BYTE_GET (external->p_align);
2492 get_64bit_program_headers (file, program_headers)
2494 Elf_Internal_Phdr * program_headers;
2496 Elf64_External_Phdr * phdrs;
2497 Elf64_External_Phdr * external;
2498 Elf64_Internal_Phdr * internal;
2501 phdrs = ((Elf64_External_Phdr *)
2502 get_data (NULL, file, elf_header.e_phoff,
2503 elf_header.e_phentsize * elf_header.e_phnum,
2504 _("program headers")));
2508 for (i = 0, internal = program_headers, external = phdrs;
2509 i < elf_header.e_phnum;
2510 i ++, internal ++, external ++)
2512 internal->p_type = BYTE_GET (external->p_type);
2513 internal->p_flags = BYTE_GET (external->p_flags);
2514 internal->p_offset = BYTE_GET8 (external->p_offset);
2515 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2516 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2517 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2518 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2519 internal->p_align = BYTE_GET8 (external->p_align);
2528 process_program_headers (file)
2531 Elf_Internal_Phdr * program_headers;
2532 Elf_Internal_Phdr * segment;
2535 if (elf_header.e_phnum == 0)
2538 printf (_("\nThere are no program headers in this file.\n"));
2542 if (do_segments && !do_header)
2544 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2545 printf (_("Entry point "));
2546 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2547 printf (_("\nThere are %d program headers, starting at offset "),
2548 elf_header.e_phnum);
2549 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2553 program_headers = (Elf_Internal_Phdr *) malloc
2554 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2556 if (program_headers == NULL)
2558 error (_("Out of memory\n"));
2563 i = get_32bit_program_headers (file, program_headers);
2565 i = get_64bit_program_headers (file, program_headers);
2569 free (program_headers);
2576 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2580 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2583 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2587 (_(" Type Offset VirtAddr PhysAddr\n"));
2589 (_(" FileSiz MemSiz Flags Align\n"));
2597 for (i = 0, segment = program_headers;
2598 i < elf_header.e_phnum;
2603 printf (" %-14.14s ", get_segment_type (segment->p_type));
2607 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2608 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2609 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2610 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2611 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2613 (segment->p_flags & PF_R ? 'R' : ' '),
2614 (segment->p_flags & PF_W ? 'W' : ' '),
2615 (segment->p_flags & PF_X ? 'E' : ' '));
2616 printf ("%#lx", (unsigned long) segment->p_align);
2620 if ((unsigned long) segment->p_offset == segment->p_offset)
2621 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2624 print_vma (segment->p_offset, FULL_HEX);
2628 print_vma (segment->p_vaddr, FULL_HEX);
2630 print_vma (segment->p_paddr, FULL_HEX);
2633 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2634 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2637 print_vma (segment->p_filesz, FULL_HEX);
2641 if ((unsigned long) segment->p_memsz == segment->p_memsz)
2642 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2645 print_vma (segment->p_offset, FULL_HEX);
2649 (segment->p_flags & PF_R ? 'R' : ' '),
2650 (segment->p_flags & PF_W ? 'W' : ' '),
2651 (segment->p_flags & PF_X ? 'E' : ' '));
2653 if ((unsigned long) segment->p_align == segment->p_align)
2654 printf ("%#lx", (unsigned long) segment->p_align);
2657 print_vma (segment->p_align, PREFIX_HEX);
2662 print_vma (segment->p_offset, FULL_HEX);
2664 print_vma (segment->p_vaddr, FULL_HEX);
2666 print_vma (segment->p_paddr, FULL_HEX);
2668 print_vma (segment->p_filesz, FULL_HEX);
2670 print_vma (segment->p_memsz, FULL_HEX);
2672 (segment->p_flags & PF_R ? 'R' : ' '),
2673 (segment->p_flags & PF_W ? 'W' : ' '),
2674 (segment->p_flags & PF_X ? 'E' : ' '));
2675 print_vma (segment->p_align, HEX);
2679 switch (segment->p_type)
2683 loadaddr = (segment->p_vaddr & 0xfffff000)
2684 - (segment->p_offset & 0xfffff000);
2689 error (_("more than one dynamic segment\n"));
2691 dynamic_addr = segment->p_offset;
2692 dynamic_size = segment->p_filesz;
2696 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2697 error (_("Unable to find program interpreter name\n"));
2700 program_interpreter[0] = 0;
2701 fscanf (file, "%63s", program_interpreter);
2704 printf (_("\n [Requesting program interpreter: %s]"),
2705 program_interpreter);
2711 putc ('\n', stdout);
2720 if (do_segments && section_headers != NULL)
2722 printf (_("\n Section to Segment mapping:\n"));
2723 printf (_(" Segment Sections...\n"));
2725 assert (string_table != NULL);
2727 for (i = 0; i < elf_header.e_phnum; i++)
2730 Elf_Internal_Shdr * section;
2732 segment = program_headers + i;
2733 section = section_headers;
2735 printf (" %2.2d ", i);
2737 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2739 if (section->sh_size > 0
2740 /* Compare allocated sections by VMA, unallocated
2741 sections by file offset. */
2742 && (section->sh_flags & SHF_ALLOC
2743 ? (section->sh_addr >= segment->p_vaddr
2744 && section->sh_addr + section->sh_size
2745 <= segment->p_vaddr + segment->p_memsz)
2746 : ((bfd_vma) section->sh_offset >= segment->p_offset
2747 && (section->sh_offset + section->sh_size
2748 <= segment->p_offset + segment->p_filesz))))
2749 printf ("%s ", SECTION_NAME (section));
2756 free (program_headers);
2763 get_32bit_section_headers (file)
2766 Elf32_External_Shdr * shdrs;
2767 Elf32_Internal_Shdr * internal;
2770 shdrs = ((Elf32_External_Shdr *)
2771 get_data (NULL, file, elf_header.e_shoff,
2772 elf_header.e_shentsize * elf_header.e_shnum,
2773 _("section headers")));
2777 section_headers = (Elf_Internal_Shdr *) malloc
2778 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2780 if (section_headers == NULL)
2782 error (_("Out of memory\n"));
2786 for (i = 0, internal = section_headers;
2787 i < elf_header.e_shnum;
2790 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2791 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2792 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2793 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2794 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2795 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2796 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2797 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2798 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2799 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2808 get_64bit_section_headers (file)
2811 Elf64_External_Shdr * shdrs;
2812 Elf64_Internal_Shdr * internal;
2815 shdrs = ((Elf64_External_Shdr *)
2816 get_data (NULL, file, elf_header.e_shoff,
2817 elf_header.e_shentsize * elf_header.e_shnum,
2818 _("section headers")));
2822 section_headers = (Elf_Internal_Shdr *) malloc
2823 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2825 if (section_headers == NULL)
2827 error (_("Out of memory\n"));
2831 for (i = 0, internal = section_headers;
2832 i < elf_header.e_shnum;
2835 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2836 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2837 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2838 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2839 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2840 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2841 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2842 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2843 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2844 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2852 static Elf_Internal_Sym *
2853 get_32bit_elf_symbols (file, offset, number)
2855 unsigned long offset;
2856 unsigned long number;
2858 Elf32_External_Sym * esyms;
2859 Elf_Internal_Sym * isyms;
2860 Elf_Internal_Sym * psym;
2863 esyms = ((Elf32_External_Sym *)
2864 get_data (NULL, file, offset,
2865 number * sizeof (Elf32_External_Sym), _("symbols")));
2869 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2873 error (_("Out of memory\n"));
2879 for (j = 0, psym = isyms;
2883 psym->st_name = BYTE_GET (esyms[j].st_name);
2884 psym->st_value = BYTE_GET (esyms[j].st_value);
2885 psym->st_size = BYTE_GET (esyms[j].st_size);
2886 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2887 psym->st_info = BYTE_GET (esyms[j].st_info);
2888 psym->st_other = BYTE_GET (esyms[j].st_other);
2896 static Elf_Internal_Sym *
2897 get_64bit_elf_symbols (file, offset, number)
2899 unsigned long offset;
2900 unsigned long number;
2902 Elf64_External_Sym * esyms;
2903 Elf_Internal_Sym * isyms;
2904 Elf_Internal_Sym * psym;
2907 esyms = ((Elf64_External_Sym *)
2908 get_data (NULL, file, offset,
2909 number * sizeof (Elf64_External_Sym), _("symbols")));
2913 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2917 error (_("Out of memory\n"));
2923 for (j = 0, psym = isyms;
2927 psym->st_name = BYTE_GET (esyms[j].st_name);
2928 psym->st_info = BYTE_GET (esyms[j].st_info);
2929 psym->st_other = BYTE_GET (esyms[j].st_other);
2930 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2931 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2932 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2941 get_elf_section_flags (sh_flags)
2944 static char buff [32];
2952 flag = sh_flags & - sh_flags;
2957 case SHF_WRITE: strcat (buff, "W"); break;
2958 case SHF_ALLOC: strcat (buff, "A"); break;
2959 case SHF_EXECINSTR: strcat (buff, "X"); break;
2960 case SHF_MERGE: strcat (buff, "M"); break;
2961 case SHF_STRINGS: strcat (buff, "S"); break;
2962 case SHF_INFO_LINK: strcat (buff, "I"); break;
2963 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2964 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2965 case SHF_GROUP: strcat (buff, "G"); break;
2968 if (flag & SHF_MASKOS)
2971 sh_flags &= ~ SHF_MASKOS;
2973 else if (flag & SHF_MASKPROC)
2976 sh_flags &= ~ SHF_MASKPROC;
2988 process_section_headers (file)
2991 Elf_Internal_Shdr * section;
2994 section_headers = NULL;
2996 if (elf_header.e_shnum == 0)
2999 printf (_("\nThere are no sections in this file.\n"));
3004 if (do_sections && !do_header)
3005 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3006 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3010 if (! get_32bit_section_headers (file))
3013 else if (! get_64bit_section_headers (file))
3016 /* Read in the string table, so that we have names to display. */
3017 section = section_headers + elf_header.e_shstrndx;
3019 if (section->sh_size != 0)
3021 string_table = (char *) get_data (NULL, file, section->sh_offset,
3022 section->sh_size, _("string table"));
3024 string_table_length = section->sh_size;
3027 /* Scan the sections for the dynamic symbol table
3028 and dynamic string table and debug sections. */
3029 dynamic_symbols = NULL;
3030 dynamic_strings = NULL;
3031 dynamic_syminfo = NULL;
3033 for (i = 0, section = section_headers;
3034 i < elf_header.e_shnum;
3037 char * name = SECTION_NAME (section);
3039 if (section->sh_type == SHT_DYNSYM)
3041 if (dynamic_symbols != NULL)
3043 error (_("File contains multiple dynamic symbol tables\n"));
3047 num_dynamic_syms = section->sh_size / section->sh_entsize;
3049 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
3051 else if (section->sh_type == SHT_STRTAB
3052 && strcmp (name, ".dynstr") == 0)
3054 if (dynamic_strings != NULL)
3056 error (_("File contains multiple dynamic string tables\n"));
3060 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3062 _("dynamic strings"));
3064 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3065 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3066 || do_debug_frames || do_debug_macinfo || do_debug_str)
3067 && strncmp (name, ".debug_", 7) == 0)
3072 || (do_debug_info && (strcmp (name, "info") == 0))
3073 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3074 || (do_debug_lines && (strcmp (name, "line") == 0))
3075 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3076 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3077 || (do_debug_frames && (strcmp (name, "frame") == 0))
3078 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3079 || (do_debug_str && (strcmp (name, "str") == 0))
3081 request_dump (i, DEBUG_DUMP);
3083 /* linkonce section to be combined with .debug_info at link time. */
3084 else if ((do_debugging || do_debug_info)
3085 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3086 request_dump (i, DEBUG_DUMP);
3087 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3088 request_dump (i, DEBUG_DUMP);
3094 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3098 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3101 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3104 printf (_(" [Nr] Name Type Address Offset\n"));
3105 printf (_(" Size EntSize Flags Link Info Align\n"));
3108 for (i = 0, section = section_headers;
3109 i < elf_header.e_shnum;
3112 printf (" [%2d] %-17.17s %-15.15s ",
3114 SECTION_NAME (section),
3115 get_section_type_name (section->sh_type));
3119 print_vma (section->sh_addr, LONG_HEX);
3121 printf ( " %6.6lx %6.6lx %2.2lx",
3122 (unsigned long) section->sh_offset,
3123 (unsigned long) section->sh_size,
3124 (unsigned long) section->sh_entsize);
3126 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3128 printf ("%2ld %3lx %2ld\n",
3129 (unsigned long) section->sh_link,
3130 (unsigned long) section->sh_info,
3131 (unsigned long) section->sh_addralign);
3135 print_vma (section->sh_addr, LONG_HEX);
3137 if ((long) section->sh_offset == section->sh_offset)
3138 printf (" %6.6lx", (unsigned long) section->sh_offset);
3142 print_vma (section->sh_offset, LONG_HEX);
3145 if ((unsigned long) section->sh_size == section->sh_size)
3146 printf (" %6.6lx", (unsigned long) section->sh_size);
3150 print_vma (section->sh_size, LONG_HEX);
3153 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3154 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3158 print_vma (section->sh_entsize, LONG_HEX);
3161 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3163 printf ("%2ld %3lx ",
3164 (unsigned long) section->sh_link,
3165 (unsigned long) section->sh_info);
3167 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3168 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3171 print_vma (section->sh_addralign, DEC);
3178 print_vma (section->sh_addr, LONG_HEX);
3179 if ((long) section->sh_offset == section->sh_offset)
3180 printf (" %8.8lx", (unsigned long) section->sh_offset);
3184 print_vma (section->sh_offset, LONG_HEX);
3187 print_vma (section->sh_size, LONG_HEX);
3189 print_vma (section->sh_entsize, LONG_HEX);
3191 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3193 printf (" %2ld %3lx %ld\n",
3194 (unsigned long) section->sh_link,
3195 (unsigned long) section->sh_info,
3196 (unsigned long) section->sh_addralign);
3200 printf (_("Key to Flags:\n\
3201 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3202 I (info), L (link order), G (group), x (unknown)\n\
3203 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3208 /* Process the reloc section. */
3210 process_relocs (file)
3213 unsigned long rel_size;
3214 unsigned long rel_offset;
3220 if (do_using_dynamic)
3222 int is_rela = FALSE;
3227 if (dynamic_info[DT_REL])
3229 rel_offset = dynamic_info[DT_REL];
3230 rel_size = dynamic_info[DT_RELSZ];
3233 else if (dynamic_info [DT_RELA])
3235 rel_offset = dynamic_info[DT_RELA];
3236 rel_size = dynamic_info[DT_RELASZ];
3239 else if (dynamic_info[DT_JMPREL])
3241 rel_offset = dynamic_info[DT_JMPREL];
3242 rel_size = dynamic_info[DT_PLTRELSZ];
3244 switch (dynamic_info[DT_PLTREL])
3261 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3262 rel_offset, rel_size);
3264 dump_relocations (file, rel_offset - loadaddr, rel_size,
3265 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3268 printf (_("\nThere are no dynamic relocations in this file.\n"));
3272 Elf32_Internal_Shdr * section;
3276 for (i = 0, section = section_headers;
3277 i < elf_header.e_shnum;
3280 if ( section->sh_type != SHT_RELA
3281 && section->sh_type != SHT_REL)
3284 rel_offset = section->sh_offset;
3285 rel_size = section->sh_size;
3289 Elf32_Internal_Shdr * strsec;
3290 Elf_Internal_Sym * symtab;
3293 unsigned long nsyms;
3295 printf (_("\nRelocation section "));
3297 if (string_table == NULL)
3298 printf ("%d", section->sh_name);
3300 printf ("'%s'", SECTION_NAME (section));
3302 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3303 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3308 if (section->sh_link)
3310 Elf32_Internal_Shdr * symsec;
3312 symsec = section_headers + section->sh_link;
3313 nsyms = symsec->sh_size / symsec->sh_entsize;
3314 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
3319 strsec = section_headers + symsec->sh_link;
3321 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3325 is_rela = section->sh_type == SHT_RELA;
3327 dump_relocations (file, rel_offset, rel_size,
3328 symtab, nsyms, strtab, is_rela);
3340 printf (_("\nThere are no relocations in this file.\n"));
3346 #include "unwind-ia64.h"
3348 /* An absolute address consists of a section and an offset. If the
3349 section is NULL, the offset itself is the address, otherwise, the
3350 address equals to LOAD_ADDRESS(section) + offset. */
3354 unsigned short section;
3360 struct unw_table_entry
3362 struct absaddr start;
3364 struct absaddr info;
3366 *table; /* Unwind table. */
3367 unsigned long table_len; /* Length of unwind table. */
3368 unsigned char * info; /* Unwind info. */
3369 unsigned long info_size; /* Size of unwind info. */
3370 bfd_vma info_addr; /* starting address of unwind info. */
3371 bfd_vma seg_base; /* Starting address of segment. */
3372 Elf_Internal_Sym * symtab; /* The symbol table. */
3373 unsigned long nsyms; /* Number of symbols. */
3374 char * strtab; /* The string table. */
3375 unsigned long strtab_size; /* Size of string table. */
3378 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3379 struct absaddr, const char **,
3381 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3382 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3383 Elf32_Internal_Shdr *));
3386 find_symbol_for_address (aux, addr, symname, offset)
3387 struct unw_aux_info *aux;
3388 struct absaddr addr;
3389 const char **symname;
3392 bfd_vma dist = (bfd_vma) 0x100000;
3393 Elf_Internal_Sym *sym, *best = NULL;
3396 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3398 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3399 && sym->st_name != 0
3400 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3401 && addr.offset >= sym->st_value
3402 && addr.offset - sym->st_value < dist)
3405 dist = addr.offset - sym->st_value;
3412 *symname = (best->st_name >= aux->strtab_size
3413 ? "<corrupt>" : aux->strtab + best->st_name);
3418 *offset = addr.offset;
3422 dump_ia64_unwind (aux)
3423 struct unw_aux_info *aux;
3426 struct unw_table_entry * tp;
3429 addr_size = is_32bit_elf ? 4 : 8;
3431 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3435 const unsigned char * dp;
3436 const unsigned char * head;
3437 const char * procname;
3439 find_symbol_for_address (aux, tp->start, &procname, &offset);
3441 fputs ("\n<", stdout);
3445 fputs (procname, stdout);
3448 printf ("+%lx", (unsigned long) offset);
3451 fputs (">: [", stdout);
3452 print_vma (tp->start.offset, PREFIX_HEX);
3453 fputc ('-', stdout);
3454 print_vma (tp->end.offset, PREFIX_HEX);
3455 printf ("), info at +0x%lx\n",
3456 (unsigned long) (tp->info.offset - aux->seg_base));
3458 head = aux->info + (tp->info.offset - aux->info_addr);
3459 stamp = BYTE_GET8 ((unsigned char *) head);
3461 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3462 (unsigned) UNW_VER (stamp),
3463 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3464 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3465 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3466 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3468 if (UNW_VER (stamp) != 1)
3470 printf ("\tUnknown version.\n");
3475 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3476 dp = unw_decode (dp, in_body, & in_body);
3481 slurp_ia64_unwind_table (file, aux, sec)
3483 struct unw_aux_info *aux;
3484 Elf32_Internal_Shdr *sec;
3486 unsigned long size, addr_size, nrelas, i;
3487 Elf_Internal_Phdr *prog_hdrs, *seg;
3488 struct unw_table_entry *tep;
3489 Elf32_Internal_Shdr *relsec;
3490 Elf_Internal_Rela *rela, *rp;
3491 unsigned char *table, *tp;
3492 Elf_Internal_Sym *sym;
3493 const char *relname;
3496 addr_size = is_32bit_elf ? 4 : 8;
3498 /* First, find the starting address of the segment that includes
3501 if (elf_header.e_phnum)
3503 prog_hdrs = (Elf_Internal_Phdr *)
3504 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3507 result = get_32bit_program_headers (file, prog_hdrs);
3509 result = get_64bit_program_headers (file, prog_hdrs);
3517 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3519 if (seg->p_type != PT_LOAD)
3522 if (sec->sh_addr >= seg->p_vaddr
3523 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3525 aux->seg_base = seg->p_vaddr;
3533 /* Second, build the unwind table from the contents of the unwind section: */
3534 size = sec->sh_size;
3535 table = (char *) get_data (NULL, file, sec->sh_offset,
3536 size, _("unwind table"));
3540 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3541 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3543 tep->start.section = SHN_UNDEF;
3544 tep->end.section = SHN_UNDEF;
3545 tep->info.section = SHN_UNDEF;
3548 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3549 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3550 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3554 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3555 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3556 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3558 tep->start.offset += aux->seg_base;
3559 tep->end.offset += aux->seg_base;
3560 tep->info.offset += aux->seg_base;
3564 /* Third, apply any relocations to the unwind table: */
3566 for (relsec = section_headers;
3567 relsec < section_headers + elf_header.e_shnum;
3570 if (relsec->sh_type != SHT_RELA
3571 || section_headers + relsec->sh_info != sec)
3574 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3578 for (rp = rela; rp < rela + nrelas; ++rp)
3582 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3583 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3585 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3587 warn (_("Skipping unexpected symbol type %u\n"),
3588 ELF32_ST_TYPE (sym->st_info));
3594 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3595 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3597 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3599 warn (_("Skipping unexpected symbol type %u\n"),
3600 ELF64_ST_TYPE (sym->st_info));
3605 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3607 warn (_("Skipping unexpected relocation type %s\n"), relname);
3611 i = rp->r_offset / (3 * addr_size);
3613 switch (rp->r_offset/addr_size % 3)
3616 aux->table[i].start.section = sym->st_shndx;
3617 aux->table[i].start.offset += rp->r_addend;
3620 aux->table[i].end.section = sym->st_shndx;
3621 aux->table[i].end.offset += rp->r_addend;
3624 aux->table[i].info.section = sym->st_shndx;
3625 aux->table[i].info.offset += rp->r_addend;
3635 aux->table_len = size / (3 * addr_size);
3640 process_unwind (file)
3643 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3644 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3645 struct unw_aux_info aux;
3650 if (elf_header.e_machine != EM_IA_64)
3652 printf (_("\nThere are no unwind sections in this file.\n"));
3656 memset (& aux, 0, sizeof (aux));
3658 addr_size = is_32bit_elf ? 4 : 8;
3660 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3662 if (sec->sh_type == SHT_SYMTAB)
3664 aux.nsyms = sec->sh_size / sec->sh_entsize;
3665 aux.symtab = GET_ELF_SYMBOLS (file, sec->sh_offset, aux.nsyms);
3667 strsec = section_headers + sec->sh_link;
3668 aux.strtab_size = strsec->sh_size;
3669 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3670 aux.strtab_size, _("string table"));
3672 else if (sec->sh_type == SHT_IA_64_UNWIND)
3677 printf (_("\nThere are no unwind sections in this file.\n"));
3679 while (unwcount-- > 0)
3684 for (i = unwstart, sec = section_headers + unwstart;
3685 i < elf_header.e_shnum; ++i, ++sec)
3686 if (sec->sh_type == SHT_IA_64_UNWIND)
3693 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3695 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3698 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3699 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3700 suffix = SECTION_NAME (unwsec) + len;
3701 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3703 if (strncmp (SECTION_NAME (sec),
3704 ELF_STRING_ia64_unwind_info_once, len2) == 0
3705 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3710 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3711 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3712 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3713 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3715 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3717 suffix = SECTION_NAME (unwsec) + len;
3718 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3720 if (strncmp (SECTION_NAME (sec),
3721 ELF_STRING_ia64_unwind_info, len2) == 0
3722 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3726 if (i == elf_header.e_shnum)
3728 printf (_("\nCould not find unwind info section for "));
3730 if (string_table == NULL)
3731 printf ("%d", unwsec->sh_name);
3733 printf ("'%s'", SECTION_NAME (unwsec));
3737 aux.info_size = sec->sh_size;
3738 aux.info_addr = sec->sh_addr;
3739 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3740 aux.info_size, _("unwind info"));
3742 printf (_("\nUnwind section "));
3744 if (string_table == NULL)
3745 printf ("%d", unwsec->sh_name);
3747 printf ("'%s'", SECTION_NAME (unwsec));
3749 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3750 (unsigned long) unwsec->sh_offset,
3751 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3753 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3755 if (aux.table_len > 0)
3756 dump_ia64_unwind (& aux);
3759 free ((char *) aux.table);
3761 free ((char *) aux.info);
3770 free ((char *) aux.strtab);
3776 dynamic_segment_mips_val (entry)
3777 Elf_Internal_Dyn * entry;
3779 switch (entry->d_tag)
3782 if (entry->d_un.d_val == 0)
3786 static const char * opts[] =
3788 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3789 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3790 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3791 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3796 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3797 if (entry->d_un.d_val & (1 << cnt))
3799 printf ("%s%s", first ? "" : " ", opts[cnt]);
3806 case DT_MIPS_IVERSION:
3807 if (dynamic_strings != NULL)
3808 printf ("Interface Version: %s\n",
3809 dynamic_strings + entry->d_un.d_val);
3811 printf ("%ld\n", (long) entry->d_un.d_ptr);
3814 case DT_MIPS_TIME_STAMP:
3819 time_t time = entry->d_un.d_val;
3820 tmp = gmtime (&time);
3821 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3822 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3823 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3824 printf ("Time Stamp: %s\n", timebuf);
3828 case DT_MIPS_RLD_VERSION:
3829 case DT_MIPS_LOCAL_GOTNO:
3830 case DT_MIPS_CONFLICTNO:
3831 case DT_MIPS_LIBLISTNO:
3832 case DT_MIPS_SYMTABNO:
3833 case DT_MIPS_UNREFEXTNO:
3834 case DT_MIPS_HIPAGENO:
3835 case DT_MIPS_DELTA_CLASS_NO:
3836 case DT_MIPS_DELTA_INSTANCE_NO:
3837 case DT_MIPS_DELTA_RELOC_NO:
3838 case DT_MIPS_DELTA_SYM_NO:
3839 case DT_MIPS_DELTA_CLASSSYM_NO:
3840 case DT_MIPS_COMPACT_SIZE:
3841 printf ("%ld\n", (long) entry->d_un.d_ptr);
3845 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3851 dynamic_segment_parisc_val (entry)
3852 Elf_Internal_Dyn * entry;
3854 switch (entry->d_tag)
3856 case DT_HP_DLD_FLAGS:
3865 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3866 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3867 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3868 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3869 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3870 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3871 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3872 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3873 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3874 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3875 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3879 bfd_vma val = entry->d_un.d_val;
3881 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3882 if (val & flags[cnt].bit)
3886 fputs (flags[cnt].str, stdout);
3888 val ^= flags[cnt].bit;
3891 if (val != 0 || first)
3895 print_vma (val, HEX);
3901 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3907 get_32bit_dynamic_segment (file)
3910 Elf32_External_Dyn * edyn;
3911 Elf_Internal_Dyn * entry;
3914 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
3915 dynamic_size, _("dynamic segment"));
3919 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3920 how large this .dynamic is now. We can do this even before the byte
3921 swapping since the DT_NULL tag is recognizable. */
3923 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3926 dynamic_segment = (Elf_Internal_Dyn *)
3927 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3929 if (dynamic_segment == NULL)
3931 error (_("Out of memory\n"));
3936 for (i = 0, entry = dynamic_segment;
3940 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3941 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3950 get_64bit_dynamic_segment (file)
3953 Elf64_External_Dyn * edyn;
3954 Elf_Internal_Dyn * entry;
3957 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
3958 dynamic_size, _("dynamic segment"));
3962 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3963 how large this .dynamic is now. We can do this even before the byte
3964 swapping since the DT_NULL tag is recognizable. */
3966 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3969 dynamic_segment = (Elf_Internal_Dyn *)
3970 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3972 if (dynamic_segment == NULL)
3974 error (_("Out of memory\n"));
3979 for (i = 0, entry = dynamic_segment;
3983 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3984 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3993 get_dynamic_flags (flags)
3996 static char buff [64];
4001 flag = flags & - flags;
4006 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
4007 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
4008 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
4009 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
4010 default: strcat (buff, "unknown "); break;
4016 /* Parse and display the contents of the dynamic segment. */
4018 process_dynamic_segment (file)
4021 Elf_Internal_Dyn * entry;
4024 if (dynamic_size == 0)
4027 printf (_("\nThere is no dynamic segment in this file.\n"));
4034 if (! get_32bit_dynamic_segment (file))
4037 else if (! get_64bit_dynamic_segment (file))
4040 /* Find the appropriate symbol table. */
4041 if (dynamic_symbols == NULL)
4043 for (i = 0, entry = dynamic_segment;
4047 unsigned long offset;
4049 if (entry->d_tag != DT_SYMTAB)
4052 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4054 /* Since we do not know how big the symbol table is,
4055 we default to reading in the entire file (!) and
4056 processing that. This is overkill, I know, but it
4058 offset = entry->d_un.d_val - loadaddr;
4060 if (fseek (file, 0, SEEK_END))
4061 error (_("Unable to seek to end of file!"));
4064 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
4066 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
4068 if (num_dynamic_syms < 1)
4070 error (_("Unable to determine the number of symbols to load\n"));
4074 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
4078 /* Similarly find a string table. */
4079 if (dynamic_strings == NULL)
4081 for (i = 0, entry = dynamic_segment;
4085 unsigned long offset;
4088 if (entry->d_tag != DT_STRTAB)
4091 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4093 /* Since we do not know how big the string table is,
4094 we default to reading in the entire file (!) and
4095 processing that. This is overkill, I know, but it
4098 offset = entry->d_un.d_val - loadaddr;
4099 if (fseek (file, 0, SEEK_END))
4100 error (_("Unable to seek to end of file\n"));
4101 str_tab_len = ftell (file) - offset;
4103 if (str_tab_len < 1)
4106 (_("Unable to determine the length of the dynamic string table\n"));
4110 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4111 _("dynamic string table"));
4116 /* And find the syminfo section if available. */
4117 if (dynamic_syminfo == NULL)
4119 unsigned int syminsz = 0;
4121 for (i = 0, entry = dynamic_segment;
4125 if (entry->d_tag == DT_SYMINENT)
4127 /* Note: these braces are necessary to avoid a syntax
4128 error from the SunOS4 C compiler. */
4129 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4131 else if (entry->d_tag == DT_SYMINSZ)
4132 syminsz = entry->d_un.d_val;
4133 else if (entry->d_tag == DT_SYMINFO)
4134 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4137 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4139 Elf_External_Syminfo * extsyminfo;
4140 Elf_Internal_Syminfo * syminfo;
4142 /* There is a syminfo section. Read the data. */
4143 extsyminfo = ((Elf_External_Syminfo *)
4144 get_data (NULL, file, dynamic_syminfo_offset,
4145 syminsz, _("symbol information")));
4149 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4150 if (dynamic_syminfo == NULL)
4152 error (_("Out of memory\n"));
4156 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4157 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4160 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4161 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4168 if (do_dynamic && dynamic_addr)
4169 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4170 dynamic_addr, (long) dynamic_size);
4172 printf (_(" Tag Type Name/Value\n"));
4174 for (i = 0, entry = dynamic_segment;
4183 print_vma (entry->d_tag, FULL_HEX);
4184 dtype = get_dynamic_type (entry->d_tag);
4185 printf (" (%s)%*s", dtype,
4186 ((is_32bit_elf ? 27 : 19)
4187 - (int) strlen (dtype)),
4191 switch (entry->d_tag)
4195 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4205 switch (entry->d_tag)
4208 printf (_("Auxiliary library"));
4212 printf (_("Filter library"));
4216 printf (_("Configuration file"));
4220 printf (_("Dependency audit library"));
4224 printf (_("Audit library"));
4228 if (dynamic_strings)
4229 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4233 print_vma (entry->d_un.d_val, PREFIX_HEX);
4242 printf (_("Flags:"));
4243 if (entry->d_un.d_val == 0)
4244 printf (_(" None\n"));
4247 unsigned long int val = entry->d_un.d_val;
4248 if (val & DTF_1_PARINIT)
4250 printf (" PARINIT");
4251 val ^= DTF_1_PARINIT;
4253 if (val & DTF_1_CONFEXP)
4255 printf (" CONFEXP");
4256 val ^= DTF_1_CONFEXP;
4259 printf (" %lx", val);
4268 printf (_("Flags:"));
4269 if (entry->d_un.d_val == 0)
4270 printf (_(" None\n"));
4273 unsigned long int val = entry->d_un.d_val;
4274 if (val & DF_P1_LAZYLOAD)
4276 printf (" LAZYLOAD");
4277 val ^= DF_P1_LAZYLOAD;
4279 if (val & DF_P1_GROUPPERM)
4281 printf (" GROUPPERM");
4282 val ^= DF_P1_GROUPPERM;
4285 printf (" %lx", val);
4294 printf (_("Flags:"));
4295 if (entry->d_un.d_val == 0)
4296 printf (_(" None\n"));
4299 unsigned long int val = entry->d_un.d_val;
4305 if (val & DF_1_GLOBAL)
4310 if (val & DF_1_GROUP)
4315 if (val & DF_1_NODELETE)
4317 printf (" NODELETE");
4318 val ^= DF_1_NODELETE;
4320 if (val & DF_1_LOADFLTR)
4322 printf (" LOADFLTR");
4323 val ^= DF_1_LOADFLTR;
4325 if (val & DF_1_INITFIRST)
4327 printf (" INITFIRST");
4328 val ^= DF_1_INITFIRST;
4330 if (val & DF_1_NOOPEN)
4335 if (val & DF_1_ORIGIN)
4340 if (val & DF_1_DIRECT)
4345 if (val & DF_1_TRANS)
4350 if (val & DF_1_INTERPOSE)
4352 printf (" INTERPOSE");
4353 val ^= DF_1_INTERPOSE;
4355 if (val & DF_1_NODEFLIB)
4357 printf (" NODEFLIB");
4358 val ^= DF_1_NODEFLIB;
4360 if (val & DF_1_NODUMP)
4365 if (val & DF_1_CONLFAT)
4367 printf (" CONLFAT");
4368 val ^= DF_1_CONLFAT;
4371 printf (" %lx", val);
4379 puts (get_dynamic_type (entry->d_un.d_val));
4399 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4405 if (dynamic_strings == NULL)
4408 name = dynamic_strings + entry->d_un.d_val;
4412 switch (entry->d_tag)
4415 printf (_("Shared library: [%s]"), name);
4417 if (strcmp (name, program_interpreter) == 0)
4418 printf (_(" program interpreter"));
4422 printf (_("Library soname: [%s]"), name);
4426 printf (_("Library rpath: [%s]"), name);
4430 printf (_("Library runpath: [%s]"), name);
4434 print_vma (entry->d_un.d_val, PREFIX_HEX);
4439 print_vma (entry->d_un.d_val, PREFIX_HEX);
4455 case DT_INIT_ARRAYSZ:
4456 case DT_FINI_ARRAYSZ:
4459 print_vma (entry->d_un.d_val, UNSIGNED);
4460 printf (" (bytes)\n");
4470 print_vma (entry->d_un.d_val, UNSIGNED);
4483 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4487 name = dynamic_strings + entry->d_un.d_val;
4491 printf (_("Not needed object: [%s]\n"), name);
4496 print_vma (entry->d_un.d_val, PREFIX_HEX);
4502 /* The value of this entry is ignored. */
4506 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4507 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4512 switch (elf_header.e_machine)
4515 case EM_MIPS_RS3_LE:
4516 dynamic_segment_mips_val (entry);
4519 dynamic_segment_parisc_val (entry);
4522 print_vma (entry->d_un.d_val, PREFIX_HEX);
4534 get_ver_flags (flags)
4537 static char buff [32];
4544 if (flags & VER_FLG_BASE)
4545 strcat (buff, "BASE ");
4547 if (flags & VER_FLG_WEAK)
4549 if (flags & VER_FLG_BASE)
4550 strcat (buff, "| ");
4552 strcat (buff, "WEAK ");
4555 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4556 strcat (buff, "| <unknown>");
4561 /* Display the contents of the version sections. */
4563 process_version_sections (file)
4566 Elf32_Internal_Shdr * section;
4573 for (i = 0, section = section_headers;
4574 i < elf_header.e_shnum;
4577 switch (section->sh_type)
4579 case SHT_GNU_verdef:
4581 Elf_External_Verdef * edefs;
4588 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4589 SECTION_NAME (section), section->sh_info);
4591 printf (_(" Addr: 0x"));
4592 printf_vma (section->sh_addr);
4593 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4594 (unsigned long) section->sh_offset, section->sh_link,
4595 SECTION_NAME (section_headers + section->sh_link));
4597 edefs = ((Elf_External_Verdef *)
4598 get_data (NULL, file, section->sh_offset,
4600 _("version definition section")));
4604 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4607 Elf_External_Verdef * edef;
4608 Elf_Internal_Verdef ent;
4609 Elf_External_Verdaux * eaux;
4610 Elf_Internal_Verdaux aux;
4614 vstart = ((char *) edefs) + idx;
4616 edef = (Elf_External_Verdef *) vstart;
4618 ent.vd_version = BYTE_GET (edef->vd_version);
4619 ent.vd_flags = BYTE_GET (edef->vd_flags);
4620 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4621 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4622 ent.vd_hash = BYTE_GET (edef->vd_hash);
4623 ent.vd_aux = BYTE_GET (edef->vd_aux);
4624 ent.vd_next = BYTE_GET (edef->vd_next);
4626 printf (_(" %#06x: Rev: %d Flags: %s"),
4627 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4629 printf (_(" Index: %d Cnt: %d "),
4630 ent.vd_ndx, ent.vd_cnt);
4632 vstart += ent.vd_aux;
4634 eaux = (Elf_External_Verdaux *) vstart;
4636 aux.vda_name = BYTE_GET (eaux->vda_name);
4637 aux.vda_next = BYTE_GET (eaux->vda_next);
4639 if (dynamic_strings)
4640 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4642 printf (_("Name index: %ld\n"), aux.vda_name);
4644 isum = idx + ent.vd_aux;
4646 for (j = 1; j < ent.vd_cnt; j ++)
4648 isum += aux.vda_next;
4649 vstart += aux.vda_next;
4651 eaux = (Elf_External_Verdaux *) vstart;
4653 aux.vda_name = BYTE_GET (eaux->vda_name);
4654 aux.vda_next = BYTE_GET (eaux->vda_next);
4656 if (dynamic_strings)
4657 printf (_(" %#06x: Parent %d: %s\n"),
4658 isum, j, dynamic_strings + aux.vda_name);
4660 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4661 isum, j, aux.vda_name);
4671 case SHT_GNU_verneed:
4673 Elf_External_Verneed * eneed;
4679 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4680 SECTION_NAME (section), section->sh_info);
4682 printf (_(" Addr: 0x"));
4683 printf_vma (section->sh_addr);
4684 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4685 (unsigned long) section->sh_offset, section->sh_link,
4686 SECTION_NAME (section_headers + section->sh_link));
4688 eneed = ((Elf_External_Verneed *)
4689 get_data (NULL, file, section->sh_offset,
4690 section->sh_size, _("version need section")));
4694 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4696 Elf_External_Verneed * entry;
4697 Elf_Internal_Verneed ent;
4702 vstart = ((char *) eneed) + idx;
4704 entry = (Elf_External_Verneed *) vstart;
4706 ent.vn_version = BYTE_GET (entry->vn_version);
4707 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4708 ent.vn_file = BYTE_GET (entry->vn_file);
4709 ent.vn_aux = BYTE_GET (entry->vn_aux);
4710 ent.vn_next = BYTE_GET (entry->vn_next);
4712 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4714 if (dynamic_strings)
4715 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4717 printf (_(" File: %lx"), ent.vn_file);
4719 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4721 vstart += ent.vn_aux;
4723 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4725 Elf_External_Vernaux * eaux;
4726 Elf_Internal_Vernaux aux;
4728 eaux = (Elf_External_Vernaux *) vstart;
4730 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4731 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4732 aux.vna_other = BYTE_GET (eaux->vna_other);
4733 aux.vna_name = BYTE_GET (eaux->vna_name);
4734 aux.vna_next = BYTE_GET (eaux->vna_next);
4736 if (dynamic_strings)
4737 printf (_(" %#06x: Name: %s"),
4738 isum, dynamic_strings + aux.vna_name);
4740 printf (_(" %#06x: Name index: %lx"),
4741 isum, aux.vna_name);
4743 printf (_(" Flags: %s Version: %d\n"),
4744 get_ver_flags (aux.vna_flags), aux.vna_other);
4746 isum += aux.vna_next;
4747 vstart += aux.vna_next;
4757 case SHT_GNU_versym:
4759 Elf32_Internal_Shdr * link_section;
4762 unsigned char * edata;
4763 unsigned short * data;
4765 Elf_Internal_Sym * symbols;
4766 Elf32_Internal_Shdr * string_sec;
4768 link_section = section_headers + section->sh_link;
4769 total = section->sh_size / section->sh_entsize;
4773 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
4774 link_section->sh_size / link_section->sh_entsize);
4776 string_sec = section_headers + link_section->sh_link;
4778 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4779 string_sec->sh_size,
4780 _("version string table"));
4784 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4785 SECTION_NAME (section), total);
4787 printf (_(" Addr: "));
4788 printf_vma (section->sh_addr);
4789 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4790 (unsigned long) section->sh_offset, section->sh_link,
4791 SECTION_NAME (link_section));
4795 get_data (NULL, file,
4796 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4797 total * sizeof (short), _("version symbol data")));
4804 data = (unsigned short *) malloc (total * sizeof (short));
4806 for (cnt = total; cnt --;)
4807 data [cnt] = byte_get (edata + cnt * sizeof (short),
4812 for (cnt = 0; cnt < total; cnt += 4)
4815 int check_def, check_need;
4818 printf (" %03x:", cnt);
4820 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4821 switch (data [cnt + j])
4824 fputs (_(" 0 (*local*) "), stdout);
4828 fputs (_(" 1 (*global*) "), stdout);
4832 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4833 data [cnt + j] & 0x8000 ? 'h' : ' ');
4837 if (symbols [cnt + j].st_shndx >= SHN_LORESERVE
4838 || section_headers[symbols [cnt + j].st_shndx].sh_type
4841 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4848 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4850 Elf_Internal_Verneed ivn;
4851 unsigned long offset;
4853 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4858 Elf_Internal_Vernaux ivna;
4859 Elf_External_Verneed evn;
4860 Elf_External_Vernaux evna;
4861 unsigned long a_off;
4863 get_data (&evn, file, offset, sizeof (evn),
4866 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4867 ivn.vn_next = BYTE_GET (evn.vn_next);
4869 a_off = offset + ivn.vn_aux;
4873 get_data (&evna, file, a_off, sizeof (evna),
4874 _("version need aux (2)"));
4876 ivna.vna_next = BYTE_GET (evna.vna_next);
4877 ivna.vna_other = BYTE_GET (evna.vna_other);
4879 a_off += ivna.vna_next;
4881 while (ivna.vna_other != data [cnt + j]
4882 && ivna.vna_next != 0);
4884 if (ivna.vna_other == data [cnt + j])
4886 ivna.vna_name = BYTE_GET (evna.vna_name);
4888 name = strtab + ivna.vna_name;
4889 nn += printf ("(%s%-*s",
4891 12 - (int) strlen (name),
4897 offset += ivn.vn_next;
4899 while (ivn.vn_next);
4902 if (check_def && data [cnt + j] != 0x8001
4903 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4905 Elf_Internal_Verdef ivd;
4906 Elf_External_Verdef evd;
4907 unsigned long offset;
4909 offset = version_info
4910 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4914 get_data (&evd, file, offset, sizeof (evd),
4917 ivd.vd_next = BYTE_GET (evd.vd_next);
4918 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4920 offset += ivd.vd_next;
4922 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4923 && ivd.vd_next != 0);
4925 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4927 Elf_External_Verdaux evda;
4928 Elf_Internal_Verdaux ivda;
4930 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4932 get_data (&evda, file,
4933 offset - ivd.vd_next + ivd.vd_aux,
4934 sizeof (evda), _("version def aux"));
4936 ivda.vda_name = BYTE_GET (evda.vda_name);
4938 name = strtab + ivda.vda_name;
4939 nn += printf ("(%s%-*s",
4941 12 - (int) strlen (name),
4947 printf ("%*c", 18 - nn, ' ');
4965 printf (_("\nNo version information found in this file.\n"));
4971 get_symbol_binding (binding)
4972 unsigned int binding;
4974 static char buff [32];
4978 case STB_LOCAL: return "LOCAL";
4979 case STB_GLOBAL: return "GLOBAL";
4980 case STB_WEAK: return "WEAK";
4982 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4983 sprintf (buff, _("<processor specific>: %d"), binding);
4984 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4985 sprintf (buff, _("<OS specific>: %d"), binding);
4987 sprintf (buff, _("<unknown>: %d"), binding);
4993 get_symbol_type (type)
4996 static char buff [32];
5000 case STT_NOTYPE: return "NOTYPE";
5001 case STT_OBJECT: return "OBJECT";
5002 case STT_FUNC: return "FUNC";
5003 case STT_SECTION: return "SECTION";
5004 case STT_FILE: return "FILE";
5005 case STT_COMMON: return "COMMON";
5007 if (type >= STT_LOPROC && type <= STT_HIPROC)
5009 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5010 return "THUMB_FUNC";
5012 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5015 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5016 return "PARISC_MILLI";
5018 sprintf (buff, _("<processor specific>: %d"), type);
5020 else if (type >= STT_LOOS && type <= STT_HIOS)
5022 if (elf_header.e_machine == EM_PARISC)
5024 if (type == STT_HP_OPAQUE)
5026 if (type == STT_HP_STUB)
5030 sprintf (buff, _("<OS specific>: %d"), type);
5033 sprintf (buff, _("<unknown>: %d"), type);
5039 get_symbol_visibility (visibility)
5040 unsigned int visibility;
5044 case STV_DEFAULT: return "DEFAULT";
5045 case STV_INTERNAL: return "INTERNAL";
5046 case STV_HIDDEN: return "HIDDEN";
5047 case STV_PROTECTED: return "PROTECTED";
5053 get_symbol_index_type (type)
5058 case SHN_UNDEF: return "UND";
5059 case SHN_ABS: return "ABS";
5060 case SHN_COMMON: return "COM";
5062 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5064 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5066 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5070 static char buff [32];
5072 sprintf (buff, "%3d", type);
5079 get_dynamic_data (file, number)
5081 unsigned int number;
5083 unsigned char * e_data;
5086 e_data = (unsigned char *) malloc (number * 4);
5090 error (_("Out of memory\n"));
5094 if (fread (e_data, 4, number, file) != number)
5096 error (_("Unable to read in dynamic data\n"));
5100 i_data = (int *) malloc (number * sizeof (* i_data));
5104 error (_("Out of memory\n"));
5110 i_data [number] = byte_get (e_data + number * 4, 4);
5117 /* Dump the symbol table. */
5119 process_symbol_table (file)
5122 Elf32_Internal_Shdr * section;
5123 unsigned char nb [4];
5124 unsigned char nc [4];
5127 int * buckets = NULL;
5128 int * chains = NULL;
5130 if (! do_syms && !do_histogram)
5133 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5136 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5138 error (_("Unable to seek to start of dynamic information"));
5142 if (fread (nb, sizeof (nb), 1, file) != 1)
5144 error (_("Failed to read in number of buckets\n"));
5148 if (fread (nc, sizeof (nc), 1, file) != 1)
5150 error (_("Failed to read in number of chains\n"));
5154 nbuckets = byte_get (nb, 4);
5155 nchains = byte_get (nc, 4);
5157 buckets = get_dynamic_data (file, nbuckets);
5158 chains = get_dynamic_data (file, nchains);
5160 if (buckets == NULL || chains == NULL)
5165 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5170 printf (_("\nSymbol table for image:\n"));
5172 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5174 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5176 for (hn = 0; hn < nbuckets; hn++)
5181 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5183 Elf_Internal_Sym * psym;
5185 psym = dynamic_symbols + si;
5187 printf (" %3d %3d: ", si, hn);
5188 print_vma (psym->st_value, LONG_HEX);
5190 print_vma (psym->st_size, DEC_5);
5192 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5193 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5194 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5195 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
5196 printf (" %s\n", dynamic_strings + psym->st_name);
5200 else if (do_syms && !do_using_dynamic)
5204 for (i = 0, section = section_headers;
5205 i < elf_header.e_shnum;
5210 Elf_Internal_Sym * symtab;
5211 Elf_Internal_Sym * psym;
5214 if ( section->sh_type != SHT_SYMTAB
5215 && section->sh_type != SHT_DYNSYM)
5218 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5219 SECTION_NAME (section),
5220 (unsigned long) (section->sh_size / section->sh_entsize));
5222 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5224 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5226 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
5227 section->sh_size / section->sh_entsize);
5231 if (section->sh_link == elf_header.e_shstrndx)
5232 strtab = string_table;
5235 Elf32_Internal_Shdr * string_sec;
5237 string_sec = section_headers + section->sh_link;
5239 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5240 string_sec->sh_size,
5244 for (si = 0, psym = symtab;
5245 si < section->sh_size / section->sh_entsize;
5248 printf ("%6d: ", si);
5249 print_vma (psym->st_value, LONG_HEX);
5251 print_vma (psym->st_size, DEC_5);
5252 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5253 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5254 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5255 printf (" %4s", get_symbol_index_type (psym->st_shndx));
5256 printf (" %s", strtab + psym->st_name);
5258 if (section->sh_type == SHT_DYNSYM &&
5259 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5261 unsigned char data[2];
5262 unsigned short vers_data;
5263 unsigned long offset;
5267 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5270 get_data (&data, file, offset + si * sizeof (vers_data),
5271 sizeof (data), _("version data"));
5273 vers_data = byte_get (data, 2);
5275 is_nobits = psym->st_shndx < SHN_LORESERVE ?
5276 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
5279 check_def = (psym->st_shndx != SHN_UNDEF);
5281 if ((vers_data & 0x8000) || vers_data > 1)
5283 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5284 && (is_nobits || ! check_def))
5286 Elf_External_Verneed evn;
5287 Elf_Internal_Verneed ivn;
5288 Elf_Internal_Vernaux ivna;
5290 /* We must test both. */
5291 offset = version_info
5292 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5296 unsigned long vna_off;
5298 get_data (&evn, file, offset, sizeof (evn),
5301 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5302 ivn.vn_next = BYTE_GET (evn.vn_next);
5304 vna_off = offset + ivn.vn_aux;
5308 Elf_External_Vernaux evna;
5310 get_data (&evna, file, vna_off,
5312 _("version need aux (3)"));
5314 ivna.vna_other = BYTE_GET (evna.vna_other);
5315 ivna.vna_next = BYTE_GET (evna.vna_next);
5316 ivna.vna_name = BYTE_GET (evna.vna_name);
5318 vna_off += ivna.vna_next;
5320 while (ivna.vna_other != vers_data
5321 && ivna.vna_next != 0);
5323 if (ivna.vna_other == vers_data)
5326 offset += ivn.vn_next;
5328 while (ivn.vn_next != 0);
5330 if (ivna.vna_other == vers_data)
5333 strtab + ivna.vna_name, ivna.vna_other);
5336 else if (! is_nobits)
5337 error (_("bad dynamic symbol"));
5344 if (vers_data != 0x8001
5345 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5347 Elf_Internal_Verdef ivd;
5348 Elf_Internal_Verdaux ivda;
5349 Elf_External_Verdaux evda;
5350 unsigned long offset;
5353 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5358 Elf_External_Verdef evd;
5360 get_data (&evd, file, offset, sizeof (evd),
5363 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5364 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5365 ivd.vd_next = BYTE_GET (evd.vd_next);
5367 offset += ivd.vd_next;
5369 while (ivd.vd_ndx != (vers_data & 0x7fff)
5370 && ivd.vd_next != 0);
5372 offset -= ivd.vd_next;
5373 offset += ivd.vd_aux;
5375 get_data (&evda, file, offset, sizeof (evda),
5376 _("version def aux"));
5378 ivda.vda_name = BYTE_GET (evda.vda_name);
5380 if (psym->st_name != ivda.vda_name)
5381 printf ((vers_data & 0x8000)
5383 strtab + ivda.vda_name);
5393 if (strtab != string_table)
5399 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5401 if (do_histogram && buckets != NULL)
5408 int nzero_counts = 0;
5411 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5413 printf (_(" Length Number %% of total Coverage\n"));
5415 lengths = (int *) calloc (nbuckets, sizeof (int));
5416 if (lengths == NULL)
5418 error (_("Out of memory"));
5421 for (hn = 0; hn < nbuckets; ++hn)
5426 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5429 if (maxlength < ++lengths[hn])
5434 counts = (int *) calloc (maxlength + 1, sizeof (int));
5437 error (_("Out of memory"));
5441 for (hn = 0; hn < nbuckets; ++hn)
5442 ++ counts [lengths [hn]];
5446 printf (" 0 %-10d (%5.1f%%)\n",
5447 counts[0], (counts[0] * 100.0) / nbuckets);
5448 for (si = 1; si <= maxlength; ++si)
5450 nzero_counts += counts[si] * si;
5451 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5452 si, counts[si], (counts[si] * 100.0) / nbuckets,
5453 (nzero_counts * 100.0) / nsyms);
5461 if (buckets != NULL)
5471 process_syminfo (file)
5472 FILE * file ATTRIBUTE_UNUSED;
5476 if (dynamic_syminfo == NULL
5478 /* No syminfo, this is ok. */
5481 /* There better should be a dynamic symbol section. */
5482 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5486 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5487 dynamic_syminfo_offset, dynamic_syminfo_nent);
5489 printf (_(" Num: Name BoundTo Flags\n"));
5490 for (i = 0; i < dynamic_syminfo_nent; ++i)
5492 unsigned short int flags = dynamic_syminfo[i].si_flags;
5494 printf ("%4d: %-30s ", i,
5495 dynamic_strings + dynamic_symbols[i].st_name);
5497 switch (dynamic_syminfo[i].si_boundto)
5499 case SYMINFO_BT_SELF:
5500 fputs ("SELF ", stdout);
5502 case SYMINFO_BT_PARENT:
5503 fputs ("PARENT ", stdout);
5506 if (dynamic_syminfo[i].si_boundto > 0
5507 && dynamic_syminfo[i].si_boundto < dynamic_size)
5510 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5512 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5516 if (flags & SYMINFO_FLG_DIRECT)
5518 if (flags & SYMINFO_FLG_PASSTHRU)
5519 printf (" PASSTHRU");
5520 if (flags & SYMINFO_FLG_COPY)
5522 if (flags & SYMINFO_FLG_LAZYLOAD)
5523 printf (" LAZYLOAD");
5531 #ifdef SUPPORT_DISASSEMBLY
5533 disassemble_section (section, file)
5534 Elf32_Internal_Shdr * section;
5537 printf (_("\nAssembly dump of section %s\n"),
5538 SECTION_NAME (section));
5540 /* XXX -- to be done --- XXX */
5547 dump_section (section, file)
5548 Elf32_Internal_Shdr * section;
5551 bfd_size_type bytes;
5553 unsigned char * data;
5554 unsigned char * start;
5556 bytes = section->sh_size;
5560 printf (_("\nSection '%s' has no data to dump.\n"),
5561 SECTION_NAME (section));
5565 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5567 addr = section->sh_addr;
5569 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5582 lbytes = (bytes > 16 ? 16 : bytes);
5584 printf (" 0x%8.8lx ", (unsigned long) addr);
5586 switch (elf_header.e_ident [EI_DATA])
5590 for (j = 15; j >= 0; j --)
5593 printf ("%2.2x", data [j]);
5603 for (j = 0; j < 16; j++)
5606 printf ("%2.2x", data [j]);
5616 for (j = 0; j < lbytes; j++)
5619 if (k >= ' ' && k < 0x80)
5638 static unsigned long int
5639 read_leb128 (data, length_return, sign)
5640 unsigned char * data;
5641 int * length_return;
5644 unsigned long int result = 0;
5645 unsigned int num_read = 0;
5654 result |= (byte & 0x7f) << shift;
5659 while (byte & 0x80);
5661 if (length_return != NULL)
5662 * length_return = num_read;
5664 if (sign && (shift < 32) && (byte & 0x40))
5665 result |= -1 << shift;
5670 typedef struct State_Machine_Registers
5672 unsigned long address;
5675 unsigned int column;
5679 /* This variable hold the number of the last entry seen
5680 in the File Table. */
5681 unsigned int last_file_entry;
5684 static SMR state_machine_regs;
5687 reset_state_machine (is_stmt)
5690 state_machine_regs.address = 0;
5691 state_machine_regs.file = 1;
5692 state_machine_regs.line = 1;
5693 state_machine_regs.column = 0;
5694 state_machine_regs.is_stmt = is_stmt;
5695 state_machine_regs.basic_block = 0;
5696 state_machine_regs.end_sequence = 0;
5697 state_machine_regs.last_file_entry = 0;
5700 /* Handled an extend line op. Returns true if this is the end
5703 process_extended_line_op (data, is_stmt, pointer_size)
5704 unsigned char * data;
5708 unsigned char op_code;
5711 unsigned char * name;
5714 len = read_leb128 (data, & bytes_read, 0);
5719 warn (_("badly formed extended line op encountered!\n"));
5724 op_code = * data ++;
5726 printf (_(" Extended opcode %d: "), op_code);
5730 case DW_LNE_end_sequence:
5731 printf (_("End of Sequence\n\n"));
5732 reset_state_machine (is_stmt);
5735 case DW_LNE_set_address:
5736 adr = byte_get (data, pointer_size);
5737 printf (_("set Address to 0x%lx\n"), adr);
5738 state_machine_regs.address = adr;
5741 case DW_LNE_define_file:
5742 printf (_(" define new File Table entry\n"));
5743 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5745 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5747 data += strlen ((char *) data) + 1;
5748 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5750 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5752 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5753 printf (_("%s\n\n"), name);
5757 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5764 /* Size of pointers in the .debug_line section. This information is not
5765 really present in that section. It's obtained before dumping the debug
5766 sections by doing some pre-scan of the .debug_info section. */
5767 static int debug_line_pointer_size = 4;
5770 display_debug_lines (section, start, file)
5771 Elf32_Internal_Shdr * section;
5772 unsigned char * start;
5773 FILE * file ATTRIBUTE_UNUSED;
5775 DWARF2_External_LineInfo * external;
5776 DWARF2_Internal_LineInfo info;
5777 unsigned char * standard_opcodes;
5778 unsigned char * data = start;
5779 unsigned char * end = start + section->sh_size;
5780 unsigned char * end_of_sequence;
5783 printf (_("\nDump of debug contents of section %s:\n\n"),
5784 SECTION_NAME (section));
5788 external = (DWARF2_External_LineInfo *) data;
5790 /* Check the length of the block. */
5791 info.li_length = BYTE_GET (external->li_length);
5793 if (info.li_length == 0xffffffff)
5795 warn (_("64-bit DWARF line info is not supported yet.\n"));
5799 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5802 (_("The line info appears to be corrupt - the section is too small\n"));
5806 /* Check its version number. */
5807 info.li_version = BYTE_GET (external->li_version);
5808 if (info.li_version != 2)
5810 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5814 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5815 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5816 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5817 info.li_line_base = BYTE_GET (external->li_line_base);
5818 info.li_line_range = BYTE_GET (external->li_line_range);
5819 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5821 /* Sign extend the line base field. */
5822 info.li_line_base <<= 24;
5823 info.li_line_base >>= 24;
5825 printf (_(" Length: %ld\n"), info.li_length);
5826 printf (_(" DWARF Version: %d\n"), info.li_version);
5827 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
5828 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5829 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5830 printf (_(" Line Base: %d\n"), info.li_line_base);
5831 printf (_(" Line Range: %d\n"), info.li_line_range);
5832 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5834 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5836 reset_state_machine (info.li_default_is_stmt);
5838 /* Display the contents of the Opcodes table. */
5839 standard_opcodes = data + sizeof (* external);
5841 printf (_("\n Opcodes:\n"));
5843 for (i = 1; i < info.li_opcode_base; i++)
5844 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5846 /* Display the contents of the Directory table. */
5847 data = standard_opcodes + info.li_opcode_base - 1;
5850 printf (_("\n The Directory Table is empty.\n"));
5853 printf (_("\n The Directory Table:\n"));
5857 printf (_(" %s\n"), data);
5859 data += strlen ((char *) data) + 1;
5863 /* Skip the NUL at the end of the table. */
5866 /* Display the contents of the File Name table. */
5868 printf (_("\n The File Name Table is empty.\n"));
5871 printf (_("\n The File Name Table:\n"));
5872 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5876 unsigned char * name;
5879 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5882 data += strlen ((char *) data) + 1;
5884 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5886 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5888 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5890 printf (_("%s\n"), name);
5894 /* Skip the NUL at the end of the table. */
5897 /* Now display the statements. */
5898 printf (_("\n Line Number Statements:\n"));
5901 while (data < end_of_sequence)
5903 unsigned char op_code;
5907 op_code = * data ++;
5909 if (op_code >= info.li_opcode_base)
5911 op_code -= info.li_opcode_base;
5912 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5913 state_machine_regs.address += adv;
5914 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5915 op_code, adv, state_machine_regs.address);
5916 adv = (op_code % info.li_line_range) + info.li_line_base;
5917 state_machine_regs.line += adv;
5918 printf (_(" and Line by %d to %d\n"),
5919 adv, state_machine_regs.line);
5921 else switch (op_code)
5923 case DW_LNS_extended_op:
5924 data += process_extended_line_op (data, info.li_default_is_stmt,
5925 debug_line_pointer_size);
5929 printf (_(" Copy\n"));
5932 case DW_LNS_advance_pc:
5933 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5935 state_machine_regs.address += adv;
5936 printf (_(" Advance PC by %d to %lx\n"), adv,
5937 state_machine_regs.address);
5940 case DW_LNS_advance_line:
5941 adv = read_leb128 (data, & bytes_read, 1);
5943 state_machine_regs.line += adv;
5944 printf (_(" Advance Line by %d to %d\n"), adv,
5945 state_machine_regs.line);
5948 case DW_LNS_set_file:
5949 adv = read_leb128 (data, & bytes_read, 0);
5951 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5953 state_machine_regs.file = adv;
5956 case DW_LNS_set_column:
5957 adv = read_leb128 (data, & bytes_read, 0);
5959 printf (_(" Set column to %d\n"), adv);
5960 state_machine_regs.column = adv;
5963 case DW_LNS_negate_stmt:
5964 adv = state_machine_regs.is_stmt;
5966 printf (_(" Set is_stmt to %d\n"), adv);
5967 state_machine_regs.is_stmt = adv;
5970 case DW_LNS_set_basic_block:
5971 printf (_(" Set basic block\n"));
5972 state_machine_regs.basic_block = 1;
5975 case DW_LNS_const_add_pc:
5976 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5977 * info.li_min_insn_length);
5978 state_machine_regs.address += adv;
5979 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5980 state_machine_regs.address);
5983 case DW_LNS_fixed_advance_pc:
5984 adv = byte_get (data, 2);
5986 state_machine_regs.address += adv;
5987 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5988 adv, state_machine_regs.address);
5991 case DW_LNS_set_prologue_end:
5992 printf (_(" Set prologue_end to true\n"));
5995 case DW_LNS_set_epilogue_begin:
5996 printf (_(" Set epilogue_begin to true\n"));
5999 case DW_LNS_set_isa:
6000 adv = read_leb128 (data, & bytes_read, 0);
6002 printf (_(" Set ISA to %d\n"), adv);
6006 printf (_(" Unknown opcode %d with operands: "), op_code);
6009 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6011 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6012 i == 1 ? "" : ", ");
6027 display_debug_pubnames (section, start, file)
6028 Elf32_Internal_Shdr * section;
6029 unsigned char * start;
6030 FILE * file ATTRIBUTE_UNUSED;
6032 DWARF2_External_PubNames * external;
6033 DWARF2_Internal_PubNames pubnames;
6034 unsigned char * end;
6036 end = start + section->sh_size;
6038 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6042 unsigned char * data;
6043 unsigned long offset;
6045 external = (DWARF2_External_PubNames *) start;
6047 pubnames.pn_length = BYTE_GET (external->pn_length);
6048 pubnames.pn_version = BYTE_GET (external->pn_version);
6049 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6050 pubnames.pn_size = BYTE_GET (external->pn_size);
6052 data = start + sizeof (* external);
6053 start += pubnames.pn_length + sizeof (external->pn_length);
6055 if (pubnames.pn_length == 0xffffffff)
6057 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6061 if (pubnames.pn_version != 2)
6063 static int warned = 0;
6067 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6074 printf (_(" Length: %ld\n"),
6075 pubnames.pn_length);
6076 printf (_(" Version: %d\n"),
6077 pubnames.pn_version);
6078 printf (_(" Offset into .debug_info section: %ld\n"),
6079 pubnames.pn_offset);
6080 printf (_(" Size of area in .debug_info section: %ld\n"),
6083 printf (_("\n Offset\tName\n"));
6087 offset = byte_get (data, 4);
6092 printf (" %ld\t\t%s\n", offset, data);
6093 data += strlen ((char *) data) + 1;
6096 while (offset != 0);
6109 case DW_TAG_padding: return "DW_TAG_padding";
6110 case DW_TAG_array_type: return "DW_TAG_array_type";
6111 case DW_TAG_class_type: return "DW_TAG_class_type";
6112 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6113 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6114 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6115 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6116 case DW_TAG_label: return "DW_TAG_label";
6117 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6118 case DW_TAG_member: return "DW_TAG_member";
6119 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6120 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6121 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6122 case DW_TAG_string_type: return "DW_TAG_string_type";
6123 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6124 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6125 case DW_TAG_typedef: return "DW_TAG_typedef";
6126 case DW_TAG_union_type: return "DW_TAG_union_type";
6127 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6128 case DW_TAG_variant: return "DW_TAG_variant";
6129 case DW_TAG_common_block: return "DW_TAG_common_block";
6130 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6131 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6132 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6133 case DW_TAG_module: return "DW_TAG_module";
6134 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6135 case DW_TAG_set_type: return "DW_TAG_set_type";
6136 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6137 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6138 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6139 case DW_TAG_base_type: return "DW_TAG_base_type";
6140 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6141 case DW_TAG_const_type: return "DW_TAG_const_type";
6142 case DW_TAG_constant: return "DW_TAG_constant";
6143 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6144 case DW_TAG_file_type: return "DW_TAG_file_type";
6145 case DW_TAG_friend: return "DW_TAG_friend";
6146 case DW_TAG_namelist: return "DW_TAG_namelist";
6147 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6148 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6149 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6150 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6151 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6152 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6153 case DW_TAG_try_block: return "DW_TAG_try_block";
6154 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6155 case DW_TAG_variable: return "DW_TAG_variable";
6156 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6157 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6158 case DW_TAG_format_label: return "DW_TAG_format_label";
6159 case DW_TAG_function_template: return "DW_TAG_function_template";
6160 case DW_TAG_class_template: return "DW_TAG_class_template";
6161 /* DWARF 2.1 values. */
6162 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6163 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6164 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6165 case DW_TAG_namespace: return "DW_TAG_namespace";
6166 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6167 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6168 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6169 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6172 static char buffer [100];
6174 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6181 get_AT_name (attribute)
6182 unsigned long attribute;
6186 case DW_AT_sibling: return "DW_AT_sibling";
6187 case DW_AT_location: return "DW_AT_location";
6188 case DW_AT_name: return "DW_AT_name";
6189 case DW_AT_ordering: return "DW_AT_ordering";
6190 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6191 case DW_AT_byte_size: return "DW_AT_byte_size";
6192 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6193 case DW_AT_bit_size: return "DW_AT_bit_size";
6194 case DW_AT_element_list: return "DW_AT_element_list";
6195 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6196 case DW_AT_low_pc: return "DW_AT_low_pc";
6197 case DW_AT_high_pc: return "DW_AT_high_pc";
6198 case DW_AT_language: return "DW_AT_language";
6199 case DW_AT_member: return "DW_AT_member";
6200 case DW_AT_discr: return "DW_AT_discr";
6201 case DW_AT_discr_value: return "DW_AT_discr_value";
6202 case DW_AT_visibility: return "DW_AT_visibility";
6203 case DW_AT_import: return "DW_AT_import";
6204 case DW_AT_string_length: return "DW_AT_string_length";
6205 case DW_AT_common_reference: return "DW_AT_common_reference";
6206 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6207 case DW_AT_const_value: return "DW_AT_const_value";
6208 case DW_AT_containing_type: return "DW_AT_containing_type";
6209 case DW_AT_default_value: return "DW_AT_default_value";
6210 case DW_AT_inline: return "DW_AT_inline";
6211 case DW_AT_is_optional: return "DW_AT_is_optional";
6212 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6213 case DW_AT_producer: return "DW_AT_producer";
6214 case DW_AT_prototyped: return "DW_AT_prototyped";
6215 case DW_AT_return_addr: return "DW_AT_return_addr";
6216 case DW_AT_start_scope: return "DW_AT_start_scope";
6217 case DW_AT_stride_size: return "DW_AT_stride_size";
6218 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6219 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6220 case DW_AT_accessibility: return "DW_AT_accessibility";
6221 case DW_AT_address_class: return "DW_AT_address_class";
6222 case DW_AT_artificial: return "DW_AT_artificial";
6223 case DW_AT_base_types: return "DW_AT_base_types";
6224 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6225 case DW_AT_count: return "DW_AT_count";
6226 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6227 case DW_AT_decl_column: return "DW_AT_decl_column";
6228 case DW_AT_decl_file: return "DW_AT_decl_file";
6229 case DW_AT_decl_line: return "DW_AT_decl_line";
6230 case DW_AT_declaration: return "DW_AT_declaration";
6231 case DW_AT_discr_list: return "DW_AT_discr_list";
6232 case DW_AT_encoding: return "DW_AT_encoding";
6233 case DW_AT_external: return "DW_AT_external";
6234 case DW_AT_frame_base: return "DW_AT_frame_base";
6235 case DW_AT_friend: return "DW_AT_friend";
6236 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6237 case DW_AT_macro_info: return "DW_AT_macro_info";
6238 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6239 case DW_AT_priority: return "DW_AT_priority";
6240 case DW_AT_segment: return "DW_AT_segment";
6241 case DW_AT_specification: return "DW_AT_specification";
6242 case DW_AT_static_link: return "DW_AT_static_link";
6243 case DW_AT_type: return "DW_AT_type";
6244 case DW_AT_use_location: return "DW_AT_use_location";
6245 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6246 case DW_AT_virtuality: return "DW_AT_virtuality";
6247 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6248 /* DWARF 2.1 values. */
6249 case DW_AT_allocated: return "DW_AT_allocated";
6250 case DW_AT_associated: return "DW_AT_associated";
6251 case DW_AT_data_location: return "DW_AT_data_location";
6252 case DW_AT_stride: return "DW_AT_stride";
6253 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6254 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6255 case DW_AT_extension: return "DW_AT_extension";
6256 case DW_AT_ranges: return "DW_AT_ranges";
6257 case DW_AT_trampoline: return "DW_AT_trampoline";
6258 case DW_AT_call_column: return "DW_AT_call_column";
6259 case DW_AT_call_file: return "DW_AT_call_file";
6260 case DW_AT_call_line: return "DW_AT_call_line";
6261 /* SGI/MIPS extensions. */
6262 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6263 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6264 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6265 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6266 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6267 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6268 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6269 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6270 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6271 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6272 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6273 /* GNU extensions. */
6274 case DW_AT_sf_names: return "DW_AT_sf_names";
6275 case DW_AT_src_info: return "DW_AT_src_info";
6276 case DW_AT_mac_info: return "DW_AT_mac_info";
6277 case DW_AT_src_coords: return "DW_AT_src_coords";
6278 case DW_AT_body_begin: return "DW_AT_body_begin";
6279 case DW_AT_body_end: return "DW_AT_body_end";
6282 static char buffer [100];
6284 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6291 get_FORM_name (form)
6296 case DW_FORM_addr: return "DW_FORM_addr";
6297 case DW_FORM_block2: return "DW_FORM_block2";
6298 case DW_FORM_block4: return "DW_FORM_block4";
6299 case DW_FORM_data2: return "DW_FORM_data2";
6300 case DW_FORM_data4: return "DW_FORM_data4";
6301 case DW_FORM_data8: return "DW_FORM_data8";
6302 case DW_FORM_string: return "DW_FORM_string";
6303 case DW_FORM_block: return "DW_FORM_block";
6304 case DW_FORM_block1: return "DW_FORM_block1";
6305 case DW_FORM_data1: return "DW_FORM_data1";
6306 case DW_FORM_flag: return "DW_FORM_flag";
6307 case DW_FORM_sdata: return "DW_FORM_sdata";
6308 case DW_FORM_strp: return "DW_FORM_strp";
6309 case DW_FORM_udata: return "DW_FORM_udata";
6310 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6311 case DW_FORM_ref1: return "DW_FORM_ref1";
6312 case DW_FORM_ref2: return "DW_FORM_ref2";
6313 case DW_FORM_ref4: return "DW_FORM_ref4";
6314 case DW_FORM_ref8: return "DW_FORM_ref8";
6315 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6316 case DW_FORM_indirect: return "DW_FORM_indirect";
6319 static char buffer [100];
6321 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6327 /* FIXME: There are better and more effiecint ways to handle
6328 these structures. For now though, I just want something that
6329 is simple to implement. */
6330 typedef struct abbrev_attr
6332 unsigned long attribute;
6334 struct abbrev_attr * next;
6338 typedef struct abbrev_entry
6340 unsigned long entry;
6343 struct abbrev_attr * first_attr;
6344 struct abbrev_attr * last_attr;
6345 struct abbrev_entry * next;
6349 static abbrev_entry * first_abbrev = NULL;
6350 static abbrev_entry * last_abbrev = NULL;
6353 free_abbrevs PARAMS ((void))
6355 abbrev_entry * abbrev;
6357 for (abbrev = first_abbrev; abbrev;)
6359 abbrev_entry * next = abbrev->next;
6362 for (attr = abbrev->first_attr; attr;)
6364 abbrev_attr * next = attr->next;
6374 last_abbrev = first_abbrev = NULL;
6378 add_abbrev (number, tag, children)
6379 unsigned long number;
6383 abbrev_entry * entry;
6385 entry = (abbrev_entry *) malloc (sizeof (* entry));
6391 entry->entry = number;
6393 entry->children = children;
6394 entry->first_attr = NULL;
6395 entry->last_attr = NULL;
6398 if (first_abbrev == NULL)
6399 first_abbrev = entry;
6401 last_abbrev->next = entry;
6403 last_abbrev = entry;
6407 add_abbrev_attr (attribute, form)
6408 unsigned long attribute;
6413 attr = (abbrev_attr *) malloc (sizeof (* attr));
6419 attr->attribute = attribute;
6423 if (last_abbrev->first_attr == NULL)
6424 last_abbrev->first_attr = attr;
6426 last_abbrev->last_attr->next = attr;
6428 last_abbrev->last_attr = attr;
6431 /* Processes the (partial) contents of a .debug_abbrev section.
6432 Returns NULL if the end of the section was encountered.
6433 Returns the address after the last byte read if the end of
6434 an abbreviation set was found. */
6436 static unsigned char *
6437 process_abbrev_section (start, end)
6438 unsigned char * start;
6439 unsigned char * end;
6441 if (first_abbrev != NULL)
6447 unsigned long entry;
6449 unsigned long attribute;
6452 entry = read_leb128 (start, & bytes_read, 0);
6453 start += bytes_read;
6455 /* A single zero is supposed to end the section according
6456 to the standard. If there's more, then signal that to
6459 return start == end ? NULL : start;
6461 tag = read_leb128 (start, & bytes_read, 0);
6462 start += bytes_read;
6464 children = * start ++;
6466 add_abbrev (entry, tag, children);
6472 attribute = read_leb128 (start, & bytes_read, 0);
6473 start += bytes_read;
6475 form = read_leb128 (start, & bytes_read, 0);
6476 start += bytes_read;
6479 add_abbrev_attr (attribute, form);
6481 while (attribute != 0);
6489 display_debug_macinfo (section, start, file)
6490 Elf32_Internal_Shdr * section;
6491 unsigned char * start;
6492 FILE * file ATTRIBUTE_UNUSED;
6494 unsigned char * end = start + section->sh_size;
6495 unsigned char * curr = start;
6496 unsigned int bytes_read;
6497 enum dwarf_macinfo_record_type op;
6499 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6503 unsigned int lineno;
6504 const char * string;
6511 case DW_MACINFO_start_file:
6513 unsigned int filenum;
6515 lineno = read_leb128 (curr, & bytes_read, 0);
6517 filenum = read_leb128 (curr, & bytes_read, 0);
6520 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6524 case DW_MACINFO_end_file:
6525 printf (_(" DW_MACINFO_end_file\n"));
6528 case DW_MACINFO_define:
6529 lineno = read_leb128 (curr, & bytes_read, 0);
6532 curr += strlen (string) + 1;
6533 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6536 case DW_MACINFO_undef:
6537 lineno = read_leb128 (curr, & bytes_read, 0);
6540 curr += strlen (string) + 1;
6541 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6544 case DW_MACINFO_vendor_ext:
6546 unsigned int constant;
6548 constant = read_leb128 (curr, & bytes_read, 0);
6551 curr += strlen (string) + 1;
6552 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6563 display_debug_abbrev (section, start, file)
6564 Elf32_Internal_Shdr * section;
6565 unsigned char * start;
6566 FILE * file ATTRIBUTE_UNUSED;
6568 abbrev_entry * entry;
6569 unsigned char * end = start + section->sh_size;
6571 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6575 start = process_abbrev_section (start, end);
6577 if (first_abbrev == NULL)
6580 printf (_(" Number TAG\n"));
6582 for (entry = first_abbrev; entry; entry = entry->next)
6586 printf (_(" %ld %s [%s]\n"),
6588 get_TAG_name (entry->tag),
6589 entry->children ? _("has children") : _("no children"));
6591 for (attr = entry->first_attr; attr; attr = attr->next)
6593 printf (_(" %-18s %s\n"),
6594 get_AT_name (attr->attribute),
6595 get_FORM_name (attr->form));
6609 static unsigned char *
6610 display_block (data, length)
6611 unsigned char * data;
6612 unsigned long length;
6614 printf (_(" %lu byte block: "), length);
6617 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6623 decode_location_expression (data, pointer_size, length)
6624 unsigned char * data;
6625 unsigned int pointer_size;
6626 unsigned long length;
6630 unsigned long uvalue;
6631 unsigned char * end = data + length;
6640 printf ("DW_OP_addr: %lx",
6641 (unsigned long) byte_get (data, pointer_size));
6642 data += pointer_size;
6645 printf ("DW_OP_deref");
6648 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6651 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6654 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6658 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6662 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6666 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6670 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6671 (unsigned long) byte_get (data + 4, 4));
6675 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6676 (long) byte_get (data + 4, 4));
6680 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6684 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6688 printf ("DW_OP_dup");
6691 printf ("DW_OP_drop");
6694 printf ("DW_OP_over");
6697 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6700 printf ("DW_OP_swap");
6703 printf ("DW_OP_rot");
6706 printf ("DW_OP_xderef");
6709 printf ("DW_OP_abs");
6712 printf ("DW_OP_and");
6715 printf ("DW_OP_div");
6718 printf ("DW_OP_minus");
6721 printf ("DW_OP_mod");
6724 printf ("DW_OP_mul");
6727 printf ("DW_OP_neg");
6730 printf ("DW_OP_not");
6733 printf ("DW_OP_or");
6736 printf ("DW_OP_plus");
6738 case DW_OP_plus_uconst:
6739 printf ("DW_OP_plus_uconst: %lu",
6740 read_leb128 (data, &bytes_read, 0));
6744 printf ("DW_OP_shl");
6747 printf ("DW_OP_shr");
6750 printf ("DW_OP_shra");
6753 printf ("DW_OP_xor");
6756 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6760 printf ("DW_OP_eq");
6763 printf ("DW_OP_ge");
6766 printf ("DW_OP_gt");
6769 printf ("DW_OP_le");
6772 printf ("DW_OP_lt");
6775 printf ("DW_OP_ne");
6778 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6814 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6849 printf ("DW_OP_reg%d", op - DW_OP_reg0);
6884 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6885 read_leb128 (data, &bytes_read, 1));
6890 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
6894 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
6898 uvalue = read_leb128 (data, &bytes_read, 0);
6900 printf ("DW_OP_bregx: %lu %ld", uvalue,
6901 read_leb128 (data, &bytes_read, 1));
6905 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6908 case DW_OP_deref_size:
6909 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6911 case DW_OP_xderef_size:
6912 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6915 printf ("DW_OP_nop");
6918 /* DWARF 2.1 extensions. */
6919 case DW_OP_push_object_address:
6920 printf ("DW_OP_push_object_address");
6923 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
6927 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
6931 printf ("DW_OP_calli");
6935 if (op >= DW_OP_lo_user
6936 && op <= DW_OP_hi_user)
6937 printf (_("(User defined location op)"));
6939 printf (_("(Unknown location op)"));
6940 /* No way to tell where the next op is, so just bail. */
6944 /* Separate the ops. */
6950 static const char * debug_str_contents;
6951 static bfd_vma debug_str_size;
6954 load_debug_str (file)
6957 Elf32_Internal_Shdr * sec;
6960 /* If it is already loaded, do nothing. */
6961 if (debug_str_contents != NULL)
6964 /* Locate the .debug_str section. */
6965 for (i = 0, sec = section_headers;
6966 i < elf_header.e_shnum;
6968 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
6971 if (i == elf_header.e_shnum || sec->sh_size == 0)
6974 debug_str_size = sec->sh_size;
6976 debug_str_contents = ((char *)
6977 get_data (NULL, file, sec->sh_offset, sec->sh_size,
6978 _("debug_str section data")));
6984 if (debug_str_contents == NULL)
6987 free ((char *) debug_str_contents);
6988 debug_str_contents = NULL;
6993 fetch_indirect_string (offset)
6994 unsigned long offset;
6996 if (debug_str_contents == NULL)
6997 return _("<no .debug_str section>");
6999 if (offset > debug_str_size)
7000 return _("<offset is too big>");
7002 return debug_str_contents + offset;
7007 display_debug_str (section, start, file)
7008 Elf32_Internal_Shdr * section;
7009 unsigned char * start;
7010 FILE * file ATTRIBUTE_UNUSED;
7012 unsigned long bytes;
7015 addr = section->sh_addr;
7016 bytes = section->sh_size;
7020 printf (_("\nThe .debug_str section is empty.\n"));
7024 printf (_("Contents of the .debug_str section:\n\n"));
7032 lbytes = (bytes > 16 ? 16 : bytes);
7034 printf (" 0x%8.8lx ", (unsigned long) addr);
7036 for (j = 0; j < 16; j++)
7039 printf ("%2.2x", start [j]);
7047 for (j = 0; j < lbytes; j++)
7050 if (k >= ' ' && k < 0x80)
7067 static unsigned char *
7068 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7069 unsigned long attribute;
7071 unsigned char * data;
7072 unsigned long cu_offset;
7073 unsigned long pointer_size;
7075 unsigned long uvalue = 0;
7076 unsigned char * block_start = NULL;
7084 case DW_FORM_ref_addr:
7086 uvalue = byte_get (data, pointer_size);
7087 data += pointer_size;
7091 uvalue = byte_get (data, /* offset_size */ 4);
7092 data += /* offset_size */ 4;
7098 uvalue = byte_get (data ++, 1);
7103 uvalue = byte_get (data, 2);
7109 uvalue = byte_get (data, 4);
7114 uvalue = read_leb128 (data, & bytes_read, 1);
7118 case DW_FORM_ref_udata:
7120 uvalue = read_leb128 (data, & bytes_read, 0);
7124 case DW_FORM_indirect:
7125 form = read_leb128 (data, & bytes_read, 0);
7127 printf (" %s", get_FORM_name (form));
7128 return read_and_display_attr_value (attribute, form, data, cu_offset,
7134 case DW_FORM_ref_addr:
7135 printf (" <#%lx>", uvalue);
7141 case DW_FORM_ref_udata:
7142 printf (" <%lx>", uvalue + cu_offset);
7146 printf (" %#lx", uvalue);
7154 printf (" %ld", uvalue);
7159 uvalue = byte_get (data, 4);
7160 printf (" %lx", uvalue);
7161 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7165 case DW_FORM_string:
7166 printf (" %s", data);
7167 data += strlen ((char *) data) + 1;
7171 uvalue = read_leb128 (data, & bytes_read, 0);
7172 block_start = data + bytes_read;
7173 data = display_block (block_start, uvalue);
7176 case DW_FORM_block1:
7177 uvalue = byte_get (data, 1);
7178 block_start = data + 1;
7179 data = display_block (block_start, uvalue);
7182 case DW_FORM_block2:
7183 uvalue = byte_get (data, 2);
7184 block_start = data + 2;
7185 data = display_block (block_start, uvalue);
7188 case DW_FORM_block4:
7189 uvalue = byte_get (data, 4);
7190 block_start = data + 4;
7191 data = display_block (block_start, uvalue);
7195 printf (_(" (indirect string, offset: 0x%lx): "), uvalue);
7196 printf (fetch_indirect_string (uvalue));
7199 case DW_FORM_indirect:
7200 /* Handled above. */
7204 warn (_("Unrecognised form: %d\n"), form);
7208 /* For some attributes we can display futher information. */
7217 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7218 case DW_INL_inlined: printf (_("(inlined)")); break;
7219 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7220 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7221 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7225 case DW_AT_language:
7228 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7229 case DW_LANG_C89: printf ("(ANSI C)"); break;
7230 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7231 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7232 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7233 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7234 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7235 case DW_LANG_Ada83: printf ("(Ada)"); break;
7236 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7237 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7238 /* DWARF 2.1 values. */
7239 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7240 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7241 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7242 /* MIPS extension. */
7243 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7244 default: printf ("(Unknown: %lx)", uvalue); break;
7248 case DW_AT_encoding:
7251 case DW_ATE_void: printf ("(void)"); break;
7252 case DW_ATE_address: printf ("(machine address)"); break;
7253 case DW_ATE_boolean: printf ("(boolean)"); break;
7254 case DW_ATE_complex_float: printf ("(complex float)"); break;
7255 case DW_ATE_float: printf ("(float)"); break;
7256 case DW_ATE_signed: printf ("(signed)"); break;
7257 case DW_ATE_signed_char: printf ("(signed char)"); break;
7258 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7259 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7260 /* DWARF 2.1 value. */
7261 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7263 if (uvalue >= DW_ATE_lo_user
7264 && uvalue <= DW_ATE_hi_user)
7265 printf ("(user defined type)");
7267 printf ("(unknown type)");
7272 case DW_AT_accessibility:
7275 case DW_ACCESS_public: printf ("(public)"); break;
7276 case DW_ACCESS_protected: printf ("(protected)"); break;
7277 case DW_ACCESS_private: printf ("(private)"); break;
7278 default: printf ("(unknown accessibility)"); break;
7282 case DW_AT_visibility:
7285 case DW_VIS_local: printf ("(local)"); break;
7286 case DW_VIS_exported: printf ("(exported)"); break;
7287 case DW_VIS_qualified: printf ("(qualified)"); break;
7288 default: printf ("(unknown visibility)"); break;
7292 case DW_AT_virtuality:
7295 case DW_VIRTUALITY_none: printf ("(none)"); break;
7296 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7297 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7298 default: printf ("(unknown virtuality)"); break;
7302 case DW_AT_identifier_case:
7305 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7306 case DW_ID_up_case: printf ("(up_case)"); break;
7307 case DW_ID_down_case: printf ("(down_case)"); break;
7308 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7309 default: printf ("(unknown case)"); break;
7313 case DW_AT_calling_convention:
7316 case DW_CC_normal: printf ("(normal)"); break;
7317 case DW_CC_program: printf ("(program)"); break;
7318 case DW_CC_nocall: printf ("(nocall)"); break;
7320 if (uvalue >= DW_CC_lo_user
7321 && uvalue <= DW_CC_hi_user)
7322 printf ("(user defined)");
7324 printf ("(unknown convention)");
7328 case DW_AT_ordering:
7331 case -1: printf ("(undefined)"); break;
7332 case 0: printf ("(row major)"); break;
7333 case 1: printf ("(column major)"); break;
7337 case DW_AT_frame_base:
7338 case DW_AT_location:
7339 case DW_AT_data_member_location:
7340 case DW_AT_vtable_elem_location:
7341 case DW_AT_allocated:
7342 case DW_AT_associated:
7343 case DW_AT_data_location:
7345 case DW_AT_upper_bound:
7346 case DW_AT_lower_bound:
7350 decode_location_expression (block_start, pointer_size, uvalue);
7362 static unsigned char *
7363 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7364 unsigned long attribute;
7366 unsigned char * data;
7367 unsigned long cu_offset;
7368 unsigned long pointer_size;
7370 printf (" %-18s:", get_AT_name (attribute));
7371 data = read_and_display_attr_value (attribute, form, data, cu_offset,
7378 display_debug_info (section, start, file)
7379 Elf32_Internal_Shdr * section;
7380 unsigned char * start;
7383 unsigned char * end = start + section->sh_size;
7384 unsigned char * section_begin = start;
7386 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7388 load_debug_str (file);
7392 DWARF2_External_CompUnit * external;
7393 DWARF2_Internal_CompUnit compunit;
7394 Elf32_Internal_Shdr * relsec;
7395 unsigned char * tags;
7398 unsigned long cu_offset;
7400 external = (DWARF2_External_CompUnit *) start;
7402 compunit.cu_length = BYTE_GET (external->cu_length);
7403 compunit.cu_version = BYTE_GET (external->cu_version);
7404 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7405 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7407 if (compunit.cu_length == 0xffffffff)
7409 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7413 /* Check for RELA relocations in the abbrev_offset address, and
7415 for (relsec = section_headers;
7416 relsec < section_headers + elf_header.e_shnum;
7419 unsigned long nrelas, nsyms;
7420 Elf_Internal_Rela *rela, *rp;
7421 Elf32_Internal_Shdr *symsec;
7422 Elf_Internal_Sym *symtab;
7423 Elf_Internal_Sym *sym;
7425 if (relsec->sh_type != SHT_RELA
7426 || section_headers + relsec->sh_info != section)
7429 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7433 symsec = section_headers + relsec->sh_link;
7434 nsyms = symsec->sh_size / symsec->sh_entsize;
7435 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
7437 for (rp = rela; rp < rela + nrelas; ++rp)
7440 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7446 sym = symtab + ELF32_R_SYM (rp->r_info);
7448 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7450 warn (_("Skipping unexpected symbol type %u\n"),
7451 ELF32_ST_TYPE (sym->st_info));
7457 sym = symtab + ELF64_R_SYM (rp->r_info);
7459 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7461 warn (_("Skipping unexpected symbol type %u\n"),
7462 ELF64_ST_TYPE (sym->st_info));
7467 compunit.cu_abbrev_offset += rp->r_addend;
7475 tags = start + sizeof (* external);
7476 cu_offset = start - section_begin;
7477 start += compunit.cu_length + sizeof (external->cu_length);
7479 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7480 printf (_(" Length: %ld\n"), compunit.cu_length);
7481 printf (_(" Version: %d\n"), compunit.cu_version);
7482 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7483 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7485 if (compunit.cu_version != 2)
7487 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7493 /* Read in the abbrevs used by this compilation unit. */
7496 Elf32_Internal_Shdr * sec;
7497 unsigned char * begin;
7499 /* Locate the .debug_abbrev section and process it. */
7500 for (i = 0, sec = section_headers;
7501 i < elf_header.e_shnum;
7503 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7506 if (i == elf_header.e_shnum || sec->sh_size == 0)
7508 warn (_("Unable to locate .debug_abbrev section!\n"));
7512 begin = ((unsigned char *)
7513 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7514 _("debug_abbrev section data")));
7518 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7519 begin + sec->sh_size);
7525 while (tags < start)
7528 unsigned long abbrev_number;
7529 abbrev_entry * entry;
7532 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7535 /* A null DIE marks the end of a list of children. */
7536 if (abbrev_number == 0)
7542 /* Scan through the abbreviation list until we reach the
7544 for (entry = first_abbrev;
7545 entry && entry->entry != abbrev_number;
7546 entry = entry->next)
7551 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7556 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7558 (unsigned long) (tags - section_begin - bytes_read),
7560 get_TAG_name (entry->tag));
7562 for (attr = entry->first_attr; attr; attr = attr->next)
7563 tags = read_and_display_attr (attr->attribute,
7566 compunit.cu_pointer_size);
7568 if (entry->children)
7581 display_debug_aranges (section, start, file)
7582 Elf32_Internal_Shdr * section;
7583 unsigned char * start;
7584 FILE * file ATTRIBUTE_UNUSED;
7586 unsigned char * end = start + section->sh_size;
7588 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7592 DWARF2_External_ARange * external;
7593 DWARF2_Internal_ARange arange;
7594 unsigned char * ranges;
7595 unsigned long length;
7596 unsigned long address;
7599 external = (DWARF2_External_ARange *) start;
7601 arange.ar_length = BYTE_GET (external->ar_length);
7602 arange.ar_version = BYTE_GET (external->ar_version);
7603 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7604 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7605 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7607 if (arange.ar_length == 0xffffffff)
7609 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7613 if (arange.ar_version != 2)
7615 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7619 printf (_(" Length: %ld\n"), arange.ar_length);
7620 printf (_(" Version: %d\n"), arange.ar_version);
7621 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7622 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7623 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7625 printf (_("\n Address Length\n"));
7627 ranges = start + sizeof (* external);
7629 /* Must pad to an alignment boundary that is twice the pointer size. */
7630 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7632 ranges += (2 * arange.ar_pointer_size) - excess;
7636 address = byte_get (ranges, arange.ar_pointer_size);
7638 ranges += arange.ar_pointer_size;
7640 length = byte_get (ranges, arange.ar_pointer_size);
7642 ranges += arange.ar_pointer_size;
7644 /* A pair of zeros marks the end of the list. */
7645 if (address == 0 && length == 0)
7648 printf (" %8.8lx %lu\n", address, length);
7651 start += arange.ar_length + sizeof (external->ar_length);
7659 typedef struct Frame_Chunk
7661 struct Frame_Chunk * next;
7662 unsigned char * chunk_start;
7664 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7665 short int * col_type;
7667 char * augmentation;
7668 unsigned int code_factor;
7670 unsigned long pc_begin;
7671 unsigned long pc_range;
7675 unsigned char fde_encoding;
7679 /* A marker for a col_type that means this column was never referenced
7680 in the frame info. */
7681 #define DW_CFA_unreferenced (-1)
7683 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7684 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7685 static int size_of_encoded_value PARAMS ((int));
7688 frame_need_space (fc, reg)
7692 int prev = fc->ncols;
7694 if (reg < fc->ncols)
7697 fc->ncols = reg + 1;
7698 fc->col_type = (short int *) xrealloc (fc->col_type,
7699 fc->ncols * sizeof (short int));
7700 fc->col_offset = (int *) xrealloc (fc->col_offset,
7701 fc->ncols * sizeof (int));
7703 while (prev < fc->ncols)
7705 fc->col_type[prev] = DW_CFA_unreferenced;
7706 fc->col_offset[prev] = 0;
7712 frame_display_row (fc, need_col_headers, max_regs)
7714 int * need_col_headers;
7720 if (* max_regs < fc->ncols)
7721 * max_regs = fc->ncols;
7723 if (* need_col_headers)
7725 * need_col_headers = 0;
7727 printf (" LOC CFA ");
7729 for (r = 0; r < * max_regs; r++)
7730 if (fc->col_type[r] != DW_CFA_unreferenced)
7735 printf ("r%-4d", r);
7741 printf ("%08lx ", fc->pc_begin);
7742 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7743 printf ("%-8s ", tmp);
7745 for (r = 0; r < fc->ncols; r++)
7747 if (fc->col_type[r] != DW_CFA_unreferenced)
7749 switch (fc->col_type[r])
7751 case DW_CFA_undefined:
7754 case DW_CFA_same_value:
7758 sprintf (tmp, "c%+d", fc->col_offset[r]);
7760 case DW_CFA_register:
7761 sprintf (tmp, "r%d", fc->col_offset[r]);
7764 strcpy (tmp, "n/a");
7767 printf ("%-5s", tmp);
7774 size_of_encoded_value (encoding)
7777 switch (encoding & 0x7)
7780 case 0: return is_32bit_elf ? 4 : 8;
7787 #define GET(N) byte_get (start, N); start += N
7788 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7789 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7792 display_debug_frames (section, start, file)
7793 Elf32_Internal_Shdr * section;
7794 unsigned char * start;
7795 FILE * file ATTRIBUTE_UNUSED;
7797 unsigned char * end = start + section->sh_size;
7798 unsigned char * section_start = start;
7799 Frame_Chunk * chunks = 0;
7800 Frame_Chunk * remembered_state = 0;
7802 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7805 int addr_size = is_32bit_elf ? 4 : 8;
7807 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7811 unsigned char * saved_start;
7812 unsigned char * block_end;
7813 unsigned long length;
7814 unsigned long cie_id;
7817 int need_col_headers = 1;
7818 unsigned char * augmentation_data = NULL;
7819 unsigned long augmentation_data_len = 0;
7820 int encoded_ptr_size = addr_size;
7822 saved_start = start;
7823 length = byte_get (start, 4); start += 4;
7828 if (length == 0xffffffff)
7830 warn (_("64-bit DWARF format frames are not supported yet.\n"));
7834 block_end = saved_start + length + 4;
7835 cie_id = byte_get (start, 4); start += 4;
7837 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7841 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7842 memset (fc, 0, sizeof (Frame_Chunk));
7846 fc->chunk_start = saved_start;
7848 fc->col_type = (short int *) xmalloc (sizeof (short int));
7849 fc->col_offset = (int *) xmalloc (sizeof (int));
7850 frame_need_space (fc, max_regs-1);
7854 fc->augmentation = start;
7855 start = strchr (start, '\0') + 1;
7857 if (fc->augmentation[0] == 'z')
7859 fc->code_factor = LEB ();
7860 fc->data_factor = SLEB ();
7861 fc->ra = byte_get (start, 1); start += 1;
7862 augmentation_data_len = LEB ();
7863 augmentation_data = start;
7864 start += augmentation_data_len;
7866 else if (strcmp (fc->augmentation, "eh") == 0)
7869 fc->code_factor = LEB ();
7870 fc->data_factor = SLEB ();
7871 fc->ra = byte_get (start, 1); start += 1;
7875 fc->code_factor = LEB ();
7876 fc->data_factor = SLEB ();
7877 fc->ra = byte_get (start, 1); start += 1;
7881 if (do_debug_frames_interp)
7882 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7883 (unsigned long)(saved_start - section_start), length, cie_id,
7884 fc->augmentation, fc->code_factor, fc->data_factor,
7888 printf ("\n%08lx %08lx %08lx CIE\n",
7889 (unsigned long)(saved_start - section_start), length, cie_id);
7890 printf (" Version: %d\n", version);
7891 printf (" Augmentation: \"%s\"\n", fc->augmentation);
7892 printf (" Code alignment factor: %u\n", fc->code_factor);
7893 printf (" Data alignment factor: %d\n", fc->data_factor);
7894 printf (" Return address column: %d\n", fc->ra);
7896 if (augmentation_data_len)
7899 printf (" Augmentation data: ");
7900 for (i = 0; i < augmentation_data_len; ++i)
7901 printf (" %02x", augmentation_data[i]);
7907 if (augmentation_data_len)
7909 unsigned char *p, *q;
7910 p = fc->augmentation + 1;
7911 q = augmentation_data;
7918 q += 1 + size_of_encoded_value (*q);
7920 fc->fde_encoding = *q++;
7926 if (fc->fde_encoding)
7927 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7930 frame_need_space (fc, fc->ra);
7934 unsigned char * look_for;
7935 static Frame_Chunk fde_fc;
7938 memset (fc, 0, sizeof (Frame_Chunk));
7940 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
7942 for (cie = chunks; cie ; cie = cie->next)
7943 if (cie->chunk_start == look_for)
7948 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7949 cie_id, saved_start);
7952 fc->col_type = (short int *) xmalloc (sizeof (short int));
7953 fc->col_offset = (int *) xmalloc (sizeof (int));
7954 frame_need_space (fc, max_regs - 1);
7956 fc->augmentation = "";
7957 fc->fde_encoding = 0;
7961 fc->ncols = cie->ncols;
7962 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
7963 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
7964 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7965 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7966 fc->augmentation = cie->augmentation;
7967 fc->code_factor = cie->code_factor;
7968 fc->data_factor = cie->data_factor;
7969 fc->cfa_reg = cie->cfa_reg;
7970 fc->cfa_offset = cie->cfa_offset;
7972 frame_need_space (fc, max_regs-1);
7973 fc->fde_encoding = cie->fde_encoding;
7976 if (fc->fde_encoding)
7977 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7979 fc->pc_begin = byte_get (start, encoded_ptr_size);
7980 start += encoded_ptr_size;
7981 fc->pc_range = byte_get (start, encoded_ptr_size);
7982 start += encoded_ptr_size;
7984 if (cie->augmentation[0] == 'z')
7986 augmentation_data_len = LEB ();
7987 augmentation_data = start;
7988 start += augmentation_data_len;
7991 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
7992 (unsigned long)(saved_start - section_start), length, cie_id,
7993 (unsigned long)(cie->chunk_start - section_start),
7994 fc->pc_begin, fc->pc_begin + fc->pc_range);
7995 if (! do_debug_frames_interp && augmentation_data_len)
7998 printf (" Augmentation data: ");
7999 for (i = 0; i < augmentation_data_len; ++i)
8000 printf (" %02x", augmentation_data[i]);
8006 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8007 about to interpret instructions for the chunk. */
8009 if (do_debug_frames_interp)
8011 /* Start by making a pass over the chunk, allocating storage
8012 and taking note of what registers are used. */
8013 unsigned char * tmp = start;
8015 while (start < block_end)
8025 /* Warning: if you add any more cases to this switch, be
8026 sure to add them to the corresponding switch below. */
8029 case DW_CFA_advance_loc:
8033 frame_need_space (fc, opa);
8034 fc->col_type[opa] = DW_CFA_undefined;
8036 case DW_CFA_restore:
8037 frame_need_space (fc, opa);
8038 fc->col_type[opa] = DW_CFA_undefined;
8040 case DW_CFA_set_loc:
8041 start += encoded_ptr_size;
8043 case DW_CFA_advance_loc1:
8046 case DW_CFA_advance_loc2:
8049 case DW_CFA_advance_loc4:
8052 case DW_CFA_offset_extended:
8053 reg = LEB (); LEB ();
8054 frame_need_space (fc, reg);
8055 fc->col_type[reg] = DW_CFA_undefined;
8057 case DW_CFA_restore_extended:
8059 frame_need_space (fc, reg);
8060 fc->col_type[reg] = DW_CFA_undefined;
8062 case DW_CFA_undefined:
8064 frame_need_space (fc, reg);
8065 fc->col_type[reg] = DW_CFA_undefined;
8067 case DW_CFA_same_value:
8069 frame_need_space (fc, reg);
8070 fc->col_type[reg] = DW_CFA_undefined;
8072 case DW_CFA_register:
8073 reg = LEB (); LEB ();
8074 frame_need_space (fc, reg);
8075 fc->col_type[reg] = DW_CFA_undefined;
8077 case DW_CFA_def_cfa:
8080 case DW_CFA_def_cfa_register:
8083 case DW_CFA_def_cfa_offset:
8086 #ifndef DW_CFA_GNU_args_size
8087 #define DW_CFA_GNU_args_size 0x2e
8089 case DW_CFA_GNU_args_size:
8092 #ifndef DW_CFA_GNU_negative_offset_extended
8093 #define DW_CFA_GNU_negative_offset_extended 0x2f
8095 case DW_CFA_GNU_negative_offset_extended:
8096 reg = LEB (); LEB ();
8097 frame_need_space (fc, reg);
8098 fc->col_type[reg] = DW_CFA_undefined;
8107 /* Now we know what registers are used, make a second pass over
8108 the chunk, this time actually printing out the info. */
8110 while (start < block_end)
8113 unsigned long ul, reg, roffs;
8122 /* Warning: if you add any more cases to this switch, be
8123 sure to add them to the corresponding switch above. */
8126 case DW_CFA_advance_loc:
8127 if (do_debug_frames_interp)
8128 frame_display_row (fc, &need_col_headers, &max_regs);
8130 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8131 opa * fc->code_factor,
8132 fc->pc_begin + opa * fc->code_factor);
8133 fc->pc_begin += opa * fc->code_factor;
8138 if (! do_debug_frames_interp)
8139 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8140 opa, roffs * fc->data_factor);
8141 fc->col_type[opa] = DW_CFA_offset;
8142 fc->col_offset[opa] = roffs * fc->data_factor;
8145 case DW_CFA_restore:
8146 if (! do_debug_frames_interp)
8147 printf (" DW_CFA_restore: r%d\n", opa);
8148 fc->col_type[opa] = cie->col_type[opa];
8149 fc->col_offset[opa] = cie->col_offset[opa];
8152 case DW_CFA_set_loc:
8153 vma = byte_get (start, encoded_ptr_size);
8154 start += encoded_ptr_size;
8155 if (do_debug_frames_interp)
8156 frame_display_row (fc, &need_col_headers, &max_regs);
8158 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8162 case DW_CFA_advance_loc1:
8163 ofs = byte_get (start, 1); start += 1;
8164 if (do_debug_frames_interp)
8165 frame_display_row (fc, &need_col_headers, &max_regs);
8167 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8168 ofs * fc->code_factor,
8169 fc->pc_begin + ofs * fc->code_factor);
8170 fc->pc_begin += ofs * fc->code_factor;
8173 case DW_CFA_advance_loc2:
8174 ofs = byte_get (start, 2); start += 2;
8175 if (do_debug_frames_interp)
8176 frame_display_row (fc, &need_col_headers, &max_regs);
8178 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8179 ofs * fc->code_factor,
8180 fc->pc_begin + ofs * fc->code_factor);
8181 fc->pc_begin += ofs * fc->code_factor;
8184 case DW_CFA_advance_loc4:
8185 ofs = byte_get (start, 4); start += 4;
8186 if (do_debug_frames_interp)
8187 frame_display_row (fc, &need_col_headers, &max_regs);
8189 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8190 ofs * fc->code_factor,
8191 fc->pc_begin + ofs * fc->code_factor);
8192 fc->pc_begin += ofs * fc->code_factor;
8195 case DW_CFA_offset_extended:
8198 if (! do_debug_frames_interp)
8199 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8200 reg, roffs * fc->data_factor);
8201 fc->col_type[reg] = DW_CFA_offset;
8202 fc->col_offset[reg] = roffs * fc->data_factor;
8205 case DW_CFA_restore_extended:
8207 if (! do_debug_frames_interp)
8208 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8209 fc->col_type[reg] = cie->col_type[reg];
8210 fc->col_offset[reg] = cie->col_offset[reg];
8213 case DW_CFA_undefined:
8215 if (! do_debug_frames_interp)
8216 printf (" DW_CFA_undefined: r%ld\n", reg);
8217 fc->col_type[reg] = DW_CFA_undefined;
8218 fc->col_offset[reg] = 0;
8221 case DW_CFA_same_value:
8223 if (! do_debug_frames_interp)
8224 printf (" DW_CFA_same_value: r%ld\n", reg);
8225 fc->col_type[reg] = DW_CFA_same_value;
8226 fc->col_offset[reg] = 0;
8229 case DW_CFA_register:
8232 if (! do_debug_frames_interp)
8233 printf (" DW_CFA_register: r%ld\n", reg);
8234 fc->col_type[reg] = DW_CFA_register;
8235 fc->col_offset[reg] = roffs;
8238 case DW_CFA_remember_state:
8239 if (! do_debug_frames_interp)
8240 printf (" DW_CFA_remember_state\n");
8241 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8242 rs->ncols = fc->ncols;
8243 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8244 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8245 memcpy (rs->col_type, fc->col_type, rs->ncols);
8246 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8247 rs->next = remembered_state;
8248 remembered_state = rs;
8251 case DW_CFA_restore_state:
8252 if (! do_debug_frames_interp)
8253 printf (" DW_CFA_restore_state\n");
8254 rs = remembered_state;
8255 remembered_state = rs->next;
8256 frame_need_space (fc, rs->ncols-1);
8257 memcpy (fc->col_type, rs->col_type, rs->ncols);
8258 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8259 free (rs->col_type);
8260 free (rs->col_offset);
8264 case DW_CFA_def_cfa:
8265 fc->cfa_reg = LEB ();
8266 fc->cfa_offset = LEB ();
8267 if (! do_debug_frames_interp)
8268 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8269 fc->cfa_reg, fc->cfa_offset);
8272 case DW_CFA_def_cfa_register:
8273 fc->cfa_reg = LEB ();
8274 if (! do_debug_frames_interp)
8275 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8278 case DW_CFA_def_cfa_offset:
8279 fc->cfa_offset = LEB ();
8280 if (! do_debug_frames_interp)
8281 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8285 if (! do_debug_frames_interp)
8286 printf (" DW_CFA_nop\n");
8289 #ifndef DW_CFA_GNU_window_save
8290 #define DW_CFA_GNU_window_save 0x2d
8292 case DW_CFA_GNU_window_save:
8293 if (! do_debug_frames_interp)
8294 printf (" DW_CFA_GNU_window_save\n");
8297 case DW_CFA_GNU_args_size:
8299 if (! do_debug_frames_interp)
8300 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8303 case DW_CFA_GNU_negative_offset_extended:
8306 frame_need_space (fc, reg);
8307 if (! do_debug_frames_interp)
8308 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8309 reg, l * fc->data_factor);
8310 fc->col_type[reg] = DW_CFA_offset;
8311 fc->col_offset[reg] = l * fc->data_factor;
8315 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8320 if (do_debug_frames_interp)
8321 frame_display_row (fc, &need_col_headers, &max_regs);
8336 display_debug_not_supported (section, start, file)
8337 Elf32_Internal_Shdr * section;
8338 unsigned char * start ATTRIBUTE_UNUSED;
8339 FILE * file ATTRIBUTE_UNUSED;
8341 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8342 SECTION_NAME (section));
8347 /* Pre-scan the .debug_info section to record the size of address.
8348 When dumping the .debug_line, we use that size information, assuming
8349 that all compilation units have the same address size. */
8351 prescan_debug_info (section, start, file)
8352 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8353 unsigned char * start;
8354 FILE * file ATTRIBUTE_UNUSED;
8356 DWARF2_External_CompUnit * external;
8358 external = (DWARF2_External_CompUnit *) start;
8360 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8364 /* A structure containing the name of a debug section and a pointer
8365 to a function that can decode it. The third field is a prescan
8366 function to be run over the section before displaying any of the
8370 const char * const name;
8371 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8372 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8376 { ".debug_abbrev", display_debug_abbrev, NULL },
8377 { ".debug_aranges", display_debug_aranges, NULL },
8378 { ".debug_frame", display_debug_frames, NULL },
8379 { ".debug_info", display_debug_info, prescan_debug_info },
8380 { ".debug_line", display_debug_lines, NULL },
8381 { ".debug_pubnames", display_debug_pubnames, NULL },
8382 { ".eh_frame", display_debug_frames, NULL },
8383 { ".debug_macinfo", display_debug_macinfo, NULL },
8384 { ".debug_str", display_debug_str, NULL },
8386 { ".debug_pubtypes", display_debug_not_supported, NULL },
8387 { ".debug_ranges", display_debug_not_supported, NULL },
8388 { ".debug_static_func", display_debug_not_supported, NULL },
8389 { ".debug_static_vars", display_debug_not_supported, NULL },
8390 { ".debug_types", display_debug_not_supported, NULL },
8391 { ".debug_weaknames", display_debug_not_supported, NULL }
8395 display_debug_section (section, file)
8396 Elf32_Internal_Shdr * section;
8399 char * name = SECTION_NAME (section);
8400 bfd_size_type length;
8401 unsigned char * start;
8404 length = section->sh_size;
8407 printf (_("\nSection '%s' has no debugging data.\n"), name);
8411 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8412 _("debug section data"));
8416 /* See if we know how to display the contents of this section. */
8417 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8418 name = ".debug_info";
8420 for (i = NUM_ELEM (debug_displays); i--;)
8421 if (strcmp (debug_displays[i].name, name) == 0)
8423 debug_displays[i].display (section, start, file);
8428 printf (_("Unrecognised debug section: %s\n"), name);
8432 /* If we loaded in the abbrev section at some point,
8433 we must release it here. */
8440 process_section_contents (file)
8443 Elf32_Internal_Shdr * section;
8449 /* Pre-scan the debug sections to find some debug information not
8450 present in some of them. For the .debug_line, we must find out the
8451 size of address (specified in .debug_info and .debug_aranges). */
8452 for (i = 0, section = section_headers;
8453 i < elf_header.e_shnum && i < num_dump_sects;
8456 char * name = SECTION_NAME (section);
8459 if (section->sh_size == 0)
8462 /* See if there is some pre-scan operation for this section. */
8463 for (j = NUM_ELEM (debug_displays); j--;)
8464 if (strcmp (debug_displays[j].name, name) == 0)
8466 if (debug_displays[j].prescan != NULL)
8468 bfd_size_type length;
8469 unsigned char * start;
8471 length = section->sh_size;
8472 start = ((unsigned char *)
8473 get_data (NULL, file, section->sh_offset, length,
8474 _("debug section data")));
8478 debug_displays[j].prescan (section, start, file);
8486 for (i = 0, section = section_headers;
8487 i < elf_header.e_shnum && i < num_dump_sects;
8490 #ifdef SUPPORT_DISASSEMBLY
8491 if (dump_sects[i] & DISASS_DUMP)
8492 disassemble_section (section, file);
8494 if (dump_sects[i] & HEX_DUMP)
8495 dump_section (section, file);
8497 if (dump_sects[i] & DEBUG_DUMP)
8498 display_debug_section (section, file);
8501 if (i < num_dump_sects)
8502 warn (_("Some sections were not dumped because they do not exist!\n"));
8508 process_mips_fpe_exception (mask)
8514 if (mask & OEX_FPU_INEX)
8515 fputs ("INEX", stdout), first = 0;
8516 if (mask & OEX_FPU_UFLO)
8517 printf ("%sUFLO", first ? "" : "|"), first = 0;
8518 if (mask & OEX_FPU_OFLO)
8519 printf ("%sOFLO", first ? "" : "|"), first = 0;
8520 if (mask & OEX_FPU_DIV0)
8521 printf ("%sDIV0", first ? "" : "|"), first = 0;
8522 if (mask & OEX_FPU_INVAL)
8523 printf ("%sINVAL", first ? "" : "|");
8526 fputs ("0", stdout);
8530 process_mips_specific (file)
8533 Elf_Internal_Dyn * entry;
8534 size_t liblist_offset = 0;
8535 size_t liblistno = 0;
8536 size_t conflictsno = 0;
8537 size_t options_offset = 0;
8538 size_t conflicts_offset = 0;
8540 /* We have a lot of special sections. Thanks SGI! */
8541 if (dynamic_segment == NULL)
8542 /* No information available. */
8545 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8546 switch (entry->d_tag)
8548 case DT_MIPS_LIBLIST:
8549 liblist_offset = entry->d_un.d_val - loadaddr;
8551 case DT_MIPS_LIBLISTNO:
8552 liblistno = entry->d_un.d_val;
8554 case DT_MIPS_OPTIONS:
8555 options_offset = entry->d_un.d_val - loadaddr;
8557 case DT_MIPS_CONFLICT:
8558 conflicts_offset = entry->d_un.d_val - loadaddr;
8560 case DT_MIPS_CONFLICTNO:
8561 conflictsno = entry->d_un.d_val;
8567 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8569 Elf32_External_Lib * elib;
8572 elib = ((Elf32_External_Lib *)
8573 get_data (NULL, file, liblist_offset,
8574 liblistno * sizeof (Elf32_External_Lib),
8578 printf ("\nSection '.liblist' contains %lu entries:\n",
8579 (unsigned long) liblistno);
8580 fputs (" Library Time Stamp Checksum Version Flags\n",
8583 for (cnt = 0; cnt < liblistno; ++cnt)
8590 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8591 time = BYTE_GET (elib[cnt].l_time_stamp);
8592 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8593 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8594 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8596 tmp = gmtime (&time);
8597 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8598 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8599 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8601 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
8602 dynamic_strings + liblist.l_name, timebuf,
8603 liblist.l_checksum, liblist.l_version);
8605 if (liblist.l_flags == 0)
8616 { " EXACT_MATCH", LL_EXACT_MATCH },
8617 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8618 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8619 { " EXPORTS", LL_EXPORTS },
8620 { " DELAY_LOAD", LL_DELAY_LOAD },
8621 { " DELTA", LL_DELTA }
8623 int flags = liblist.l_flags;
8627 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8629 if ((flags & l_flags_vals[fcnt].bit) != 0)
8631 fputs (l_flags_vals[fcnt].name, stdout);
8632 flags ^= l_flags_vals[fcnt].bit;
8635 printf (" %#x", (unsigned int) flags);
8645 if (options_offset != 0)
8647 Elf_External_Options * eopt;
8648 Elf_Internal_Shdr * sect = section_headers;
8649 Elf_Internal_Options * iopt;
8650 Elf_Internal_Options * option;
8654 /* Find the section header so that we get the size. */
8655 while (sect->sh_type != SHT_MIPS_OPTIONS)
8658 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8659 sect->sh_size, _("options"));
8662 iopt = ((Elf_Internal_Options *)
8663 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8666 error (_("Out of memory"));
8673 while (offset < sect->sh_size)
8675 Elf_External_Options * eoption;
8677 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8679 option->kind = BYTE_GET (eoption->kind);
8680 option->size = BYTE_GET (eoption->size);
8681 option->section = BYTE_GET (eoption->section);
8682 option->info = BYTE_GET (eoption->info);
8684 offset += option->size;
8690 printf (_("\nSection '%s' contains %d entries:\n"),
8691 SECTION_NAME (sect), cnt);
8699 switch (option->kind)
8702 /* This shouldn't happen. */
8703 printf (" NULL %d %lx", option->section, option->info);
8706 printf (" REGINFO ");
8707 if (elf_header.e_machine == EM_MIPS)
8710 Elf32_External_RegInfo * ereg;
8711 Elf32_RegInfo reginfo;
8713 ereg = (Elf32_External_RegInfo *) (option + 1);
8714 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8715 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8716 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8717 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8718 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8719 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8721 printf ("GPR %08lx GP 0x%lx\n",
8723 (unsigned long) reginfo.ri_gp_value);
8724 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8725 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8726 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8731 Elf64_External_RegInfo * ereg;
8732 Elf64_Internal_RegInfo reginfo;
8734 ereg = (Elf64_External_RegInfo *) (option + 1);
8735 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8736 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8737 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8738 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8739 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8740 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8742 printf ("GPR %08lx GP 0x",
8743 reginfo.ri_gprmask);
8744 printf_vma (reginfo.ri_gp_value);
8747 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8748 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8749 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8753 case ODK_EXCEPTIONS:
8754 fputs (" EXCEPTIONS fpe_min(", stdout);
8755 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8756 fputs (") fpe_max(", stdout);
8757 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8758 fputs (")", stdout);
8760 if (option->info & OEX_PAGE0)
8761 fputs (" PAGE0", stdout);
8762 if (option->info & OEX_SMM)
8763 fputs (" SMM", stdout);
8764 if (option->info & OEX_FPDBUG)
8765 fputs (" FPDBUG", stdout);
8766 if (option->info & OEX_DISMISS)
8767 fputs (" DISMISS", stdout);
8770 fputs (" PAD ", stdout);
8771 if (option->info & OPAD_PREFIX)
8772 fputs (" PREFIX", stdout);
8773 if (option->info & OPAD_POSTFIX)
8774 fputs (" POSTFIX", stdout);
8775 if (option->info & OPAD_SYMBOL)
8776 fputs (" SYMBOL", stdout);
8779 fputs (" HWPATCH ", stdout);
8780 if (option->info & OHW_R4KEOP)
8781 fputs (" R4KEOP", stdout);
8782 if (option->info & OHW_R8KPFETCH)
8783 fputs (" R8KPFETCH", stdout);
8784 if (option->info & OHW_R5KEOP)
8785 fputs (" R5KEOP", stdout);
8786 if (option->info & OHW_R5KCVTL)
8787 fputs (" R5KCVTL", stdout);
8790 fputs (" FILL ", stdout);
8791 /* XXX Print content of info word? */
8794 fputs (" TAGS ", stdout);
8795 /* XXX Print content of info word? */
8798 fputs (" HWAND ", stdout);
8799 if (option->info & OHWA0_R4KEOP_CHECKED)
8800 fputs (" R4KEOP_CHECKED", stdout);
8801 if (option->info & OHWA0_R4KEOP_CLEAN)
8802 fputs (" R4KEOP_CLEAN", stdout);
8805 fputs (" HWOR ", stdout);
8806 if (option->info & OHWA0_R4KEOP_CHECKED)
8807 fputs (" R4KEOP_CHECKED", stdout);
8808 if (option->info & OHWA0_R4KEOP_CLEAN)
8809 fputs (" R4KEOP_CLEAN", stdout);
8812 printf (" GP_GROUP %#06lx self-contained %#06lx",
8813 option->info & OGP_GROUP,
8814 (option->info & OGP_SELF) >> 16);
8817 printf (" IDENT %#06lx self-contained %#06lx",
8818 option->info & OGP_GROUP,
8819 (option->info & OGP_SELF) >> 16);
8822 /* This shouldn't happen. */
8823 printf (" %3d ??? %d %lx",
8824 option->kind, option->section, option->info);
8828 len = sizeof (* eopt);
8829 while (len < option->size)
8830 if (((char *) option)[len] >= ' '
8831 && ((char *) option)[len] < 0x7f)
8832 printf ("%c", ((char *) option)[len++]);
8834 printf ("\\%03o", ((char *) option)[len++]);
8836 fputs ("\n", stdout);
8844 if (conflicts_offset != 0 && conflictsno != 0)
8846 Elf32_Conflict * iconf;
8849 if (dynamic_symbols == NULL)
8851 error (_("conflict list with without table"));
8855 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
8858 error (_("Out of memory"));
8864 Elf32_External_Conflict * econf32;
8866 econf32 = ((Elf32_External_Conflict *)
8867 get_data (NULL, file, conflicts_offset,
8868 conflictsno * sizeof (* econf32),
8873 for (cnt = 0; cnt < conflictsno; ++cnt)
8874 iconf[cnt] = BYTE_GET (econf32[cnt]);
8880 Elf64_External_Conflict * econf64;
8882 econf64 = ((Elf64_External_Conflict *)
8883 get_data (NULL, file, conflicts_offset,
8884 conflictsno * sizeof (* econf64),
8889 for (cnt = 0; cnt < conflictsno; ++cnt)
8890 iconf[cnt] = BYTE_GET (econf64[cnt]);
8895 printf (_("\nSection '.conflict' contains %ld entries:\n"),
8896 (long) conflictsno);
8897 puts (_(" Num: Index Value Name"));
8899 for (cnt = 0; cnt < conflictsno; ++cnt)
8901 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
8903 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
8904 print_vma (psym->st_value, FULL_HEX);
8905 printf (" %s\n", dynamic_strings + psym->st_name);
8915 get_note_type (e_type)
8918 static char buff[64];
8922 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
8923 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
8924 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
8925 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
8926 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
8927 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
8928 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
8929 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
8930 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8931 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8932 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8934 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
8939 /* Note that by the ELF standard, the name field is already null byte
8940 terminated, and namesz includes the terminating null byte.
8941 I.E. the value of namesz for the name "FSF" is 4.
8943 If the value of namesz is zero, there is no name present. */
8945 process_note (pnote)
8946 Elf32_Internal_Note * pnote;
8948 printf (" %s\t\t0x%08lx\t%s\n",
8949 pnote->namesz ? pnote->namedata : "(NONE)",
8950 pnote->descsz, get_note_type (pnote->type));
8956 process_corefile_note_segment (file, offset, length)
8961 Elf_External_Note * pnotes;
8962 Elf_External_Note * external;
8968 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
8975 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8976 (unsigned long) offset, (unsigned long) length);
8977 printf (_(" Owner\t\tData size\tDescription\n"));
8979 while (external < (Elf_External_Note *)((char *) pnotes + length))
8981 Elf32_Internal_Note inote;
8984 inote.type = BYTE_GET (external->type);
8985 inote.namesz = BYTE_GET (external->namesz);
8986 inote.namedata = external->name;
8987 inote.descsz = BYTE_GET (external->descsz);
8988 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
8989 inote.descpos = offset + (inote.descdata - (char *) pnotes);
8991 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
8993 /* Verify that name is null terminated. It appears that at least
8994 one version of Linux (RedHat 6.0) generates corefiles that don't
8995 comply with the ELF spec by failing to include the null byte in
8997 if (inote.namedata[inote.namesz] != '\0')
8999 temp = malloc (inote.namesz + 1);
9003 error (_("Out of memory\n"));
9008 strncpy (temp, inote.namedata, inote.namesz);
9009 temp[inote.namesz] = 0;
9011 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9012 inote.namedata = temp;
9015 res &= process_note (& inote);
9030 process_corefile_note_segments (file)
9033 Elf_Internal_Phdr * program_headers;
9034 Elf_Internal_Phdr * segment;
9038 program_headers = (Elf_Internal_Phdr *) malloc
9039 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9041 if (program_headers == NULL)
9043 error (_("Out of memory\n"));
9048 i = get_32bit_program_headers (file, program_headers);
9050 i = get_64bit_program_headers (file, program_headers);
9054 free (program_headers);
9058 for (i = 0, segment = program_headers;
9059 i < elf_header.e_phnum;
9062 if (segment->p_type == PT_NOTE)
9063 res &= process_corefile_note_segment (file,
9064 (bfd_vma) segment->p_offset,
9065 (bfd_vma) segment->p_filesz);
9068 free (program_headers);
9074 process_corefile_contents (file)
9077 /* If we have not been asked to display the notes then do nothing. */
9081 /* If file is not a core file then exit. */
9082 if (elf_header.e_type != ET_CORE)
9085 /* No program headers means no NOTE segment. */
9086 if (elf_header.e_phnum == 0)
9088 printf (_("No note segments present in the core file.\n"));
9092 return process_corefile_note_segments (file);
9096 process_arch_specific (file)
9102 switch (elf_header.e_machine)
9105 case EM_MIPS_RS3_LE:
9106 return process_mips_specific (file);
9115 get_file_header (file)
9118 /* Read in the identity array. */
9119 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9122 /* Determine how to read the rest of the header. */
9123 switch (elf_header.e_ident [EI_DATA])
9125 default: /* fall through */
9126 case ELFDATANONE: /* fall through */
9127 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9128 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9131 /* For now we only support 32 bit and 64 bit ELF files. */
9132 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9134 /* Read in the rest of the header. */
9137 Elf32_External_Ehdr ehdr32;
9139 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9142 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9143 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9144 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9145 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9146 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9147 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9148 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9149 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9150 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9151 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9152 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9153 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9154 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9158 Elf64_External_Ehdr ehdr64;
9160 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9161 we will not be able to cope with the 64bit data found in
9162 64 ELF files. Detect this now and abort before we start
9163 overwritting things. */
9164 if (sizeof (bfd_vma) < 8)
9166 error (_("This instance of readelf has been built without support for a\n\
9167 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9171 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9174 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9175 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9176 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9177 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
9178 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
9179 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
9180 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9181 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9182 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9183 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9184 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9185 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9186 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9193 process_file (file_name)
9197 struct stat statbuf;
9200 if (stat (file_name, & statbuf) < 0)
9202 error (_("Cannot stat input file %s.\n"), file_name);
9206 file = fopen (file_name, "rb");
9209 error (_("Input file %s not found.\n"), file_name);
9213 if (! get_file_header (file))
9215 error (_("%s: Failed to read file header\n"), file_name);
9220 /* Initialise per file variables. */
9221 for (i = NUM_ELEM (version_info); i--;)
9222 version_info[i] = 0;
9224 for (i = NUM_ELEM (dynamic_info); i--;)
9225 dynamic_info[i] = 0;
9227 /* Process the file. */
9229 printf (_("\nFile: %s\n"), file_name);
9231 if (! process_file_header ())
9237 process_section_headers (file);
9239 process_program_headers (file);
9241 process_dynamic_segment (file);
9243 process_relocs (file);
9245 process_unwind (file);
9247 process_symbol_table (file);
9249 process_syminfo (file);
9251 process_version_sections (file);
9253 process_section_contents (file);
9255 process_corefile_contents (file);
9257 process_arch_specific (file);
9261 if (section_headers)
9263 free (section_headers);
9264 section_headers = NULL;
9269 free (string_table);
9270 string_table = NULL;
9271 string_table_length = 0;
9274 if (dynamic_strings)
9276 free (dynamic_strings);
9277 dynamic_strings = NULL;
9280 if (dynamic_symbols)
9282 free (dynamic_symbols);
9283 dynamic_symbols = NULL;
9284 num_dynamic_syms = 0;
9287 if (dynamic_syminfo)
9289 free (dynamic_syminfo);
9290 dynamic_syminfo = NULL;
9296 #ifdef SUPPORT_DISASSEMBLY
9297 /* Needed by the i386 disassembler. For extra credit, someone could
9298 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9302 print_address (unsigned int addr, FILE * outfile)
9304 fprintf (outfile,"0x%8.8x", addr);
9307 /* Needed by the i386 disassembler. */
9309 db_task_printsym (unsigned int addr)
9311 print_address (addr, stderr);
9315 int main PARAMS ((int, char **));
9324 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9325 setlocale (LC_MESSAGES, "");
9327 #if defined (HAVE_SETLOCALE)
9328 setlocale (LC_CTYPE, "");
9330 bindtextdomain (PACKAGE, LOCALEDIR);
9331 textdomain (PACKAGE);
9333 parse_args (argc, argv);
9335 if (optind < (argc - 1))
9339 while (optind < argc)
9340 err |= process_file (argv [optind ++]);
9342 if (dump_sects != NULL)