1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
56 #include "elf/alpha.h"
59 #include "elf/sparc.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
70 #include "elf/mcore.h"
77 #include "elf/x86-64.h"
83 char * program_name = "readelf";
84 unsigned int dynamic_addr;
85 bfd_size_type dynamic_size;
86 unsigned int rela_addr;
87 unsigned int rela_size;
88 char * dynamic_strings;
90 unsigned long string_table_length;
91 unsigned long num_dynamic_syms;
92 Elf_Internal_Sym * dynamic_symbols;
93 Elf_Internal_Syminfo * dynamic_syminfo;
94 unsigned long dynamic_syminfo_offset;
95 unsigned int dynamic_syminfo_nent;
96 char program_interpreter [64];
97 int dynamic_info[DT_JMPREL + 1];
100 Elf_Internal_Ehdr elf_header;
101 Elf_Internal_Shdr * section_headers;
102 Elf_Internal_Dyn * dynamic_segment;
110 int do_using_dynamic;
118 int do_debug_abbrevs;
120 int do_debug_pubnames;
121 int do_debug_aranges;
123 int do_debug_frames_interp;
124 int do_debug_macinfo;
129 /* A dynamic array of flags indicating which sections require dumping. */
130 char * dump_sects = NULL;
131 unsigned int num_dump_sects = 0;
133 #define HEX_DUMP (1 << 0)
134 #define DISASS_DUMP (1 << 1)
135 #define DEBUG_DUMP (1 << 2)
137 /* How to rpint a vma value. */
138 typedef enum print_mode
150 /* Forward declarations for dumb compilers. */
151 static void print_vma PARAMS ((bfd_vma, print_mode));
152 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
153 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
154 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
155 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
156 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
157 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
158 static const char * get_dynamic_type PARAMS ((unsigned long));
159 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
160 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
161 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
162 static char * get_file_type PARAMS ((unsigned));
163 static char * get_machine_name PARAMS ((unsigned));
164 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
165 static char * get_machine_flags PARAMS ((unsigned, unsigned));
166 static const char * get_mips_segment_type PARAMS ((unsigned long));
167 static const char * get_parisc_segment_type PARAMS ((unsigned long));
168 static const char * get_ia64_segment_type PARAMS ((unsigned long));
169 static const char * get_segment_type PARAMS ((unsigned long));
170 static const char * get_mips_section_type_name PARAMS ((unsigned int));
171 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
172 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
173 static const char * get_section_type_name PARAMS ((unsigned int));
174 static const char * get_symbol_binding PARAMS ((unsigned int));
175 static const char * get_symbol_type PARAMS ((unsigned int));
176 static const char * get_symbol_visibility PARAMS ((unsigned int));
177 static const char * get_symbol_index_type PARAMS ((unsigned int));
178 static const char * get_dynamic_flags PARAMS ((bfd_vma));
179 static void usage PARAMS ((void));
180 static void parse_args PARAMS ((int, char **));
181 static int process_file_header PARAMS ((void));
182 static int process_program_headers PARAMS ((FILE *));
183 static int process_section_headers PARAMS ((FILE *));
184 static int process_unwind PARAMS ((FILE *));
185 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
186 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
187 static int process_dynamic_segment PARAMS ((FILE *));
188 static int process_symbol_table PARAMS ((FILE *));
189 static int process_syminfo PARAMS ((FILE *));
190 static int process_section_contents PARAMS ((FILE *));
191 static void process_mips_fpe_exception PARAMS ((int));
192 static int process_mips_specific PARAMS ((FILE *));
193 static int process_file PARAMS ((char *));
194 static int process_relocs PARAMS ((FILE *));
195 static int process_version_sections PARAMS ((FILE *));
196 static char * get_ver_flags PARAMS ((unsigned int));
197 static int get_32bit_section_headers PARAMS ((FILE *));
198 static int get_64bit_section_headers PARAMS ((FILE *));
199 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
200 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
201 static int get_file_header PARAMS ((FILE *));
202 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
203 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
204 static const char * get_elf_section_flags PARAMS ((bfd_vma));
205 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
206 static int get_32bit_dynamic_segment PARAMS ((FILE *));
207 static int get_64bit_dynamic_segment PARAMS ((FILE *));
208 #ifdef SUPPORT_DISASSEMBLY
209 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
211 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
212 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
213 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
214 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
215 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
216 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
217 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
218 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
219 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
220 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
221 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
222 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
223 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
224 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
225 static void reset_state_machine PARAMS ((int));
226 static char * get_TAG_name PARAMS ((unsigned long));
227 static char * get_AT_name PARAMS ((unsigned long));
228 static char * get_FORM_name PARAMS ((unsigned long));
229 static void free_abbrevs PARAMS ((void));
230 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
231 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
232 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
233 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
234 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
235 static void request_dump PARAMS ((unsigned int, char));
236 static const char * get_elf_class PARAMS ((unsigned char));
237 static const char * get_data_encoding PARAMS ((unsigned char));
238 static const char * get_osabi_name PARAMS ((unsigned char));
239 static int guess_is_rela PARAMS ((unsigned long));
240 static char * get_note_type PARAMS ((unsigned int));
241 static int process_note PARAMS ((Elf32_Internal_Note *));
242 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
243 static int process_corefile_note_segments PARAMS ((FILE *));
244 static int process_corefile_contents PARAMS ((FILE *));
245 static int process_arch_specific PARAMS ((FILE *));
247 typedef int Elf32_Word;
255 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
256 ((X)->sh_name >= string_table_length \
257 ? "<corrupt>" : string_table + (X)->sh_name))
259 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
261 #define BYTE_GET(field) byte_get (field, sizeof (field))
263 /* If we can support a 64 bit data type then BFD64 should be defined
264 and sizeof (bfd_vma) == 8. In this case when translating from an
265 external 8 byte field to an internal field, we can assume that the
266 internal field is also 8 bytes wide and so we can extract all the data.
267 If, however, BFD64 is not defined, then we must assume that the
268 internal data structure only has 4 byte wide fields that are the
269 equivalent of the 8 byte wide external counterparts, and so we must
270 truncate the data. */
272 #define BYTE_GET8(field) byte_get (field, -8)
274 #define BYTE_GET8(field) byte_get (field, 8)
277 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
279 #define GET_ELF_SYMBOLS(file, offset, size) \
280 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
281 : get_64bit_elf_symbols (file, offset, size))
285 error VPARAMS ((const char *message, ...))
287 VA_OPEN (args, message);
288 VA_FIXEDARG (args, const char *, message);
290 fprintf (stderr, _("%s: Error: "), program_name);
291 vfprintf (stderr, message, args);
296 warn VPARAMS ((const char *message, ...))
298 VA_OPEN (args, message);
299 VA_FIXEDARG (args, const char *, message);
301 fprintf (stderr, _("%s: Warning: "), program_name);
302 vfprintf (stderr, message, args);
306 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
309 get_data (var, file, offset, size, reason)
321 if (fseek (file, offset, SEEK_SET))
323 error (_("Unable to seek to %x for %s\n"), offset, reason);
330 mvar = (PTR) malloc (size);
334 error (_("Out of memory allocating %d bytes for %s\n"),
340 if (fread (mvar, size, 1, file) != 1)
342 error (_("Unable to read in %d bytes of %s\n"), size, reason);
352 byte_get_little_endian (field, size)
353 unsigned char * field;
362 return ((unsigned int) (field [0]))
363 | (((unsigned int) (field [1])) << 8);
367 /* We want to extract data from an 8 byte wide field and
368 place it into a 4 byte wide field. Since this is a little
369 endian source we can juts use the 4 byte extraction code. */
373 return ((unsigned long) (field [0]))
374 | (((unsigned long) (field [1])) << 8)
375 | (((unsigned long) (field [2])) << 16)
376 | (((unsigned long) (field [3])) << 24);
381 /* This is a special case, generated by the BYTE_GET8 macro.
382 It means that we are loading an 8 byte value from a field
383 in an external structure into an 8 byte value in a field
384 in an internal strcuture. */
385 return ((bfd_vma) (field [0]))
386 | (((bfd_vma) (field [1])) << 8)
387 | (((bfd_vma) (field [2])) << 16)
388 | (((bfd_vma) (field [3])) << 24)
389 | (((bfd_vma) (field [4])) << 32)
390 | (((bfd_vma) (field [5])) << 40)
391 | (((bfd_vma) (field [6])) << 48)
392 | (((bfd_vma) (field [7])) << 56);
395 error (_("Unhandled data length: %d\n"), size);
400 /* Print a VMA value. */
402 print_vma (vma, mode)
412 case FULL_HEX: printf ("0x"); /* drop through */
413 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
414 case PREFIX_HEX: printf ("0x"); /* drop through */
415 case HEX: printf ("%lx", (unsigned long) vma); break;
416 case DEC: printf ("%ld", (unsigned long) vma); break;
417 case DEC_5: printf ("%5ld", (long) vma); break;
418 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
439 #if BFD_HOST_64BIT_LONG
442 if (_bfd_int64_high (vma))
443 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
445 printf ("%lx", _bfd_int64_low (vma));
450 #if BFD_HOST_64BIT_LONG
453 if (_bfd_int64_high (vma))
455 printf ("++%ld", _bfd_int64_low (vma));
457 printf ("%ld", _bfd_int64_low (vma));
462 #if BFD_HOST_64BIT_LONG
463 printf ("%5ld", vma);
465 if (_bfd_int64_high (vma))
467 printf ("++%ld", _bfd_int64_low (vma));
469 printf ("%5ld", _bfd_int64_low (vma));
474 #if BFD_HOST_64BIT_LONG
477 if (_bfd_int64_high (vma))
479 printf ("++%lu", _bfd_int64_low (vma));
481 printf ("%lu", _bfd_int64_low (vma));
490 byte_get_big_endian (field, size)
491 unsigned char * field;
500 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
503 return ((unsigned long) (field [3]))
504 | (((unsigned long) (field [2])) << 8)
505 | (((unsigned long) (field [1])) << 16)
506 | (((unsigned long) (field [0])) << 24);
510 /* Although we are extracing data from an 8 byte wide field, we
511 are returning only 4 bytes of data. */
512 return ((unsigned long) (field [7]))
513 | (((unsigned long) (field [6])) << 8)
514 | (((unsigned long) (field [5])) << 16)
515 | (((unsigned long) (field [4])) << 24);
519 /* This is a special case, generated by the BYTE_GET8 macro.
520 It means that we are loading an 8 byte value from a field
521 in an external structure into an 8 byte value in a field
522 in an internal strcuture. */
523 return ((bfd_vma) (field [7]))
524 | (((bfd_vma) (field [6])) << 8)
525 | (((bfd_vma) (field [5])) << 16)
526 | (((bfd_vma) (field [4])) << 24)
527 | (((bfd_vma) (field [3])) << 32)
528 | (((bfd_vma) (field [2])) << 40)
529 | (((bfd_vma) (field [1])) << 48)
530 | (((bfd_vma) (field [0])) << 56);
534 error (_("Unhandled data length: %d\n"), size);
539 /* Guess the relocation size commonly used by the specific machines. */
542 guess_is_rela (e_machine)
543 unsigned long e_machine;
547 /* Targets that use REL relocations. */
560 /* Targets that use RELA relocations. */
574 case EM_CYGNUS_MN10200:
576 case EM_CYGNUS_MN10300:
611 warn (_("Don't know about relocations on this machine architecture\n"));
617 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
619 unsigned long rel_offset;
620 unsigned long rel_size;
621 Elf_Internal_Rela **relasp;
622 unsigned long *nrelasp;
624 Elf_Internal_Rela *relas;
625 unsigned long nrelas;
630 Elf32_External_Rela * erelas;
632 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
633 rel_size, _("relocs"));
637 nrelas = rel_size / sizeof (Elf32_External_Rela);
639 relas = (Elf_Internal_Rela *)
640 malloc (nrelas * sizeof (Elf_Internal_Rela));
644 error(_("out of memory parsing relocs"));
648 for (i = 0; i < nrelas; i++)
650 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
651 relas[i].r_info = BYTE_GET (erelas[i].r_info);
652 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
659 Elf64_External_Rela * erelas;
661 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
662 rel_size, _("relocs"));
666 nrelas = rel_size / sizeof (Elf64_External_Rela);
668 relas = (Elf_Internal_Rela *)
669 malloc (nrelas * sizeof (Elf_Internal_Rela));
673 error(_("out of memory parsing relocs"));
677 for (i = 0; i < nrelas; i++)
679 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
680 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
681 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
692 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
694 unsigned long rel_offset;
695 unsigned long rel_size;
696 Elf_Internal_Rel **relsp;
697 unsigned long *nrelsp;
699 Elf_Internal_Rel *rels;
705 Elf32_External_Rel * erels;
707 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
708 rel_size, _("relocs"));
712 nrels = rel_size / sizeof (Elf32_External_Rel);
714 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
718 error(_("out of memory parsing relocs"));
722 for (i = 0; i < nrels; i++)
724 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
725 rels[i].r_info = BYTE_GET (erels[i].r_info);
732 Elf64_External_Rel * erels;
734 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
735 rel_size, _("relocs"));
739 nrels = rel_size / sizeof (Elf64_External_Rel);
741 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
745 error(_("out of memory parsing relocs"));
749 for (i = 0; i < nrels; i++)
751 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
752 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
762 /* Display the contents of the relocation data found at the specified offset. */
764 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
766 unsigned long rel_offset;
767 unsigned long rel_size;
768 Elf_Internal_Sym * symtab;
774 Elf_Internal_Rel * rels;
775 Elf_Internal_Rela * relas;
778 if (is_rela == UNKNOWN)
779 is_rela = guess_is_rela (elf_header.e_machine);
783 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
788 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
796 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
799 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
805 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
808 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
811 for (i = 0; i < rel_size; i++)
816 bfd_vma symtab_index;
821 offset = relas [i].r_offset;
822 info = relas [i].r_info;
826 offset = rels [i].r_offset;
827 info = rels [i].r_info;
832 type = ELF32_R_TYPE (info);
833 symtab_index = ELF32_R_SYM (info);
837 if (elf_header.e_machine == EM_SPARCV9)
838 type = ELF64_R_TYPE_ID (info);
840 type = ELF64_R_TYPE (info);
841 /* The #ifdef BFD64 below is to prevent a compile time warning.
842 We know that if we do not have a 64 bit data type that we
843 will never execute this code anyway. */
845 symtab_index = ELF64_R_SYM (info);
851 #ifdef _bfd_int64_low
852 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
854 printf ("%8.8lx %8.8lx ", offset, info);
859 #ifdef _bfd_int64_low
860 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
861 _bfd_int64_high (offset),
862 _bfd_int64_low (offset),
863 _bfd_int64_high (info),
864 _bfd_int64_low (info));
866 printf ("%16.16lx %16.16lx ", offset, info);
870 switch (elf_header.e_machine)
878 rtype = elf_m32r_reloc_type (type);
883 rtype = elf_i386_reloc_type (type);
887 rtype = elf_m68k_reloc_type (type);
891 rtype = elf_i960_reloc_type (type);
896 rtype = elf_avr_reloc_type (type);
903 rtype = elf_sparc_reloc_type (type);
908 rtype = v850_reloc_type (type);
913 rtype = elf_d10v_reloc_type (type);
918 rtype = elf_d30v_reloc_type (type);
922 rtype = elf_sh_reloc_type (type);
926 case EM_CYGNUS_MN10300:
927 rtype = elf_mn10300_reloc_type (type);
931 case EM_CYGNUS_MN10200:
932 rtype = elf_mn10200_reloc_type (type);
937 rtype = elf_fr30_reloc_type (type);
941 rtype = elf_mcore_reloc_type (type);
946 rtype = elf_ppc_reloc_type (type);
951 rtype = elf_mips_reloc_type (type);
955 rtype = elf_alpha_reloc_type (type);
959 rtype = elf_arm_reloc_type (type);
963 rtype = elf_arc_reloc_type (type);
967 rtype = elf_hppa_reloc_type (type);
973 rtype = elf_h8_reloc_type (type);
978 rtype = elf_pj_reloc_type (type);
981 rtype = elf_ia64_reloc_type (type);
985 rtype = elf_cris_reloc_type (type);
989 rtype = elf_i860_reloc_type (type);
993 rtype = elf_x86_64_reloc_type (type);
998 rtype = elf_s390_reloc_type (type);
1003 #ifdef _bfd_int64_low
1004 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
1006 printf (_("unrecognised: %-7lx"), type);
1009 printf ("%-21.21s", rtype);
1013 if (symtab == NULL || symtab_index >= nsyms)
1014 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1017 Elf_Internal_Sym * psym;
1019 psym = symtab + symtab_index;
1022 print_vma (psym->st_value, LONG_HEX);
1025 if (psym->st_name == 0)
1027 SECTION_NAME (section_headers + psym->st_shndx));
1028 else if (strtab == NULL)
1029 printf (_("<string table index %3ld>"), psym->st_name);
1031 printf ("%-25.25s", strtab + psym->st_name);
1034 printf (" + %lx", (unsigned long) relas [i].r_addend);
1039 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1040 print_vma (relas[i].r_addend, LONG_HEX);
1043 if (elf_header.e_machine == EM_SPARCV9
1044 && !strcmp (rtype, "R_SPARC_OLO10"))
1045 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1059 get_mips_dynamic_type (type)
1064 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1065 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1066 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1067 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1068 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1069 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1070 case DT_MIPS_MSYM: return "MIPS_MSYM";
1071 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1072 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1073 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1074 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1075 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1076 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1077 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1078 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1079 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1080 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1081 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1082 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1083 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1084 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1085 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1086 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1087 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1088 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1089 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1090 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1091 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1092 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1093 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1094 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1095 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1096 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1097 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1098 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1099 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1100 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1101 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1102 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1103 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1104 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1105 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1106 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1113 get_sparc64_dynamic_type (type)
1118 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1125 get_parisc_dynamic_type (type)
1130 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1131 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1132 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1133 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1134 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1135 case DT_HP_PREINIT: return "HP_PREINIT";
1136 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1137 case DT_HP_NEEDED: return "HP_NEEDED";
1138 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1139 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1140 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1141 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1142 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1149 get_dynamic_type (type)
1152 static char buff [32];
1156 case DT_NULL: return "NULL";
1157 case DT_NEEDED: return "NEEDED";
1158 case DT_PLTRELSZ: return "PLTRELSZ";
1159 case DT_PLTGOT: return "PLTGOT";
1160 case DT_HASH: return "HASH";
1161 case DT_STRTAB: return "STRTAB";
1162 case DT_SYMTAB: return "SYMTAB";
1163 case DT_RELA: return "RELA";
1164 case DT_RELASZ: return "RELASZ";
1165 case DT_RELAENT: return "RELAENT";
1166 case DT_STRSZ: return "STRSZ";
1167 case DT_SYMENT: return "SYMENT";
1168 case DT_INIT: return "INIT";
1169 case DT_FINI: return "FINI";
1170 case DT_SONAME: return "SONAME";
1171 case DT_RPATH: return "RPATH";
1172 case DT_SYMBOLIC: return "SYMBOLIC";
1173 case DT_REL: return "REL";
1174 case DT_RELSZ: return "RELSZ";
1175 case DT_RELENT: return "RELENT";
1176 case DT_PLTREL: return "PLTREL";
1177 case DT_DEBUG: return "DEBUG";
1178 case DT_TEXTREL: return "TEXTREL";
1179 case DT_JMPREL: return "JMPREL";
1180 case DT_BIND_NOW: return "BIND_NOW";
1181 case DT_INIT_ARRAY: return "INIT_ARRAY";
1182 case DT_FINI_ARRAY: return "FINI_ARRAY";
1183 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1184 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1185 case DT_RUNPATH: return "RUNPATH";
1186 case DT_FLAGS: return "FLAGS";
1188 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1189 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1191 case DT_CHECKSUM: return "CHECKSUM";
1192 case DT_PLTPADSZ: return "PLTPADSZ";
1193 case DT_MOVEENT: return "MOVEENT";
1194 case DT_MOVESZ: return "MOVESZ";
1195 case DT_FEATURE: return "FEATURE";
1196 case DT_POSFLAG_1: return "POSFLAG_1";
1197 case DT_SYMINSZ: return "SYMINSZ";
1198 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1200 case DT_ADDRRNGLO: return "ADDRRNGLO";
1201 case DT_CONFIG: return "CONFIG";
1202 case DT_DEPAUDIT: return "DEPAUDIT";
1203 case DT_AUDIT: return "AUDIT";
1204 case DT_PLTPAD: return "PLTPAD";
1205 case DT_MOVETAB: return "MOVETAB";
1206 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1208 case DT_VERSYM: return "VERSYM";
1210 case DT_RELACOUNT: return "RELACOUNT";
1211 case DT_RELCOUNT: return "RELCOUNT";
1212 case DT_FLAGS_1: return "FLAGS_1";
1213 case DT_VERDEF: return "VERDEF";
1214 case DT_VERDEFNUM: return "VERDEFNUM";
1215 case DT_VERNEED: return "VERNEED";
1216 case DT_VERNEEDNUM: return "VERNEEDNUM";
1218 case DT_AUXILIARY: return "AUXILIARY";
1219 case DT_USED: return "USED";
1220 case DT_FILTER: return "FILTER";
1223 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1225 const char * result;
1227 switch (elf_header.e_machine)
1230 case EM_MIPS_RS3_LE:
1231 result = get_mips_dynamic_type (type);
1234 result = get_sparc64_dynamic_type (type);
1244 sprintf (buff, _("Processor Specific: %lx"), type);
1246 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1248 const char * result;
1250 switch (elf_header.e_machine)
1253 result = get_parisc_dynamic_type (type);
1263 sprintf (buff, _("Operating System specific: %lx"), type);
1266 sprintf (buff, _("<unknown>: %lx"), type);
1273 get_file_type (e_type)
1276 static char buff [32];
1280 case ET_NONE: return _("NONE (None)");
1281 case ET_REL: return _("REL (Relocatable file)");
1282 case ET_EXEC: return _("EXEC (Executable file)");
1283 case ET_DYN: return _("DYN (Shared object file)");
1284 case ET_CORE: return _("CORE (Core file)");
1287 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1288 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1289 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1290 sprintf (buff, _("OS Specific: (%x)"), e_type);
1292 sprintf (buff, _("<unknown>: %x"), e_type);
1298 get_machine_name (e_machine)
1301 static char buff [64]; /* XXX */
1305 case EM_NONE: return _("None");
1306 case EM_M32: return "WE32100";
1307 case EM_SPARC: return "Sparc";
1308 case EM_386: return "Intel 80386";
1309 case EM_68K: return "MC68000";
1310 case EM_88K: return "MC88000";
1311 case EM_486: return "Intel 80486";
1312 case EM_860: return "Intel 80860";
1313 case EM_MIPS: return "MIPS R3000";
1314 case EM_S370: return "IBM System/370";
1315 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1316 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1317 case EM_PARISC: return "HPPA";
1318 case EM_PPC_OLD: return "Power PC (old)";
1319 case EM_SPARC32PLUS: return "Sparc v8+" ;
1320 case EM_960: return "Intel 90860";
1321 case EM_PPC: return "PowerPC";
1322 case EM_V800: return "NEC V800";
1323 case EM_FR20: return "Fujitsu FR20";
1324 case EM_RH32: return "TRW RH32";
1325 case EM_MCORE: return "MCORE";
1326 case EM_ARM: return "ARM";
1327 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1328 case EM_SH: return "Hitachi SH";
1329 case EM_SPARCV9: return "Sparc v9";
1330 case EM_TRICORE: return "Siemens Tricore";
1331 case EM_ARC: return "ARC";
1332 case EM_H8_300: return "Hitachi H8/300";
1333 case EM_H8_300H: return "Hitachi H8/300H";
1334 case EM_H8S: return "Hitachi H8S";
1335 case EM_H8_500: return "Hitachi H8/500";
1336 case EM_IA_64: return "Intel IA-64";
1337 case EM_MIPS_X: return "Stanford MIPS-X";
1338 case EM_COLDFIRE: return "Motorola Coldfire";
1339 case EM_68HC12: return "Motorola M68HC12";
1340 case EM_ALPHA: return "Alpha";
1341 case EM_CYGNUS_D10V:
1342 case EM_D10V: return "d10v";
1343 case EM_CYGNUS_D30V:
1344 case EM_D30V: return "d30v";
1345 case EM_CYGNUS_M32R:
1346 case EM_M32R: return "Mitsubishi M32r";
1347 case EM_CYGNUS_V850:
1348 case EM_V850: return "NEC v850";
1349 case EM_CYGNUS_MN10300:
1350 case EM_MN10300: return "mn10300";
1351 case EM_CYGNUS_MN10200:
1352 case EM_MN10200: return "mn10200";
1353 case EM_CYGNUS_FR30:
1354 case EM_FR30: return "Fujitsu FR30";
1356 case EM_PJ: return "picoJava";
1357 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1358 case EM_PCP: return "Siemens PCP";
1359 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1360 case EM_NDR1: return "Denso NDR1 microprocesspr";
1361 case EM_STARCORE: return "Motorola Star*Core processor";
1362 case EM_ME16: return "Toyota ME16 processor";
1363 case EM_ST100: return "STMicroelectronics ST100 processor";
1364 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1365 case EM_FX66: return "Siemens FX66 microcontroller";
1366 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1367 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1368 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1369 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1370 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1371 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1372 case EM_SVX: return "Silicon Graphics SVx";
1373 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1374 case EM_VAX: return "Digital VAX";
1376 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1377 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1378 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1379 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1380 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1381 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1382 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1383 case EM_PRISM: return "SiTera Prism";
1384 case EM_X86_64: return "Advanced Micro Devices X86-64";
1386 case EM_S390: return "IBM S/390";
1388 sprintf (buff, _("<unknown>: %x"), e_machine);
1394 decode_ARM_machine_flags (e_flags, buf)
1401 eabi = EF_ARM_EABI_VERSION (e_flags);
1402 e_flags &= ~ EF_ARM_EABIMASK;
1404 /* Handle "generic" ARM flags. */
1405 if (e_flags & EF_ARM_RELEXEC)
1407 strcat (buf, ", relocatable executable");
1408 e_flags &= ~ EF_ARM_RELEXEC;
1411 if (e_flags & EF_ARM_HASENTRY)
1413 strcat (buf, ", has entry point");
1414 e_flags &= ~ EF_ARM_HASENTRY;
1417 /* Now handle EABI specific flags. */
1421 strcat (buf, ", <unrecognised EABI>");
1426 case EF_ARM_EABI_VER1:
1427 strcat (buf, ", Version1 EABI");
1432 /* Process flags one bit at a time. */
1433 flag = e_flags & - e_flags;
1438 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1439 strcat (buf, ", sorted symbol tables");
1449 case EF_ARM_EABI_VER2:
1450 strcat (buf, ", Version2 EABI");
1455 /* Process flags one bit at a time. */
1456 flag = e_flags & - e_flags;
1461 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1462 strcat (buf, ", sorted symbol tables");
1465 case EF_ARM_DYNSYMSUSESEGIDX:
1466 strcat (buf, ", dynamic symbols use segment index");
1469 case EF_ARM_MAPSYMSFIRST:
1470 strcat (buf, ", mapping symbols precede others");
1480 case EF_ARM_EABI_UNKNOWN:
1481 strcat (buf, ", GNU EABI");
1486 /* Process flags one bit at a time. */
1487 flag = e_flags & - e_flags;
1492 case EF_ARM_INTERWORK:
1493 strcat (buf, ", interworking enabled");
1496 case EF_ARM_APCS_26:
1497 strcat (buf, ", uses APCS/26");
1500 case EF_ARM_APCS_FLOAT:
1501 strcat (buf, ", uses APCS/float");
1505 strcat (buf, ", position independent");
1509 strcat (buf, ", 8 bit structure alignment");
1512 case EF_ARM_NEW_ABI:
1513 strcat (buf, ", uses new ABI");
1516 case EF_ARM_OLD_ABI:
1517 strcat (buf, ", uses old ABI");
1520 case EF_ARM_SOFT_FLOAT:
1521 strcat (buf, ", software FP");
1532 strcat (buf,", <unknown>");
1536 get_machine_flags (e_flags, e_machine)
1540 static char buf [1024];
1552 decode_ARM_machine_flags (e_flags, buf);
1556 if (e_flags & EF_CPU32)
1557 strcat (buf, ", cpu32");
1561 if (e_flags & EF_PPC_EMB)
1562 strcat (buf, ", emb");
1564 if (e_flags & EF_PPC_RELOCATABLE)
1565 strcat (buf, ", relocatable");
1567 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1568 strcat (buf, ", relocatable-lib");
1572 case EM_CYGNUS_V850:
1573 switch (e_flags & EF_V850_ARCH)
1576 strcat (buf, ", v850e");
1579 strcat (buf, ", v850ea");
1582 strcat (buf, ", v850");
1585 strcat (buf, ", unknown v850 architecture variant");
1591 case EM_CYGNUS_M32R:
1592 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1593 strcat (buf, ", m32r");
1598 case EM_MIPS_RS3_LE:
1599 if (e_flags & EF_MIPS_NOREORDER)
1600 strcat (buf, ", noreorder");
1602 if (e_flags & EF_MIPS_PIC)
1603 strcat (buf, ", pic");
1605 if (e_flags & EF_MIPS_CPIC)
1606 strcat (buf, ", cpic");
1608 if (e_flags & EF_MIPS_UCODE)
1609 strcat (buf, ", ugen_reserved");
1611 if (e_flags & EF_MIPS_ABI2)
1612 strcat (buf, ", abi2");
1614 if (e_flags & EF_MIPS_32BITMODE)
1615 strcat (buf, ", 32bitmode");
1617 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1618 strcat (buf, ", mips1");
1620 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1621 strcat (buf, ", mips2");
1623 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1624 strcat (buf, ", mips3");
1626 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1627 strcat (buf, ", mips4");
1629 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
1630 strcat (buf, ", mips5");
1632 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
1633 strcat (buf, ", mips32");
1635 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
1636 strcat (buf, ", mips64");
1638 switch ((e_flags & EF_MIPS_MACH))
1640 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1641 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1642 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1643 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1644 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1645 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1646 default: strcat (buf, " UNKNOWN"); break;
1651 if (e_flags & EF_SPARC_32PLUS)
1652 strcat (buf, ", v8+");
1654 if (e_flags & EF_SPARC_SUN_US1)
1655 strcat (buf, ", ultrasparcI");
1657 if (e_flags & EF_SPARC_SUN_US3)
1658 strcat (buf, ", ultrasparcIII");
1660 if (e_flags & EF_SPARC_HAL_R1)
1661 strcat (buf, ", halr1");
1663 if (e_flags & EF_SPARC_LEDATA)
1664 strcat (buf, ", ledata");
1666 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1667 strcat (buf, ", tso");
1669 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1670 strcat (buf, ", pso");
1672 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1673 strcat (buf, ", rmo");
1677 switch (e_flags & EF_PARISC_ARCH)
1679 case EFA_PARISC_1_0:
1680 strcpy (buf, ", PA-RISC 1.0");
1682 case EFA_PARISC_1_1:
1683 strcpy (buf, ", PA-RISC 1.1");
1685 case EFA_PARISC_2_0:
1686 strcpy (buf, ", PA-RISC 2.0");
1691 if (e_flags & EF_PARISC_TRAPNIL)
1692 strcat (buf, ", trapnil");
1693 if (e_flags & EF_PARISC_EXT)
1694 strcat (buf, ", ext");
1695 if (e_flags & EF_PARISC_LSB)
1696 strcat (buf, ", lsb");
1697 if (e_flags & EF_PARISC_WIDE)
1698 strcat (buf, ", wide");
1699 if (e_flags & EF_PARISC_NO_KABP)
1700 strcat (buf, ", no kabp");
1701 if (e_flags & EF_PARISC_LAZYSWAP)
1702 strcat (buf, ", lazyswap");
1707 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1708 strcat (buf, ", new calling convention");
1710 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1711 strcat (buf, ", gnu calling convention");
1715 if ((e_flags & EF_IA_64_ABI64))
1716 strcat (buf, ", 64-bit");
1718 strcat (buf, ", 32-bit");
1719 if ((e_flags & EF_IA_64_REDUCEDFP))
1720 strcat (buf, ", reduced fp model");
1721 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1722 strcat (buf, ", no function descriptors, constant gp");
1723 else if ((e_flags & EF_IA_64_CONS_GP))
1724 strcat (buf, ", constant gp");
1725 if ((e_flags & EF_IA_64_ABSOLUTE))
1726 strcat (buf, ", absolute");
1735 get_mips_segment_type (type)
1740 case PT_MIPS_REGINFO:
1742 case PT_MIPS_RTPROC:
1744 case PT_MIPS_OPTIONS:
1754 get_parisc_segment_type (type)
1759 case PT_HP_TLS: return "HP_TLS";
1760 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1761 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1762 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1763 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1764 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1765 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1766 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1767 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1768 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1769 case PT_HP_PARALLEL: return "HP_PARALLEL";
1770 case PT_HP_FASTBIND: return "HP_FASTBIND";
1771 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1772 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1781 get_ia64_segment_type (type)
1786 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1787 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1796 get_segment_type (p_type)
1797 unsigned long p_type;
1799 static char buff [32];
1803 case PT_NULL: return "NULL";
1804 case PT_LOAD: return "LOAD";
1805 case PT_DYNAMIC: return "DYNAMIC";
1806 case PT_INTERP: return "INTERP";
1807 case PT_NOTE: return "NOTE";
1808 case PT_SHLIB: return "SHLIB";
1809 case PT_PHDR: return "PHDR";
1812 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1814 const char * result;
1816 switch (elf_header.e_machine)
1819 case EM_MIPS_RS3_LE:
1820 result = get_mips_segment_type (p_type);
1823 result = get_parisc_segment_type (p_type);
1826 result = get_ia64_segment_type (p_type);
1836 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1838 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1840 const char * result;
1842 switch (elf_header.e_machine)
1845 result = get_parisc_segment_type (p_type);
1855 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1858 sprintf (buff, _("<unknown>: %lx"), p_type);
1865 get_mips_section_type_name (sh_type)
1866 unsigned int sh_type;
1870 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1871 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1872 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1873 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1874 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1875 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1876 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1877 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1878 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1879 case SHT_MIPS_RELD: return "MIPS_RELD";
1880 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1881 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1882 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1883 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1884 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1885 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1886 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1887 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1888 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1889 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1890 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1891 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1892 case SHT_MIPS_LINE: return "MIPS_LINE";
1893 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1894 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1895 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1896 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1897 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1898 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1899 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1900 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1901 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1902 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1903 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1904 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1905 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1906 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1907 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1908 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1916 get_parisc_section_type_name (sh_type)
1917 unsigned int sh_type;
1921 case SHT_PARISC_EXT: return "PARISC_EXT";
1922 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1923 case SHT_PARISC_DOC: return "PARISC_DOC";
1931 get_ia64_section_type_name (sh_type)
1932 unsigned int sh_type;
1936 case SHT_IA_64_EXT: return "IA_64_EXT";
1937 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
1945 get_section_type_name (sh_type)
1946 unsigned int sh_type;
1948 static char buff [32];
1952 case SHT_NULL: return "NULL";
1953 case SHT_PROGBITS: return "PROGBITS";
1954 case SHT_SYMTAB: return "SYMTAB";
1955 case SHT_STRTAB: return "STRTAB";
1956 case SHT_RELA: return "RELA";
1957 case SHT_HASH: return "HASH";
1958 case SHT_DYNAMIC: return "DYNAMIC";
1959 case SHT_NOTE: return "NOTE";
1960 case SHT_NOBITS: return "NOBITS";
1961 case SHT_REL: return "REL";
1962 case SHT_SHLIB: return "SHLIB";
1963 case SHT_DYNSYM: return "DYNSYM";
1964 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1965 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1966 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1967 case SHT_GROUP: return "GROUP";
1968 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
1969 case SHT_GNU_verdef: return "VERDEF";
1970 case SHT_GNU_verneed: return "VERNEED";
1971 case SHT_GNU_versym: return "VERSYM";
1972 case 0x6ffffff0: return "VERSYM";
1973 case 0x6ffffffc: return "VERDEF";
1974 case 0x7ffffffd: return "AUXILIARY";
1975 case 0x7fffffff: return "FILTER";
1978 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1980 const char * result;
1982 switch (elf_header.e_machine)
1985 case EM_MIPS_RS3_LE:
1986 result = get_mips_section_type_name (sh_type);
1989 result = get_parisc_section_type_name (sh_type);
1992 result = get_ia64_section_type_name (sh_type);
2002 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2004 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2005 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2006 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2007 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2009 sprintf (buff, _("<unknown>: %x"), sh_type);
2015 struct option options [] =
2017 {"all", no_argument, 0, 'a'},
2018 {"file-header", no_argument, 0, 'h'},
2019 {"program-headers", no_argument, 0, 'l'},
2020 {"headers", no_argument, 0, 'e'},
2021 {"histogram", no_argument, 0, 'I'},
2022 {"segments", no_argument, 0, 'l'},
2023 {"sections", no_argument, 0, 'S'},
2024 {"section-headers", no_argument, 0, 'S'},
2025 {"symbols", no_argument, 0, 's'},
2026 {"syms", no_argument, 0, 's'},
2027 {"relocs", no_argument, 0, 'r'},
2028 {"notes", no_argument, 0, 'n'},
2029 {"dynamic", no_argument, 0, 'd'},
2030 {"arch-specific", no_argument, 0, 'A'},
2031 {"version-info", no_argument, 0, 'V'},
2032 {"use-dynamic", no_argument, 0, 'D'},
2033 {"hex-dump", required_argument, 0, 'x'},
2034 {"debug-dump", optional_argument, 0, 'w'},
2035 {"unwind", no_argument, 0, 'u'},
2036 #ifdef SUPPORT_DISASSEMBLY
2037 {"instruction-dump", required_argument, 0, 'i'},
2040 {"version", no_argument, 0, 'v'},
2041 {"wide", no_argument, 0, 'W'},
2042 {"help", no_argument, 0, 'H'},
2043 {0, no_argument, 0, 0}
2049 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
2050 fprintf (stdout, _(" Options are:\n"));
2051 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2052 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
2053 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
2054 fprintf (stdout, _(" Display the program headers\n"));
2055 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
2056 fprintf (stdout, _(" Display the sections' header\n"));
2057 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
2058 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
2059 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
2060 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
2061 fprintf (stdout, _(" -u or --unwind Display the unwind info (if present)\n"));
2062 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2063 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
2064 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2065 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2066 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
2067 fprintf (stdout, _(" Dump the contents of section <number>\n"));
2068 fprintf (stdout, _(" -w[liaprmf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames]\n"));
2069 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
2070 #ifdef SUPPORT_DISASSEMBLY
2071 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
2072 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
2074 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2075 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
2076 fprintf (stdout, _(" -W or --wide Don't split lines to fit into 80 columns\n"));
2077 fprintf (stdout, _(" -H or --help Display this information\n"));
2078 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2084 request_dump (section, type)
2085 unsigned int section;
2088 if (section >= num_dump_sects)
2090 char * new_dump_sects;
2092 new_dump_sects = (char *) calloc (section + 1, 1);
2094 if (new_dump_sects == NULL)
2095 error (_("Out of memory allocating dump request table."));
2098 /* Copy current flag settings. */
2099 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2103 dump_sects = new_dump_sects;
2104 num_dump_sects = section + 1;
2109 dump_sects [section] |= type;
2115 parse_args (argc, argv)
2124 while ((c = getopt_long
2125 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2161 do_using_dynamic ++;
2192 section = strtoul (optarg, & cp, 0);
2193 if (! * cp && section >= 0)
2195 request_dump (section, HEX_DUMP);
2205 unsigned int index = 0;
2209 while (optarg[index])
2210 switch (optarg[index++])
2219 do_debug_abbrevs = 1;
2229 do_debug_pubnames = 1;
2234 do_debug_aranges = 1;
2238 do_debug_frames_interp = 1;
2240 do_debug_frames = 1;
2245 do_debug_macinfo = 1;
2249 warn (_("Unrecognised debug option '%s'\n"), optarg);
2254 #ifdef SUPPORT_DISASSEMBLY
2257 section = strtoul (optarg, & cp, 0);
2258 if (! * cp && section >= 0)
2260 request_dump (section, DISASS_DUMP);
2266 print_version (program_name);
2276 /* xgettext:c-format */
2277 error (_("Invalid option '-%c'\n"), c);
2284 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2285 && !do_segments && !do_header && !do_dump && !do_version
2286 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2290 warn (_("Nothing to do.\n"));
2296 get_elf_class (elf_class)
2297 unsigned char elf_class;
2299 static char buff [32];
2303 case ELFCLASSNONE: return _("none");
2304 case ELFCLASS32: return _("ELF32");
2305 case ELFCLASS64: return _("ELF64");
2307 sprintf (buff, _("<unknown: %x>"), elf_class);
2313 get_data_encoding (encoding)
2314 unsigned char encoding;
2316 static char buff [32];
2320 case ELFDATANONE: return _("none");
2321 case ELFDATA2LSB: return _("2's complement, little endian");
2322 case ELFDATA2MSB: return _("2's complement, big endian");
2324 sprintf (buff, _("<unknown: %x>"), encoding);
2330 get_osabi_name (osabi)
2331 unsigned char osabi;
2333 static char buff [32];
2337 case ELFOSABI_NONE: return _("UNIX - System V");
2338 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2339 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2340 case ELFOSABI_LINUX: return _("UNIX - Linux");
2341 case ELFOSABI_HURD: return _("GNU/Hurd");
2342 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2343 case ELFOSABI_AIX: return _("UNIX - AIX");
2344 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2345 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2346 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2347 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2348 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2349 case ELFOSABI_STANDALONE: return _("Standalone App");
2350 case ELFOSABI_ARM: return _("ARM");
2352 sprintf (buff, _("<unknown: %x>"), osabi);
2357 /* Decode the data held in 'elf_header'. */
2359 process_file_header ()
2361 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2362 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2363 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2364 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2367 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2375 printf (_("ELF Header:\n"));
2376 printf (_(" Magic: "));
2377 for (i = 0; i < EI_NIDENT; i ++)
2378 printf ("%2.2x ", elf_header.e_ident [i]);
2380 printf (_(" Class: %s\n"),
2381 get_elf_class (elf_header.e_ident [EI_CLASS]));
2382 printf (_(" Data: %s\n"),
2383 get_data_encoding (elf_header.e_ident [EI_DATA]));
2384 printf (_(" Version: %d %s\n"),
2385 elf_header.e_ident [EI_VERSION],
2386 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2388 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2391 printf (_(" OS/ABI: %s\n"),
2392 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2393 printf (_(" ABI Version: %d\n"),
2394 elf_header.e_ident [EI_ABIVERSION]);
2395 printf (_(" Type: %s\n"),
2396 get_file_type (elf_header.e_type));
2397 printf (_(" Machine: %s\n"),
2398 get_machine_name (elf_header.e_machine));
2399 printf (_(" Version: 0x%lx\n"),
2400 (unsigned long) elf_header.e_version);
2402 printf (_(" Entry point address: "));
2403 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2404 printf (_("\n Start of program headers: "));
2405 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2406 printf (_(" (bytes into file)\n Start of section headers: "));
2407 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2408 printf (_(" (bytes into file)\n"));
2410 printf (_(" Flags: 0x%lx%s\n"),
2411 (unsigned long) elf_header.e_flags,
2412 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2413 printf (_(" Size of this header: %ld (bytes)\n"),
2414 (long) elf_header.e_ehsize);
2415 printf (_(" Size of program headers: %ld (bytes)\n"),
2416 (long) elf_header.e_phentsize);
2417 printf (_(" Number of program headers: %ld\n"),
2418 (long) elf_header.e_phnum);
2419 printf (_(" Size of section headers: %ld (bytes)\n"),
2420 (long) elf_header.e_shentsize);
2421 printf (_(" Number of section headers: %ld\n"),
2422 (long) elf_header.e_shnum);
2423 printf (_(" Section header string table index: %ld\n"),
2424 (long) elf_header.e_shstrndx);
2432 get_32bit_program_headers (file, program_headers)
2434 Elf_Internal_Phdr * program_headers;
2436 Elf32_External_Phdr * phdrs;
2437 Elf32_External_Phdr * external;
2438 Elf32_Internal_Phdr * internal;
2441 phdrs = ((Elf32_External_Phdr *)
2442 get_data (NULL, file, elf_header.e_phoff,
2443 elf_header.e_phentsize * elf_header.e_phnum,
2444 _("program headers")));
2448 for (i = 0, internal = program_headers, external = phdrs;
2449 i < elf_header.e_phnum;
2450 i ++, internal ++, external ++)
2452 internal->p_type = BYTE_GET (external->p_type);
2453 internal->p_offset = BYTE_GET (external->p_offset);
2454 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2455 internal->p_paddr = BYTE_GET (external->p_paddr);
2456 internal->p_filesz = BYTE_GET (external->p_filesz);
2457 internal->p_memsz = BYTE_GET (external->p_memsz);
2458 internal->p_flags = BYTE_GET (external->p_flags);
2459 internal->p_align = BYTE_GET (external->p_align);
2468 get_64bit_program_headers (file, program_headers)
2470 Elf_Internal_Phdr * program_headers;
2472 Elf64_External_Phdr * phdrs;
2473 Elf64_External_Phdr * external;
2474 Elf64_Internal_Phdr * internal;
2477 phdrs = ((Elf64_External_Phdr *)
2478 get_data (NULL, file, elf_header.e_phoff,
2479 elf_header.e_phentsize * elf_header.e_phnum,
2480 _("program headers")));
2484 for (i = 0, internal = program_headers, external = phdrs;
2485 i < elf_header.e_phnum;
2486 i ++, internal ++, external ++)
2488 internal->p_type = BYTE_GET (external->p_type);
2489 internal->p_flags = BYTE_GET (external->p_flags);
2490 internal->p_offset = BYTE_GET8 (external->p_offset);
2491 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2492 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2493 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2494 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2495 internal->p_align = BYTE_GET8 (external->p_align);
2504 process_program_headers (file)
2507 Elf_Internal_Phdr * program_headers;
2508 Elf_Internal_Phdr * segment;
2511 if (elf_header.e_phnum == 0)
2514 printf (_("\nThere are no program headers in this file.\n"));
2518 if (do_segments && !do_header)
2520 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2521 printf (_("Entry point "));
2522 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2523 printf (_("\nThere are %d program headers, starting at offset "),
2524 elf_header.e_phnum);
2525 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2529 program_headers = (Elf_Internal_Phdr *) malloc
2530 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2532 if (program_headers == NULL)
2534 error (_("Out of memory\n"));
2539 i = get_32bit_program_headers (file, program_headers);
2541 i = get_64bit_program_headers (file, program_headers);
2545 free (program_headers);
2552 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2556 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2559 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2563 (_(" Type Offset VirtAddr PhysAddr\n"));
2565 (_(" FileSiz MemSiz Flags Align\n"));
2573 for (i = 0, segment = program_headers;
2574 i < elf_header.e_phnum;
2579 printf (" %-14.14s ", get_segment_type (segment->p_type));
2583 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2584 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2585 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2586 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2587 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2589 (segment->p_flags & PF_R ? 'R' : ' '),
2590 (segment->p_flags & PF_W ? 'W' : ' '),
2591 (segment->p_flags & PF_X ? 'E' : ' '));
2592 printf ("%#lx", (unsigned long) segment->p_align);
2596 if ((unsigned long) segment->p_offset == segment->p_offset)
2597 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2600 print_vma (segment->p_offset, FULL_HEX);
2604 print_vma (segment->p_vaddr, FULL_HEX);
2606 print_vma (segment->p_paddr, FULL_HEX);
2609 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2610 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2613 print_vma (segment->p_filesz, FULL_HEX);
2617 if ((unsigned long) segment->p_memsz == segment->p_memsz)
2618 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2621 print_vma (segment->p_offset, FULL_HEX);
2625 (segment->p_flags & PF_R ? 'R' : ' '),
2626 (segment->p_flags & PF_W ? 'W' : ' '),
2627 (segment->p_flags & PF_X ? 'E' : ' '));
2629 if ((unsigned long) segment->p_align == segment->p_align)
2630 printf ("%#lx", (unsigned long) segment->p_align);
2633 print_vma (segment->p_align, PREFIX_HEX);
2638 print_vma (segment->p_offset, FULL_HEX);
2640 print_vma (segment->p_vaddr, FULL_HEX);
2642 print_vma (segment->p_paddr, FULL_HEX);
2644 print_vma (segment->p_filesz, FULL_HEX);
2646 print_vma (segment->p_memsz, FULL_HEX);
2648 (segment->p_flags & PF_R ? 'R' : ' '),
2649 (segment->p_flags & PF_W ? 'W' : ' '),
2650 (segment->p_flags & PF_X ? 'E' : ' '));
2651 print_vma (segment->p_align, HEX);
2655 switch (segment->p_type)
2659 loadaddr = (segment->p_vaddr & 0xfffff000)
2660 - (segment->p_offset & 0xfffff000);
2665 error (_("more than one dynamic segment\n"));
2667 dynamic_addr = segment->p_offset;
2668 dynamic_size = segment->p_filesz;
2672 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2673 error (_("Unable to find program interpreter name\n"));
2676 program_interpreter[0] = 0;
2677 fscanf (file, "%63s", program_interpreter);
2680 printf (_("\n [Requesting program interpreter: %s]"),
2681 program_interpreter);
2687 putc ('\n', stdout);
2696 if (do_segments && section_headers != NULL)
2698 printf (_("\n Section to Segment mapping:\n"));
2699 printf (_(" Segment Sections...\n"));
2701 assert (string_table != NULL);
2703 for (i = 0; i < elf_header.e_phnum; i++)
2706 Elf_Internal_Shdr * section;
2708 segment = program_headers + i;
2709 section = section_headers;
2711 printf (" %2.2d ", i);
2713 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2715 if (section->sh_size > 0
2716 /* Compare allocated sections by VMA, unallocated
2717 sections by file offset. */
2718 && (section->sh_flags & SHF_ALLOC
2719 ? (section->sh_addr >= segment->p_vaddr
2720 && section->sh_addr + section->sh_size
2721 <= segment->p_vaddr + segment->p_memsz)
2722 : ((bfd_vma) section->sh_offset >= segment->p_offset
2723 && (section->sh_offset + section->sh_size
2724 <= segment->p_offset + segment->p_filesz))))
2725 printf ("%s ", SECTION_NAME (section));
2732 free (program_headers);
2739 get_32bit_section_headers (file)
2742 Elf32_External_Shdr * shdrs;
2743 Elf32_Internal_Shdr * internal;
2746 shdrs = ((Elf32_External_Shdr *)
2747 get_data (NULL, file, elf_header.e_shoff,
2748 elf_header.e_shentsize * elf_header.e_shnum,
2749 _("section headers")));
2753 section_headers = (Elf_Internal_Shdr *) malloc
2754 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2756 if (section_headers == NULL)
2758 error (_("Out of memory\n"));
2762 for (i = 0, internal = section_headers;
2763 i < elf_header.e_shnum;
2766 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2767 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2768 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2769 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2770 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2771 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2772 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2773 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2774 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2775 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2784 get_64bit_section_headers (file)
2787 Elf64_External_Shdr * shdrs;
2788 Elf64_Internal_Shdr * internal;
2791 shdrs = ((Elf64_External_Shdr *)
2792 get_data (NULL, file, elf_header.e_shoff,
2793 elf_header.e_shentsize * elf_header.e_shnum,
2794 _("section headers")));
2798 section_headers = (Elf_Internal_Shdr *) malloc
2799 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2801 if (section_headers == NULL)
2803 error (_("Out of memory\n"));
2807 for (i = 0, internal = section_headers;
2808 i < elf_header.e_shnum;
2811 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2812 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2813 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2814 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2815 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2816 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2817 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2818 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2819 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2820 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2828 static Elf_Internal_Sym *
2829 get_32bit_elf_symbols (file, offset, number)
2831 unsigned long offset;
2832 unsigned long number;
2834 Elf32_External_Sym * esyms;
2835 Elf_Internal_Sym * isyms;
2836 Elf_Internal_Sym * psym;
2839 esyms = ((Elf32_External_Sym *)
2840 get_data (NULL, file, offset,
2841 number * sizeof (Elf32_External_Sym), _("symbols")));
2845 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2849 error (_("Out of memory\n"));
2855 for (j = 0, psym = isyms;
2859 psym->st_name = BYTE_GET (esyms[j].st_name);
2860 psym->st_value = BYTE_GET (esyms[j].st_value);
2861 psym->st_size = BYTE_GET (esyms[j].st_size);
2862 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2863 psym->st_info = BYTE_GET (esyms[j].st_info);
2864 psym->st_other = BYTE_GET (esyms[j].st_other);
2872 static Elf_Internal_Sym *
2873 get_64bit_elf_symbols (file, offset, number)
2875 unsigned long offset;
2876 unsigned long number;
2878 Elf64_External_Sym * esyms;
2879 Elf_Internal_Sym * isyms;
2880 Elf_Internal_Sym * psym;
2883 esyms = ((Elf64_External_Sym *)
2884 get_data (NULL, file, offset,
2885 number * sizeof (Elf64_External_Sym), _("symbols")));
2889 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2893 error (_("Out of memory\n"));
2899 for (j = 0, psym = isyms;
2903 psym->st_name = BYTE_GET (esyms[j].st_name);
2904 psym->st_info = BYTE_GET (esyms[j].st_info);
2905 psym->st_other = BYTE_GET (esyms[j].st_other);
2906 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2907 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2908 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2917 get_elf_section_flags (sh_flags)
2920 static char buff [32];
2928 flag = sh_flags & - sh_flags;
2933 case SHF_WRITE: strcat (buff, "W"); break;
2934 case SHF_ALLOC: strcat (buff, "A"); break;
2935 case SHF_EXECINSTR: strcat (buff, "X"); break;
2936 case SHF_MERGE: strcat (buff, "M"); break;
2937 case SHF_STRINGS: strcat (buff, "S"); break;
2938 case SHF_INFO_LINK: strcat (buff, "I"); break;
2939 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2940 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2941 case SHF_GROUP: strcat (buff, "G"); break;
2944 if (flag & SHF_MASKOS)
2947 sh_flags &= ~ SHF_MASKOS;
2949 else if (flag & SHF_MASKPROC)
2952 sh_flags &= ~ SHF_MASKPROC;
2964 process_section_headers (file)
2967 Elf_Internal_Shdr * section;
2970 section_headers = NULL;
2972 if (elf_header.e_shnum == 0)
2975 printf (_("\nThere are no sections in this file.\n"));
2980 if (do_sections && !do_header)
2981 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2982 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2986 if (! get_32bit_section_headers (file))
2989 else if (! get_64bit_section_headers (file))
2992 /* Read in the string table, so that we have names to display. */
2993 section = section_headers + elf_header.e_shstrndx;
2995 if (section->sh_size != 0)
2997 string_table = (char *) get_data (NULL, file, section->sh_offset,
2998 section->sh_size, _("string table"));
3000 string_table_length = section->sh_size;
3003 /* Scan the sections for the dynamic symbol table
3004 and dynamic string table and debug sections. */
3005 dynamic_symbols = NULL;
3006 dynamic_strings = NULL;
3007 dynamic_syminfo = NULL;
3009 for (i = 0, section = section_headers;
3010 i < elf_header.e_shnum;
3013 char * name = SECTION_NAME (section);
3015 if (section->sh_type == SHT_DYNSYM)
3017 if (dynamic_symbols != NULL)
3019 error (_("File contains multiple dynamic symbol tables\n"));
3023 num_dynamic_syms = section->sh_size / section->sh_entsize;
3025 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
3027 else if (section->sh_type == SHT_STRTAB
3028 && strcmp (name, ".dynstr") == 0)
3030 if (dynamic_strings != NULL)
3032 error (_("File contains multiple dynamic string tables\n"));
3036 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3038 _("dynamic strings"));
3040 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3041 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3042 || do_debug_frames || do_debug_macinfo)
3043 && strncmp (name, ".debug_", 7) == 0)
3048 || (do_debug_info && (strcmp (name, "info") == 0))
3049 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3050 || (do_debug_lines && (strcmp (name, "line") == 0))
3051 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3052 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3053 || (do_debug_frames && (strcmp (name, "frame") == 0))
3054 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3056 request_dump (i, DEBUG_DUMP);
3058 /* linkonce section to be combined with .debug_info at link time. */
3059 else if ((do_debugging || do_debug_info)
3060 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3061 request_dump (i, DEBUG_DUMP);
3062 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3063 request_dump (i, DEBUG_DUMP);
3069 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3073 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3076 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3079 printf (_(" [Nr] Name Type Address Offset\n"));
3080 printf (_(" Size EntSize Flags Link Info Align\n"));
3083 for (i = 0, section = section_headers;
3084 i < elf_header.e_shnum;
3087 printf (" [%2d] %-17.17s %-15.15s ",
3089 SECTION_NAME (section),
3090 get_section_type_name (section->sh_type));
3094 print_vma (section->sh_addr, LONG_HEX);
3096 printf ( " %6.6lx %6.6lx %2.2lx",
3097 (unsigned long) section->sh_offset,
3098 (unsigned long) section->sh_size,
3099 (unsigned long) section->sh_entsize);
3101 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3103 printf ("%2ld %3lx %2ld\n",
3104 (unsigned long) section->sh_link,
3105 (unsigned long) section->sh_info,
3106 (unsigned long) section->sh_addralign);
3110 print_vma (section->sh_addr, LONG_HEX);
3112 if ((long) section->sh_offset == section->sh_offset)
3113 printf (" %6.6lx", (unsigned long) section->sh_offset);
3117 print_vma (section->sh_offset, LONG_HEX);
3120 if ((unsigned long) section->sh_size == section->sh_size)
3121 printf (" %6.6lx", (unsigned long) section->sh_size);
3125 print_vma (section->sh_size, LONG_HEX);
3128 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3129 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3133 print_vma (section->sh_entsize, LONG_HEX);
3136 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3138 printf ("%2ld %3lx ",
3139 (unsigned long) section->sh_link,
3140 (unsigned long) section->sh_info);
3142 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3143 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3146 print_vma (section->sh_addralign, DEC);
3153 print_vma (section->sh_addr, LONG_HEX);
3154 if ((long) section->sh_offset == section->sh_offset)
3155 printf (" %8.8lx", (unsigned long) section->sh_offset);
3159 print_vma (section->sh_offset, LONG_HEX);
3162 print_vma (section->sh_size, LONG_HEX);
3164 print_vma (section->sh_entsize, LONG_HEX);
3166 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3168 printf (" %2ld %3lx %ld\n",
3169 (unsigned long) section->sh_link,
3170 (unsigned long) section->sh_info,
3171 (unsigned long) section->sh_addralign);
3175 printf (_("Key to Flags:\n"));
3176 printf (_(" W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
3177 printf (_(" I (info), L (link order), G (group), x (unknown)\n"));
3178 printf (_(" O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3183 /* Process the reloc section. */
3185 process_relocs (file)
3188 unsigned long rel_size;
3189 unsigned long rel_offset;
3195 if (do_using_dynamic)
3197 int is_rela = FALSE;
3202 if (dynamic_info[DT_REL])
3204 rel_offset = dynamic_info[DT_REL];
3205 rel_size = dynamic_info[DT_RELSZ];
3208 else if (dynamic_info [DT_RELA])
3210 rel_offset = dynamic_info[DT_RELA];
3211 rel_size = dynamic_info[DT_RELASZ];
3214 else if (dynamic_info[DT_JMPREL])
3216 rel_offset = dynamic_info[DT_JMPREL];
3217 rel_size = dynamic_info[DT_PLTRELSZ];
3219 switch (dynamic_info[DT_PLTREL])
3236 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3237 rel_offset, rel_size);
3239 dump_relocations (file, rel_offset - loadaddr, rel_size,
3240 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3243 printf (_("\nThere are no dynamic relocations in this file.\n"));
3247 Elf32_Internal_Shdr * section;
3251 for (i = 0, section = section_headers;
3252 i < elf_header.e_shnum;
3255 if ( section->sh_type != SHT_RELA
3256 && section->sh_type != SHT_REL)
3259 rel_offset = section->sh_offset;
3260 rel_size = section->sh_size;
3264 Elf32_Internal_Shdr * strsec;
3265 Elf_Internal_Sym * symtab;
3268 unsigned long nsyms;
3270 printf (_("\nRelocation section "));
3272 if (string_table == NULL)
3273 printf ("%d", section->sh_name);
3275 printf ("'%s'", SECTION_NAME (section));
3277 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3278 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3283 if (section->sh_link)
3285 Elf32_Internal_Shdr * symsec;
3287 symsec = section_headers + section->sh_link;
3288 nsyms = symsec->sh_size / symsec->sh_entsize;
3289 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
3294 strsec = section_headers + symsec->sh_link;
3296 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3300 is_rela = section->sh_type == SHT_RELA;
3302 dump_relocations (file, rel_offset, rel_size,
3303 symtab, nsyms, strtab, is_rela);
3315 printf (_("\nThere are no relocations in this file.\n"));
3321 #include "unwind-ia64.h"
3323 /* An absolute address consists of a section and an offset. If the
3324 section is NULL, the offset itself is the address, otherwise, the
3325 address equals to LOAD_ADDRESS(section) + offset. */
3329 unsigned short section;
3335 struct unw_table_entry
3337 struct absaddr start;
3339 struct absaddr info;
3341 *table; /* Unwind table. */
3342 unsigned long table_len; /* Length of unwind table. */
3343 unsigned char * info; /* Unwind info. */
3344 unsigned long info_size; /* Size of unwind info. */
3345 bfd_vma info_addr; /* starting address of unwind info. */
3346 bfd_vma seg_base; /* Starting address of segment. */
3347 Elf_Internal_Sym * symtab; /* The symbol table. */
3348 unsigned long nsyms; /* Number of symbols. */
3349 char * strtab; /* The string table. */
3350 unsigned long strtab_size; /* Size of string table. */
3353 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3354 struct absaddr, const char **,
3356 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3357 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3358 Elf32_Internal_Shdr *));
3361 find_symbol_for_address (aux, addr, symname, offset)
3362 struct unw_aux_info *aux;
3363 struct absaddr addr;
3364 const char **symname;
3367 bfd_vma dist = (bfd_vma) 0x100000;
3368 Elf_Internal_Sym *sym, *best = NULL;
3371 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3373 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3374 && sym->st_name != 0
3375 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3376 && addr.offset >= sym->st_value
3377 && addr.offset - sym->st_value < dist)
3380 dist = addr.offset - sym->st_value;
3387 *symname = (best->st_name >= aux->strtab_size
3388 ? "<corrupt>" : aux->strtab + best->st_name);
3393 *offset = addr.offset;
3397 dump_ia64_unwind (aux)
3398 struct unw_aux_info *aux;
3401 struct unw_table_entry * tp;
3404 addr_size = is_32bit_elf ? 4 : 8;
3406 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3410 const unsigned char * dp;
3411 const unsigned char * head;
3412 const char * procname;
3414 find_symbol_for_address (aux, tp->start, &procname, &offset);
3416 fputs ("\n<", stdout);
3420 fputs (procname, stdout);
3423 printf ("+%lx", (unsigned long) offset);
3426 fputs (">: [", stdout);
3427 print_vma (tp->start.offset, PREFIX_HEX);
3428 fputc ('-', stdout);
3429 print_vma (tp->end.offset, PREFIX_HEX);
3430 printf ("), info at +0x%lx\n",
3431 (unsigned long) (tp->info.offset - aux->seg_base));
3433 head = aux->info + (tp->info.offset - aux->info_addr);
3434 stamp = BYTE_GET8 ((unsigned char *) head);
3436 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3437 (unsigned) UNW_VER (stamp),
3438 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3439 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3440 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3441 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3443 if (UNW_VER (stamp) != 1)
3445 printf ("\tUnknown version.\n");
3450 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3451 dp = unw_decode (dp, in_body, & in_body);
3456 slurp_ia64_unwind_table (file, aux, sec)
3458 struct unw_aux_info *aux;
3459 Elf32_Internal_Shdr *sec;
3461 unsigned long size, addr_size, nrelas, i;
3462 Elf_Internal_Phdr *prog_hdrs, *seg;
3463 struct unw_table_entry *tep;
3464 Elf32_Internal_Shdr *relsec;
3465 Elf_Internal_Rela *rela, *rp;
3466 unsigned char *table, *tp;
3467 Elf_Internal_Sym *sym;
3468 const char *relname;
3471 addr_size = is_32bit_elf ? 4 : 8;
3473 /* First, find the starting address of the segment that includes
3476 if (elf_header.e_phnum)
3478 prog_hdrs = (Elf_Internal_Phdr *)
3479 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3482 result = get_32bit_program_headers (file, prog_hdrs);
3484 result = get_64bit_program_headers (file, prog_hdrs);
3492 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3494 if (seg->p_type != PT_LOAD)
3497 if (sec->sh_addr >= seg->p_vaddr
3498 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3500 aux->seg_base = seg->p_vaddr;
3508 /* Second, build the unwind table from the contents of the unwind section: */
3509 size = sec->sh_size;
3510 table = (char *) get_data (NULL, file, sec->sh_offset,
3511 size, _("unwind table"));
3515 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3516 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3518 tep->start.section = SHN_UNDEF;
3519 tep->end.section = SHN_UNDEF;
3520 tep->info.section = SHN_UNDEF;
3523 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3524 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3525 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3529 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3530 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3531 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3533 tep->start.offset += aux->seg_base;
3534 tep->end.offset += aux->seg_base;
3535 tep->info.offset += aux->seg_base;
3539 /* Third, apply any relocations to the unwind table: */
3541 for (relsec = section_headers;
3542 relsec < section_headers + elf_header.e_shnum;
3545 if (relsec->sh_type != SHT_RELA
3546 || section_headers + relsec->sh_info != sec)
3549 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3553 for (rp = rela; rp < rela + nrelas; ++rp)
3557 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3558 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3560 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3562 warn (_("Skipping unexpected symbol type %u"),
3563 ELF32_ST_TYPE (sym->st_info));
3569 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3570 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3572 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3574 warn (_("Skipping unexpected symbol type %u"),
3575 ELF64_ST_TYPE (sym->st_info));
3580 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3582 warn (_("Skipping unexpected relocation type %s"), relname);
3586 i = rp->r_offset / (3 * addr_size);
3588 switch (rp->r_offset/addr_size % 3)
3591 aux->table[i].start.section = sym->st_shndx;
3592 aux->table[i].start.offset += rp->r_addend;
3595 aux->table[i].end.section = sym->st_shndx;
3596 aux->table[i].end.offset += rp->r_addend;
3599 aux->table[i].info.section = sym->st_shndx;
3600 aux->table[i].info.offset += rp->r_addend;
3610 aux->table_len = size / (3 * addr_size);
3615 process_unwind (file)
3618 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3619 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3620 struct unw_aux_info aux;
3625 if (elf_header.e_machine != EM_IA_64)
3627 printf (_("\nThere are no unwind sections in this file.\n"));
3631 memset (& aux, 0, sizeof (aux));
3633 addr_size = is_32bit_elf ? 4 : 8;
3635 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3637 if (sec->sh_type == SHT_SYMTAB)
3639 aux.nsyms = sec->sh_size / sec->sh_entsize;
3640 aux.symtab = GET_ELF_SYMBOLS (file, sec->sh_offset, aux.nsyms);
3642 strsec = section_headers + sec->sh_link;
3643 aux.strtab_size = strsec->sh_size;
3644 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3645 aux.strtab_size, _("string table"));
3647 else if (sec->sh_type == SHT_IA_64_UNWIND)
3652 printf (_("\nThere are no unwind sections in this file.\n"));
3654 while (unwcount-- > 0)
3659 for (i = unwstart, sec = section_headers + unwstart;
3660 i < elf_header.e_shnum; ++i, ++sec)
3661 if (sec->sh_type == SHT_IA_64_UNWIND)
3668 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3670 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3673 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3674 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3675 suffix = SECTION_NAME (unwsec) + len;
3676 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3678 if (strncmp (SECTION_NAME (sec),
3679 ELF_STRING_ia64_unwind_info_once, len2) == 0
3680 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3685 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3686 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3687 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3688 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3690 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3692 suffix = SECTION_NAME (unwsec) + len;
3693 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3695 if (strncmp (SECTION_NAME (sec),
3696 ELF_STRING_ia64_unwind_info, len2) == 0
3697 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3701 if (i == elf_header.e_shnum)
3703 printf (_("\nCould not find unwind info section for "));
3705 if (string_table == NULL)
3706 printf ("%d", unwsec->sh_name);
3708 printf ("'%s'", SECTION_NAME (unwsec));
3712 aux.info_size = sec->sh_size;
3713 aux.info_addr = sec->sh_addr;
3714 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3715 aux.info_size, _("unwind info"));
3717 printf (_("\nUnwind section "));
3719 if (string_table == NULL)
3720 printf ("%d", unwsec->sh_name);
3722 printf ("'%s'", SECTION_NAME (unwsec));
3724 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3725 (unsigned long) unwsec->sh_offset,
3726 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3728 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3730 if (aux.table_len > 0)
3731 dump_ia64_unwind (& aux);
3734 free ((char *) aux.table);
3736 free ((char *) aux.info);
3745 free ((char *) aux.strtab);
3751 dynamic_segment_mips_val (entry)
3752 Elf_Internal_Dyn * entry;
3754 switch (entry->d_tag)
3757 if (entry->d_un.d_val == 0)
3761 static const char * opts[] =
3763 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3764 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3765 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3766 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3771 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3772 if (entry->d_un.d_val & (1 << cnt))
3774 printf ("%s%s", first ? "" : " ", opts[cnt]);
3781 case DT_MIPS_IVERSION:
3782 if (dynamic_strings != NULL)
3783 printf ("Interface Version: %s\n",
3784 dynamic_strings + entry->d_un.d_val);
3786 printf ("%ld\n", (long) entry->d_un.d_ptr);
3789 case DT_MIPS_TIME_STAMP:
3794 time_t time = entry->d_un.d_val;
3795 tmp = gmtime (&time);
3796 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3797 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3798 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3799 printf ("Time Stamp: %s\n", timebuf);
3803 case DT_MIPS_RLD_VERSION:
3804 case DT_MIPS_LOCAL_GOTNO:
3805 case DT_MIPS_CONFLICTNO:
3806 case DT_MIPS_LIBLISTNO:
3807 case DT_MIPS_SYMTABNO:
3808 case DT_MIPS_UNREFEXTNO:
3809 case DT_MIPS_HIPAGENO:
3810 case DT_MIPS_DELTA_CLASS_NO:
3811 case DT_MIPS_DELTA_INSTANCE_NO:
3812 case DT_MIPS_DELTA_RELOC_NO:
3813 case DT_MIPS_DELTA_SYM_NO:
3814 case DT_MIPS_DELTA_CLASSSYM_NO:
3815 case DT_MIPS_COMPACT_SIZE:
3816 printf ("%ld\n", (long) entry->d_un.d_ptr);
3820 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3826 dynamic_segment_parisc_val (entry)
3827 Elf_Internal_Dyn * entry;
3829 switch (entry->d_tag)
3831 case DT_HP_DLD_FLAGS:
3840 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3841 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3842 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3843 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3844 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3845 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3846 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3847 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3848 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3849 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3850 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3854 bfd_vma val = entry->d_un.d_val;
3856 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3857 if (val & flags[cnt].bit)
3861 fputs (flags[cnt].str, stdout);
3863 val ^= flags[cnt].bit;
3866 if (val != 0 || first)
3870 print_vma (val, HEX);
3876 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3882 get_32bit_dynamic_segment (file)
3885 Elf32_External_Dyn * edyn;
3886 Elf_Internal_Dyn * entry;
3889 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
3890 dynamic_size, _("dynamic segment"));
3894 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3895 how large this .dynamic is now. We can do this even before the byte
3896 swapping since the DT_NULL tag is recognizable. */
3898 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3901 dynamic_segment = (Elf_Internal_Dyn *)
3902 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3904 if (dynamic_segment == NULL)
3906 error (_("Out of memory\n"));
3911 for (i = 0, entry = dynamic_segment;
3915 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3916 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3925 get_64bit_dynamic_segment (file)
3928 Elf64_External_Dyn * edyn;
3929 Elf_Internal_Dyn * entry;
3932 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
3933 dynamic_size, _("dynamic segment"));
3937 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3938 how large this .dynamic is now. We can do this even before the byte
3939 swapping since the DT_NULL tag is recognizable. */
3941 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3944 dynamic_segment = (Elf_Internal_Dyn *)
3945 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3947 if (dynamic_segment == NULL)
3949 error (_("Out of memory\n"));
3954 for (i = 0, entry = dynamic_segment;
3958 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3959 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3968 get_dynamic_flags (flags)
3971 static char buff [64];
3976 flag = flags & - flags;
3981 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3982 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3983 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3984 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3985 default: strcat (buff, "unknown "); break;
3991 /* Parse and display the contents of the dynamic segment. */
3993 process_dynamic_segment (file)
3996 Elf_Internal_Dyn * entry;
3999 if (dynamic_size == 0)
4002 printf (_("\nThere is no dynamic segment in this file.\n"));
4009 if (! get_32bit_dynamic_segment (file))
4012 else if (! get_64bit_dynamic_segment (file))
4015 /* Find the appropriate symbol table. */
4016 if (dynamic_symbols == NULL)
4018 for (i = 0, entry = dynamic_segment;
4022 unsigned long offset;
4024 if (entry->d_tag != DT_SYMTAB)
4027 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4029 /* Since we do not know how big the symbol table is,
4030 we default to reading in the entire file (!) and
4031 processing that. This is overkill, I know, but it
4033 offset = entry->d_un.d_val - loadaddr;
4035 if (fseek (file, 0, SEEK_END))
4036 error (_("Unable to seek to end of file!"));
4039 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
4041 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
4043 if (num_dynamic_syms < 1)
4045 error (_("Unable to determine the number of symbols to load\n"));
4049 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
4053 /* Similarly find a string table. */
4054 if (dynamic_strings == NULL)
4056 for (i = 0, entry = dynamic_segment;
4060 unsigned long offset;
4063 if (entry->d_tag != DT_STRTAB)
4066 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4068 /* Since we do not know how big the string table is,
4069 we default to reading in the entire file (!) and
4070 processing that. This is overkill, I know, but it
4073 offset = entry->d_un.d_val - loadaddr;
4074 if (fseek (file, 0, SEEK_END))
4075 error (_("Unable to seek to end of file\n"));
4076 str_tab_len = ftell (file) - offset;
4078 if (str_tab_len < 1)
4081 (_("Unable to determine the length of the dynamic string table\n"));
4085 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4086 _("dynamic string table"));
4092 /* And find the syminfo section if available. */
4093 if (dynamic_syminfo == NULL)
4095 unsigned int syminsz = 0;
4097 for (i = 0, entry = dynamic_segment;
4101 if (entry->d_tag == DT_SYMINENT)
4103 /* Note: these braces are necessary to avoid a syntax
4104 error from the SunOS4 C compiler. */
4105 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4107 else if (entry->d_tag == DT_SYMINSZ)
4108 syminsz = entry->d_un.d_val;
4109 else if (entry->d_tag == DT_SYMINFO)
4110 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4113 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4115 Elf_External_Syminfo * extsyminfo;
4116 Elf_Internal_Syminfo * syminfo;
4118 /* There is a syminfo section. Read the data. */
4119 extsyminfo = ((Elf_External_Syminfo *)
4120 get_data (NULL, file, dynamic_syminfo_offset,
4121 syminsz, _("symbol information")));
4125 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4126 if (dynamic_syminfo == NULL)
4128 error (_("Out of memory\n"));
4132 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4133 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4136 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4137 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4144 if (do_dynamic && dynamic_addr)
4145 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4146 dynamic_addr, (long) dynamic_size);
4148 printf (_(" Tag Type Name/Value\n"));
4150 for (i = 0, entry = dynamic_segment;
4159 print_vma (entry->d_tag, FULL_HEX);
4160 dtype = get_dynamic_type (entry->d_tag);
4161 printf (" (%s)%*s", dtype,
4162 ((is_32bit_elf ? 27 : 19)
4163 - (int) strlen (dtype)),
4167 switch (entry->d_tag)
4171 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4181 switch (entry->d_tag)
4184 printf (_("Auxiliary library"));
4188 printf (_("Filter library"));
4192 printf (_("Configuration file"));
4196 printf (_("Dependency audit library"));
4200 printf (_("Audit library"));
4204 if (dynamic_strings)
4205 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4209 print_vma (entry->d_un.d_val, PREFIX_HEX);
4218 printf (_("Flags:"));
4219 if (entry->d_un.d_val == 0)
4220 printf (_(" None\n"));
4223 unsigned long int val = entry->d_un.d_val;
4224 if (val & DTF_1_PARINIT)
4226 printf (" PARINIT");
4227 val ^= DTF_1_PARINIT;
4229 if (val & DTF_1_CONFEXP)
4231 printf (" CONFEXP");
4232 val ^= DTF_1_CONFEXP;
4235 printf (" %lx", val);
4244 printf (_("Flags:"));
4245 if (entry->d_un.d_val == 0)
4246 printf (_(" None\n"));
4249 unsigned long int val = entry->d_un.d_val;
4250 if (val & DF_P1_LAZYLOAD)
4252 printf (" LAZYLOAD");
4253 val ^= DF_P1_LAZYLOAD;
4255 if (val & DF_P1_GROUPPERM)
4257 printf (" GROUPPERM");
4258 val ^= DF_P1_GROUPPERM;
4261 printf (" %lx", val);
4270 printf (_("Flags:"));
4271 if (entry->d_un.d_val == 0)
4272 printf (_(" None\n"));
4275 unsigned long int val = entry->d_un.d_val;
4281 if (val & DF_1_GLOBAL)
4286 if (val & DF_1_GROUP)
4291 if (val & DF_1_NODELETE)
4293 printf (" NODELETE");
4294 val ^= DF_1_NODELETE;
4296 if (val & DF_1_LOADFLTR)
4298 printf (" LOADFLTR");
4299 val ^= DF_1_LOADFLTR;
4301 if (val & DF_1_INITFIRST)
4303 printf (" INITFIRST");
4304 val ^= DF_1_INITFIRST;
4306 if (val & DF_1_NOOPEN)
4311 if (val & DF_1_ORIGIN)
4316 if (val & DF_1_DIRECT)
4321 if (val & DF_1_TRANS)
4326 if (val & DF_1_INTERPOSE)
4328 printf (" INTERPOSE");
4329 val ^= DF_1_INTERPOSE;
4331 if (val & DF_1_NODEFLIB)
4333 printf (" NODEFLIB");
4334 val ^= DF_1_NODEFLIB;
4336 if (val & DF_1_NODUMP)
4341 if (val & DF_1_CONLFAT)
4343 printf (" CONLFAT");
4344 val ^= DF_1_CONLFAT;
4347 printf (" %lx", val);
4355 puts (get_dynamic_type (entry->d_un.d_val));
4375 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4381 if (dynamic_strings == NULL)
4384 name = dynamic_strings + entry->d_un.d_val;
4388 switch (entry->d_tag)
4391 printf (_("Shared library: [%s]"), name);
4393 if (strcmp (name, program_interpreter) == 0)
4394 printf (_(" program interpreter"));
4398 printf (_("Library soname: [%s]"), name);
4402 printf (_("Library rpath: [%s]"), name);
4406 printf (_("Library runpath: [%s]"), name);
4410 print_vma (entry->d_un.d_val, PREFIX_HEX);
4415 print_vma (entry->d_un.d_val, PREFIX_HEX);
4431 case DT_INIT_ARRAYSZ:
4432 case DT_FINI_ARRAYSZ:
4435 print_vma (entry->d_un.d_val, UNSIGNED);
4436 printf (" (bytes)\n");
4446 print_vma (entry->d_un.d_val, UNSIGNED);
4459 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4463 name = dynamic_strings + entry->d_un.d_val;
4467 printf (_("Not needed object: [%s]\n"), name);
4472 print_vma (entry->d_un.d_val, PREFIX_HEX);
4478 /* The value of this entry is ignored. */
4482 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4483 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4488 switch (elf_header.e_machine)
4491 case EM_MIPS_RS3_LE:
4492 dynamic_segment_mips_val (entry);
4495 dynamic_segment_parisc_val (entry);
4498 print_vma (entry->d_un.d_val, PREFIX_HEX);
4510 get_ver_flags (flags)
4513 static char buff [32];
4520 if (flags & VER_FLG_BASE)
4521 strcat (buff, "BASE ");
4523 if (flags & VER_FLG_WEAK)
4525 if (flags & VER_FLG_BASE)
4526 strcat (buff, "| ");
4528 strcat (buff, "WEAK ");
4531 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4532 strcat (buff, "| <unknown>");
4537 /* Display the contents of the version sections. */
4539 process_version_sections (file)
4542 Elf32_Internal_Shdr * section;
4549 for (i = 0, section = section_headers;
4550 i < elf_header.e_shnum;
4553 switch (section->sh_type)
4555 case SHT_GNU_verdef:
4557 Elf_External_Verdef * edefs;
4564 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4565 SECTION_NAME (section), section->sh_info);
4567 printf (_(" Addr: 0x"));
4568 printf_vma (section->sh_addr);
4569 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4570 (unsigned long) section->sh_offset, section->sh_link,
4571 SECTION_NAME (section_headers + section->sh_link));
4573 edefs = ((Elf_External_Verdef *)
4574 get_data (NULL, file, section->sh_offset,
4576 _("version definition section")));
4580 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4583 Elf_External_Verdef * edef;
4584 Elf_Internal_Verdef ent;
4585 Elf_External_Verdaux * eaux;
4586 Elf_Internal_Verdaux aux;
4590 vstart = ((char *) edefs) + idx;
4592 edef = (Elf_External_Verdef *) vstart;
4594 ent.vd_version = BYTE_GET (edef->vd_version);
4595 ent.vd_flags = BYTE_GET (edef->vd_flags);
4596 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4597 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4598 ent.vd_hash = BYTE_GET (edef->vd_hash);
4599 ent.vd_aux = BYTE_GET (edef->vd_aux);
4600 ent.vd_next = BYTE_GET (edef->vd_next);
4602 printf (_(" %#06x: Rev: %d Flags: %s"),
4603 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4605 printf (_(" Index: %d Cnt: %d "),
4606 ent.vd_ndx, ent.vd_cnt);
4608 vstart += ent.vd_aux;
4610 eaux = (Elf_External_Verdaux *) vstart;
4612 aux.vda_name = BYTE_GET (eaux->vda_name);
4613 aux.vda_next = BYTE_GET (eaux->vda_next);
4615 if (dynamic_strings)
4616 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4618 printf (_("Name index: %ld\n"), aux.vda_name);
4620 isum = idx + ent.vd_aux;
4622 for (j = 1; j < ent.vd_cnt; j ++)
4624 isum += aux.vda_next;
4625 vstart += aux.vda_next;
4627 eaux = (Elf_External_Verdaux *) vstart;
4629 aux.vda_name = BYTE_GET (eaux->vda_name);
4630 aux.vda_next = BYTE_GET (eaux->vda_next);
4632 if (dynamic_strings)
4633 printf (_(" %#06x: Parent %d: %s\n"),
4634 isum, j, dynamic_strings + aux.vda_name);
4636 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4637 isum, j, aux.vda_name);
4647 case SHT_GNU_verneed:
4649 Elf_External_Verneed * eneed;
4655 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4656 SECTION_NAME (section), section->sh_info);
4658 printf (_(" Addr: 0x"));
4659 printf_vma (section->sh_addr);
4660 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4661 (unsigned long) section->sh_offset, section->sh_link,
4662 SECTION_NAME (section_headers + section->sh_link));
4664 eneed = ((Elf_External_Verneed *)
4665 get_data (NULL, file, section->sh_offset,
4666 section->sh_size, _("version need section")));
4670 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4672 Elf_External_Verneed * entry;
4673 Elf_Internal_Verneed ent;
4678 vstart = ((char *) eneed) + idx;
4680 entry = (Elf_External_Verneed *) vstart;
4682 ent.vn_version = BYTE_GET (entry->vn_version);
4683 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4684 ent.vn_file = BYTE_GET (entry->vn_file);
4685 ent.vn_aux = BYTE_GET (entry->vn_aux);
4686 ent.vn_next = BYTE_GET (entry->vn_next);
4688 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4690 if (dynamic_strings)
4691 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4693 printf (_(" File: %lx"), ent.vn_file);
4695 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4697 vstart += ent.vn_aux;
4699 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4701 Elf_External_Vernaux * eaux;
4702 Elf_Internal_Vernaux aux;
4704 eaux = (Elf_External_Vernaux *) vstart;
4706 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4707 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4708 aux.vna_other = BYTE_GET (eaux->vna_other);
4709 aux.vna_name = BYTE_GET (eaux->vna_name);
4710 aux.vna_next = BYTE_GET (eaux->vna_next);
4712 if (dynamic_strings)
4713 printf (_(" %#06x: Name: %s"),
4714 isum, dynamic_strings + aux.vna_name);
4716 printf (_(" %#06x: Name index: %lx"),
4717 isum, aux.vna_name);
4719 printf (_(" Flags: %s Version: %d\n"),
4720 get_ver_flags (aux.vna_flags), aux.vna_other);
4722 isum += aux.vna_next;
4723 vstart += aux.vna_next;
4733 case SHT_GNU_versym:
4735 Elf32_Internal_Shdr * link_section;
4738 unsigned char * edata;
4739 unsigned short * data;
4741 Elf_Internal_Sym * symbols;
4742 Elf32_Internal_Shdr * string_sec;
4744 link_section = section_headers + section->sh_link;
4745 total = section->sh_size / section->sh_entsize;
4749 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
4750 link_section->sh_size / link_section->sh_entsize);
4752 string_sec = section_headers + link_section->sh_link;
4754 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4755 string_sec->sh_size,
4756 _("version string table"));
4760 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4761 SECTION_NAME (section), total);
4763 printf (_(" Addr: "));
4764 printf_vma (section->sh_addr);
4765 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4766 (unsigned long) section->sh_offset, section->sh_link,
4767 SECTION_NAME (link_section));
4771 get_data (NULL, file,
4772 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4773 total * sizeof (short), _("version symbol data")));
4780 data = (unsigned short *) malloc (total * sizeof (short));
4782 for (cnt = total; cnt --;)
4783 data [cnt] = byte_get (edata + cnt * sizeof (short),
4788 for (cnt = 0; cnt < total; cnt += 4)
4791 int check_def, check_need;
4794 printf (" %03x:", cnt);
4796 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4797 switch (data [cnt + j])
4800 fputs (_(" 0 (*local*) "), stdout);
4804 fputs (_(" 1 (*global*) "), stdout);
4808 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4809 data [cnt + j] & 0x8000 ? 'h' : ' ');
4813 if (symbols [cnt + j].st_shndx >= SHN_LORESERVE
4814 || section_headers[symbols [cnt + j].st_shndx].sh_type
4817 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4824 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4826 Elf_Internal_Verneed ivn;
4827 unsigned long offset;
4829 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4834 Elf_Internal_Vernaux ivna;
4835 Elf_External_Verneed evn;
4836 Elf_External_Vernaux evna;
4837 unsigned long a_off;
4839 get_data (&evn, file, offset, sizeof (evn),
4842 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4843 ivn.vn_next = BYTE_GET (evn.vn_next);
4845 a_off = offset + ivn.vn_aux;
4849 get_data (&evna, file, a_off, sizeof (evna),
4850 _("version need aux (2)"));
4852 ivna.vna_next = BYTE_GET (evna.vna_next);
4853 ivna.vna_other = BYTE_GET (evna.vna_other);
4855 a_off += ivna.vna_next;
4857 while (ivna.vna_other != data [cnt + j]
4858 && ivna.vna_next != 0);
4860 if (ivna.vna_other == data [cnt + j])
4862 ivna.vna_name = BYTE_GET (evna.vna_name);
4864 name = strtab + ivna.vna_name;
4865 nn += printf ("(%s%-*s",
4867 12 - (int) strlen (name),
4873 offset += ivn.vn_next;
4875 while (ivn.vn_next);
4878 if (check_def && data [cnt + j] != 0x8001
4879 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4881 Elf_Internal_Verdef ivd;
4882 Elf_External_Verdef evd;
4883 unsigned long offset;
4885 offset = version_info
4886 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4890 get_data (&evd, file, offset, sizeof (evd),
4893 ivd.vd_next = BYTE_GET (evd.vd_next);
4894 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4896 offset += ivd.vd_next;
4898 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4899 && ivd.vd_next != 0);
4901 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4903 Elf_External_Verdaux evda;
4904 Elf_Internal_Verdaux ivda;
4906 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4908 get_data (&evda, file,
4909 offset - ivd.vd_next + ivd.vd_aux,
4910 sizeof (evda), _("version def aux"));
4912 ivda.vda_name = BYTE_GET (evda.vda_name);
4914 name = strtab + ivda.vda_name;
4915 nn += printf ("(%s%-*s",
4917 12 - (int) strlen (name),
4923 printf ("%*c", 18 - nn, ' ');
4941 printf (_("\nNo version information found in this file.\n"));
4947 get_symbol_binding (binding)
4948 unsigned int binding;
4950 static char buff [32];
4954 case STB_LOCAL: return "LOCAL";
4955 case STB_GLOBAL: return "GLOBAL";
4956 case STB_WEAK: return "WEAK";
4958 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4959 sprintf (buff, _("<processor specific>: %d"), binding);
4960 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4961 sprintf (buff, _("<OS specific>: %d"), binding);
4963 sprintf (buff, _("<unknown>: %d"), binding);
4969 get_symbol_type (type)
4972 static char buff [32];
4976 case STT_NOTYPE: return "NOTYPE";
4977 case STT_OBJECT: return "OBJECT";
4978 case STT_FUNC: return "FUNC";
4979 case STT_SECTION: return "SECTION";
4980 case STT_FILE: return "FILE";
4981 case STT_COMMON: return "COMMON";
4983 if (type >= STT_LOPROC && type <= STT_HIPROC)
4985 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4986 return "THUMB_FUNC";
4988 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4991 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4992 return "PARISC_MILLI";
4994 sprintf (buff, _("<processor specific>: %d"), type);
4996 else if (type >= STT_LOOS && type <= STT_HIOS)
4998 if (elf_header.e_machine == EM_PARISC)
5000 if (type == STT_HP_OPAQUE)
5002 if (type == STT_HP_STUB)
5006 sprintf (buff, _("<OS specific>: %d"), type);
5009 sprintf (buff, _("<unknown>: %d"), type);
5015 get_symbol_visibility (visibility)
5016 unsigned int visibility;
5020 case STV_DEFAULT: return "DEFAULT";
5021 case STV_INTERNAL: return "INTERNAL";
5022 case STV_HIDDEN: return "HIDDEN";
5023 case STV_PROTECTED: return "PROTECTED";
5029 get_symbol_index_type (type)
5034 case SHN_UNDEF: return "UND";
5035 case SHN_ABS: return "ABS";
5036 case SHN_COMMON: return "COM";
5038 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5040 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5042 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5046 static char buff [32];
5048 sprintf (buff, "%3d", type);
5055 get_dynamic_data (file, number)
5057 unsigned int number;
5059 unsigned char * e_data;
5062 e_data = (unsigned char *) malloc (number * 4);
5066 error (_("Out of memory\n"));
5070 if (fread (e_data, 4, number, file) != number)
5072 error (_("Unable to read in dynamic data\n"));
5076 i_data = (int *) malloc (number * sizeof (* i_data));
5080 error (_("Out of memory\n"));
5086 i_data [number] = byte_get (e_data + number * 4, 4);
5093 /* Dump the symbol table */
5095 process_symbol_table (file)
5098 Elf32_Internal_Shdr * section;
5099 unsigned char nb [4];
5100 unsigned char nc [4];
5103 int * buckets = NULL;
5104 int * chains = NULL;
5106 if (! do_syms && !do_histogram)
5109 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5112 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5114 error (_("Unable to seek to start of dynamic information"));
5118 if (fread (nb, sizeof (nb), 1, file) != 1)
5120 error (_("Failed to read in number of buckets\n"));
5124 if (fread (nc, sizeof (nc), 1, file) != 1)
5126 error (_("Failed to read in number of chains\n"));
5130 nbuckets = byte_get (nb, 4);
5131 nchains = byte_get (nc, 4);
5133 buckets = get_dynamic_data (file, nbuckets);
5134 chains = get_dynamic_data (file, nchains);
5136 if (buckets == NULL || chains == NULL)
5141 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5146 printf (_("\nSymbol table for image:\n"));
5148 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5150 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5152 for (hn = 0; hn < nbuckets; hn++)
5157 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5159 Elf_Internal_Sym * psym;
5161 psym = dynamic_symbols + si;
5163 printf (" %3d %3d: ", si, hn);
5164 print_vma (psym->st_value, LONG_HEX);
5166 print_vma (psym->st_size, DEC_5);
5168 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5169 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5170 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5171 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
5172 printf (" %s\n", dynamic_strings + psym->st_name);
5176 else if (do_syms && !do_using_dynamic)
5180 for (i = 0, section = section_headers;
5181 i < elf_header.e_shnum;
5186 Elf_Internal_Sym * symtab;
5187 Elf_Internal_Sym * psym;
5190 if ( section->sh_type != SHT_SYMTAB
5191 && section->sh_type != SHT_DYNSYM)
5194 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5195 SECTION_NAME (section),
5196 (unsigned long) (section->sh_size / section->sh_entsize));
5198 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5200 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5202 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
5203 section->sh_size / section->sh_entsize);
5207 if (section->sh_link == elf_header.e_shstrndx)
5208 strtab = string_table;
5211 Elf32_Internal_Shdr * string_sec;
5213 string_sec = section_headers + section->sh_link;
5215 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5216 string_sec->sh_size,
5220 for (si = 0, psym = symtab;
5221 si < section->sh_size / section->sh_entsize;
5224 printf ("%6d: ", si);
5225 print_vma (psym->st_value, LONG_HEX);
5227 print_vma (psym->st_size, DEC_5);
5228 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5229 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5230 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5231 printf (" %4s", get_symbol_index_type (psym->st_shndx));
5232 printf (" %s", strtab + psym->st_name);
5234 if (section->sh_type == SHT_DYNSYM &&
5235 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5237 unsigned char data[2];
5238 unsigned short vers_data;
5239 unsigned long offset;
5243 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5246 get_data (&data, file, offset + si * sizeof (vers_data),
5247 sizeof (data), _("version data"));
5249 vers_data = byte_get (data, 2);
5251 is_nobits = psym->st_shndx < SHN_LORESERVE ?
5252 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
5255 check_def = (psym->st_shndx != SHN_UNDEF);
5257 if ((vers_data & 0x8000) || vers_data > 1)
5259 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5260 && (is_nobits || ! check_def))
5262 Elf_External_Verneed evn;
5263 Elf_Internal_Verneed ivn;
5264 Elf_Internal_Vernaux ivna;
5266 /* We must test both. */
5267 offset = version_info
5268 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5272 unsigned long vna_off;
5274 get_data (&evn, file, offset, sizeof (evn),
5277 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5278 ivn.vn_next = BYTE_GET (evn.vn_next);
5280 vna_off = offset + ivn.vn_aux;
5284 Elf_External_Vernaux evna;
5286 get_data (&evna, file, vna_off,
5288 _("version need aux (3)"));
5290 ivna.vna_other = BYTE_GET (evna.vna_other);
5291 ivna.vna_next = BYTE_GET (evna.vna_next);
5292 ivna.vna_name = BYTE_GET (evna.vna_name);
5294 vna_off += ivna.vna_next;
5296 while (ivna.vna_other != vers_data
5297 && ivna.vna_next != 0);
5299 if (ivna.vna_other == vers_data)
5302 offset += ivn.vn_next;
5304 while (ivn.vn_next != 0);
5306 if (ivna.vna_other == vers_data)
5309 strtab + ivna.vna_name, ivna.vna_other);
5312 else if (! is_nobits)
5313 error (_("bad dynamic symbol"));
5320 if (vers_data != 0x8001
5321 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5323 Elf_Internal_Verdef ivd;
5324 Elf_Internal_Verdaux ivda;
5325 Elf_External_Verdaux evda;
5326 unsigned long offset;
5329 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5334 Elf_External_Verdef evd;
5336 get_data (&evd, file, offset, sizeof (evd),
5339 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5340 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5341 ivd.vd_next = BYTE_GET (evd.vd_next);
5343 offset += ivd.vd_next;
5345 while (ivd.vd_ndx != (vers_data & 0x7fff)
5346 && ivd.vd_next != 0);
5348 offset -= ivd.vd_next;
5349 offset += ivd.vd_aux;
5351 get_data (&evda, file, offset, sizeof (evda),
5352 _("version def aux"));
5354 ivda.vda_name = BYTE_GET (evda.vda_name);
5356 if (psym->st_name != ivda.vda_name)
5357 printf ((vers_data & 0x8000)
5359 strtab + ivda.vda_name);
5369 if (strtab != string_table)
5375 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5377 if (do_histogram && buckets != NULL)
5384 int nzero_counts = 0;
5387 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5389 printf (_(" Length Number %% of total Coverage\n"));
5391 lengths = (int *) calloc (nbuckets, sizeof (int));
5392 if (lengths == NULL)
5394 error (_("Out of memory"));
5397 for (hn = 0; hn < nbuckets; ++hn)
5402 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5405 if (maxlength < ++lengths[hn])
5410 counts = (int *) calloc (maxlength + 1, sizeof (int));
5413 error (_("Out of memory"));
5417 for (hn = 0; hn < nbuckets; ++hn)
5418 ++ counts [lengths [hn]];
5422 printf (" 0 %-10d (%5.1f%%)\n",
5423 counts[0], (counts[0] * 100.0) / nbuckets);
5424 for (si = 1; si <= maxlength; ++si)
5426 nzero_counts += counts[si] * si;
5427 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5428 si, counts[si], (counts[si] * 100.0) / nbuckets,
5429 (nzero_counts * 100.0) / nsyms);
5437 if (buckets != NULL)
5447 process_syminfo (file)
5448 FILE * file ATTRIBUTE_UNUSED;
5452 if (dynamic_syminfo == NULL
5454 /* No syminfo, this is ok. */
5457 /* There better should be a dynamic symbol section. */
5458 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5462 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5463 dynamic_syminfo_offset, dynamic_syminfo_nent);
5465 printf (_(" Num: Name BoundTo Flags\n"));
5466 for (i = 0; i < dynamic_syminfo_nent; ++i)
5468 unsigned short int flags = dynamic_syminfo[i].si_flags;
5470 printf ("%4d: %-30s ", i,
5471 dynamic_strings + dynamic_symbols[i].st_name);
5473 switch (dynamic_syminfo[i].si_boundto)
5475 case SYMINFO_BT_SELF:
5476 fputs ("SELF ", stdout);
5478 case SYMINFO_BT_PARENT:
5479 fputs ("PARENT ", stdout);
5482 if (dynamic_syminfo[i].si_boundto > 0
5483 && dynamic_syminfo[i].si_boundto < dynamic_size)
5486 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5488 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5492 if (flags & SYMINFO_FLG_DIRECT)
5494 if (flags & SYMINFO_FLG_PASSTHRU)
5495 printf (" PASSTHRU");
5496 if (flags & SYMINFO_FLG_COPY)
5498 if (flags & SYMINFO_FLG_LAZYLOAD)
5499 printf (" LAZYLOAD");
5507 #ifdef SUPPORT_DISASSEMBLY
5509 disassemble_section (section, file)
5510 Elf32_Internal_Shdr * section;
5513 printf (_("\nAssembly dump of section %s\n"),
5514 SECTION_NAME (section));
5516 /* XXX -- to be done --- XXX */
5523 dump_section (section, file)
5524 Elf32_Internal_Shdr * section;
5527 bfd_size_type bytes;
5529 unsigned char * data;
5530 unsigned char * start;
5532 bytes = section->sh_size;
5536 printf (_("\nSection '%s' has no data to dump.\n"),
5537 SECTION_NAME (section));
5541 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5543 addr = section->sh_addr;
5545 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5558 lbytes = (bytes > 16 ? 16 : bytes);
5560 printf (" 0x%8.8lx ", (unsigned long) addr);
5562 switch (elf_header.e_ident [EI_DATA])
5566 for (j = 15; j >= 0; j --)
5569 printf ("%2.2x", data [j]);
5579 for (j = 0; j < 16; j++)
5582 printf ("%2.2x", data [j]);
5592 for (j = 0; j < lbytes; j++)
5595 if (k >= ' ' && k < 0x80)
5614 static unsigned long int
5615 read_leb128 (data, length_return, sign)
5616 unsigned char * data;
5617 int * length_return;
5620 unsigned long int result = 0;
5621 unsigned int num_read = 0;
5630 result |= (byte & 0x7f) << shift;
5635 while (byte & 0x80);
5637 if (length_return != NULL)
5638 * length_return = num_read;
5640 if (sign && (shift < 32) && (byte & 0x40))
5641 result |= -1 << shift;
5646 typedef struct State_Machine_Registers
5648 unsigned long address;
5651 unsigned int column;
5655 /* This variable hold the number of the last entry seen
5656 in the File Table. */
5657 unsigned int last_file_entry;
5660 static SMR state_machine_regs;
5663 reset_state_machine (is_stmt)
5666 state_machine_regs.address = 0;
5667 state_machine_regs.file = 1;
5668 state_machine_regs.line = 1;
5669 state_machine_regs.column = 0;
5670 state_machine_regs.is_stmt = is_stmt;
5671 state_machine_regs.basic_block = 0;
5672 state_machine_regs.end_sequence = 0;
5673 state_machine_regs.last_file_entry = 0;
5676 /* Handled an extend line op. Returns true if this is the end
5679 process_extended_line_op (data, is_stmt, pointer_size)
5680 unsigned char * data;
5684 unsigned char op_code;
5687 unsigned char * name;
5690 len = read_leb128 (data, & bytes_read, 0);
5695 warn (_("badly formed extended line op encountered!"));
5700 op_code = * data ++;
5702 printf (_(" Extended opcode %d: "), op_code);
5706 case DW_LNE_end_sequence:
5707 printf (_("End of Sequence\n\n"));
5708 reset_state_machine (is_stmt);
5711 case DW_LNE_set_address:
5712 adr = byte_get (data, pointer_size);
5713 printf (_("set Address to 0x%lx\n"), adr);
5714 state_machine_regs.address = adr;
5717 case DW_LNE_define_file:
5718 printf (_(" define new File Table entry\n"));
5719 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5721 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5723 data += strlen ((char *) data) + 1;
5724 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5726 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5728 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5729 printf (_("%s\n\n"), name);
5733 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5740 /* Size of pointers in the .debug_line section. This information is not
5741 really present in that section. It's obtained before dumping the debug
5742 sections by doing some pre-scan of the .debug_info section. */
5743 static int debug_line_pointer_size = 4;
5746 display_debug_lines (section, start, file)
5747 Elf32_Internal_Shdr * section;
5748 unsigned char * start;
5749 FILE * file ATTRIBUTE_UNUSED;
5751 DWARF2_External_LineInfo * external;
5752 DWARF2_Internal_LineInfo info;
5753 unsigned char * standard_opcodes;
5754 unsigned char * data = start;
5755 unsigned char * end = start + section->sh_size;
5756 unsigned char * end_of_sequence;
5759 printf (_("\nDump of debug contents of section %s:\n\n"),
5760 SECTION_NAME (section));
5764 external = (DWARF2_External_LineInfo *) data;
5766 /* Check the length of the block. */
5767 info.li_length = BYTE_GET (external->li_length);
5769 if (info.li_length == 0xffffffff)
5771 warn (_("64-bit DWARF line info is not supported yet.\n"));
5775 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5778 (_("The line info appears to be corrupt - the section is too small\n"));
5782 /* Check its version number. */
5783 info.li_version = BYTE_GET (external->li_version);
5784 if (info.li_version != 2)
5786 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5790 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5791 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5792 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5793 info.li_line_base = BYTE_GET (external->li_line_base);
5794 info.li_line_range = BYTE_GET (external->li_line_range);
5795 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5797 /* Sign extend the line base field. */
5798 info.li_line_base <<= 24;
5799 info.li_line_base >>= 24;
5801 printf (_(" Length: %ld\n"), info.li_length);
5802 printf (_(" DWARF Version: %d\n"), info.li_version);
5803 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
5804 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5805 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5806 printf (_(" Line Base: %d\n"), info.li_line_base);
5807 printf (_(" Line Range: %d\n"), info.li_line_range);
5808 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5810 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5812 reset_state_machine (info.li_default_is_stmt);
5814 /* Display the contents of the Opcodes table. */
5815 standard_opcodes = data + sizeof (* external);
5817 printf (_("\n Opcodes:\n"));
5819 for (i = 1; i < info.li_opcode_base; i++)
5820 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5822 /* Display the contents of the Directory table. */
5823 data = standard_opcodes + info.li_opcode_base - 1;
5826 printf (_("\n The Directory Table is empty.\n"));
5829 printf (_("\n The Directory Table:\n"));
5833 printf (_(" %s\n"), data);
5835 data += strlen ((char *) data) + 1;
5839 /* Skip the NUL at the end of the table. */
5842 /* Display the contents of the File Name table. */
5844 printf (_("\n The File Name Table is empty.\n"));
5847 printf (_("\n The File Name Table:\n"));
5848 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5852 unsigned char * name;
5855 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5858 data += strlen ((char *) data) + 1;
5860 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5862 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5864 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5866 printf (_("%s\n"), name);
5870 /* Skip the NUL at the end of the table. */
5873 /* Now display the statements. */
5874 printf (_("\n Line Number Statements:\n"));
5877 while (data < end_of_sequence)
5879 unsigned char op_code;
5883 op_code = * data ++;
5887 case DW_LNS_extended_op:
5888 data += process_extended_line_op (data, info.li_default_is_stmt,
5889 debug_line_pointer_size);
5893 printf (_(" Copy\n"));
5896 case DW_LNS_advance_pc:
5897 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5899 state_machine_regs.address += adv;
5900 printf (_(" Advance PC by %d to %lx\n"), adv,
5901 state_machine_regs.address);
5904 case DW_LNS_advance_line:
5905 adv = read_leb128 (data, & bytes_read, 1);
5907 state_machine_regs.line += adv;
5908 printf (_(" Advance Line by %d to %d\n"), adv,
5909 state_machine_regs.line);
5912 case DW_LNS_set_file:
5913 adv = read_leb128 (data, & bytes_read, 0);
5915 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5917 state_machine_regs.file = adv;
5920 case DW_LNS_set_column:
5921 adv = read_leb128 (data, & bytes_read, 0);
5923 printf (_(" Set column to %d\n"), adv);
5924 state_machine_regs.column = adv;
5927 case DW_LNS_negate_stmt:
5928 adv = state_machine_regs.is_stmt;
5930 printf (_(" Set is_stmt to %d\n"), adv);
5931 state_machine_regs.is_stmt = adv;
5934 case DW_LNS_set_basic_block:
5935 printf (_(" Set basic block\n"));
5936 state_machine_regs.basic_block = 1;
5939 case DW_LNS_const_add_pc:
5940 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5941 * info.li_min_insn_length);
5942 state_machine_regs.address += adv;
5943 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5944 state_machine_regs.address);
5947 case DW_LNS_fixed_advance_pc:
5948 adv = byte_get (data, 2);
5950 state_machine_regs.address += adv;
5951 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5952 adv, state_machine_regs.address);
5956 op_code -= info.li_opcode_base;
5957 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5958 state_machine_regs.address += adv;
5959 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5960 op_code, adv, state_machine_regs.address);
5961 adv = (op_code % info.li_line_range) + info.li_line_base;
5962 state_machine_regs.line += adv;
5963 printf (_(" and Line by %d to %d\n"),
5964 adv, state_machine_regs.line);
5975 display_debug_pubnames (section, start, file)
5976 Elf32_Internal_Shdr * section;
5977 unsigned char * start;
5978 FILE * file ATTRIBUTE_UNUSED;
5980 DWARF2_External_PubNames * external;
5981 DWARF2_Internal_PubNames pubnames;
5982 unsigned char * end;
5984 end = start + section->sh_size;
5986 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5990 unsigned char * data;
5991 unsigned long offset;
5993 external = (DWARF2_External_PubNames *) start;
5995 pubnames.pn_length = BYTE_GET (external->pn_length);
5996 pubnames.pn_version = BYTE_GET (external->pn_version);
5997 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5998 pubnames.pn_size = BYTE_GET (external->pn_size);
6000 data = start + sizeof (* external);
6001 start += pubnames.pn_length + sizeof (external->pn_length);
6003 if (pubnames.pn_length == 0xffffffff)
6005 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6009 if (pubnames.pn_version != 2)
6011 static int warned = 0;
6015 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6022 printf (_(" Length: %ld\n"),
6023 pubnames.pn_length);
6024 printf (_(" Version: %d\n"),
6025 pubnames.pn_version);
6026 printf (_(" Offset into .debug_info section: %ld\n"),
6027 pubnames.pn_offset);
6028 printf (_(" Size of area in .debug_info section: %ld\n"),
6031 printf (_("\n Offset\tName\n"));
6035 offset = byte_get (data, 4);
6040 printf (" %ld\t\t%s\n", offset, data);
6041 data += strlen ((char *) data) + 1;
6044 while (offset != 0);
6057 case DW_TAG_padding: return "DW_TAG_padding";
6058 case DW_TAG_array_type: return "DW_TAG_array_type";
6059 case DW_TAG_class_type: return "DW_TAG_class_type";
6060 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6061 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6062 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6063 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6064 case DW_TAG_label: return "DW_TAG_label";
6065 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6066 case DW_TAG_member: return "DW_TAG_member";
6067 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6068 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6069 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6070 case DW_TAG_string_type: return "DW_TAG_string_type";
6071 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6072 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6073 case DW_TAG_typedef: return "DW_TAG_typedef";
6074 case DW_TAG_union_type: return "DW_TAG_union_type";
6075 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6076 case DW_TAG_variant: return "DW_TAG_variant";
6077 case DW_TAG_common_block: return "DW_TAG_common_block";
6078 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6079 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6080 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6081 case DW_TAG_module: return "DW_TAG_module";
6082 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6083 case DW_TAG_set_type: return "DW_TAG_set_type";
6084 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6085 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6086 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6087 case DW_TAG_base_type: return "DW_TAG_base_type";
6088 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6089 case DW_TAG_const_type: return "DW_TAG_const_type";
6090 case DW_TAG_constant: return "DW_TAG_constant";
6091 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6092 case DW_TAG_file_type: return "DW_TAG_file_type";
6093 case DW_TAG_friend: return "DW_TAG_friend";
6094 case DW_TAG_namelist: return "DW_TAG_namelist";
6095 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6096 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6097 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6098 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6099 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6100 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6101 case DW_TAG_try_block: return "DW_TAG_try_block";
6102 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6103 case DW_TAG_variable: return "DW_TAG_variable";
6104 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6105 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6106 case DW_TAG_format_label: return "DW_TAG_format_label";
6107 case DW_TAG_function_template: return "DW_TAG_function_template";
6108 case DW_TAG_class_template: return "DW_TAG_class_template";
6109 /* DWARF 2.1 values. */
6110 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6111 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6112 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6113 case DW_TAG_namespace: return "DW_TAG_namespace";
6114 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6115 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6116 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6117 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6120 static char buffer [100];
6122 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6129 get_AT_name (attribute)
6130 unsigned long attribute;
6134 case DW_AT_sibling: return "DW_AT_sibling";
6135 case DW_AT_location: return "DW_AT_location";
6136 case DW_AT_name: return "DW_AT_name";
6137 case DW_AT_ordering: return "DW_AT_ordering";
6138 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6139 case DW_AT_byte_size: return "DW_AT_byte_size";
6140 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6141 case DW_AT_bit_size: return "DW_AT_bit_size";
6142 case DW_AT_element_list: return "DW_AT_element_list";
6143 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6144 case DW_AT_low_pc: return "DW_AT_low_pc";
6145 case DW_AT_high_pc: return "DW_AT_high_pc";
6146 case DW_AT_language: return "DW_AT_language";
6147 case DW_AT_member: return "DW_AT_member";
6148 case DW_AT_discr: return "DW_AT_discr";
6149 case DW_AT_discr_value: return "DW_AT_discr_value";
6150 case DW_AT_visibility: return "DW_AT_visibility";
6151 case DW_AT_import: return "DW_AT_import";
6152 case DW_AT_string_length: return "DW_AT_string_length";
6153 case DW_AT_common_reference: return "DW_AT_common_reference";
6154 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6155 case DW_AT_const_value: return "DW_AT_const_value";
6156 case DW_AT_containing_type: return "DW_AT_containing_type";
6157 case DW_AT_default_value: return "DW_AT_default_value";
6158 case DW_AT_inline: return "DW_AT_inline";
6159 case DW_AT_is_optional: return "DW_AT_is_optional";
6160 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6161 case DW_AT_producer: return "DW_AT_producer";
6162 case DW_AT_prototyped: return "DW_AT_prototyped";
6163 case DW_AT_return_addr: return "DW_AT_return_addr";
6164 case DW_AT_start_scope: return "DW_AT_start_scope";
6165 case DW_AT_stride_size: return "DW_AT_stride_size";
6166 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6167 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6168 case DW_AT_accessibility: return "DW_AT_accessibility";
6169 case DW_AT_address_class: return "DW_AT_address_class";
6170 case DW_AT_artificial: return "DW_AT_artificial";
6171 case DW_AT_base_types: return "DW_AT_base_types";
6172 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6173 case DW_AT_count: return "DW_AT_count";
6174 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6175 case DW_AT_decl_column: return "DW_AT_decl_column";
6176 case DW_AT_decl_file: return "DW_AT_decl_file";
6177 case DW_AT_decl_line: return "DW_AT_decl_line";
6178 case DW_AT_declaration: return "DW_AT_declaration";
6179 case DW_AT_discr_list: return "DW_AT_discr_list";
6180 case DW_AT_encoding: return "DW_AT_encoding";
6181 case DW_AT_external: return "DW_AT_external";
6182 case DW_AT_frame_base: return "DW_AT_frame_base";
6183 case DW_AT_friend: return "DW_AT_friend";
6184 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6185 case DW_AT_macro_info: return "DW_AT_macro_info";
6186 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6187 case DW_AT_priority: return "DW_AT_priority";
6188 case DW_AT_segment: return "DW_AT_segment";
6189 case DW_AT_specification: return "DW_AT_specification";
6190 case DW_AT_static_link: return "DW_AT_static_link";
6191 case DW_AT_type: return "DW_AT_type";
6192 case DW_AT_use_location: return "DW_AT_use_location";
6193 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6194 case DW_AT_virtuality: return "DW_AT_virtuality";
6195 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6196 /* DWARF 2.1 values. */
6197 case DW_AT_allocated: return "DW_AT_allocated";
6198 case DW_AT_associated: return "DW_AT_associated";
6199 case DW_AT_data_location: return "DW_AT_data_location";
6200 case DW_AT_stride: return "DW_AT_stride";
6201 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6202 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6203 case DW_AT_extension: return "DW_AT_extension";
6204 case DW_AT_ranges: return "DW_AT_ranges";
6205 case DW_AT_trampoline: return "DW_AT_trampoline";
6206 case DW_AT_call_column: return "DW_AT_call_column";
6207 case DW_AT_call_file: return "DW_AT_call_file";
6208 case DW_AT_call_line: return "DW_AT_call_line";
6209 /* SGI/MIPS extensions. */
6210 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6211 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6212 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6213 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6214 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6215 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6216 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6217 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6218 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6219 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6220 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6221 /* GNU extensions. */
6222 case DW_AT_sf_names: return "DW_AT_sf_names";
6223 case DW_AT_src_info: return "DW_AT_src_info";
6224 case DW_AT_mac_info: return "DW_AT_mac_info";
6225 case DW_AT_src_coords: return "DW_AT_src_coords";
6226 case DW_AT_body_begin: return "DW_AT_body_begin";
6227 case DW_AT_body_end: return "DW_AT_body_end";
6230 static char buffer [100];
6232 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6239 get_FORM_name (form)
6244 case DW_FORM_addr: return "DW_FORM_addr";
6245 case DW_FORM_block2: return "DW_FORM_block2";
6246 case DW_FORM_block4: return "DW_FORM_block4";
6247 case DW_FORM_data2: return "DW_FORM_data2";
6248 case DW_FORM_data4: return "DW_FORM_data4";
6249 case DW_FORM_data8: return "DW_FORM_data8";
6250 case DW_FORM_string: return "DW_FORM_string";
6251 case DW_FORM_block: return "DW_FORM_block";
6252 case DW_FORM_block1: return "DW_FORM_block1";
6253 case DW_FORM_data1: return "DW_FORM_data1";
6254 case DW_FORM_flag: return "DW_FORM_flag";
6255 case DW_FORM_sdata: return "DW_FORM_sdata";
6256 case DW_FORM_strp: return "DW_FORM_strp";
6257 case DW_FORM_udata: return "DW_FORM_udata";
6258 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6259 case DW_FORM_ref1: return "DW_FORM_ref1";
6260 case DW_FORM_ref2: return "DW_FORM_ref2";
6261 case DW_FORM_ref4: return "DW_FORM_ref4";
6262 case DW_FORM_ref8: return "DW_FORM_ref8";
6263 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6264 case DW_FORM_indirect: return "DW_FORM_indirect";
6267 static char buffer [100];
6269 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6275 /* FIXME: There are better and more effiecint ways to handle
6276 these structures. For now though, I just want something that
6277 is simple to implement. */
6278 typedef struct abbrev_attr
6280 unsigned long attribute;
6282 struct abbrev_attr * next;
6286 typedef struct abbrev_entry
6288 unsigned long entry;
6291 struct abbrev_attr * first_attr;
6292 struct abbrev_attr * last_attr;
6293 struct abbrev_entry * next;
6297 static abbrev_entry * first_abbrev = NULL;
6298 static abbrev_entry * last_abbrev = NULL;
6301 free_abbrevs PARAMS ((void))
6303 abbrev_entry * abbrev;
6305 for (abbrev = first_abbrev; abbrev;)
6307 abbrev_entry * next = abbrev->next;
6310 for (attr = abbrev->first_attr; attr;)
6312 abbrev_attr * next = attr->next;
6322 last_abbrev = first_abbrev = NULL;
6326 add_abbrev (number, tag, children)
6327 unsigned long number;
6331 abbrev_entry * entry;
6333 entry = (abbrev_entry *) malloc (sizeof (* entry));
6339 entry->entry = number;
6341 entry->children = children;
6342 entry->first_attr = NULL;
6343 entry->last_attr = NULL;
6346 if (first_abbrev == NULL)
6347 first_abbrev = entry;
6349 last_abbrev->next = entry;
6351 last_abbrev = entry;
6355 add_abbrev_attr (attribute, form)
6356 unsigned long attribute;
6361 attr = (abbrev_attr *) malloc (sizeof (* attr));
6367 attr->attribute = attribute;
6371 if (last_abbrev->first_attr == NULL)
6372 last_abbrev->first_attr = attr;
6374 last_abbrev->last_attr->next = attr;
6376 last_abbrev->last_attr = attr;
6379 /* Processes the (partial) contents of a .debug_abbrev section.
6380 Returns NULL if the end of the section was encountered.
6381 Returns the address after the last byte read if the end of
6382 an abbreviation set was found. */
6384 static unsigned char *
6385 process_abbrev_section (start, end)
6386 unsigned char * start;
6387 unsigned char * end;
6389 if (first_abbrev != NULL)
6395 unsigned long entry;
6397 unsigned long attribute;
6400 entry = read_leb128 (start, & bytes_read, 0);
6401 start += bytes_read;
6403 /* A single zero is supposed to end the section according
6404 to the standard. If there's more, then signal that to
6407 return start == end ? NULL : start;
6409 tag = read_leb128 (start, & bytes_read, 0);
6410 start += bytes_read;
6412 children = * start ++;
6414 add_abbrev (entry, tag, children);
6420 attribute = read_leb128 (start, & bytes_read, 0);
6421 start += bytes_read;
6423 form = read_leb128 (start, & bytes_read, 0);
6424 start += bytes_read;
6427 add_abbrev_attr (attribute, form);
6429 while (attribute != 0);
6437 display_debug_macinfo (section, start, file)
6438 Elf32_Internal_Shdr * section;
6439 unsigned char * start;
6440 FILE * file ATTRIBUTE_UNUSED;
6442 unsigned char * end = start + section->sh_size;
6443 unsigned char * curr = start;
6444 unsigned int bytes_read;
6445 enum dwarf_macinfo_record_type op;
6447 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6451 unsigned int lineno;
6452 const char * string;
6459 case DW_MACINFO_start_file:
6461 unsigned int filenum;
6463 lineno = read_leb128 (curr, & bytes_read, 0);
6465 filenum = read_leb128 (curr, & bytes_read, 0);
6468 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6472 case DW_MACINFO_end_file:
6473 printf (_(" DW_MACINFO_end_file\n"));
6476 case DW_MACINFO_define:
6477 lineno = read_leb128 (curr, & bytes_read, 0);
6480 curr += strlen (string) + 1;
6481 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6484 case DW_MACINFO_undef:
6485 lineno = read_leb128 (curr, & bytes_read, 0);
6488 curr += strlen (string) + 1;
6489 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6492 case DW_MACINFO_vendor_ext:
6494 unsigned int constant;
6496 constant = read_leb128 (curr, & bytes_read, 0);
6499 curr += strlen (string) + 1;
6500 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6511 display_debug_abbrev (section, start, file)
6512 Elf32_Internal_Shdr * section;
6513 unsigned char * start;
6514 FILE * file ATTRIBUTE_UNUSED;
6516 abbrev_entry * entry;
6517 unsigned char * end = start + section->sh_size;
6519 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6523 start = process_abbrev_section (start, end);
6525 printf (_(" Number TAG\n"));
6527 for (entry = first_abbrev; entry; entry = entry->next)
6531 printf (_(" %ld %s [%s]\n"),
6533 get_TAG_name (entry->tag),
6534 entry->children ? _("has children") : _("no children"));
6536 for (attr = entry->first_attr; attr; attr = attr->next)
6538 printf (_(" %-18s %s\n"),
6539 get_AT_name (attr->attribute),
6540 get_FORM_name (attr->form));
6552 static unsigned char *
6553 display_block (data, length)
6554 unsigned char * data;
6555 unsigned long length;
6557 printf (_(" %lu byte block: "), length);
6560 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6566 decode_location_expression (data, pointer_size, length)
6567 unsigned char * data;
6568 unsigned int pointer_size;
6569 unsigned long length;
6573 unsigned long uvalue;
6574 unsigned char * end = data + length;
6583 printf ("DW_OP_addr: %lx",
6584 (unsigned long) byte_get (data, pointer_size));
6585 data += pointer_size;
6588 printf ("DW_OP_deref");
6591 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6594 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6597 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6601 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6605 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6609 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6613 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6614 (unsigned long) byte_get (data + 4, 4));
6618 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6619 (long) byte_get (data + 4, 4));
6623 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6627 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6631 printf ("DW_OP_dup");
6634 printf ("DW_OP_drop");
6637 printf ("DW_OP_over");
6640 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6643 printf ("DW_OP_swap");
6646 printf ("DW_OP_rot");
6649 printf ("DW_OP_xderef");
6652 printf ("DW_OP_abs");
6655 printf ("DW_OP_and");
6658 printf ("DW_OP_div");
6661 printf ("DW_OP_minus");
6664 printf ("DW_OP_mod");
6667 printf ("DW_OP_mul");
6670 printf ("DW_OP_neg");
6673 printf ("DW_OP_not");
6676 printf ("DW_OP_or");
6679 printf ("DW_OP_plus");
6681 case DW_OP_plus_uconst:
6682 printf ("DW_OP_plus_uconst: %lu",
6683 read_leb128 (data, &bytes_read, 0));
6687 printf ("DW_OP_shl");
6690 printf ("DW_OP_shr");
6693 printf ("DW_OP_shra");
6696 printf ("DW_OP_xor");
6699 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6703 printf ("DW_OP_eq");
6706 printf ("DW_OP_ge");
6709 printf ("DW_OP_gt");
6712 printf ("DW_OP_le");
6715 printf ("DW_OP_lt");
6718 printf ("DW_OP_ne");
6721 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6757 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6792 printf ("DW_OP_reg%d", op - DW_OP_reg0);
6827 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6828 read_leb128 (data, &bytes_read, 1));
6833 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
6837 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
6841 uvalue = read_leb128 (data, &bytes_read, 0);
6843 printf ("DW_OP_bregx: %lu %ld", uvalue,
6844 read_leb128 (data, &bytes_read, 1));
6848 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6851 case DW_OP_deref_size:
6852 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6854 case DW_OP_xderef_size:
6855 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6858 printf ("DW_OP_nop");
6861 /* DWARF 2.1 extensions. */
6862 case DW_OP_push_object_address:
6863 printf ("DW_OP_push_object_address");
6866 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
6870 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
6874 printf ("DW_OP_calli");
6878 if (op >= DW_OP_lo_user
6879 && op <= DW_OP_hi_user)
6880 printf (_("(User defined location op)"));
6882 printf (_("(Unknown location op)"));
6883 /* No way to tell where the next op is, so just bail. */
6887 /* Separate the ops. */
6893 static unsigned char *
6894 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
6895 unsigned long attribute;
6897 unsigned char * data;
6898 unsigned long cu_offset;
6899 unsigned long pointer_size;
6901 unsigned long uvalue = 0;
6902 unsigned char * block_start = NULL;
6905 printf (" %-18s:", get_AT_name (attribute));
6912 case DW_FORM_ref_addr:
6914 uvalue = byte_get (data, pointer_size);
6915 data += pointer_size;
6921 uvalue = byte_get (data ++, 1);
6926 uvalue = byte_get (data, 2);
6932 uvalue = byte_get (data, 4);
6937 uvalue = read_leb128 (data, & bytes_read, 1);
6941 case DW_FORM_ref_udata:
6943 uvalue = read_leb128 (data, & bytes_read, 0);
6950 case DW_FORM_ref_addr:
6951 printf (" <#%lx>", uvalue);
6957 case DW_FORM_ref_udata:
6958 printf (" <%lx>", uvalue + cu_offset);
6962 printf (" %#lx", uvalue);
6970 printf (" %ld", uvalue);
6975 uvalue = byte_get (data, 4);
6976 printf (" %lx", uvalue);
6977 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6981 case DW_FORM_string:
6982 printf (" %s", data);
6983 data += strlen ((char *) data) + 1;
6987 uvalue = read_leb128 (data, & bytes_read, 0);
6988 block_start = data + bytes_read;
6989 data = display_block (block_start, uvalue);
6992 case DW_FORM_block1:
6993 uvalue = byte_get (data, 1);
6994 block_start = data + 1;
6995 data = display_block (block_start, uvalue);
6998 case DW_FORM_block2:
6999 uvalue = byte_get (data, 2);
7000 block_start = data + 2;
7001 data = display_block (block_start, uvalue);
7004 case DW_FORM_block4:
7005 uvalue = byte_get (data, 4);
7006 block_start = data + 4;
7007 data = display_block (block_start, uvalue);
7011 case DW_FORM_indirect:
7012 warn (_("Unable to handle FORM: %d"), form);
7016 warn (_("Unrecognised form: %d"), form);
7020 /* For some attributes we can display futher information. */
7029 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7030 case DW_INL_inlined: printf (_("(inlined)")); break;
7031 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7032 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7033 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7037 case DW_AT_language:
7040 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7041 case DW_LANG_C89: printf ("(ANSI C)"); break;
7042 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7043 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7044 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7045 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7046 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7047 case DW_LANG_Ada83: printf ("(Ada)"); break;
7048 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7049 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7050 /* DWARF 2.1 values. */
7051 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7052 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7053 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7054 /* MIPS extension. */
7055 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7056 default: printf ("(Unknown: %lx)", uvalue); break;
7060 case DW_AT_encoding:
7063 case DW_ATE_void: printf ("(void)"); break;
7064 case DW_ATE_address: printf ("(machine address)"); break;
7065 case DW_ATE_boolean: printf ("(boolean)"); break;
7066 case DW_ATE_complex_float: printf ("(complex float)"); break;
7067 case DW_ATE_float: printf ("(float)"); break;
7068 case DW_ATE_signed: printf ("(signed)"); break;
7069 case DW_ATE_signed_char: printf ("(signed char)"); break;
7070 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7071 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7072 /* DWARF 2.1 value. */
7073 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7075 if (uvalue >= DW_ATE_lo_user
7076 && uvalue <= DW_ATE_hi_user)
7077 printf ("(user defined type)");
7079 printf ("(unknown type)");
7084 case DW_AT_accessibility:
7087 case DW_ACCESS_public: printf ("(public)"); break;
7088 case DW_ACCESS_protected: printf ("(protected)"); break;
7089 case DW_ACCESS_private: printf ("(private)"); break;
7090 default: printf ("(unknown accessibility)"); break;
7094 case DW_AT_visibility:
7097 case DW_VIS_local: printf ("(local)"); break;
7098 case DW_VIS_exported: printf ("(exported)"); break;
7099 case DW_VIS_qualified: printf ("(qualified)"); break;
7100 default: printf ("(unknown visibility)"); break;
7104 case DW_AT_virtuality:
7107 case DW_VIRTUALITY_none: printf ("(none)"); break;
7108 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7109 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7110 default: printf ("(unknown virtuality)"); break;
7114 case DW_AT_identifier_case:
7117 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7118 case DW_ID_up_case: printf ("(up_case)"); break;
7119 case DW_ID_down_case: printf ("(down_case)"); break;
7120 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7121 default: printf ("(unknown case)"); break;
7125 case DW_AT_calling_convention:
7128 case DW_CC_normal: printf ("(normal)"); break;
7129 case DW_CC_program: printf ("(program)"); break;
7130 case DW_CC_nocall: printf ("(nocall)"); break;
7132 if (uvalue >= DW_CC_lo_user
7133 && uvalue <= DW_CC_hi_user)
7134 printf ("(user defined)");
7136 printf ("(unknown convention)");
7140 case DW_AT_ordering:
7143 case -1: printf ("(undefined)"); break;
7144 case 0: printf ("(row major)"); break;
7145 case 1: printf ("(column major)"); break;
7149 case DW_AT_frame_base:
7150 case DW_AT_location:
7151 case DW_AT_data_member_location:
7152 case DW_AT_vtable_elem_location:
7153 case DW_AT_allocated:
7154 case DW_AT_associated:
7155 case DW_AT_data_location:
7157 case DW_AT_upper_bound:
7158 case DW_AT_lower_bound:
7162 decode_location_expression (block_start, pointer_size, uvalue);
7176 display_debug_info (section, start, file)
7177 Elf32_Internal_Shdr * section;
7178 unsigned char * start;
7181 unsigned char * end = start + section->sh_size;
7182 unsigned char * section_begin = start;
7184 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7188 DWARF2_External_CompUnit * external;
7189 DWARF2_Internal_CompUnit compunit;
7190 Elf32_Internal_Shdr * relsec;
7191 unsigned char * tags;
7194 unsigned long cu_offset;
7196 external = (DWARF2_External_CompUnit *) start;
7198 compunit.cu_length = BYTE_GET (external->cu_length);
7199 compunit.cu_version = BYTE_GET (external->cu_version);
7200 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7201 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7203 if (compunit.cu_length == 0xffffffff)
7205 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7209 /* Check for RELA relocations in the abbrev_offset address, and
7211 for (relsec = section_headers;
7212 relsec < section_headers + elf_header.e_shnum;
7215 unsigned long nrelas, nsyms;
7216 Elf_Internal_Rela *rela, *rp;
7217 Elf32_Internal_Shdr *symsec;
7218 Elf_Internal_Sym *symtab;
7219 Elf_Internal_Sym *sym;
7221 if (relsec->sh_type != SHT_RELA
7222 || section_headers + relsec->sh_info != section)
7225 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7229 symsec = section_headers + relsec->sh_link;
7230 nsyms = symsec->sh_size / symsec->sh_entsize;
7231 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
7233 for (rp = rela; rp < rela + nrelas; ++rp)
7236 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7242 sym = symtab + ELF32_R_SYM (rp->r_info);
7244 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7246 warn (_("Skipping unexpected symbol type %u"),
7247 ELF32_ST_TYPE (sym->st_info));
7253 sym = symtab + ELF64_R_SYM (rp->r_info);
7255 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7257 warn (_("Skipping unexpected symbol type %u"),
7258 ELF64_ST_TYPE (sym->st_info));
7263 compunit.cu_abbrev_offset += rp->r_addend;
7271 tags = start + sizeof (* external);
7272 cu_offset = start - section_begin;
7273 start += compunit.cu_length + sizeof (external->cu_length);
7275 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7276 printf (_(" Length: %ld\n"), compunit.cu_length);
7277 printf (_(" Version: %d\n"), compunit.cu_version);
7278 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7279 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7281 if (compunit.cu_version != 2)
7283 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7287 if (first_abbrev != NULL)
7290 /* Read in the abbrevs used by this compilation unit. */
7293 Elf32_Internal_Shdr * sec;
7294 unsigned char * begin;
7296 /* Locate the .debug_abbrev section and process it. */
7297 for (i = 0, sec = section_headers;
7298 i < elf_header.e_shnum;
7300 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7303 if (i == -1 || sec->sh_size == 0)
7305 warn (_("Unable to locate .debug_abbrev section!\n"));
7309 begin = ((unsigned char *)
7310 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7311 _("debug_abbrev section data")));
7315 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7316 begin + sec->sh_size);
7322 while (tags < start)
7325 unsigned long abbrev_number;
7326 abbrev_entry * entry;
7329 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7332 /* A null DIE marks the end of a list of children. */
7333 if (abbrev_number == 0)
7339 /* Scan through the abbreviation list until we reach the
7341 for (entry = first_abbrev;
7342 entry && entry->entry != abbrev_number;
7343 entry = entry->next)
7348 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7353 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7355 (unsigned long) (tags - section_begin - bytes_read),
7357 get_TAG_name (entry->tag));
7359 for (attr = entry->first_attr; attr; attr = attr->next)
7360 tags = read_and_display_attr (attr->attribute,
7363 compunit.cu_pointer_size);
7365 if (entry->children)
7376 display_debug_aranges (section, start, file)
7377 Elf32_Internal_Shdr * section;
7378 unsigned char * start;
7379 FILE * file ATTRIBUTE_UNUSED;
7381 unsigned char * end = start + section->sh_size;
7383 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7387 DWARF2_External_ARange * external;
7388 DWARF2_Internal_ARange arange;
7389 unsigned char * ranges;
7390 unsigned long length;
7391 unsigned long address;
7394 external = (DWARF2_External_ARange *) start;
7396 arange.ar_length = BYTE_GET (external->ar_length);
7397 arange.ar_version = BYTE_GET (external->ar_version);
7398 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7399 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7400 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7402 if (arange.ar_length == 0xffffffff)
7404 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7408 if (arange.ar_version != 2)
7410 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7414 printf (_(" Length: %ld\n"), arange.ar_length);
7415 printf (_(" Version: %d\n"), arange.ar_version);
7416 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7417 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7418 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7420 printf (_("\n Address Length\n"));
7422 ranges = start + sizeof (* external);
7424 /* Must pad to an alignment boundary that is twice the pointer size. */
7425 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7427 ranges += (2 * arange.ar_pointer_size) - excess;
7431 address = byte_get (ranges, arange.ar_pointer_size);
7433 ranges += arange.ar_pointer_size;
7435 length = byte_get (ranges, arange.ar_pointer_size);
7437 ranges += arange.ar_pointer_size;
7439 /* A pair of zeros marks the end of the list. */
7440 if (address == 0 && length == 0)
7443 printf (" %8.8lx %lu\n", address, length);
7446 start += arange.ar_length + sizeof (external->ar_length);
7454 typedef struct Frame_Chunk
7456 struct Frame_Chunk * next;
7457 unsigned char * chunk_start;
7459 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7460 short int * col_type;
7462 char * augmentation;
7463 unsigned int code_factor;
7465 unsigned long pc_begin;
7466 unsigned long pc_range;
7470 unsigned char fde_encoding;
7474 /* A marker for a col_type that means this column was never referenced
7475 in the frame info. */
7476 #define DW_CFA_unreferenced (-1)
7478 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7479 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7480 static int size_of_encoded_value PARAMS ((int));
7483 frame_need_space (fc, reg)
7487 int prev = fc->ncols;
7489 if (reg < fc->ncols)
7492 fc->ncols = reg + 1;
7493 fc->col_type = (short int *) xrealloc (fc->col_type,
7494 fc->ncols * sizeof (short int));
7495 fc->col_offset = (int *) xrealloc (fc->col_offset,
7496 fc->ncols * sizeof (int));
7498 while (prev < fc->ncols)
7500 fc->col_type[prev] = DW_CFA_unreferenced;
7501 fc->col_offset[prev] = 0;
7507 frame_display_row (fc, need_col_headers, max_regs)
7509 int * need_col_headers;
7515 if (* max_regs < fc->ncols)
7516 * max_regs = fc->ncols;
7518 if (* need_col_headers)
7520 * need_col_headers = 0;
7522 printf (" LOC CFA ");
7524 for (r = 0; r < * max_regs; r++)
7525 if (fc->col_type[r] != DW_CFA_unreferenced)
7530 printf ("r%-4d", r);
7536 printf ("%08lx ", fc->pc_begin);
7537 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7538 printf ("%-8s ", tmp);
7540 for (r = 0; r < fc->ncols; r++)
7542 if (fc->col_type[r] != DW_CFA_unreferenced)
7544 switch (fc->col_type[r])
7546 case DW_CFA_undefined:
7549 case DW_CFA_same_value:
7553 sprintf (tmp, "c%+d", fc->col_offset[r]);
7555 case DW_CFA_register:
7556 sprintf (tmp, "r%d", fc->col_offset[r]);
7559 strcpy (tmp, "n/a");
7562 printf ("%-5s", tmp);
7569 size_of_encoded_value (encoding)
7572 switch (encoding & 0x7)
7575 case 0: return is_32bit_elf ? 4 : 8;
7582 #define GET(N) byte_get (start, N); start += N
7583 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7584 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7587 display_debug_frames (section, start, file)
7588 Elf32_Internal_Shdr * section;
7589 unsigned char * start;
7590 FILE * file ATTRIBUTE_UNUSED;
7592 unsigned char * end = start + section->sh_size;
7593 unsigned char * section_start = start;
7594 Frame_Chunk * chunks = 0;
7595 Frame_Chunk * remembered_state = 0;
7597 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7600 int addr_size = is_32bit_elf ? 4 : 8;
7602 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7606 unsigned char * saved_start;
7607 unsigned char * block_end;
7608 unsigned long length;
7609 unsigned long cie_id;
7612 int need_col_headers = 1;
7613 unsigned char * augmentation_data = NULL;
7614 unsigned long augmentation_data_len = 0;
7615 int encoded_ptr_size = addr_size;
7617 saved_start = start;
7618 length = byte_get (start, 4); start += 4;
7623 if (length == 0xffffffff)
7625 warn (_("64-bit DWARF format frames are not supported yet.\n"));
7629 block_end = saved_start + length + 4;
7630 cie_id = byte_get (start, 4); start += 4;
7632 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7636 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7637 memset (fc, 0, sizeof (Frame_Chunk));
7641 fc->chunk_start = saved_start;
7643 fc->col_type = (short int *) xmalloc (sizeof (short int));
7644 fc->col_offset = (int *) xmalloc (sizeof (int));
7645 frame_need_space (fc, max_regs-1);
7649 fc->augmentation = start;
7650 start = strchr (start, '\0') + 1;
7652 if (fc->augmentation[0] == 'z')
7654 fc->code_factor = LEB ();
7655 fc->data_factor = SLEB ();
7656 fc->ra = byte_get (start, 1); start += 1;
7657 augmentation_data_len = LEB ();
7658 augmentation_data = start;
7659 start += augmentation_data_len;
7661 else if (strcmp (fc->augmentation, "eh") == 0)
7664 fc->code_factor = LEB ();
7665 fc->data_factor = SLEB ();
7666 fc->ra = byte_get (start, 1); start += 1;
7670 fc->code_factor = LEB ();
7671 fc->data_factor = SLEB ();
7672 fc->ra = byte_get (start, 1); start += 1;
7676 if (do_debug_frames_interp)
7677 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7678 (unsigned long)(saved_start - section_start), length, cie_id,
7679 fc->augmentation, fc->code_factor, fc->data_factor,
7683 printf ("\n%08lx %08lx %08lx CIE\n",
7684 (unsigned long)(saved_start - section_start), length, cie_id);
7685 printf (" Version: %d\n", version);
7686 printf (" Augmentation: \"%s\"\n", fc->augmentation);
7687 printf (" Code alignment factor: %u\n", fc->code_factor);
7688 printf (" Data alignment factor: %d\n", fc->data_factor);
7689 printf (" Return address column: %d\n", fc->ra);
7691 if (augmentation_data_len)
7694 printf (" Augmentation data: ");
7695 for (i = 0; i < augmentation_data_len; ++i)
7696 printf (" %02x", augmentation_data[i]);
7702 if (augmentation_data_len)
7704 unsigned char *p, *q;
7705 p = fc->augmentation + 1;
7706 q = augmentation_data;
7713 q += 1 + size_of_encoded_value (*q);
7715 fc->fde_encoding = *q++;
7721 if (fc->fde_encoding)
7722 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7725 frame_need_space (fc, fc->ra);
7729 unsigned char * look_for;
7730 static Frame_Chunk fde_fc;
7733 memset (fc, 0, sizeof (Frame_Chunk));
7735 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
7737 for (cie = chunks; cie ; cie = cie->next)
7738 if (cie->chunk_start == look_for)
7743 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7744 cie_id, saved_start);
7747 fc->col_type = (short int *) xmalloc (sizeof (short int));
7748 fc->col_offset = (int *) xmalloc (sizeof (int));
7749 frame_need_space (fc, max_regs - 1);
7751 fc->augmentation = "";
7752 fc->fde_encoding = 0;
7756 fc->ncols = cie->ncols;
7757 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
7758 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
7759 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7760 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7761 fc->augmentation = cie->augmentation;
7762 fc->code_factor = cie->code_factor;
7763 fc->data_factor = cie->data_factor;
7764 fc->cfa_reg = cie->cfa_reg;
7765 fc->cfa_offset = cie->cfa_offset;
7767 frame_need_space (fc, max_regs-1);
7768 fc->fde_encoding = cie->fde_encoding;
7771 if (fc->fde_encoding)
7772 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7774 fc->pc_begin = byte_get (start, encoded_ptr_size);
7775 start += encoded_ptr_size;
7776 fc->pc_range = byte_get (start, encoded_ptr_size);
7777 start += encoded_ptr_size;
7779 if (cie->augmentation[0] == 'z')
7781 augmentation_data_len = LEB ();
7782 augmentation_data = start;
7783 start += augmentation_data_len;
7786 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
7787 (unsigned long)(saved_start - section_start), length, cie_id,
7788 (unsigned long)(cie->chunk_start - section_start),
7789 fc->pc_begin, fc->pc_begin + fc->pc_range);
7790 if (! do_debug_frames_interp && augmentation_data_len)
7793 printf (" Augmentation data: ");
7794 for (i = 0; i < augmentation_data_len; ++i)
7795 printf (" %02x", augmentation_data[i]);
7801 /* At this point, fc is the current chunk, cie (if any) is set, and we're
7802 about to interpret instructions for the chunk. */
7804 if (do_debug_frames_interp)
7806 /* Start by making a pass over the chunk, allocating storage
7807 and taking note of what registers are used. */
7808 unsigned char * tmp = start;
7810 while (start < block_end)
7820 /* Warning: if you add any more cases to this switch, be
7821 sure to add them to the corresponding switch below. */
7824 case DW_CFA_advance_loc:
7828 frame_need_space (fc, opa);
7829 fc->col_type[opa] = DW_CFA_undefined;
7831 case DW_CFA_restore:
7832 frame_need_space (fc, opa);
7833 fc->col_type[opa] = DW_CFA_undefined;
7835 case DW_CFA_set_loc:
7836 start += encoded_ptr_size;
7838 case DW_CFA_advance_loc1:
7841 case DW_CFA_advance_loc2:
7844 case DW_CFA_advance_loc4:
7847 case DW_CFA_offset_extended:
7848 reg = LEB (); LEB ();
7849 frame_need_space (fc, reg);
7850 fc->col_type[reg] = DW_CFA_undefined;
7852 case DW_CFA_restore_extended:
7854 frame_need_space (fc, reg);
7855 fc->col_type[reg] = DW_CFA_undefined;
7857 case DW_CFA_undefined:
7859 frame_need_space (fc, reg);
7860 fc->col_type[reg] = DW_CFA_undefined;
7862 case DW_CFA_same_value:
7864 frame_need_space (fc, reg);
7865 fc->col_type[reg] = DW_CFA_undefined;
7867 case DW_CFA_register:
7868 reg = LEB (); LEB ();
7869 frame_need_space (fc, reg);
7870 fc->col_type[reg] = DW_CFA_undefined;
7872 case DW_CFA_def_cfa:
7875 case DW_CFA_def_cfa_register:
7878 case DW_CFA_def_cfa_offset:
7881 #ifndef DW_CFA_GNU_args_size
7882 #define DW_CFA_GNU_args_size 0x2e
7884 case DW_CFA_GNU_args_size:
7887 #ifndef DW_CFA_GNU_negative_offset_extended
7888 #define DW_CFA_GNU_negative_offset_extended 0x2f
7890 case DW_CFA_GNU_negative_offset_extended:
7891 reg = LEB (); LEB ();
7892 frame_need_space (fc, reg);
7893 fc->col_type[reg] = DW_CFA_undefined;
7902 /* Now we know what registers are used, make a second pass over
7903 the chunk, this time actually printing out the info. */
7905 while (start < block_end)
7908 unsigned long ul, reg, roffs;
7917 /* Warning: if you add any more cases to this switch, be
7918 sure to add them to the corresponding switch above. */
7921 case DW_CFA_advance_loc:
7922 if (do_debug_frames_interp)
7923 frame_display_row (fc, &need_col_headers, &max_regs);
7925 printf (" DW_CFA_advance_loc: %d to %08lx\n",
7926 opa * fc->code_factor,
7927 fc->pc_begin + opa * fc->code_factor);
7928 fc->pc_begin += opa * fc->code_factor;
7933 if (! do_debug_frames_interp)
7934 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
7935 opa, roffs * fc->data_factor);
7936 fc->col_type[opa] = DW_CFA_offset;
7937 fc->col_offset[opa] = roffs * fc->data_factor;
7940 case DW_CFA_restore:
7941 if (! do_debug_frames_interp)
7942 printf (" DW_CFA_restore: r%d\n", opa);
7943 fc->col_type[opa] = cie->col_type[opa];
7944 fc->col_offset[opa] = cie->col_offset[opa];
7947 case DW_CFA_set_loc:
7948 vma = byte_get (start, encoded_ptr_size);
7949 start += encoded_ptr_size;
7950 if (do_debug_frames_interp)
7951 frame_display_row (fc, &need_col_headers, &max_regs);
7953 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
7957 case DW_CFA_advance_loc1:
7958 ofs = byte_get (start, 1); start += 1;
7959 if (do_debug_frames_interp)
7960 frame_display_row (fc, &need_col_headers, &max_regs);
7962 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
7963 ofs * fc->code_factor,
7964 fc->pc_begin + ofs * fc->code_factor);
7965 fc->pc_begin += ofs * fc->code_factor;
7968 case DW_CFA_advance_loc2:
7969 ofs = byte_get (start, 2); start += 2;
7970 if (do_debug_frames_interp)
7971 frame_display_row (fc, &need_col_headers, &max_regs);
7973 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
7974 ofs * fc->code_factor,
7975 fc->pc_begin + ofs * fc->code_factor);
7976 fc->pc_begin += ofs * fc->code_factor;
7979 case DW_CFA_advance_loc4:
7980 ofs = byte_get (start, 4); start += 4;
7981 if (do_debug_frames_interp)
7982 frame_display_row (fc, &need_col_headers, &max_regs);
7984 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
7985 ofs * fc->code_factor,
7986 fc->pc_begin + ofs * fc->code_factor);
7987 fc->pc_begin += ofs * fc->code_factor;
7990 case DW_CFA_offset_extended:
7993 if (! do_debug_frames_interp)
7994 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
7995 reg, roffs * fc->data_factor);
7996 fc->col_type[reg] = DW_CFA_offset;
7997 fc->col_offset[reg] = roffs * fc->data_factor;
8000 case DW_CFA_restore_extended:
8002 if (! do_debug_frames_interp)
8003 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8004 fc->col_type[reg] = cie->col_type[reg];
8005 fc->col_offset[reg] = cie->col_offset[reg];
8008 case DW_CFA_undefined:
8010 if (! do_debug_frames_interp)
8011 printf (" DW_CFA_undefined: r%ld\n", reg);
8012 fc->col_type[reg] = DW_CFA_undefined;
8013 fc->col_offset[reg] = 0;
8016 case DW_CFA_same_value:
8018 if (! do_debug_frames_interp)
8019 printf (" DW_CFA_same_value: r%ld\n", reg);
8020 fc->col_type[reg] = DW_CFA_same_value;
8021 fc->col_offset[reg] = 0;
8024 case DW_CFA_register:
8027 if (! do_debug_frames_interp)
8028 printf (" DW_CFA_register: r%ld\n", reg);
8029 fc->col_type[reg] = DW_CFA_register;
8030 fc->col_offset[reg] = roffs;
8033 case DW_CFA_remember_state:
8034 if (! do_debug_frames_interp)
8035 printf (" DW_CFA_remember_state\n");
8036 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8037 rs->ncols = fc->ncols;
8038 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8039 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8040 memcpy (rs->col_type, fc->col_type, rs->ncols);
8041 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8042 rs->next = remembered_state;
8043 remembered_state = rs;
8046 case DW_CFA_restore_state:
8047 if (! do_debug_frames_interp)
8048 printf (" DW_CFA_restore_state\n");
8049 rs = remembered_state;
8050 remembered_state = rs->next;
8051 frame_need_space (fc, rs->ncols-1);
8052 memcpy (fc->col_type, rs->col_type, rs->ncols);
8053 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8054 free (rs->col_type);
8055 free (rs->col_offset);
8059 case DW_CFA_def_cfa:
8060 fc->cfa_reg = LEB ();
8061 fc->cfa_offset = LEB ();
8062 if (! do_debug_frames_interp)
8063 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8064 fc->cfa_reg, fc->cfa_offset);
8067 case DW_CFA_def_cfa_register:
8068 fc->cfa_reg = LEB ();
8069 if (! do_debug_frames_interp)
8070 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8073 case DW_CFA_def_cfa_offset:
8074 fc->cfa_offset = LEB ();
8075 if (! do_debug_frames_interp)
8076 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8080 if (! do_debug_frames_interp)
8081 printf (" DW_CFA_nop\n");
8084 #ifndef DW_CFA_GNU_window_save
8085 #define DW_CFA_GNU_window_save 0x2d
8087 case DW_CFA_GNU_window_save:
8088 if (! do_debug_frames_interp)
8089 printf (" DW_CFA_GNU_window_save\n");
8092 case DW_CFA_GNU_args_size:
8094 if (! do_debug_frames_interp)
8095 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8098 case DW_CFA_GNU_negative_offset_extended:
8101 frame_need_space (fc, reg);
8102 if (! do_debug_frames_interp)
8103 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8104 reg, l * fc->data_factor);
8105 fc->col_type[reg] = DW_CFA_offset;
8106 fc->col_offset[reg] = l * fc->data_factor;
8110 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8115 if (do_debug_frames_interp)
8116 frame_display_row (fc, &need_col_headers, &max_regs);
8131 display_debug_not_supported (section, start, file)
8132 Elf32_Internal_Shdr * section;
8133 unsigned char * start ATTRIBUTE_UNUSED;
8134 FILE * file ATTRIBUTE_UNUSED;
8136 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8137 SECTION_NAME (section));
8142 /* Pre-scan the .debug_info section to record the size of address.
8143 When dumping the .debug_line, we use that size information, assuming
8144 that all compilation units have the same address size. */
8146 prescan_debug_info (section, start, file)
8147 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8148 unsigned char * start;
8149 FILE * file ATTRIBUTE_UNUSED;
8151 DWARF2_External_CompUnit * external;
8153 external = (DWARF2_External_CompUnit *) start;
8155 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8159 /* A structure containing the name of a debug section and a pointer
8160 to a function that can decode it. The third field is a prescan
8161 function to be run over the section before displaying any of the
8166 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8167 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8171 { ".debug_info", display_debug_info, prescan_debug_info },
8172 { ".debug_abbrev", display_debug_abbrev, NULL },
8173 { ".debug_line", display_debug_lines, NULL },
8174 { ".debug_aranges", display_debug_aranges, NULL },
8175 { ".debug_pubnames", display_debug_pubnames, NULL },
8176 { ".debug_frame", display_debug_frames, NULL },
8177 { ".eh_frame", display_debug_frames, NULL },
8178 { ".debug_macinfo", display_debug_macinfo, NULL },
8179 { ".debug_pubtypes", display_debug_not_supported, NULL },
8180 { ".debug_str", display_debug_not_supported, NULL },
8181 { ".debug_static_func", display_debug_not_supported, NULL },
8182 { ".debug_static_vars", display_debug_not_supported, NULL },
8183 { ".debug_types", display_debug_not_supported, NULL },
8184 { ".debug_weaknames", display_debug_not_supported, NULL }
8188 display_debug_section (section, file)
8189 Elf32_Internal_Shdr * section;
8192 char * name = SECTION_NAME (section);
8193 bfd_size_type length;
8194 unsigned char * start;
8197 length = section->sh_size;
8200 printf (_("\nSection '%s' has no debugging data.\n"), name);
8204 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8205 _("debug section data"));
8209 /* See if we know how to display the contents of this section. */
8210 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8211 name = ".debug_info";
8213 for (i = NUM_ELEM (debug_displays); i--;)
8214 if (strcmp (debug_displays[i].name, name) == 0)
8216 debug_displays[i].display (section, start, file);
8221 printf (_("Unrecognised debug section: %s\n"), name);
8225 /* If we loaded in the abbrev section at some point,
8226 we must release it here. */
8227 if (first_abbrev != NULL)
8234 process_section_contents (file)
8237 Elf32_Internal_Shdr * section;
8243 /* Pre-scan the debug sections to find some debug information not
8244 present in some of them. For the .debug_line, we must find out the
8245 size of address (specified in .debug_info and .debug_aranges). */
8246 for (i = 0, section = section_headers;
8247 i < elf_header.e_shnum && i < num_dump_sects;
8250 char * name = SECTION_NAME (section);
8253 if (section->sh_size == 0)
8256 /* See if there is some pre-scan operation for this section. */
8257 for (j = NUM_ELEM (debug_displays); j--;)
8258 if (strcmp (debug_displays[j].name, name) == 0)
8260 if (debug_displays[j].prescan != NULL)
8262 bfd_size_type length;
8263 unsigned char * start;
8265 length = section->sh_size;
8266 start = ((unsigned char *)
8267 get_data (NULL, file, section->sh_offset, length,
8268 _("debug section data")));
8272 debug_displays[j].prescan (section, start, file);
8280 for (i = 0, section = section_headers;
8281 i < elf_header.e_shnum && i < num_dump_sects;
8284 #ifdef SUPPORT_DISASSEMBLY
8285 if (dump_sects[i] & DISASS_DUMP)
8286 disassemble_section (section, file);
8288 if (dump_sects[i] & HEX_DUMP)
8289 dump_section (section, file);
8291 if (dump_sects[i] & DEBUG_DUMP)
8292 display_debug_section (section, file);
8295 if (i < num_dump_sects)
8296 warn (_("Some sections were not dumped because they do not exist!\n"));
8302 process_mips_fpe_exception (mask)
8308 if (mask & OEX_FPU_INEX)
8309 fputs ("INEX", stdout), first = 0;
8310 if (mask & OEX_FPU_UFLO)
8311 printf ("%sUFLO", first ? "" : "|"), first = 0;
8312 if (mask & OEX_FPU_OFLO)
8313 printf ("%sOFLO", first ? "" : "|"), first = 0;
8314 if (mask & OEX_FPU_DIV0)
8315 printf ("%sDIV0", first ? "" : "|"), first = 0;
8316 if (mask & OEX_FPU_INVAL)
8317 printf ("%sINVAL", first ? "" : "|");
8320 fputs ("0", stdout);
8324 process_mips_specific (file)
8327 Elf_Internal_Dyn * entry;
8328 size_t liblist_offset = 0;
8329 size_t liblistno = 0;
8330 size_t conflictsno = 0;
8331 size_t options_offset = 0;
8332 size_t conflicts_offset = 0;
8334 /* We have a lot of special sections. Thanks SGI! */
8335 if (dynamic_segment == NULL)
8336 /* No information available. */
8339 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8340 switch (entry->d_tag)
8342 case DT_MIPS_LIBLIST:
8343 liblist_offset = entry->d_un.d_val - loadaddr;
8345 case DT_MIPS_LIBLISTNO:
8346 liblistno = entry->d_un.d_val;
8348 case DT_MIPS_OPTIONS:
8349 options_offset = entry->d_un.d_val - loadaddr;
8351 case DT_MIPS_CONFLICT:
8352 conflicts_offset = entry->d_un.d_val - loadaddr;
8354 case DT_MIPS_CONFLICTNO:
8355 conflictsno = entry->d_un.d_val;
8361 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8363 Elf32_External_Lib * elib;
8366 elib = ((Elf32_External_Lib *)
8367 get_data (NULL, file, liblist_offset,
8368 liblistno * sizeof (Elf32_External_Lib),
8372 printf ("\nSection '.liblist' contains %lu entries:\n",
8373 (unsigned long) liblistno);
8374 fputs (" Library Time Stamp Checksum Version Flags\n",
8377 for (cnt = 0; cnt < liblistno; ++cnt)
8384 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8385 time = BYTE_GET (elib[cnt].l_time_stamp);
8386 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8387 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8388 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8390 tmp = gmtime (&time);
8391 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8392 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8393 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8395 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
8396 dynamic_strings + liblist.l_name, timebuf,
8397 liblist.l_checksum, liblist.l_version);
8399 if (liblist.l_flags == 0)
8410 { " EXACT_MATCH", LL_EXACT_MATCH },
8411 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8412 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8413 { " EXPORTS", LL_EXPORTS },
8414 { " DELAY_LOAD", LL_DELAY_LOAD },
8415 { " DELTA", LL_DELTA }
8417 int flags = liblist.l_flags;
8421 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8423 if ((flags & l_flags_vals[fcnt].bit) != 0)
8425 fputs (l_flags_vals[fcnt].name, stdout);
8426 flags ^= l_flags_vals[fcnt].bit;
8429 printf (" %#x", (unsigned int) flags);
8439 if (options_offset != 0)
8441 Elf_External_Options * eopt;
8442 Elf_Internal_Shdr * sect = section_headers;
8443 Elf_Internal_Options * iopt;
8444 Elf_Internal_Options * option;
8448 /* Find the section header so that we get the size. */
8449 while (sect->sh_type != SHT_MIPS_OPTIONS)
8452 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8453 sect->sh_size, _("options"));
8456 iopt = ((Elf_Internal_Options *)
8457 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8460 error (_("Out of memory"));
8467 while (offset < sect->sh_size)
8469 Elf_External_Options * eoption;
8471 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8473 option->kind = BYTE_GET (eoption->kind);
8474 option->size = BYTE_GET (eoption->size);
8475 option->section = BYTE_GET (eoption->section);
8476 option->info = BYTE_GET (eoption->info);
8478 offset += option->size;
8484 printf (_("\nSection '%s' contains %d entries:\n"),
8485 SECTION_NAME (sect), cnt);
8493 switch (option->kind)
8496 /* This shouldn't happen. */
8497 printf (" NULL %d %lx", option->section, option->info);
8500 printf (" REGINFO ");
8501 if (elf_header.e_machine == EM_MIPS)
8504 Elf32_External_RegInfo * ereg;
8505 Elf32_RegInfo reginfo;
8507 ereg = (Elf32_External_RegInfo *) (option + 1);
8508 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8509 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8510 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8511 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8512 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8513 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8515 printf ("GPR %08lx GP 0x%lx\n",
8517 (unsigned long) reginfo.ri_gp_value);
8518 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8519 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8520 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8525 Elf64_External_RegInfo * ereg;
8526 Elf64_Internal_RegInfo reginfo;
8528 ereg = (Elf64_External_RegInfo *) (option + 1);
8529 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8530 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8531 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8532 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8533 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8534 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8536 printf ("GPR %08lx GP 0x",
8537 reginfo.ri_gprmask);
8538 printf_vma (reginfo.ri_gp_value);
8541 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8542 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8543 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8547 case ODK_EXCEPTIONS:
8548 fputs (" EXCEPTIONS fpe_min(", stdout);
8549 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8550 fputs (") fpe_max(", stdout);
8551 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8552 fputs (")", stdout);
8554 if (option->info & OEX_PAGE0)
8555 fputs (" PAGE0", stdout);
8556 if (option->info & OEX_SMM)
8557 fputs (" SMM", stdout);
8558 if (option->info & OEX_FPDBUG)
8559 fputs (" FPDBUG", stdout);
8560 if (option->info & OEX_DISMISS)
8561 fputs (" DISMISS", stdout);
8564 fputs (" PAD ", stdout);
8565 if (option->info & OPAD_PREFIX)
8566 fputs (" PREFIX", stdout);
8567 if (option->info & OPAD_POSTFIX)
8568 fputs (" POSTFIX", stdout);
8569 if (option->info & OPAD_SYMBOL)
8570 fputs (" SYMBOL", stdout);
8573 fputs (" HWPATCH ", stdout);
8574 if (option->info & OHW_R4KEOP)
8575 fputs (" R4KEOP", stdout);
8576 if (option->info & OHW_R8KPFETCH)
8577 fputs (" R8KPFETCH", stdout);
8578 if (option->info & OHW_R5KEOP)
8579 fputs (" R5KEOP", stdout);
8580 if (option->info & OHW_R5KCVTL)
8581 fputs (" R5KCVTL", stdout);
8584 fputs (" FILL ", stdout);
8585 /* XXX Print content of info word? */
8588 fputs (" TAGS ", stdout);
8589 /* XXX Print content of info word? */
8592 fputs (" HWAND ", stdout);
8593 if (option->info & OHWA0_R4KEOP_CHECKED)
8594 fputs (" R4KEOP_CHECKED", stdout);
8595 if (option->info & OHWA0_R4KEOP_CLEAN)
8596 fputs (" R4KEOP_CLEAN", stdout);
8599 fputs (" HWOR ", stdout);
8600 if (option->info & OHWA0_R4KEOP_CHECKED)
8601 fputs (" R4KEOP_CHECKED", stdout);
8602 if (option->info & OHWA0_R4KEOP_CLEAN)
8603 fputs (" R4KEOP_CLEAN", stdout);
8606 printf (" GP_GROUP %#06lx self-contained %#06lx",
8607 option->info & OGP_GROUP,
8608 (option->info & OGP_SELF) >> 16);
8611 printf (" IDENT %#06lx self-contained %#06lx",
8612 option->info & OGP_GROUP,
8613 (option->info & OGP_SELF) >> 16);
8616 /* This shouldn't happen. */
8617 printf (" %3d ??? %d %lx",
8618 option->kind, option->section, option->info);
8622 len = sizeof (* eopt);
8623 while (len < option->size)
8624 if (((char *) option)[len] >= ' '
8625 && ((char *) option)[len] < 0x7f)
8626 printf ("%c", ((char *) option)[len++]);
8628 printf ("\\%03o", ((char *) option)[len++]);
8630 fputs ("\n", stdout);
8638 if (conflicts_offset != 0 && conflictsno != 0)
8640 Elf32_Conflict * iconf;
8643 if (dynamic_symbols == NULL)
8645 error (_("conflict list with without table"));
8649 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
8652 error (_("Out of memory"));
8658 Elf32_External_Conflict * econf32;
8660 econf32 = ((Elf32_External_Conflict *)
8661 get_data (NULL, file, conflicts_offset,
8662 conflictsno * sizeof (* econf32),
8667 for (cnt = 0; cnt < conflictsno; ++cnt)
8668 iconf[cnt] = BYTE_GET (econf32[cnt]);
8674 Elf64_External_Conflict * econf64;
8676 econf64 = ((Elf64_External_Conflict *)
8677 get_data (NULL, file, conflicts_offset,
8678 conflictsno * sizeof (* econf64),
8683 for (cnt = 0; cnt < conflictsno; ++cnt)
8684 iconf[cnt] = BYTE_GET (econf64[cnt]);
8689 printf (_("\nSection '.conflict' contains %ld entries:\n"),
8690 (long) conflictsno);
8691 puts (_(" Num: Index Value Name"));
8693 for (cnt = 0; cnt < conflictsno; ++cnt)
8695 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
8697 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
8698 print_vma (psym->st_value, FULL_HEX);
8699 printf (" %s\n", dynamic_strings + psym->st_name);
8709 get_note_type (e_type)
8712 static char buff[64];
8716 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
8717 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
8718 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
8719 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
8720 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
8721 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
8722 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
8723 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
8724 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8725 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8726 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8728 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
8733 /* Note that by the ELF standard, the name field is already null byte
8734 terminated, and namesz includes the terminating null byte.
8735 I.E. the value of namesz for the name "FSF" is 4.
8737 If the value of namesz is zero, there is no name present. */
8739 process_note (pnote)
8740 Elf32_Internal_Note * pnote;
8742 printf (" %s\t\t0x%08lx\t%s\n",
8743 pnote->namesz ? pnote->namedata : "(NONE)",
8744 pnote->descsz, get_note_type (pnote->type));
8750 process_corefile_note_segment (file, offset, length)
8755 Elf_External_Note * pnotes;
8756 Elf_External_Note * external;
8762 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
8769 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8770 (unsigned long) offset, (unsigned long) length);
8771 printf (_(" Owner\t\tData size\tDescription\n"));
8773 while (external < (Elf_External_Note *)((char *) pnotes + length))
8775 Elf32_Internal_Note inote;
8778 inote.type = BYTE_GET (external->type);
8779 inote.namesz = BYTE_GET (external->namesz);
8780 inote.namedata = external->name;
8781 inote.descsz = BYTE_GET (external->descsz);
8782 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
8783 inote.descpos = offset + (inote.descdata - (char *) pnotes);
8785 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
8787 /* Verify that name is null terminated. It appears that at least
8788 one version of Linux (RedHat 6.0) generates corefiles that don't
8789 comply with the ELF spec by failing to include the null byte in
8791 if (inote.namedata[inote.namesz] != '\0')
8793 temp = malloc (inote.namesz + 1);
8797 error (_("Out of memory\n"));
8802 strncpy (temp, inote.namedata, inote.namesz);
8803 temp[inote.namesz] = 0;
8805 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8806 inote.namedata = temp;
8809 res &= process_note (& inote);
8824 process_corefile_note_segments (file)
8827 Elf_Internal_Phdr * program_headers;
8828 Elf_Internal_Phdr * segment;
8832 program_headers = (Elf_Internal_Phdr *) malloc
8833 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
8835 if (program_headers == NULL)
8837 error (_("Out of memory\n"));
8842 i = get_32bit_program_headers (file, program_headers);
8844 i = get_64bit_program_headers (file, program_headers);
8848 free (program_headers);
8852 for (i = 0, segment = program_headers;
8853 i < elf_header.e_phnum;
8856 if (segment->p_type == PT_NOTE)
8857 res &= process_corefile_note_segment (file,
8858 (bfd_vma) segment->p_offset,
8859 (bfd_vma) segment->p_filesz);
8862 free (program_headers);
8868 process_corefile_contents (file)
8871 /* If we have not been asked to display the notes then do nothing. */
8875 /* If file is not a core file then exit. */
8876 if (elf_header.e_type != ET_CORE)
8879 /* No program headers means no NOTE segment. */
8880 if (elf_header.e_phnum == 0)
8882 printf (_("No note segments present in the core file.\n"));
8886 return process_corefile_note_segments (file);
8890 process_arch_specific (file)
8896 switch (elf_header.e_machine)
8899 case EM_MIPS_RS3_LE:
8900 return process_mips_specific (file);
8909 get_file_header (file)
8912 /* Read in the identity array. */
8913 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
8916 /* Determine how to read the rest of the header. */
8917 switch (elf_header.e_ident [EI_DATA])
8919 default: /* fall through */
8920 case ELFDATANONE: /* fall through */
8921 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
8922 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
8925 /* For now we only support 32 bit and 64 bit ELF files. */
8926 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
8928 /* Read in the rest of the header. */
8931 Elf32_External_Ehdr ehdr32;
8933 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
8936 elf_header.e_type = BYTE_GET (ehdr32.e_type);
8937 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
8938 elf_header.e_version = BYTE_GET (ehdr32.e_version);
8939 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
8940 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
8941 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
8942 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
8943 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
8944 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
8945 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
8946 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
8947 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
8948 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
8952 Elf64_External_Ehdr ehdr64;
8954 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8955 we will not be able to cope with the 64bit data found in
8956 64 ELF files. Detect this now and abort before we start
8957 overwritting things. */
8958 if (sizeof (bfd_vma) < 8)
8960 error (_("This instance of readelf has been built without support for a\n"));
8961 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
8965 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
8968 elf_header.e_type = BYTE_GET (ehdr64.e_type);
8969 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
8970 elf_header.e_version = BYTE_GET (ehdr64.e_version);
8971 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
8972 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
8973 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
8974 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
8975 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
8976 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
8977 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
8978 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
8979 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
8980 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
8987 process_file (file_name)
8991 struct stat statbuf;
8994 if (stat (file_name, & statbuf) < 0)
8996 error (_("Cannot stat input file %s.\n"), file_name);
9000 file = fopen (file_name, "rb");
9003 error (_("Input file %s not found.\n"), file_name);
9007 if (! get_file_header (file))
9009 error (_("%s: Failed to read file header\n"), file_name);
9014 /* Initialise per file variables. */
9015 for (i = NUM_ELEM (version_info); i--;)
9016 version_info[i] = 0;
9018 for (i = NUM_ELEM (dynamic_info); i--;)
9019 dynamic_info[i] = 0;
9021 /* Process the file. */
9023 printf (_("\nFile: %s\n"), file_name);
9025 if (! process_file_header ())
9031 process_section_headers (file);
9033 process_program_headers (file);
9035 process_dynamic_segment (file);
9037 process_relocs (file);
9039 process_unwind (file);
9041 process_symbol_table (file);
9043 process_syminfo (file);
9045 process_version_sections (file);
9047 process_section_contents (file);
9049 process_corefile_contents (file);
9051 process_arch_specific (file);
9055 if (section_headers)
9057 free (section_headers);
9058 section_headers = NULL;
9063 free (string_table);
9064 string_table = NULL;
9065 string_table_length = 0;
9068 if (dynamic_strings)
9070 free (dynamic_strings);
9071 dynamic_strings = NULL;
9074 if (dynamic_symbols)
9076 free (dynamic_symbols);
9077 dynamic_symbols = NULL;
9078 num_dynamic_syms = 0;
9081 if (dynamic_syminfo)
9083 free (dynamic_syminfo);
9084 dynamic_syminfo = NULL;
9090 #ifdef SUPPORT_DISASSEMBLY
9091 /* Needed by the i386 disassembler. For extra credit, someone could
9092 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9096 print_address (unsigned int addr, FILE * outfile)
9098 fprintf (outfile,"0x%8.8x", addr);
9101 /* Needed by the i386 disassembler. */
9103 db_task_printsym (unsigned int addr)
9105 print_address (addr, stderr);
9109 int main PARAMS ((int, char **));
9118 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9119 setlocale (LC_MESSAGES, "");
9121 #if defined (HAVE_SETLOCALE)
9122 setlocale (LC_CTYPE, "");
9124 bindtextdomain (PACKAGE, LOCALEDIR);
9125 textdomain (PACKAGE);
9127 parse_args (argc, argv);
9129 if (optind < (argc - 1))
9133 while (optind < argc)
9134 err |= process_file (argv [optind ++]);
9136 if (dump_sects != NULL)