1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
56 #include "elf/alpha.h"
59 #include "elf/sparc.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
70 #include "elf/mcore.h"
78 #include "elf/x86-64.h"
80 #include "elf/xstormy16.h"
85 char * program_name = "readelf";
86 unsigned int dynamic_addr;
87 bfd_size_type dynamic_size;
88 unsigned int rela_addr;
89 unsigned int rela_size;
90 char * dynamic_strings;
92 unsigned long string_table_length;
93 unsigned long num_dynamic_syms;
94 Elf_Internal_Sym * dynamic_symbols;
95 Elf_Internal_Syminfo * dynamic_syminfo;
96 unsigned long dynamic_syminfo_offset;
97 unsigned int dynamic_syminfo_nent;
98 char program_interpreter [64];
99 int dynamic_info[DT_JMPREL + 1];
100 int version_info[16];
102 Elf_Internal_Ehdr elf_header;
103 Elf_Internal_Shdr * section_headers;
104 Elf_Internal_Dyn * dynamic_segment;
105 Elf_Internal_Shdr * symtab_shndx_hdr;
113 int do_using_dynamic;
121 int do_debug_abbrevs;
123 int do_debug_pubnames;
124 int do_debug_aranges;
126 int do_debug_frames_interp;
127 int do_debug_macinfo;
133 /* A dynamic array of flags indicating which sections require dumping. */
134 char * dump_sects = NULL;
135 unsigned int num_dump_sects = 0;
137 #define HEX_DUMP (1 << 0)
138 #define DISASS_DUMP (1 << 1)
139 #define DEBUG_DUMP (1 << 2)
141 /* How to rpint a vma value. */
142 typedef enum print_mode
154 /* Forward declarations for dumb compilers. */
155 static void print_vma PARAMS ((bfd_vma, print_mode));
156 static void print_symbol PARAMS ((int, char *));
157 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
158 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
159 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
160 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
161 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
162 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
163 static const char * get_dynamic_type PARAMS ((unsigned long));
164 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
165 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
166 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
167 static char * get_file_type PARAMS ((unsigned));
168 static char * get_machine_name PARAMS ((unsigned));
169 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
170 static char * get_machine_flags PARAMS ((unsigned, unsigned));
171 static const char * get_mips_segment_type PARAMS ((unsigned long));
172 static const char * get_parisc_segment_type PARAMS ((unsigned long));
173 static const char * get_ia64_segment_type PARAMS ((unsigned long));
174 static const char * get_segment_type PARAMS ((unsigned long));
175 static const char * get_mips_section_type_name PARAMS ((unsigned int));
176 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
177 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
178 static const char * get_section_type_name PARAMS ((unsigned int));
179 static const char * get_symbol_binding PARAMS ((unsigned int));
180 static const char * get_symbol_type PARAMS ((unsigned int));
181 static const char * get_symbol_visibility PARAMS ((unsigned int));
182 static const char * get_symbol_index_type PARAMS ((unsigned int));
183 static const char * get_dynamic_flags PARAMS ((bfd_vma));
184 static void usage PARAMS ((void));
185 static void parse_args PARAMS ((int, char **));
186 static int process_file_header PARAMS ((void));
187 static int process_program_headers PARAMS ((FILE *));
188 static int process_section_headers PARAMS ((FILE *));
189 static int process_unwind PARAMS ((FILE *));
190 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
191 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
192 static int process_dynamic_segment PARAMS ((FILE *));
193 static int process_symbol_table PARAMS ((FILE *));
194 static int process_syminfo PARAMS ((FILE *));
195 static int process_section_contents PARAMS ((FILE *));
196 static void process_mips_fpe_exception PARAMS ((int));
197 static int process_mips_specific PARAMS ((FILE *));
198 static int process_file PARAMS ((char *));
199 static int process_relocs PARAMS ((FILE *));
200 static int process_version_sections PARAMS ((FILE *));
201 static char * get_ver_flags PARAMS ((unsigned int));
202 static int get_32bit_section_headers PARAMS ((FILE *, unsigned int));
203 static int get_64bit_section_headers PARAMS ((FILE *, unsigned int));
204 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
205 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
206 static int get_file_header PARAMS ((FILE *));
207 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
208 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
209 static const char * get_elf_section_flags PARAMS ((bfd_vma));
210 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
211 static int get_32bit_dynamic_segment PARAMS ((FILE *));
212 static int get_64bit_dynamic_segment PARAMS ((FILE *));
213 #ifdef SUPPORT_DISASSEMBLY
214 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
216 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
217 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
218 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
219 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
220 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
221 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
222 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
223 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
224 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
225 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
226 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
227 static int display_debug_str PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
228 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
229 static void load_debug_str PARAMS ((FILE *));
230 static void free_debug_str PARAMS ((void));
231 static const char * fetch_indirect_string PARAMS ((unsigned long));
232 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
233 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
234 static void reset_state_machine PARAMS ((int));
235 static char * get_TAG_name PARAMS ((unsigned long));
236 static char * get_AT_name PARAMS ((unsigned long));
237 static char * get_FORM_name PARAMS ((unsigned long));
238 static void free_abbrevs PARAMS ((void));
239 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
240 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
241 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
242 static unsigned char * read_and_display_attr_value PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
243 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
244 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
245 static void request_dump PARAMS ((unsigned int, int));
246 static const char * get_elf_class PARAMS ((unsigned int));
247 static const char * get_data_encoding PARAMS ((unsigned int));
248 static const char * get_osabi_name PARAMS ((unsigned int));
249 static int guess_is_rela PARAMS ((unsigned long));
250 static const char * get_note_type PARAMS ((unsigned int));
251 static const char * get_netbsd_elfcore_note_type PARAMS ((unsigned int));
252 static int process_note PARAMS ((Elf32_Internal_Note *));
253 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
254 static int process_corefile_note_segments PARAMS ((FILE *));
255 static int process_corefile_contents PARAMS ((FILE *));
256 static int process_arch_specific PARAMS ((FILE *));
258 typedef int Elf32_Word;
266 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
267 ((X)->sh_name >= string_table_length \
268 ? "<corrupt>" : string_table + (X)->sh_name))
270 /* Given st_shndx I, map to section_headers index. */
271 #define SECTION_HEADER_INDEX(I) \
272 ((I) < SHN_LORESERVE \
274 : ((I) <= SHN_HIRESERVE \
276 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
278 /* Reverse of the above. */
279 #define SECTION_HEADER_NUM(N) \
280 ((N) < SHN_LORESERVE \
282 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
284 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
286 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
288 #define BYTE_GET(field) byte_get (field, sizeof (field))
290 /* If we can support a 64 bit data type then BFD64 should be defined
291 and sizeof (bfd_vma) == 8. In this case when translating from an
292 external 8 byte field to an internal field, we can assume that the
293 internal field is also 8 bytes wide and so we can extract all the data.
294 If, however, BFD64 is not defined, then we must assume that the
295 internal data structure only has 4 byte wide fields that are the
296 equivalent of the 8 byte wide external counterparts, and so we must
297 truncate the data. */
299 #define BYTE_GET8(field) byte_get (field, -8)
301 #define BYTE_GET8(field) byte_get (field, 8)
304 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
306 #define GET_ELF_SYMBOLS(file, section) \
307 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
308 : get_64bit_elf_symbols (file, section))
312 error VPARAMS ((const char *message, ...))
314 VA_OPEN (args, message);
315 VA_FIXEDARG (args, const char *, message);
317 fprintf (stderr, _("%s: Error: "), program_name);
318 vfprintf (stderr, message, args);
323 warn VPARAMS ((const char *message, ...))
325 VA_OPEN (args, message);
326 VA_FIXEDARG (args, const char *, message);
328 fprintf (stderr, _("%s: Warning: "), program_name);
329 vfprintf (stderr, message, args);
333 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
336 get_data (var, file, offset, size, reason)
348 if (fseek (file, offset, SEEK_SET))
350 error (_("Unable to seek to %x for %s\n"), offset, reason);
357 mvar = (PTR) malloc (size);
361 error (_("Out of memory allocating %d bytes for %s\n"),
367 if (fread (mvar, size, 1, file) != 1)
369 error (_("Unable to read in %d bytes of %s\n"), size, reason);
379 byte_get_little_endian (field, size)
380 unsigned char * field;
389 return ((unsigned int) (field [0]))
390 | (((unsigned int) (field [1])) << 8);
394 /* We want to extract data from an 8 byte wide field and
395 place it into a 4 byte wide field. Since this is a little
396 endian source we can juts use the 4 byte extraction code. */
400 return ((unsigned long) (field [0]))
401 | (((unsigned long) (field [1])) << 8)
402 | (((unsigned long) (field [2])) << 16)
403 | (((unsigned long) (field [3])) << 24);
408 /* This is a special case, generated by the BYTE_GET8 macro.
409 It means that we are loading an 8 byte value from a field
410 in an external structure into an 8 byte value in a field
411 in an internal strcuture. */
412 return ((bfd_vma) (field [0]))
413 | (((bfd_vma) (field [1])) << 8)
414 | (((bfd_vma) (field [2])) << 16)
415 | (((bfd_vma) (field [3])) << 24)
416 | (((bfd_vma) (field [4])) << 32)
417 | (((bfd_vma) (field [5])) << 40)
418 | (((bfd_vma) (field [6])) << 48)
419 | (((bfd_vma) (field [7])) << 56);
422 error (_("Unhandled data length: %d\n"), size);
427 /* Print a VMA value. */
429 print_vma (vma, mode)
439 case FULL_HEX: printf ("0x"); /* drop through */
440 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
441 case PREFIX_HEX: printf ("0x"); /* drop through */
442 case HEX: printf ("%lx", (unsigned long) vma); break;
443 case DEC: printf ("%ld", (unsigned long) vma); break;
444 case DEC_5: printf ("%5ld", (long) vma); break;
445 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
466 #if BFD_HOST_64BIT_LONG
469 if (_bfd_int64_high (vma))
470 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
472 printf ("%lx", _bfd_int64_low (vma));
477 #if BFD_HOST_64BIT_LONG
480 if (_bfd_int64_high (vma))
482 printf ("++%ld", _bfd_int64_low (vma));
484 printf ("%ld", _bfd_int64_low (vma));
489 #if BFD_HOST_64BIT_LONG
490 printf ("%5ld", vma);
492 if (_bfd_int64_high (vma))
494 printf ("++%ld", _bfd_int64_low (vma));
496 printf ("%5ld", _bfd_int64_low (vma));
501 #if BFD_HOST_64BIT_LONG
504 if (_bfd_int64_high (vma))
506 printf ("++%lu", _bfd_int64_low (vma));
508 printf ("%lu", _bfd_int64_low (vma));
516 /* Display a symbol on stdout. If do_wide is not true then
517 format the symbol to be at most WIDTH characters,
518 truhncating as necessary. If WIDTH is negative then
519 format the string to be exactly - WIDTH characters,
520 truncating or padding as necessary. */
523 print_symbol (width, symbol)
530 printf ("%-*.*s", width, width, symbol);
532 printf ("%-.*s", width, symbol);
536 byte_get_big_endian (field, size)
537 unsigned char * field;
546 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
549 return ((unsigned long) (field [3]))
550 | (((unsigned long) (field [2])) << 8)
551 | (((unsigned long) (field [1])) << 16)
552 | (((unsigned long) (field [0])) << 24);
556 /* Although we are extracing data from an 8 byte wide field, we
557 are returning only 4 bytes of data. */
558 return ((unsigned long) (field [7]))
559 | (((unsigned long) (field [6])) << 8)
560 | (((unsigned long) (field [5])) << 16)
561 | (((unsigned long) (field [4])) << 24);
565 /* This is a special case, generated by the BYTE_GET8 macro.
566 It means that we are loading an 8 byte value from a field
567 in an external structure into an 8 byte value in a field
568 in an internal strcuture. */
569 return ((bfd_vma) (field [7]))
570 | (((bfd_vma) (field [6])) << 8)
571 | (((bfd_vma) (field [5])) << 16)
572 | (((bfd_vma) (field [4])) << 24)
573 | (((bfd_vma) (field [3])) << 32)
574 | (((bfd_vma) (field [2])) << 40)
575 | (((bfd_vma) (field [1])) << 48)
576 | (((bfd_vma) (field [0])) << 56);
580 error (_("Unhandled data length: %d\n"), size);
585 /* Guess the relocation size commonly used by the specific machines. */
588 guess_is_rela (e_machine)
589 unsigned long e_machine;
593 /* Targets that use REL relocations. */
606 /* Targets that use RELA relocations. */
620 case EM_CYGNUS_MN10200:
622 case EM_CYGNUS_MN10300:
659 warn (_("Don't know about relocations on this machine architecture\n"));
665 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
667 unsigned long rel_offset;
668 unsigned long rel_size;
669 Elf_Internal_Rela **relasp;
670 unsigned long *nrelasp;
672 Elf_Internal_Rela *relas;
673 unsigned long nrelas;
678 Elf32_External_Rela * erelas;
680 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
681 rel_size, _("relocs"));
685 nrelas = rel_size / sizeof (Elf32_External_Rela);
687 relas = (Elf_Internal_Rela *)
688 malloc (nrelas * sizeof (Elf_Internal_Rela));
692 error(_("out of memory parsing relocs"));
696 for (i = 0; i < nrelas; i++)
698 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
699 relas[i].r_info = BYTE_GET (erelas[i].r_info);
700 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
707 Elf64_External_Rela * erelas;
709 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
710 rel_size, _("relocs"));
714 nrelas = rel_size / sizeof (Elf64_External_Rela);
716 relas = (Elf_Internal_Rela *)
717 malloc (nrelas * sizeof (Elf_Internal_Rela));
721 error(_("out of memory parsing relocs"));
725 for (i = 0; i < nrelas; i++)
727 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
728 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
729 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
740 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
742 unsigned long rel_offset;
743 unsigned long rel_size;
744 Elf_Internal_Rel **relsp;
745 unsigned long *nrelsp;
747 Elf_Internal_Rel *rels;
753 Elf32_External_Rel * erels;
755 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
756 rel_size, _("relocs"));
760 nrels = rel_size / sizeof (Elf32_External_Rel);
762 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
766 error(_("out of memory parsing relocs"));
770 for (i = 0; i < nrels; i++)
772 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
773 rels[i].r_info = BYTE_GET (erels[i].r_info);
780 Elf64_External_Rel * erels;
782 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
783 rel_size, _("relocs"));
787 nrels = rel_size / sizeof (Elf64_External_Rel);
789 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
793 error(_("out of memory parsing relocs"));
797 for (i = 0; i < nrels; i++)
799 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
800 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
810 /* Display the contents of the relocation data found at the specified offset. */
812 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
814 unsigned long rel_offset;
815 unsigned long rel_size;
816 Elf_Internal_Sym * symtab;
822 Elf_Internal_Rel * rels;
823 Elf_Internal_Rela * relas;
826 if (is_rela == UNKNOWN)
827 is_rela = guess_is_rela (elf_header.e_machine);
831 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
836 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
844 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
847 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
853 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
856 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
859 for (i = 0; i < rel_size; i++)
864 bfd_vma symtab_index;
869 offset = relas [i].r_offset;
870 info = relas [i].r_info;
874 offset = rels [i].r_offset;
875 info = rels [i].r_info;
880 type = ELF32_R_TYPE (info);
881 symtab_index = ELF32_R_SYM (info);
885 if (elf_header.e_machine == EM_SPARCV9)
886 type = ELF64_R_TYPE_ID (info);
888 type = ELF64_R_TYPE (info);
889 /* The #ifdef BFD64 below is to prevent a compile time warning.
890 We know that if we do not have a 64 bit data type that we
891 will never execute this code anyway. */
893 symtab_index = ELF64_R_SYM (info);
899 #ifdef _bfd_int64_low
900 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
902 printf ("%8.8lx %8.8lx ", offset, info);
907 #ifdef _bfd_int64_low
908 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
909 _bfd_int64_high (offset),
910 _bfd_int64_low (offset),
911 _bfd_int64_high (info),
912 _bfd_int64_low (info));
914 printf ("%16.16lx %16.16lx ", offset, info);
918 switch (elf_header.e_machine)
926 rtype = elf_m32r_reloc_type (type);
931 rtype = elf_i386_reloc_type (type);
935 rtype = elf_m68k_reloc_type (type);
939 rtype = elf_i960_reloc_type (type);
944 rtype = elf_avr_reloc_type (type);
951 rtype = elf_sparc_reloc_type (type);
956 rtype = v850_reloc_type (type);
961 rtype = elf_d10v_reloc_type (type);
966 rtype = elf_d30v_reloc_type (type);
970 rtype = elf_sh_reloc_type (type);
974 case EM_CYGNUS_MN10300:
975 rtype = elf_mn10300_reloc_type (type);
979 case EM_CYGNUS_MN10200:
980 rtype = elf_mn10200_reloc_type (type);
985 rtype = elf_fr30_reloc_type (type);
989 rtype = elf_mcore_reloc_type (type);
993 rtype = elf_mmix_reloc_type (type);
998 rtype = elf_ppc_reloc_type (type);
1002 case EM_MIPS_RS3_LE:
1003 rtype = elf_mips_reloc_type (type);
1007 rtype = elf_alpha_reloc_type (type);
1011 rtype = elf_arm_reloc_type (type);
1015 rtype = elf_arc_reloc_type (type);
1019 rtype = elf_hppa_reloc_type (type);
1025 rtype = elf_h8_reloc_type (type);
1030 rtype = elf_pj_reloc_type (type);
1033 rtype = elf_ia64_reloc_type (type);
1037 rtype = elf_cris_reloc_type (type);
1041 rtype = elf_i860_reloc_type (type);
1045 rtype = elf_x86_64_reloc_type (type);
1050 rtype = elf_s390_reloc_type (type);
1054 rtype = elf_xstormy16_reloc_type (type);
1059 #ifdef _bfd_int64_low
1060 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
1062 printf (_("unrecognised: %-7lx"), type);
1065 printf ("%-21.21s", rtype);
1069 if (symtab == NULL || symtab_index >= nsyms)
1070 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1073 Elf_Internal_Sym * psym;
1075 psym = symtab + symtab_index;
1078 print_vma (psym->st_value, LONG_HEX);
1081 if (psym->st_name == 0)
1082 print_symbol (-25, SECTION_NAME (section_headers + psym->st_shndx));
1083 else if (strtab == NULL)
1084 printf (_("<string table index %3ld>"), psym->st_name);
1086 print_symbol (-25, strtab + psym->st_name);
1089 printf (" + %lx", (unsigned long) relas [i].r_addend);
1094 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1095 print_vma (relas[i].r_addend, LONG_HEX);
1098 if (elf_header.e_machine == EM_SPARCV9
1099 && !strcmp (rtype, "R_SPARC_OLO10"))
1100 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1114 get_mips_dynamic_type (type)
1119 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1120 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1121 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1122 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1123 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1124 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1125 case DT_MIPS_MSYM: return "MIPS_MSYM";
1126 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1127 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1128 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1129 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1130 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1131 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1132 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1133 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1134 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1135 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1136 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1137 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1138 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1139 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1140 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1141 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1142 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1143 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1144 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1145 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1146 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1147 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1148 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1149 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1150 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1151 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1152 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1153 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1154 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1155 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1156 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1157 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1158 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1159 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1160 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1161 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1168 get_sparc64_dynamic_type (type)
1173 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1180 get_parisc_dynamic_type (type)
1185 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1186 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1187 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1188 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1189 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1190 case DT_HP_PREINIT: return "HP_PREINIT";
1191 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1192 case DT_HP_NEEDED: return "HP_NEEDED";
1193 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1194 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1195 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1196 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1197 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1204 get_dynamic_type (type)
1207 static char buff [32];
1211 case DT_NULL: return "NULL";
1212 case DT_NEEDED: return "NEEDED";
1213 case DT_PLTRELSZ: return "PLTRELSZ";
1214 case DT_PLTGOT: return "PLTGOT";
1215 case DT_HASH: return "HASH";
1216 case DT_STRTAB: return "STRTAB";
1217 case DT_SYMTAB: return "SYMTAB";
1218 case DT_RELA: return "RELA";
1219 case DT_RELASZ: return "RELASZ";
1220 case DT_RELAENT: return "RELAENT";
1221 case DT_STRSZ: return "STRSZ";
1222 case DT_SYMENT: return "SYMENT";
1223 case DT_INIT: return "INIT";
1224 case DT_FINI: return "FINI";
1225 case DT_SONAME: return "SONAME";
1226 case DT_RPATH: return "RPATH";
1227 case DT_SYMBOLIC: return "SYMBOLIC";
1228 case DT_REL: return "REL";
1229 case DT_RELSZ: return "RELSZ";
1230 case DT_RELENT: return "RELENT";
1231 case DT_PLTREL: return "PLTREL";
1232 case DT_DEBUG: return "DEBUG";
1233 case DT_TEXTREL: return "TEXTREL";
1234 case DT_JMPREL: return "JMPREL";
1235 case DT_BIND_NOW: return "BIND_NOW";
1236 case DT_INIT_ARRAY: return "INIT_ARRAY";
1237 case DT_FINI_ARRAY: return "FINI_ARRAY";
1238 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1239 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1240 case DT_RUNPATH: return "RUNPATH";
1241 case DT_FLAGS: return "FLAGS";
1243 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1244 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1246 case DT_CHECKSUM: return "CHECKSUM";
1247 case DT_PLTPADSZ: return "PLTPADSZ";
1248 case DT_MOVEENT: return "MOVEENT";
1249 case DT_MOVESZ: return "MOVESZ";
1250 case DT_FEATURE: return "FEATURE";
1251 case DT_POSFLAG_1: return "POSFLAG_1";
1252 case DT_SYMINSZ: return "SYMINSZ";
1253 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1255 case DT_ADDRRNGLO: return "ADDRRNGLO";
1256 case DT_CONFIG: return "CONFIG";
1257 case DT_DEPAUDIT: return "DEPAUDIT";
1258 case DT_AUDIT: return "AUDIT";
1259 case DT_PLTPAD: return "PLTPAD";
1260 case DT_MOVETAB: return "MOVETAB";
1261 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1263 case DT_VERSYM: return "VERSYM";
1265 case DT_RELACOUNT: return "RELACOUNT";
1266 case DT_RELCOUNT: return "RELCOUNT";
1267 case DT_FLAGS_1: return "FLAGS_1";
1268 case DT_VERDEF: return "VERDEF";
1269 case DT_VERDEFNUM: return "VERDEFNUM";
1270 case DT_VERNEED: return "VERNEED";
1271 case DT_VERNEEDNUM: return "VERNEEDNUM";
1273 case DT_AUXILIARY: return "AUXILIARY";
1274 case DT_USED: return "USED";
1275 case DT_FILTER: return "FILTER";
1278 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1280 const char * result;
1282 switch (elf_header.e_machine)
1285 case EM_MIPS_RS3_LE:
1286 result = get_mips_dynamic_type (type);
1289 result = get_sparc64_dynamic_type (type);
1299 sprintf (buff, _("Processor Specific: %lx"), type);
1301 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1303 const char * result;
1305 switch (elf_header.e_machine)
1308 result = get_parisc_dynamic_type (type);
1318 sprintf (buff, _("Operating System specific: %lx"), type);
1321 sprintf (buff, _("<unknown>: %lx"), type);
1328 get_file_type (e_type)
1331 static char buff [32];
1335 case ET_NONE: return _("NONE (None)");
1336 case ET_REL: return _("REL (Relocatable file)");
1337 case ET_EXEC: return _("EXEC (Executable file)");
1338 case ET_DYN: return _("DYN (Shared object file)");
1339 case ET_CORE: return _("CORE (Core file)");
1342 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1343 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1344 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1345 sprintf (buff, _("OS Specific: (%x)"), e_type);
1347 sprintf (buff, _("<unknown>: %x"), e_type);
1353 get_machine_name (e_machine)
1356 static char buff [64]; /* XXX */
1360 case EM_NONE: return _("None");
1361 case EM_M32: return "WE32100";
1362 case EM_SPARC: return "Sparc";
1363 case EM_386: return "Intel 80386";
1364 case EM_68K: return "MC68000";
1365 case EM_88K: return "MC88000";
1366 case EM_486: return "Intel 80486";
1367 case EM_860: return "Intel 80860";
1368 case EM_MIPS: return "MIPS R3000";
1369 case EM_S370: return "IBM System/370";
1370 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1371 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1372 case EM_PARISC: return "HPPA";
1373 case EM_PPC_OLD: return "Power PC (old)";
1374 case EM_SPARC32PLUS: return "Sparc v8+" ;
1375 case EM_960: return "Intel 90860";
1376 case EM_PPC: return "PowerPC";
1377 case EM_V800: return "NEC V800";
1378 case EM_FR20: return "Fujitsu FR20";
1379 case EM_RH32: return "TRW RH32";
1380 case EM_MCORE: return "MCORE";
1381 case EM_ARM: return "ARM";
1382 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1383 case EM_SH: return "Hitachi SH";
1384 case EM_SPARCV9: return "Sparc v9";
1385 case EM_TRICORE: return "Siemens Tricore";
1386 case EM_ARC: return "ARC";
1387 case EM_H8_300: return "Hitachi H8/300";
1388 case EM_H8_300H: return "Hitachi H8/300H";
1389 case EM_H8S: return "Hitachi H8S";
1390 case EM_H8_500: return "Hitachi H8/500";
1391 case EM_IA_64: return "Intel IA-64";
1392 case EM_MIPS_X: return "Stanford MIPS-X";
1393 case EM_COLDFIRE: return "Motorola Coldfire";
1394 case EM_68HC12: return "Motorola M68HC12";
1395 case EM_ALPHA: return "Alpha";
1396 case EM_CYGNUS_D10V:
1397 case EM_D10V: return "d10v";
1398 case EM_CYGNUS_D30V:
1399 case EM_D30V: return "d30v";
1400 case EM_CYGNUS_M32R:
1401 case EM_M32R: return "Mitsubishi M32r";
1402 case EM_CYGNUS_V850:
1403 case EM_V850: return "NEC v850";
1404 case EM_CYGNUS_MN10300:
1405 case EM_MN10300: return "mn10300";
1406 case EM_CYGNUS_MN10200:
1407 case EM_MN10200: return "mn10200";
1408 case EM_CYGNUS_FR30:
1409 case EM_FR30: return "Fujitsu FR30";
1411 case EM_PJ: return "picoJava";
1412 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1413 case EM_PCP: return "Siemens PCP";
1414 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1415 case EM_NDR1: return "Denso NDR1 microprocesspr";
1416 case EM_STARCORE: return "Motorola Star*Core processor";
1417 case EM_ME16: return "Toyota ME16 processor";
1418 case EM_ST100: return "STMicroelectronics ST100 processor";
1419 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1420 case EM_FX66: return "Siemens FX66 microcontroller";
1421 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1422 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1423 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1424 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1425 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1426 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1427 case EM_SVX: return "Silicon Graphics SVx";
1428 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1429 case EM_VAX: return "Digital VAX";
1431 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1432 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1433 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1434 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1435 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1436 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1437 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1438 case EM_PRISM: return "SiTera Prism";
1439 case EM_X86_64: return "Advanced Micro Devices X86-64";
1441 case EM_S390: return "IBM S/390";
1442 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1444 sprintf (buff, _("<unknown>: %x"), e_machine);
1450 decode_ARM_machine_flags (e_flags, buf)
1457 eabi = EF_ARM_EABI_VERSION (e_flags);
1458 e_flags &= ~ EF_ARM_EABIMASK;
1460 /* Handle "generic" ARM flags. */
1461 if (e_flags & EF_ARM_RELEXEC)
1463 strcat (buf, ", relocatable executable");
1464 e_flags &= ~ EF_ARM_RELEXEC;
1467 if (e_flags & EF_ARM_HASENTRY)
1469 strcat (buf, ", has entry point");
1470 e_flags &= ~ EF_ARM_HASENTRY;
1473 /* Now handle EABI specific flags. */
1477 strcat (buf, ", <unrecognised EABI>");
1482 case EF_ARM_EABI_VER1:
1483 strcat (buf, ", Version1 EABI");
1488 /* Process flags one bit at a time. */
1489 flag = e_flags & - e_flags;
1494 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1495 strcat (buf, ", sorted symbol tables");
1505 case EF_ARM_EABI_VER2:
1506 strcat (buf, ", Version2 EABI");
1511 /* Process flags one bit at a time. */
1512 flag = e_flags & - e_flags;
1517 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1518 strcat (buf, ", sorted symbol tables");
1521 case EF_ARM_DYNSYMSUSESEGIDX:
1522 strcat (buf, ", dynamic symbols use segment index");
1525 case EF_ARM_MAPSYMSFIRST:
1526 strcat (buf, ", mapping symbols precede others");
1536 case EF_ARM_EABI_UNKNOWN:
1537 strcat (buf, ", GNU EABI");
1542 /* Process flags one bit at a time. */
1543 flag = e_flags & - e_flags;
1548 case EF_ARM_INTERWORK:
1549 strcat (buf, ", interworking enabled");
1552 case EF_ARM_APCS_26:
1553 strcat (buf, ", uses APCS/26");
1556 case EF_ARM_APCS_FLOAT:
1557 strcat (buf, ", uses APCS/float");
1561 strcat (buf, ", position independent");
1565 strcat (buf, ", 8 bit structure alignment");
1568 case EF_ARM_NEW_ABI:
1569 strcat (buf, ", uses new ABI");
1572 case EF_ARM_OLD_ABI:
1573 strcat (buf, ", uses old ABI");
1576 case EF_ARM_SOFT_FLOAT:
1577 strcat (buf, ", software FP");
1588 strcat (buf,", <unknown>");
1592 get_machine_flags (e_flags, e_machine)
1596 static char buf [1024];
1608 decode_ARM_machine_flags (e_flags, buf);
1612 if (e_flags & EF_CPU32)
1613 strcat (buf, ", cpu32");
1617 if (e_flags & EF_PPC_EMB)
1618 strcat (buf, ", emb");
1620 if (e_flags & EF_PPC_RELOCATABLE)
1621 strcat (buf, ", relocatable");
1623 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1624 strcat (buf, ", relocatable-lib");
1628 case EM_CYGNUS_V850:
1629 switch (e_flags & EF_V850_ARCH)
1632 strcat (buf, ", v850e");
1635 strcat (buf, ", v850ea");
1638 strcat (buf, ", v850");
1641 strcat (buf, ", unknown v850 architecture variant");
1647 case EM_CYGNUS_M32R:
1648 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1649 strcat (buf, ", m32r");
1654 case EM_MIPS_RS3_LE:
1655 if (e_flags & EF_MIPS_NOREORDER)
1656 strcat (buf, ", noreorder");
1658 if (e_flags & EF_MIPS_PIC)
1659 strcat (buf, ", pic");
1661 if (e_flags & EF_MIPS_CPIC)
1662 strcat (buf, ", cpic");
1664 if (e_flags & EF_MIPS_UCODE)
1665 strcat (buf, ", ugen_reserved");
1667 if (e_flags & EF_MIPS_ABI2)
1668 strcat (buf, ", abi2");
1670 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1671 strcat (buf, ", odk first");
1673 if (e_flags & EF_MIPS_32BITMODE)
1674 strcat (buf, ", 32bitmode");
1676 switch ((e_flags & EF_MIPS_MACH))
1678 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1679 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1680 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1681 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1682 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1683 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1685 /* We simply ignore the field in this case to avoid confusion:
1686 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1689 default: strcat (buf, ", unknown CPU"); break;
1692 switch ((e_flags & EF_MIPS_ABI))
1694 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1695 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1696 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1697 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
1699 /* We simply ignore the field in this case to avoid confusion:
1700 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1701 This means it is likely to be an o32 file, but not for
1704 default: strcat (buf, ", unknown ABI"); break;
1707 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
1708 strcat (buf, ", mdmx");
1710 if (e_flags & EF_MIPS_ARCH_ASE_M16)
1711 strcat (buf, ", mips16");
1713 switch ((e_flags & EF_MIPS_ARCH))
1715 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
1716 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
1717 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
1718 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
1719 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
1720 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
1721 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
1722 default: strcat (buf, ", unknown ISA"); break;
1728 if (e_flags & EF_SPARC_32PLUS)
1729 strcat (buf, ", v8+");
1731 if (e_flags & EF_SPARC_SUN_US1)
1732 strcat (buf, ", ultrasparcI");
1734 if (e_flags & EF_SPARC_SUN_US3)
1735 strcat (buf, ", ultrasparcIII");
1737 if (e_flags & EF_SPARC_HAL_R1)
1738 strcat (buf, ", halr1");
1740 if (e_flags & EF_SPARC_LEDATA)
1741 strcat (buf, ", ledata");
1743 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1744 strcat (buf, ", tso");
1746 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1747 strcat (buf, ", pso");
1749 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1750 strcat (buf, ", rmo");
1754 switch (e_flags & EF_PARISC_ARCH)
1756 case EFA_PARISC_1_0:
1757 strcpy (buf, ", PA-RISC 1.0");
1759 case EFA_PARISC_1_1:
1760 strcpy (buf, ", PA-RISC 1.1");
1762 case EFA_PARISC_2_0:
1763 strcpy (buf, ", PA-RISC 2.0");
1768 if (e_flags & EF_PARISC_TRAPNIL)
1769 strcat (buf, ", trapnil");
1770 if (e_flags & EF_PARISC_EXT)
1771 strcat (buf, ", ext");
1772 if (e_flags & EF_PARISC_LSB)
1773 strcat (buf, ", lsb");
1774 if (e_flags & EF_PARISC_WIDE)
1775 strcat (buf, ", wide");
1776 if (e_flags & EF_PARISC_NO_KABP)
1777 strcat (buf, ", no kabp");
1778 if (e_flags & EF_PARISC_LAZYSWAP)
1779 strcat (buf, ", lazyswap");
1784 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1785 strcat (buf, ", new calling convention");
1787 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1788 strcat (buf, ", gnu calling convention");
1792 if ((e_flags & EF_IA_64_ABI64))
1793 strcat (buf, ", 64-bit");
1795 strcat (buf, ", 32-bit");
1796 if ((e_flags & EF_IA_64_REDUCEDFP))
1797 strcat (buf, ", reduced fp model");
1798 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1799 strcat (buf, ", no function descriptors, constant gp");
1800 else if ((e_flags & EF_IA_64_CONS_GP))
1801 strcat (buf, ", constant gp");
1802 if ((e_flags & EF_IA_64_ABSOLUTE))
1803 strcat (buf, ", absolute");
1812 get_mips_segment_type (type)
1817 case PT_MIPS_REGINFO:
1819 case PT_MIPS_RTPROC:
1821 case PT_MIPS_OPTIONS:
1831 get_parisc_segment_type (type)
1836 case PT_HP_TLS: return "HP_TLS";
1837 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1838 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1839 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1840 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1841 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1842 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1843 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1844 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1845 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1846 case PT_HP_PARALLEL: return "HP_PARALLEL";
1847 case PT_HP_FASTBIND: return "HP_FASTBIND";
1848 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1849 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1858 get_ia64_segment_type (type)
1863 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1864 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1865 case PT_HP_TLS: return "HP_TLS";
1866 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
1867 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
1868 case PT_IA_64_HP_STACK: return "HP_STACK";
1877 get_segment_type (p_type)
1878 unsigned long p_type;
1880 static char buff [32];
1884 case PT_NULL: return "NULL";
1885 case PT_LOAD: return "LOAD";
1886 case PT_DYNAMIC: return "DYNAMIC";
1887 case PT_INTERP: return "INTERP";
1888 case PT_NOTE: return "NOTE";
1889 case PT_SHLIB: return "SHLIB";
1890 case PT_PHDR: return "PHDR";
1892 case PT_GNU_EH_FRAME:
1893 return "GNU_EH_FRAME";
1896 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1898 const char * result;
1900 switch (elf_header.e_machine)
1903 case EM_MIPS_RS3_LE:
1904 result = get_mips_segment_type (p_type);
1907 result = get_parisc_segment_type (p_type);
1910 result = get_ia64_segment_type (p_type);
1920 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1922 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1924 const char * result;
1926 switch (elf_header.e_machine)
1929 result = get_parisc_segment_type (p_type);
1932 result = get_ia64_segment_type (p_type);
1942 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1945 sprintf (buff, _("<unknown>: %lx"), p_type);
1952 get_mips_section_type_name (sh_type)
1953 unsigned int sh_type;
1957 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1958 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1959 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1960 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1961 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1962 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1963 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1964 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1965 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1966 case SHT_MIPS_RELD: return "MIPS_RELD";
1967 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1968 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1969 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1970 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1971 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1972 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1973 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1974 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1975 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1976 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1977 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1978 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1979 case SHT_MIPS_LINE: return "MIPS_LINE";
1980 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1981 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1982 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1983 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1984 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1985 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1986 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1987 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1988 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1989 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1990 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1991 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1992 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1993 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1994 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1995 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2003 get_parisc_section_type_name (sh_type)
2004 unsigned int sh_type;
2008 case SHT_PARISC_EXT: return "PARISC_EXT";
2009 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2010 case SHT_PARISC_DOC: return "PARISC_DOC";
2018 get_ia64_section_type_name (sh_type)
2019 unsigned int sh_type;
2023 case SHT_IA_64_EXT: return "IA_64_EXT";
2024 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2032 get_section_type_name (sh_type)
2033 unsigned int sh_type;
2035 static char buff [32];
2039 case SHT_NULL: return "NULL";
2040 case SHT_PROGBITS: return "PROGBITS";
2041 case SHT_SYMTAB: return "SYMTAB";
2042 case SHT_STRTAB: return "STRTAB";
2043 case SHT_RELA: return "RELA";
2044 case SHT_HASH: return "HASH";
2045 case SHT_DYNAMIC: return "DYNAMIC";
2046 case SHT_NOTE: return "NOTE";
2047 case SHT_NOBITS: return "NOBITS";
2048 case SHT_REL: return "REL";
2049 case SHT_SHLIB: return "SHLIB";
2050 case SHT_DYNSYM: return "DYNSYM";
2051 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2052 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2053 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2054 case SHT_GROUP: return "GROUP";
2055 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2056 case SHT_GNU_verdef: return "VERDEF";
2057 case SHT_GNU_verneed: return "VERNEED";
2058 case SHT_GNU_versym: return "VERSYM";
2059 case 0x6ffffff0: return "VERSYM";
2060 case 0x6ffffffc: return "VERDEF";
2061 case 0x7ffffffd: return "AUXILIARY";
2062 case 0x7fffffff: return "FILTER";
2065 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2067 const char * result;
2069 switch (elf_header.e_machine)
2072 case EM_MIPS_RS3_LE:
2073 result = get_mips_section_type_name (sh_type);
2076 result = get_parisc_section_type_name (sh_type);
2079 result = get_ia64_section_type_name (sh_type);
2089 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2091 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2092 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2093 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2094 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2096 sprintf (buff, _("<unknown>: %x"), sh_type);
2102 struct option options [] =
2104 {"all", no_argument, 0, 'a'},
2105 {"file-header", no_argument, 0, 'h'},
2106 {"program-headers", no_argument, 0, 'l'},
2107 {"headers", no_argument, 0, 'e'},
2108 {"histogram", no_argument, 0, 'I'},
2109 {"segments", no_argument, 0, 'l'},
2110 {"sections", no_argument, 0, 'S'},
2111 {"section-headers", no_argument, 0, 'S'},
2112 {"symbols", no_argument, 0, 's'},
2113 {"syms", no_argument, 0, 's'},
2114 {"relocs", no_argument, 0, 'r'},
2115 {"notes", no_argument, 0, 'n'},
2116 {"dynamic", no_argument, 0, 'd'},
2117 {"arch-specific", no_argument, 0, 'A'},
2118 {"version-info", no_argument, 0, 'V'},
2119 {"use-dynamic", no_argument, 0, 'D'},
2120 {"hex-dump", required_argument, 0, 'x'},
2121 {"debug-dump", optional_argument, 0, 'w'},
2122 {"unwind", no_argument, 0, 'u'},
2123 #ifdef SUPPORT_DISASSEMBLY
2124 {"instruction-dump", required_argument, 0, 'i'},
2127 {"version", no_argument, 0, 'v'},
2128 {"wide", no_argument, 0, 'W'},
2129 {"help", no_argument, 0, 'H'},
2130 {0, no_argument, 0, 0}
2136 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
2137 fprintf (stdout, _(" Options are:\n"));
2138 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2139 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
2140 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
2141 fprintf (stdout, _(" Display the program headers\n"));
2142 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
2143 fprintf (stdout, _(" Display the sections' header\n"));
2144 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
2145 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
2146 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
2147 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
2148 fprintf (stdout, _(" -u or --unwind Display the unwind info (if present)\n"));
2149 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2150 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
2151 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2152 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2153 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
2154 fprintf (stdout, _(" Dump the contents of section <number>\n"));
2155 fprintf (stdout, _(" -w[liaprmfs] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n"));
2156 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
2157 #ifdef SUPPORT_DISASSEMBLY
2158 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
2159 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
2161 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2162 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
2163 fprintf (stdout, _(" -W or --wide Don't split lines or truncate symbols to fit into 80 columns\n"));
2164 fprintf (stdout, _(" -H or --help Display this information\n"));
2165 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2171 request_dump (section, type)
2172 unsigned int section;
2175 if (section >= num_dump_sects)
2177 char * new_dump_sects;
2179 new_dump_sects = (char *) calloc (section + 1, 1);
2181 if (new_dump_sects == NULL)
2182 error (_("Out of memory allocating dump request table."));
2185 /* Copy current flag settings. */
2186 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2190 dump_sects = new_dump_sects;
2191 num_dump_sects = section + 1;
2196 dump_sects [section] |= type;
2202 parse_args (argc, argv)
2211 while ((c = getopt_long
2212 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2248 do_using_dynamic ++;
2279 section = strtoul (optarg, & cp, 0);
2280 if (! * cp && section >= 0)
2282 request_dump (section, HEX_DUMP);
2292 unsigned int index = 0;
2296 while (optarg[index])
2297 switch (optarg[index++])
2306 do_debug_abbrevs = 1;
2316 do_debug_pubnames = 1;
2321 do_debug_aranges = 1;
2325 do_debug_frames_interp = 1;
2327 do_debug_frames = 1;
2332 do_debug_macinfo = 1;
2341 warn (_("Unrecognised debug option '%s'\n"), optarg);
2346 #ifdef SUPPORT_DISASSEMBLY
2349 section = strtoul (optarg, & cp, 0);
2350 if (! * cp && section >= 0)
2352 request_dump (section, DISASS_DUMP);
2358 print_version (program_name);
2368 /* xgettext:c-format */
2369 error (_("Invalid option '-%c'\n"), c);
2376 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2377 && !do_segments && !do_header && !do_dump && !do_version
2378 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2382 warn (_("Nothing to do.\n"));
2388 get_elf_class (elf_class)
2389 unsigned int elf_class;
2391 static char buff [32];
2395 case ELFCLASSNONE: return _("none");
2396 case ELFCLASS32: return "ELF32";
2397 case ELFCLASS64: return "ELF64";
2399 sprintf (buff, _("<unknown: %x>"), elf_class);
2405 get_data_encoding (encoding)
2406 unsigned int encoding;
2408 static char buff [32];
2412 case ELFDATANONE: return _("none");
2413 case ELFDATA2LSB: return _("2's complement, little endian");
2414 case ELFDATA2MSB: return _("2's complement, big endian");
2416 sprintf (buff, _("<unknown: %x>"), encoding);
2422 get_osabi_name (osabi)
2425 static char buff [32];
2429 case ELFOSABI_NONE: return "UNIX - System V";
2430 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2431 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2432 case ELFOSABI_LINUX: return "UNIX - Linux";
2433 case ELFOSABI_HURD: return "GNU/Hurd";
2434 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2435 case ELFOSABI_AIX: return "UNIX - AIX";
2436 case ELFOSABI_IRIX: return "UNIX - IRIX";
2437 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2438 case ELFOSABI_TRU64: return "UNIX - TRU64";
2439 case ELFOSABI_MODESTO: return "Novell - Modesto";
2440 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2441 case ELFOSABI_STANDALONE: return _("Standalone App");
2442 case ELFOSABI_ARM: return "ARM";
2444 sprintf (buff, _("<unknown: %x>"), osabi);
2449 /* Decode the data held in 'elf_header'. */
2451 process_file_header ()
2453 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2454 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2455 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2456 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2459 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2467 printf (_("ELF Header:\n"));
2468 printf (_(" Magic: "));
2469 for (i = 0; i < EI_NIDENT; i ++)
2470 printf ("%2.2x ", elf_header.e_ident [i]);
2472 printf (_(" Class: %s\n"),
2473 get_elf_class (elf_header.e_ident [EI_CLASS]));
2474 printf (_(" Data: %s\n"),
2475 get_data_encoding (elf_header.e_ident [EI_DATA]));
2476 printf (_(" Version: %d %s\n"),
2477 elf_header.e_ident [EI_VERSION],
2478 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2480 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2483 printf (_(" OS/ABI: %s\n"),
2484 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2485 printf (_(" ABI Version: %d\n"),
2486 elf_header.e_ident [EI_ABIVERSION]);
2487 printf (_(" Type: %s\n"),
2488 get_file_type (elf_header.e_type));
2489 printf (_(" Machine: %s\n"),
2490 get_machine_name (elf_header.e_machine));
2491 printf (_(" Version: 0x%lx\n"),
2492 (unsigned long) elf_header.e_version);
2494 printf (_(" Entry point address: "));
2495 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2496 printf (_("\n Start of program headers: "));
2497 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2498 printf (_(" (bytes into file)\n Start of section headers: "));
2499 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2500 printf (_(" (bytes into file)\n"));
2502 printf (_(" Flags: 0x%lx%s\n"),
2503 (unsigned long) elf_header.e_flags,
2504 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2505 printf (_(" Size of this header: %ld (bytes)\n"),
2506 (long) elf_header.e_ehsize);
2507 printf (_(" Size of program headers: %ld (bytes)\n"),
2508 (long) elf_header.e_phentsize);
2509 printf (_(" Number of program headers: %ld\n"),
2510 (long) elf_header.e_phnum);
2511 printf (_(" Size of section headers: %ld (bytes)\n"),
2512 (long) elf_header.e_shentsize);
2513 printf (_(" Number of section headers: %ld"),
2514 (long) elf_header.e_shnum);
2515 if (section_headers != NULL && elf_header.e_shnum == 0)
2516 printf (" (%ld)", (long) section_headers[0].sh_size);
2517 putc ('\n', stdout);
2518 printf (_(" Section header string table index: %ld"),
2519 (long) elf_header.e_shstrndx);
2520 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2521 printf (" (%ld)", (long) section_headers[0].sh_link);
2522 putc ('\n', stdout);
2525 if (section_headers != NULL)
2527 if (elf_header.e_shnum == 0)
2528 elf_header.e_shnum = section_headers[0].sh_size;
2529 if (elf_header.e_shstrndx == SHN_XINDEX)
2530 elf_header.e_shstrndx = section_headers[0].sh_link;
2531 free (section_headers);
2532 section_headers = NULL;
2540 get_32bit_program_headers (file, program_headers)
2542 Elf_Internal_Phdr * program_headers;
2544 Elf32_External_Phdr * phdrs;
2545 Elf32_External_Phdr * external;
2546 Elf32_Internal_Phdr * internal;
2549 phdrs = ((Elf32_External_Phdr *)
2550 get_data (NULL, file, elf_header.e_phoff,
2551 elf_header.e_phentsize * elf_header.e_phnum,
2552 _("program headers")));
2556 for (i = 0, internal = program_headers, external = phdrs;
2557 i < elf_header.e_phnum;
2558 i ++, internal ++, external ++)
2560 internal->p_type = BYTE_GET (external->p_type);
2561 internal->p_offset = BYTE_GET (external->p_offset);
2562 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2563 internal->p_paddr = BYTE_GET (external->p_paddr);
2564 internal->p_filesz = BYTE_GET (external->p_filesz);
2565 internal->p_memsz = BYTE_GET (external->p_memsz);
2566 internal->p_flags = BYTE_GET (external->p_flags);
2567 internal->p_align = BYTE_GET (external->p_align);
2576 get_64bit_program_headers (file, program_headers)
2578 Elf_Internal_Phdr * program_headers;
2580 Elf64_External_Phdr * phdrs;
2581 Elf64_External_Phdr * external;
2582 Elf64_Internal_Phdr * internal;
2585 phdrs = ((Elf64_External_Phdr *)
2586 get_data (NULL, file, elf_header.e_phoff,
2587 elf_header.e_phentsize * elf_header.e_phnum,
2588 _("program headers")));
2592 for (i = 0, internal = program_headers, external = phdrs;
2593 i < elf_header.e_phnum;
2594 i ++, internal ++, external ++)
2596 internal->p_type = BYTE_GET (external->p_type);
2597 internal->p_flags = BYTE_GET (external->p_flags);
2598 internal->p_offset = BYTE_GET8 (external->p_offset);
2599 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2600 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2601 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2602 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2603 internal->p_align = BYTE_GET8 (external->p_align);
2612 process_program_headers (file)
2615 Elf_Internal_Phdr * program_headers;
2616 Elf_Internal_Phdr * segment;
2619 if (elf_header.e_phnum == 0)
2622 printf (_("\nThere are no program headers in this file.\n"));
2626 if (do_segments && !do_header)
2628 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2629 printf (_("Entry point "));
2630 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2631 printf (_("\nThere are %d program headers, starting at offset "),
2632 elf_header.e_phnum);
2633 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2637 program_headers = (Elf_Internal_Phdr *) malloc
2638 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2640 if (program_headers == NULL)
2642 error (_("Out of memory\n"));
2647 i = get_32bit_program_headers (file, program_headers);
2649 i = get_64bit_program_headers (file, program_headers);
2653 free (program_headers);
2660 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2664 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2667 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2671 (_(" Type Offset VirtAddr PhysAddr\n"));
2673 (_(" FileSiz MemSiz Flags Align\n"));
2681 for (i = 0, segment = program_headers;
2682 i < elf_header.e_phnum;
2687 printf (" %-14.14s ", get_segment_type (segment->p_type));
2691 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2692 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2693 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2694 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2695 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2697 (segment->p_flags & PF_R ? 'R' : ' '),
2698 (segment->p_flags & PF_W ? 'W' : ' '),
2699 (segment->p_flags & PF_X ? 'E' : ' '));
2700 printf ("%#lx", (unsigned long) segment->p_align);
2704 if ((unsigned long) segment->p_offset == segment->p_offset)
2705 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2708 print_vma (segment->p_offset, FULL_HEX);
2712 print_vma (segment->p_vaddr, FULL_HEX);
2714 print_vma (segment->p_paddr, FULL_HEX);
2717 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2718 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2721 print_vma (segment->p_filesz, FULL_HEX);
2725 if ((unsigned long) segment->p_memsz == segment->p_memsz)
2726 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2729 print_vma (segment->p_offset, FULL_HEX);
2733 (segment->p_flags & PF_R ? 'R' : ' '),
2734 (segment->p_flags & PF_W ? 'W' : ' '),
2735 (segment->p_flags & PF_X ? 'E' : ' '));
2737 if ((unsigned long) segment->p_align == segment->p_align)
2738 printf ("%#lx", (unsigned long) segment->p_align);
2741 print_vma (segment->p_align, PREFIX_HEX);
2746 print_vma (segment->p_offset, FULL_HEX);
2748 print_vma (segment->p_vaddr, FULL_HEX);
2750 print_vma (segment->p_paddr, FULL_HEX);
2752 print_vma (segment->p_filesz, FULL_HEX);
2754 print_vma (segment->p_memsz, FULL_HEX);
2756 (segment->p_flags & PF_R ? 'R' : ' '),
2757 (segment->p_flags & PF_W ? 'W' : ' '),
2758 (segment->p_flags & PF_X ? 'E' : ' '));
2759 print_vma (segment->p_align, HEX);
2763 switch (segment->p_type)
2767 loadaddr = (segment->p_vaddr & 0xfffff000)
2768 - (segment->p_offset & 0xfffff000);
2773 error (_("more than one dynamic segment\n"));
2775 dynamic_addr = segment->p_offset;
2776 dynamic_size = segment->p_filesz;
2780 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2781 error (_("Unable to find program interpreter name\n"));
2784 program_interpreter[0] = 0;
2785 fscanf (file, "%63s", program_interpreter);
2788 printf (_("\n [Requesting program interpreter: %s]"),
2789 program_interpreter);
2795 putc ('\n', stdout);
2804 if (do_segments && section_headers != NULL)
2806 printf (_("\n Section to Segment mapping:\n"));
2807 printf (_(" Segment Sections...\n"));
2809 assert (string_table != NULL);
2811 for (i = 0; i < elf_header.e_phnum; i++)
2814 Elf_Internal_Shdr * section;
2816 segment = program_headers + i;
2817 section = section_headers;
2819 printf (" %2.2d ", i);
2821 for (j = 1; j < elf_header.e_shnum; j++, section ++)
2823 if (section->sh_size > 0
2824 /* Compare allocated sections by VMA, unallocated
2825 sections by file offset. */
2826 && (section->sh_flags & SHF_ALLOC
2827 ? (section->sh_addr >= segment->p_vaddr
2828 && section->sh_addr + section->sh_size
2829 <= segment->p_vaddr + segment->p_memsz)
2830 : ((bfd_vma) section->sh_offset >= segment->p_offset
2831 && (section->sh_offset + section->sh_size
2832 <= segment->p_offset + segment->p_filesz))))
2833 printf ("%s ", SECTION_NAME (section));
2840 free (program_headers);
2847 get_32bit_section_headers (file, num)
2851 Elf32_External_Shdr * shdrs;
2852 Elf32_Internal_Shdr * internal;
2855 shdrs = ((Elf32_External_Shdr *)
2856 get_data (NULL, file, elf_header.e_shoff,
2857 elf_header.e_shentsize * num,
2858 _("section headers")));
2862 section_headers = ((Elf_Internal_Shdr *)
2863 malloc (num * sizeof (Elf_Internal_Shdr)));
2865 if (section_headers == NULL)
2867 error (_("Out of memory\n"));
2871 for (i = 0, internal = section_headers;
2875 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2876 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2877 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2878 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2879 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2880 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2881 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2882 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2883 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2884 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2893 get_64bit_section_headers (file, num)
2897 Elf64_External_Shdr * shdrs;
2898 Elf64_Internal_Shdr * internal;
2901 shdrs = ((Elf64_External_Shdr *)
2902 get_data (NULL, file, elf_header.e_shoff,
2903 elf_header.e_shentsize * num,
2904 _("section headers")));
2908 section_headers = ((Elf_Internal_Shdr *)
2909 malloc (num * sizeof (Elf_Internal_Shdr)));
2911 if (section_headers == NULL)
2913 error (_("Out of memory\n"));
2917 for (i = 0, internal = section_headers;
2921 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2922 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2923 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2924 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2925 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2926 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2927 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2928 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2929 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2930 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2938 static Elf_Internal_Sym *
2939 get_32bit_elf_symbols (file, section)
2941 Elf_Internal_Shdr *section;
2943 unsigned long number;
2944 Elf32_External_Sym * esyms;
2945 Elf_External_Sym_Shndx *shndx;
2946 Elf_Internal_Sym * isyms;
2947 Elf_Internal_Sym * psym;
2950 esyms = ((Elf32_External_Sym *)
2951 get_data (NULL, file, section->sh_offset,
2952 section->sh_size, _("symbols")));
2957 if (symtab_shndx_hdr != NULL
2958 && (symtab_shndx_hdr->sh_link
2959 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
2961 shndx = ((Elf_External_Sym_Shndx *)
2962 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
2963 symtab_shndx_hdr->sh_size, _("symtab shndx")));
2971 number = section->sh_size / section->sh_entsize;
2972 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2976 error (_("Out of memory\n"));
2983 for (j = 0, psym = isyms;
2987 psym->st_name = BYTE_GET (esyms[j].st_name);
2988 psym->st_value = BYTE_GET (esyms[j].st_value);
2989 psym->st_size = BYTE_GET (esyms[j].st_size);
2990 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2991 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
2993 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
2994 psym->st_info = BYTE_GET (esyms[j].st_info);
2995 psym->st_other = BYTE_GET (esyms[j].st_other);
3005 static Elf_Internal_Sym *
3006 get_64bit_elf_symbols (file, section)
3008 Elf_Internal_Shdr *section;
3010 unsigned long number;
3011 Elf64_External_Sym * esyms;
3012 Elf_External_Sym_Shndx *shndx;
3013 Elf_Internal_Sym * isyms;
3014 Elf_Internal_Sym * psym;
3017 esyms = ((Elf64_External_Sym *)
3018 get_data (NULL, file, section->sh_offset,
3019 section->sh_size, _("symbols")));
3024 if (symtab_shndx_hdr != NULL
3025 && (symtab_shndx_hdr->sh_link
3026 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3028 shndx = ((Elf_External_Sym_Shndx *)
3029 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3030 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3038 number = section->sh_size / section->sh_entsize;
3039 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3043 error (_("Out of memory\n"));
3050 for (j = 0, psym = isyms;
3054 psym->st_name = BYTE_GET (esyms[j].st_name);
3055 psym->st_info = BYTE_GET (esyms[j].st_info);
3056 psym->st_other = BYTE_GET (esyms[j].st_other);
3057 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3058 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3060 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3061 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3062 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3073 get_elf_section_flags (sh_flags)
3076 static char buff [32];
3084 flag = sh_flags & - sh_flags;
3089 case SHF_WRITE: strcat (buff, "W"); break;
3090 case SHF_ALLOC: strcat (buff, "A"); break;
3091 case SHF_EXECINSTR: strcat (buff, "X"); break;
3092 case SHF_MERGE: strcat (buff, "M"); break;
3093 case SHF_STRINGS: strcat (buff, "S"); break;
3094 case SHF_INFO_LINK: strcat (buff, "I"); break;
3095 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3096 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3097 case SHF_GROUP: strcat (buff, "G"); break;
3100 if (flag & SHF_MASKOS)
3103 sh_flags &= ~ SHF_MASKOS;
3105 else if (flag & SHF_MASKPROC)
3108 sh_flags &= ~ SHF_MASKPROC;
3120 process_section_headers (file)
3123 Elf_Internal_Shdr * section;
3126 section_headers = NULL;
3128 if (elf_header.e_shnum == 0)
3131 printf (_("\nThere are no sections in this file.\n"));
3136 if (do_sections && !do_header)
3137 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3138 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3142 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3145 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3148 /* Read in the string table, so that we have names to display. */
3149 section = SECTION_HEADER (elf_header.e_shstrndx);
3151 if (section->sh_size != 0)
3153 string_table = (char *) get_data (NULL, file, section->sh_offset,
3154 section->sh_size, _("string table"));
3156 string_table_length = section->sh_size;
3159 /* Scan the sections for the dynamic symbol table
3160 and dynamic string table and debug sections. */
3161 dynamic_symbols = NULL;
3162 dynamic_strings = NULL;
3163 dynamic_syminfo = NULL;
3165 for (i = 0, section = section_headers;
3166 i < elf_header.e_shnum;
3169 char * name = SECTION_NAME (section);
3171 if (section->sh_type == SHT_DYNSYM)
3173 if (dynamic_symbols != NULL)
3175 error (_("File contains multiple dynamic symbol tables\n"));
3179 num_dynamic_syms = section->sh_size / section->sh_entsize;
3180 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3182 else if (section->sh_type == SHT_STRTAB
3183 && strcmp (name, ".dynstr") == 0)
3185 if (dynamic_strings != NULL)
3187 error (_("File contains multiple dynamic string tables\n"));
3191 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3193 _("dynamic strings"));
3195 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3197 if (symtab_shndx_hdr != NULL)
3199 error (_("File contains multiple symtab shndx tables\n"));
3202 symtab_shndx_hdr = section;
3204 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3205 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3206 || do_debug_frames || do_debug_macinfo || do_debug_str)
3207 && strncmp (name, ".debug_", 7) == 0)
3212 || (do_debug_info && (strcmp (name, "info") == 0))
3213 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3214 || (do_debug_lines && (strcmp (name, "line") == 0))
3215 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3216 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3217 || (do_debug_frames && (strcmp (name, "frame") == 0))
3218 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3219 || (do_debug_str && (strcmp (name, "str") == 0))
3221 request_dump (i, DEBUG_DUMP);
3223 /* linkonce section to be combined with .debug_info at link time. */
3224 else if ((do_debugging || do_debug_info)
3225 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3226 request_dump (i, DEBUG_DUMP);
3227 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3228 request_dump (i, DEBUG_DUMP);
3234 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3238 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3241 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3244 printf (_(" [Nr] Name Type Address Offset\n"));
3245 printf (_(" Size EntSize Flags Link Info Align\n"));
3248 for (i = 0, section = section_headers;
3249 i < elf_header.e_shnum;
3252 printf (" [%2u] %-17.17s %-15.15s ",
3253 SECTION_HEADER_NUM (i),
3254 SECTION_NAME (section),
3255 get_section_type_name (section->sh_type));
3259 print_vma (section->sh_addr, LONG_HEX);
3261 printf ( " %6.6lx %6.6lx %2.2lx",
3262 (unsigned long) section->sh_offset,
3263 (unsigned long) section->sh_size,
3264 (unsigned long) section->sh_entsize);
3266 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3268 printf ("%2ld %3lx %2ld\n",
3269 (unsigned long) section->sh_link,
3270 (unsigned long) section->sh_info,
3271 (unsigned long) section->sh_addralign);
3275 print_vma (section->sh_addr, LONG_HEX);
3277 if ((long) section->sh_offset == section->sh_offset)
3278 printf (" %6.6lx", (unsigned long) section->sh_offset);
3282 print_vma (section->sh_offset, LONG_HEX);
3285 if ((unsigned long) section->sh_size == section->sh_size)
3286 printf (" %6.6lx", (unsigned long) section->sh_size);
3290 print_vma (section->sh_size, LONG_HEX);
3293 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3294 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3298 print_vma (section->sh_entsize, LONG_HEX);
3301 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3303 printf ("%2ld %3lx ",
3304 (unsigned long) section->sh_link,
3305 (unsigned long) section->sh_info);
3307 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3308 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3311 print_vma (section->sh_addralign, DEC);
3318 print_vma (section->sh_addr, LONG_HEX);
3319 if ((long) section->sh_offset == section->sh_offset)
3320 printf (" %8.8lx", (unsigned long) section->sh_offset);
3324 print_vma (section->sh_offset, LONG_HEX);
3327 print_vma (section->sh_size, LONG_HEX);
3329 print_vma (section->sh_entsize, LONG_HEX);
3331 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3333 printf (" %2ld %3lx %ld\n",
3334 (unsigned long) section->sh_link,
3335 (unsigned long) section->sh_info,
3336 (unsigned long) section->sh_addralign);
3340 printf (_("Key to Flags:\n\
3341 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3342 I (info), L (link order), G (group), x (unknown)\n\
3343 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3348 /* Process the reloc section. */
3350 process_relocs (file)
3353 unsigned long rel_size;
3354 unsigned long rel_offset;
3360 if (do_using_dynamic)
3362 int is_rela = FALSE;
3367 if (dynamic_info[DT_REL])
3369 rel_offset = dynamic_info[DT_REL];
3370 rel_size = dynamic_info[DT_RELSZ];
3373 else if (dynamic_info [DT_RELA])
3375 rel_offset = dynamic_info[DT_RELA];
3376 rel_size = dynamic_info[DT_RELASZ];
3379 else if (dynamic_info[DT_JMPREL])
3381 rel_offset = dynamic_info[DT_JMPREL];
3382 rel_size = dynamic_info[DT_PLTRELSZ];
3384 switch (dynamic_info[DT_PLTREL])
3401 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3402 rel_offset, rel_size);
3404 dump_relocations (file, rel_offset - loadaddr, rel_size,
3405 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3408 printf (_("\nThere are no dynamic relocations in this file.\n"));
3412 Elf32_Internal_Shdr * section;
3416 for (i = 0, section = section_headers;
3417 i < elf_header.e_shnum;
3420 if ( section->sh_type != SHT_RELA
3421 && section->sh_type != SHT_REL)
3424 rel_offset = section->sh_offset;
3425 rel_size = section->sh_size;
3429 Elf32_Internal_Shdr * strsec;
3430 Elf_Internal_Sym * symtab;
3433 unsigned long nsyms;
3435 printf (_("\nRelocation section "));
3437 if (string_table == NULL)
3438 printf ("%d", section->sh_name);
3440 printf ("'%s'", SECTION_NAME (section));
3442 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3443 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3448 if (section->sh_link)
3450 Elf32_Internal_Shdr * symsec;
3452 symsec = SECTION_HEADER (section->sh_link);
3453 nsyms = symsec->sh_size / symsec->sh_entsize;
3454 symtab = GET_ELF_SYMBOLS (file, symsec);
3459 strsec = SECTION_HEADER (symsec->sh_link);
3461 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3465 is_rela = section->sh_type == SHT_RELA;
3467 dump_relocations (file, rel_offset, rel_size,
3468 symtab, nsyms, strtab, is_rela);
3480 printf (_("\nThere are no relocations in this file.\n"));
3486 #include "unwind-ia64.h"
3488 /* An absolute address consists of a section and an offset. If the
3489 section is NULL, the offset itself is the address, otherwise, the
3490 address equals to LOAD_ADDRESS(section) + offset. */
3494 unsigned short section;
3500 struct unw_table_entry
3502 struct absaddr start;
3504 struct absaddr info;
3506 *table; /* Unwind table. */
3507 unsigned long table_len; /* Length of unwind table. */
3508 unsigned char * info; /* Unwind info. */
3509 unsigned long info_size; /* Size of unwind info. */
3510 bfd_vma info_addr; /* starting address of unwind info. */
3511 bfd_vma seg_base; /* Starting address of segment. */
3512 Elf_Internal_Sym * symtab; /* The symbol table. */
3513 unsigned long nsyms; /* Number of symbols. */
3514 char * strtab; /* The string table. */
3515 unsigned long strtab_size; /* Size of string table. */
3518 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3519 struct absaddr, const char **,
3521 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3522 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3523 Elf32_Internal_Shdr *));
3526 find_symbol_for_address (aux, addr, symname, offset)
3527 struct unw_aux_info *aux;
3528 struct absaddr addr;
3529 const char **symname;
3532 bfd_vma dist = (bfd_vma) 0x100000;
3533 Elf_Internal_Sym *sym, *best = NULL;
3536 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3538 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3539 && sym->st_name != 0
3540 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3541 && addr.offset >= sym->st_value
3542 && addr.offset - sym->st_value < dist)
3545 dist = addr.offset - sym->st_value;
3552 *symname = (best->st_name >= aux->strtab_size
3553 ? "<corrupt>" : aux->strtab + best->st_name);
3558 *offset = addr.offset;
3562 dump_ia64_unwind (aux)
3563 struct unw_aux_info *aux;
3566 struct unw_table_entry * tp;
3569 addr_size = is_32bit_elf ? 4 : 8;
3571 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3575 const unsigned char * dp;
3576 const unsigned char * head;
3577 const char * procname;
3579 find_symbol_for_address (aux, tp->start, &procname, &offset);
3581 fputs ("\n<", stdout);
3585 fputs (procname, stdout);
3588 printf ("+%lx", (unsigned long) offset);
3591 fputs (">: [", stdout);
3592 print_vma (tp->start.offset, PREFIX_HEX);
3593 fputc ('-', stdout);
3594 print_vma (tp->end.offset, PREFIX_HEX);
3595 printf ("), info at +0x%lx\n",
3596 (unsigned long) (tp->info.offset - aux->seg_base));
3598 head = aux->info + (tp->info.offset - aux->info_addr);
3599 stamp = BYTE_GET8 ((unsigned char *) head);
3601 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3602 (unsigned) UNW_VER (stamp),
3603 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3604 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3605 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3606 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3608 if (UNW_VER (stamp) != 1)
3610 printf ("\tUnknown version.\n");
3615 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3616 dp = unw_decode (dp, in_body, & in_body);
3621 slurp_ia64_unwind_table (file, aux, sec)
3623 struct unw_aux_info *aux;
3624 Elf32_Internal_Shdr *sec;
3626 unsigned long size, addr_size, nrelas, i;
3627 Elf_Internal_Phdr *prog_hdrs, *seg;
3628 struct unw_table_entry *tep;
3629 Elf32_Internal_Shdr *relsec;
3630 Elf_Internal_Rela *rela, *rp;
3631 unsigned char *table, *tp;
3632 Elf_Internal_Sym *sym;
3633 const char *relname;
3636 addr_size = is_32bit_elf ? 4 : 8;
3638 /* First, find the starting address of the segment that includes
3641 if (elf_header.e_phnum)
3643 prog_hdrs = (Elf_Internal_Phdr *)
3644 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3647 result = get_32bit_program_headers (file, prog_hdrs);
3649 result = get_64bit_program_headers (file, prog_hdrs);
3657 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3659 if (seg->p_type != PT_LOAD)
3662 if (sec->sh_addr >= seg->p_vaddr
3663 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3665 aux->seg_base = seg->p_vaddr;
3673 /* Second, build the unwind table from the contents of the unwind section: */
3674 size = sec->sh_size;
3675 table = (char *) get_data (NULL, file, sec->sh_offset,
3676 size, _("unwind table"));
3680 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3681 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3683 tep->start.section = SHN_UNDEF;
3684 tep->end.section = SHN_UNDEF;
3685 tep->info.section = SHN_UNDEF;
3688 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3689 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3690 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3694 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3695 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3696 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3698 tep->start.offset += aux->seg_base;
3699 tep->end.offset += aux->seg_base;
3700 tep->info.offset += aux->seg_base;
3704 /* Third, apply any relocations to the unwind table: */
3706 for (relsec = section_headers;
3707 relsec < section_headers + elf_header.e_shnum;
3710 if (relsec->sh_type != SHT_RELA
3711 || SECTION_HEADER (relsec->sh_info) != sec)
3714 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3718 for (rp = rela; rp < rela + nrelas; ++rp)
3722 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3723 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3725 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3727 warn (_("Skipping unexpected symbol type %u\n"),
3728 ELF32_ST_TYPE (sym->st_info));
3734 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3735 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3737 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3739 warn (_("Skipping unexpected symbol type %u\n"),
3740 ELF64_ST_TYPE (sym->st_info));
3745 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3747 warn (_("Skipping unexpected relocation type %s\n"), relname);
3751 i = rp->r_offset / (3 * addr_size);
3753 switch (rp->r_offset/addr_size % 3)
3756 aux->table[i].start.section = sym->st_shndx;
3757 aux->table[i].start.offset += rp->r_addend;
3760 aux->table[i].end.section = sym->st_shndx;
3761 aux->table[i].end.offset += rp->r_addend;
3764 aux->table[i].info.section = sym->st_shndx;
3765 aux->table[i].info.offset += rp->r_addend;
3775 aux->table_len = size / (3 * addr_size);
3780 process_unwind (file)
3783 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3784 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3785 struct unw_aux_info aux;
3790 if (elf_header.e_machine != EM_IA_64)
3792 printf (_("\nThere are no unwind sections in this file.\n"));
3796 memset (& aux, 0, sizeof (aux));
3798 addr_size = is_32bit_elf ? 4 : 8;
3800 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3802 if (sec->sh_type == SHT_SYMTAB)
3804 aux.nsyms = sec->sh_size / sec->sh_entsize;
3805 aux.symtab = GET_ELF_SYMBOLS (file, sec);
3807 strsec = SECTION_HEADER (sec->sh_link);
3808 aux.strtab_size = strsec->sh_size;
3809 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3810 aux.strtab_size, _("string table"));
3812 else if (sec->sh_type == SHT_IA_64_UNWIND)
3817 printf (_("\nThere are no unwind sections in this file.\n"));
3819 while (unwcount-- > 0)
3824 for (i = unwstart, sec = section_headers + unwstart;
3825 i < elf_header.e_shnum; ++i, ++sec)
3826 if (sec->sh_type == SHT_IA_64_UNWIND)
3833 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3835 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3838 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3839 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3840 suffix = SECTION_NAME (unwsec) + len;
3841 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3843 if (strncmp (SECTION_NAME (sec),
3844 ELF_STRING_ia64_unwind_info_once, len2) == 0
3845 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3850 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3851 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3852 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3853 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3855 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3857 suffix = SECTION_NAME (unwsec) + len;
3858 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3860 if (strncmp (SECTION_NAME (sec),
3861 ELF_STRING_ia64_unwind_info, len2) == 0
3862 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3866 if (i == elf_header.e_shnum)
3868 printf (_("\nCould not find unwind info section for "));
3870 if (string_table == NULL)
3871 printf ("%d", unwsec->sh_name);
3873 printf ("'%s'", SECTION_NAME (unwsec));
3877 aux.info_size = sec->sh_size;
3878 aux.info_addr = sec->sh_addr;
3879 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3880 aux.info_size, _("unwind info"));
3882 printf (_("\nUnwind section "));
3884 if (string_table == NULL)
3885 printf ("%d", unwsec->sh_name);
3887 printf ("'%s'", SECTION_NAME (unwsec));
3889 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3890 (unsigned long) unwsec->sh_offset,
3891 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3893 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3895 if (aux.table_len > 0)
3896 dump_ia64_unwind (& aux);
3899 free ((char *) aux.table);
3901 free ((char *) aux.info);
3910 free ((char *) aux.strtab);
3916 dynamic_segment_mips_val (entry)
3917 Elf_Internal_Dyn * entry;
3919 switch (entry->d_tag)
3922 if (entry->d_un.d_val == 0)
3926 static const char * opts[] =
3928 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3929 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3930 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3931 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3936 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3937 if (entry->d_un.d_val & (1 << cnt))
3939 printf ("%s%s", first ? "" : " ", opts[cnt]);
3946 case DT_MIPS_IVERSION:
3947 if (dynamic_strings != NULL)
3948 printf ("Interface Version: %s\n",
3949 dynamic_strings + entry->d_un.d_val);
3951 printf ("%ld\n", (long) entry->d_un.d_ptr);
3954 case DT_MIPS_TIME_STAMP:
3959 time_t time = entry->d_un.d_val;
3960 tmp = gmtime (&time);
3961 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3962 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3963 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3964 printf ("Time Stamp: %s\n", timebuf);
3968 case DT_MIPS_RLD_VERSION:
3969 case DT_MIPS_LOCAL_GOTNO:
3970 case DT_MIPS_CONFLICTNO:
3971 case DT_MIPS_LIBLISTNO:
3972 case DT_MIPS_SYMTABNO:
3973 case DT_MIPS_UNREFEXTNO:
3974 case DT_MIPS_HIPAGENO:
3975 case DT_MIPS_DELTA_CLASS_NO:
3976 case DT_MIPS_DELTA_INSTANCE_NO:
3977 case DT_MIPS_DELTA_RELOC_NO:
3978 case DT_MIPS_DELTA_SYM_NO:
3979 case DT_MIPS_DELTA_CLASSSYM_NO:
3980 case DT_MIPS_COMPACT_SIZE:
3981 printf ("%ld\n", (long) entry->d_un.d_ptr);
3985 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3991 dynamic_segment_parisc_val (entry)
3992 Elf_Internal_Dyn * entry;
3994 switch (entry->d_tag)
3996 case DT_HP_DLD_FLAGS:
4005 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4006 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4007 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4008 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4009 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4010 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4011 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4012 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4013 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4014 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4015 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4019 bfd_vma val = entry->d_un.d_val;
4021 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4022 if (val & flags[cnt].bit)
4026 fputs (flags[cnt].str, stdout);
4028 val ^= flags[cnt].bit;
4031 if (val != 0 || first)
4035 print_vma (val, HEX);
4041 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4047 get_32bit_dynamic_segment (file)
4050 Elf32_External_Dyn * edyn;
4051 Elf_Internal_Dyn * entry;
4054 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4055 dynamic_size, _("dynamic segment"));
4059 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4060 how large this .dynamic is now. We can do this even before the byte
4061 swapping since the DT_NULL tag is recognizable. */
4063 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
4066 dynamic_segment = (Elf_Internal_Dyn *)
4067 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4069 if (dynamic_segment == NULL)
4071 error (_("Out of memory\n"));
4076 for (i = 0, entry = dynamic_segment;
4080 entry->d_tag = BYTE_GET (edyn [i].d_tag);
4081 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
4090 get_64bit_dynamic_segment (file)
4093 Elf64_External_Dyn * edyn;
4094 Elf_Internal_Dyn * entry;
4097 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4098 dynamic_size, _("dynamic segment"));
4102 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4103 how large this .dynamic is now. We can do this even before the byte
4104 swapping since the DT_NULL tag is recognizable. */
4106 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
4109 dynamic_segment = (Elf_Internal_Dyn *)
4110 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4112 if (dynamic_segment == NULL)
4114 error (_("Out of memory\n"));
4119 for (i = 0, entry = dynamic_segment;
4123 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
4124 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
4133 get_dynamic_flags (flags)
4136 static char buff [64];
4141 flag = flags & - flags;
4146 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
4147 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
4148 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
4149 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
4150 default: strcat (buff, "unknown "); break;
4156 /* Parse and display the contents of the dynamic segment. */
4158 process_dynamic_segment (file)
4161 Elf_Internal_Dyn * entry;
4164 if (dynamic_size == 0)
4167 printf (_("\nThere is no dynamic segment in this file.\n"));
4174 if (! get_32bit_dynamic_segment (file))
4177 else if (! get_64bit_dynamic_segment (file))
4180 /* Find the appropriate symbol table. */
4181 if (dynamic_symbols == NULL)
4183 for (i = 0, entry = dynamic_segment;
4187 Elf32_Internal_Shdr section;
4189 if (entry->d_tag != DT_SYMTAB)
4192 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4194 /* Since we do not know how big the symbol table is,
4195 we default to reading in the entire file (!) and
4196 processing that. This is overkill, I know, but it
4198 section.sh_offset = entry->d_un.d_val - loadaddr;
4200 if (fseek (file, 0, SEEK_END))
4201 error (_("Unable to seek to end of file!"));
4203 section.sh_size = ftell (file) - section.sh_offset;
4205 section.sh_entsize = sizeof (Elf32_External_Sym);
4207 section.sh_entsize = sizeof (Elf64_External_Sym);
4209 num_dynamic_syms = section.sh_size / section.sh_entsize;
4210 if (num_dynamic_syms < 1)
4212 error (_("Unable to determine the number of symbols to load\n"));
4216 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
4220 /* Similarly find a string table. */
4221 if (dynamic_strings == NULL)
4223 for (i = 0, entry = dynamic_segment;
4227 unsigned long offset;
4230 if (entry->d_tag != DT_STRTAB)
4233 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4235 /* Since we do not know how big the string table is,
4236 we default to reading in the entire file (!) and
4237 processing that. This is overkill, I know, but it
4240 offset = entry->d_un.d_val - loadaddr;
4241 if (fseek (file, 0, SEEK_END))
4242 error (_("Unable to seek to end of file\n"));
4243 str_tab_len = ftell (file) - offset;
4245 if (str_tab_len < 1)
4248 (_("Unable to determine the length of the dynamic string table\n"));
4252 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4253 _("dynamic string table"));
4258 /* And find the syminfo section if available. */
4259 if (dynamic_syminfo == NULL)
4261 unsigned int syminsz = 0;
4263 for (i = 0, entry = dynamic_segment;
4267 if (entry->d_tag == DT_SYMINENT)
4269 /* Note: these braces are necessary to avoid a syntax
4270 error from the SunOS4 C compiler. */
4271 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4273 else if (entry->d_tag == DT_SYMINSZ)
4274 syminsz = entry->d_un.d_val;
4275 else if (entry->d_tag == DT_SYMINFO)
4276 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4279 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4281 Elf_External_Syminfo * extsyminfo;
4282 Elf_Internal_Syminfo * syminfo;
4284 /* There is a syminfo section. Read the data. */
4285 extsyminfo = ((Elf_External_Syminfo *)
4286 get_data (NULL, file, dynamic_syminfo_offset,
4287 syminsz, _("symbol information")));
4291 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4292 if (dynamic_syminfo == NULL)
4294 error (_("Out of memory\n"));
4298 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4299 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4302 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4303 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4310 if (do_dynamic && dynamic_addr)
4311 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4312 dynamic_addr, (long) dynamic_size);
4314 printf (_(" Tag Type Name/Value\n"));
4316 for (i = 0, entry = dynamic_segment;
4325 print_vma (entry->d_tag, FULL_HEX);
4326 dtype = get_dynamic_type (entry->d_tag);
4327 printf (" (%s)%*s", dtype,
4328 ((is_32bit_elf ? 27 : 19)
4329 - (int) strlen (dtype)),
4333 switch (entry->d_tag)
4337 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4347 switch (entry->d_tag)
4350 printf (_("Auxiliary library"));
4354 printf (_("Filter library"));
4358 printf (_("Configuration file"));
4362 printf (_("Dependency audit library"));
4366 printf (_("Audit library"));
4370 if (dynamic_strings)
4371 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4375 print_vma (entry->d_un.d_val, PREFIX_HEX);
4384 printf (_("Flags:"));
4385 if (entry->d_un.d_val == 0)
4386 printf (_(" None\n"));
4389 unsigned long int val = entry->d_un.d_val;
4390 if (val & DTF_1_PARINIT)
4392 printf (" PARINIT");
4393 val ^= DTF_1_PARINIT;
4395 if (val & DTF_1_CONFEXP)
4397 printf (" CONFEXP");
4398 val ^= DTF_1_CONFEXP;
4401 printf (" %lx", val);
4410 printf (_("Flags:"));
4411 if (entry->d_un.d_val == 0)
4412 printf (_(" None\n"));
4415 unsigned long int val = entry->d_un.d_val;
4416 if (val & DF_P1_LAZYLOAD)
4418 printf (" LAZYLOAD");
4419 val ^= DF_P1_LAZYLOAD;
4421 if (val & DF_P1_GROUPPERM)
4423 printf (" GROUPPERM");
4424 val ^= DF_P1_GROUPPERM;
4427 printf (" %lx", val);
4436 printf (_("Flags:"));
4437 if (entry->d_un.d_val == 0)
4438 printf (_(" None\n"));
4441 unsigned long int val = entry->d_un.d_val;
4447 if (val & DF_1_GLOBAL)
4452 if (val & DF_1_GROUP)
4457 if (val & DF_1_NODELETE)
4459 printf (" NODELETE");
4460 val ^= DF_1_NODELETE;
4462 if (val & DF_1_LOADFLTR)
4464 printf (" LOADFLTR");
4465 val ^= DF_1_LOADFLTR;
4467 if (val & DF_1_INITFIRST)
4469 printf (" INITFIRST");
4470 val ^= DF_1_INITFIRST;
4472 if (val & DF_1_NOOPEN)
4477 if (val & DF_1_ORIGIN)
4482 if (val & DF_1_DIRECT)
4487 if (val & DF_1_TRANS)
4492 if (val & DF_1_INTERPOSE)
4494 printf (" INTERPOSE");
4495 val ^= DF_1_INTERPOSE;
4497 if (val & DF_1_NODEFLIB)
4499 printf (" NODEFLIB");
4500 val ^= DF_1_NODEFLIB;
4502 if (val & DF_1_NODUMP)
4507 if (val & DF_1_CONLFAT)
4509 printf (" CONLFAT");
4510 val ^= DF_1_CONLFAT;
4513 printf (" %lx", val);
4521 puts (get_dynamic_type (entry->d_un.d_val));
4541 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4547 if (dynamic_strings == NULL)
4550 name = dynamic_strings + entry->d_un.d_val;
4554 switch (entry->d_tag)
4557 printf (_("Shared library: [%s]"), name);
4559 if (strcmp (name, program_interpreter) == 0)
4560 printf (_(" program interpreter"));
4564 printf (_("Library soname: [%s]"), name);
4568 printf (_("Library rpath: [%s]"), name);
4572 printf (_("Library runpath: [%s]"), name);
4576 print_vma (entry->d_un.d_val, PREFIX_HEX);
4581 print_vma (entry->d_un.d_val, PREFIX_HEX);
4597 case DT_INIT_ARRAYSZ:
4598 case DT_FINI_ARRAYSZ:
4601 print_vma (entry->d_un.d_val, UNSIGNED);
4602 printf (" (bytes)\n");
4612 print_vma (entry->d_un.d_val, UNSIGNED);
4625 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4629 name = dynamic_strings + entry->d_un.d_val;
4633 printf (_("Not needed object: [%s]\n"), name);
4638 print_vma (entry->d_un.d_val, PREFIX_HEX);
4644 /* The value of this entry is ignored. */
4648 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4649 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4654 switch (elf_header.e_machine)
4657 case EM_MIPS_RS3_LE:
4658 dynamic_segment_mips_val (entry);
4661 dynamic_segment_parisc_val (entry);
4664 print_vma (entry->d_un.d_val, PREFIX_HEX);
4676 get_ver_flags (flags)
4679 static char buff [32];
4686 if (flags & VER_FLG_BASE)
4687 strcat (buff, "BASE ");
4689 if (flags & VER_FLG_WEAK)
4691 if (flags & VER_FLG_BASE)
4692 strcat (buff, "| ");
4694 strcat (buff, "WEAK ");
4697 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4698 strcat (buff, "| <unknown>");
4703 /* Display the contents of the version sections. */
4705 process_version_sections (file)
4708 Elf32_Internal_Shdr * section;
4715 for (i = 0, section = section_headers;
4716 i < elf_header.e_shnum;
4719 switch (section->sh_type)
4721 case SHT_GNU_verdef:
4723 Elf_External_Verdef * edefs;
4730 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4731 SECTION_NAME (section), section->sh_info);
4733 printf (_(" Addr: 0x"));
4734 printf_vma (section->sh_addr);
4735 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4736 (unsigned long) section->sh_offset, section->sh_link,
4737 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4739 edefs = ((Elf_External_Verdef *)
4740 get_data (NULL, file, section->sh_offset,
4742 _("version definition section")));
4746 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4749 Elf_External_Verdef * edef;
4750 Elf_Internal_Verdef ent;
4751 Elf_External_Verdaux * eaux;
4752 Elf_Internal_Verdaux aux;
4756 vstart = ((char *) edefs) + idx;
4758 edef = (Elf_External_Verdef *) vstart;
4760 ent.vd_version = BYTE_GET (edef->vd_version);
4761 ent.vd_flags = BYTE_GET (edef->vd_flags);
4762 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4763 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4764 ent.vd_hash = BYTE_GET (edef->vd_hash);
4765 ent.vd_aux = BYTE_GET (edef->vd_aux);
4766 ent.vd_next = BYTE_GET (edef->vd_next);
4768 printf (_(" %#06x: Rev: %d Flags: %s"),
4769 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4771 printf (_(" Index: %d Cnt: %d "),
4772 ent.vd_ndx, ent.vd_cnt);
4774 vstart += ent.vd_aux;
4776 eaux = (Elf_External_Verdaux *) vstart;
4778 aux.vda_name = BYTE_GET (eaux->vda_name);
4779 aux.vda_next = BYTE_GET (eaux->vda_next);
4781 if (dynamic_strings)
4782 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4784 printf (_("Name index: %ld\n"), aux.vda_name);
4786 isum = idx + ent.vd_aux;
4788 for (j = 1; j < ent.vd_cnt; j ++)
4790 isum += aux.vda_next;
4791 vstart += aux.vda_next;
4793 eaux = (Elf_External_Verdaux *) vstart;
4795 aux.vda_name = BYTE_GET (eaux->vda_name);
4796 aux.vda_next = BYTE_GET (eaux->vda_next);
4798 if (dynamic_strings)
4799 printf (_(" %#06x: Parent %d: %s\n"),
4800 isum, j, dynamic_strings + aux.vda_name);
4802 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4803 isum, j, aux.vda_name);
4813 case SHT_GNU_verneed:
4815 Elf_External_Verneed * eneed;
4821 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4822 SECTION_NAME (section), section->sh_info);
4824 printf (_(" Addr: 0x"));
4825 printf_vma (section->sh_addr);
4826 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4827 (unsigned long) section->sh_offset, section->sh_link,
4828 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4830 eneed = ((Elf_External_Verneed *)
4831 get_data (NULL, file, section->sh_offset,
4832 section->sh_size, _("version need section")));
4836 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4838 Elf_External_Verneed * entry;
4839 Elf_Internal_Verneed ent;
4844 vstart = ((char *) eneed) + idx;
4846 entry = (Elf_External_Verneed *) vstart;
4848 ent.vn_version = BYTE_GET (entry->vn_version);
4849 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4850 ent.vn_file = BYTE_GET (entry->vn_file);
4851 ent.vn_aux = BYTE_GET (entry->vn_aux);
4852 ent.vn_next = BYTE_GET (entry->vn_next);
4854 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4856 if (dynamic_strings)
4857 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4859 printf (_(" File: %lx"), ent.vn_file);
4861 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4863 vstart += ent.vn_aux;
4865 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4867 Elf_External_Vernaux * eaux;
4868 Elf_Internal_Vernaux aux;
4870 eaux = (Elf_External_Vernaux *) vstart;
4872 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4873 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4874 aux.vna_other = BYTE_GET (eaux->vna_other);
4875 aux.vna_name = BYTE_GET (eaux->vna_name);
4876 aux.vna_next = BYTE_GET (eaux->vna_next);
4878 if (dynamic_strings)
4879 printf (_(" %#06x: Name: %s"),
4880 isum, dynamic_strings + aux.vna_name);
4882 printf (_(" %#06x: Name index: %lx"),
4883 isum, aux.vna_name);
4885 printf (_(" Flags: %s Version: %d\n"),
4886 get_ver_flags (aux.vna_flags), aux.vna_other);
4888 isum += aux.vna_next;
4889 vstart += aux.vna_next;
4899 case SHT_GNU_versym:
4901 Elf32_Internal_Shdr * link_section;
4904 unsigned char * edata;
4905 unsigned short * data;
4907 Elf_Internal_Sym * symbols;
4908 Elf32_Internal_Shdr * string_sec;
4910 link_section = SECTION_HEADER (section->sh_link);
4911 total = section->sh_size / section->sh_entsize;
4915 symbols = GET_ELF_SYMBOLS (file, link_section);
4917 string_sec = SECTION_HEADER (link_section->sh_link);
4919 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4920 string_sec->sh_size,
4921 _("version string table"));
4925 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4926 SECTION_NAME (section), total);
4928 printf (_(" Addr: "));
4929 printf_vma (section->sh_addr);
4930 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4931 (unsigned long) section->sh_offset, section->sh_link,
4932 SECTION_NAME (link_section));
4936 get_data (NULL, file,
4937 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4938 total * sizeof (short), _("version symbol data")));
4945 data = (unsigned short *) malloc (total * sizeof (short));
4947 for (cnt = total; cnt --;)
4948 data [cnt] = byte_get (edata + cnt * sizeof (short),
4953 for (cnt = 0; cnt < total; cnt += 4)
4956 int check_def, check_need;
4959 printf (" %03x:", cnt);
4961 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4962 switch (data [cnt + j])
4965 fputs (_(" 0 (*local*) "), stdout);
4969 fputs (_(" 1 (*global*) "), stdout);
4973 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4974 data [cnt + j] & 0x8000 ? 'h' : ' ');
4978 if (SECTION_HEADER (symbols [cnt + j].st_shndx)->sh_type
4981 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4988 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4990 Elf_Internal_Verneed ivn;
4991 unsigned long offset;
4993 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4998 Elf_Internal_Vernaux ivna;
4999 Elf_External_Verneed evn;
5000 Elf_External_Vernaux evna;
5001 unsigned long a_off;
5003 get_data (&evn, file, offset, sizeof (evn),
5006 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5007 ivn.vn_next = BYTE_GET (evn.vn_next);
5009 a_off = offset + ivn.vn_aux;
5013 get_data (&evna, file, a_off, sizeof (evna),
5014 _("version need aux (2)"));
5016 ivna.vna_next = BYTE_GET (evna.vna_next);
5017 ivna.vna_other = BYTE_GET (evna.vna_other);
5019 a_off += ivna.vna_next;
5021 while (ivna.vna_other != data [cnt + j]
5022 && ivna.vna_next != 0);
5024 if (ivna.vna_other == data [cnt + j])
5026 ivna.vna_name = BYTE_GET (evna.vna_name);
5028 name = strtab + ivna.vna_name;
5029 nn += printf ("(%s%-*s",
5031 12 - (int) strlen (name),
5037 offset += ivn.vn_next;
5039 while (ivn.vn_next);
5042 if (check_def && data [cnt + j] != 0x8001
5043 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5045 Elf_Internal_Verdef ivd;
5046 Elf_External_Verdef evd;
5047 unsigned long offset;
5049 offset = version_info
5050 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
5054 get_data (&evd, file, offset, sizeof (evd),
5057 ivd.vd_next = BYTE_GET (evd.vd_next);
5058 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5060 offset += ivd.vd_next;
5062 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
5063 && ivd.vd_next != 0);
5065 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
5067 Elf_External_Verdaux evda;
5068 Elf_Internal_Verdaux ivda;
5070 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5072 get_data (&evda, file,
5073 offset - ivd.vd_next + ivd.vd_aux,
5074 sizeof (evda), _("version def aux"));
5076 ivda.vda_name = BYTE_GET (evda.vda_name);
5078 name = strtab + ivda.vda_name;
5079 nn += printf ("(%s%-*s",
5081 12 - (int) strlen (name),
5087 printf ("%*c", 18 - nn, ' ');
5105 printf (_("\nNo version information found in this file.\n"));
5111 get_symbol_binding (binding)
5112 unsigned int binding;
5114 static char buff [32];
5118 case STB_LOCAL: return "LOCAL";
5119 case STB_GLOBAL: return "GLOBAL";
5120 case STB_WEAK: return "WEAK";
5122 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5123 sprintf (buff, _("<processor specific>: %d"), binding);
5124 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5125 sprintf (buff, _("<OS specific>: %d"), binding);
5127 sprintf (buff, _("<unknown>: %d"), binding);
5133 get_symbol_type (type)
5136 static char buff [32];
5140 case STT_NOTYPE: return "NOTYPE";
5141 case STT_OBJECT: return "OBJECT";
5142 case STT_FUNC: return "FUNC";
5143 case STT_SECTION: return "SECTION";
5144 case STT_FILE: return "FILE";
5145 case STT_COMMON: return "COMMON";
5147 if (type >= STT_LOPROC && type <= STT_HIPROC)
5149 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5150 return "THUMB_FUNC";
5152 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5155 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5156 return "PARISC_MILLI";
5158 sprintf (buff, _("<processor specific>: %d"), type);
5160 else if (type >= STT_LOOS && type <= STT_HIOS)
5162 if (elf_header.e_machine == EM_PARISC)
5164 if (type == STT_HP_OPAQUE)
5166 if (type == STT_HP_STUB)
5170 sprintf (buff, _("<OS specific>: %d"), type);
5173 sprintf (buff, _("<unknown>: %d"), type);
5179 get_symbol_visibility (visibility)
5180 unsigned int visibility;
5184 case STV_DEFAULT: return "DEFAULT";
5185 case STV_INTERNAL: return "INTERNAL";
5186 case STV_HIDDEN: return "HIDDEN";
5187 case STV_PROTECTED: return "PROTECTED";
5193 get_symbol_index_type (type)
5198 case SHN_UNDEF: return "UND";
5199 case SHN_ABS: return "ABS";
5200 case SHN_COMMON: return "COM";
5202 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5204 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5206 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5210 static char buff [32];
5212 sprintf (buff, "%3d", type);
5219 get_dynamic_data (file, number)
5221 unsigned int number;
5223 unsigned char * e_data;
5226 e_data = (unsigned char *) malloc (number * 4);
5230 error (_("Out of memory\n"));
5234 if (fread (e_data, 4, number, file) != number)
5236 error (_("Unable to read in dynamic data\n"));
5240 i_data = (int *) malloc (number * sizeof (* i_data));
5244 error (_("Out of memory\n"));
5250 i_data [number] = byte_get (e_data + number * 4, 4);
5257 /* Dump the symbol table. */
5259 process_symbol_table (file)
5262 Elf32_Internal_Shdr * section;
5263 unsigned char nb [4];
5264 unsigned char nc [4];
5267 int * buckets = NULL;
5268 int * chains = NULL;
5270 if (! do_syms && !do_histogram)
5273 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5276 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5278 error (_("Unable to seek to start of dynamic information"));
5282 if (fread (nb, sizeof (nb), 1, file) != 1)
5284 error (_("Failed to read in number of buckets\n"));
5288 if (fread (nc, sizeof (nc), 1, file) != 1)
5290 error (_("Failed to read in number of chains\n"));
5294 nbuckets = byte_get (nb, 4);
5295 nchains = byte_get (nc, 4);
5297 buckets = get_dynamic_data (file, nbuckets);
5298 chains = get_dynamic_data (file, nchains);
5300 if (buckets == NULL || chains == NULL)
5305 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5310 printf (_("\nSymbol table for image:\n"));
5312 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5314 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5316 for (hn = 0; hn < nbuckets; hn++)
5321 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5323 Elf_Internal_Sym * psym;
5325 psym = dynamic_symbols + si;
5327 printf (" %3d %3d: ", si, hn);
5328 print_vma (psym->st_value, LONG_HEX);
5330 print_vma (psym->st_size, DEC_5);
5332 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5333 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5334 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5335 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5336 print_symbol (25, dynamic_strings + psym->st_name);
5341 else if (do_syms && !do_using_dynamic)
5345 for (i = 0, section = section_headers;
5346 i < elf_header.e_shnum;
5351 Elf_Internal_Sym * symtab;
5352 Elf_Internal_Sym * psym;
5355 if ( section->sh_type != SHT_SYMTAB
5356 && section->sh_type != SHT_DYNSYM)
5359 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5360 SECTION_NAME (section),
5361 (unsigned long) (section->sh_size / section->sh_entsize));
5363 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5365 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5367 symtab = GET_ELF_SYMBOLS (file, section);
5371 if (section->sh_link == elf_header.e_shstrndx)
5372 strtab = string_table;
5375 Elf32_Internal_Shdr * string_sec;
5377 string_sec = SECTION_HEADER (section->sh_link);
5379 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5380 string_sec->sh_size,
5384 for (si = 0, psym = symtab;
5385 si < section->sh_size / section->sh_entsize;
5388 printf ("%6d: ", si);
5389 print_vma (psym->st_value, LONG_HEX);
5391 print_vma (psym->st_size, DEC_5);
5392 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5393 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5394 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5395 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
5396 print_symbol (25, strtab + psym->st_name);
5398 if (section->sh_type == SHT_DYNSYM &&
5399 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5401 unsigned char data[2];
5402 unsigned short vers_data;
5403 unsigned long offset;
5407 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5410 get_data (&data, file, offset + si * sizeof (vers_data),
5411 sizeof (data), _("version data"));
5413 vers_data = byte_get (data, 2);
5415 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5418 check_def = (psym->st_shndx != SHN_UNDEF);
5420 if ((vers_data & 0x8000) || vers_data > 1)
5422 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5423 && (is_nobits || ! check_def))
5425 Elf_External_Verneed evn;
5426 Elf_Internal_Verneed ivn;
5427 Elf_Internal_Vernaux ivna;
5429 /* We must test both. */
5430 offset = version_info
5431 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5435 unsigned long vna_off;
5437 get_data (&evn, file, offset, sizeof (evn),
5440 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5441 ivn.vn_next = BYTE_GET (evn.vn_next);
5443 vna_off = offset + ivn.vn_aux;
5447 Elf_External_Vernaux evna;
5449 get_data (&evna, file, vna_off,
5451 _("version need aux (3)"));
5453 ivna.vna_other = BYTE_GET (evna.vna_other);
5454 ivna.vna_next = BYTE_GET (evna.vna_next);
5455 ivna.vna_name = BYTE_GET (evna.vna_name);
5457 vna_off += ivna.vna_next;
5459 while (ivna.vna_other != vers_data
5460 && ivna.vna_next != 0);
5462 if (ivna.vna_other == vers_data)
5465 offset += ivn.vn_next;
5467 while (ivn.vn_next != 0);
5469 if (ivna.vna_other == vers_data)
5472 strtab + ivna.vna_name, ivna.vna_other);
5475 else if (! is_nobits)
5476 error (_("bad dynamic symbol"));
5483 if (vers_data != 0x8001
5484 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5486 Elf_Internal_Verdef ivd;
5487 Elf_Internal_Verdaux ivda;
5488 Elf_External_Verdaux evda;
5489 unsigned long offset;
5492 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5497 Elf_External_Verdef evd;
5499 get_data (&evd, file, offset, sizeof (evd),
5502 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5503 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5504 ivd.vd_next = BYTE_GET (evd.vd_next);
5506 offset += ivd.vd_next;
5508 while (ivd.vd_ndx != (vers_data & 0x7fff)
5509 && ivd.vd_next != 0);
5511 offset -= ivd.vd_next;
5512 offset += ivd.vd_aux;
5514 get_data (&evda, file, offset, sizeof (evda),
5515 _("version def aux"));
5517 ivda.vda_name = BYTE_GET (evda.vda_name);
5519 if (psym->st_name != ivda.vda_name)
5520 printf ((vers_data & 0x8000)
5522 strtab + ivda.vda_name);
5532 if (strtab != string_table)
5538 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5540 if (do_histogram && buckets != NULL)
5547 int nzero_counts = 0;
5550 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5552 printf (_(" Length Number %% of total Coverage\n"));
5554 lengths = (int *) calloc (nbuckets, sizeof (int));
5555 if (lengths == NULL)
5557 error (_("Out of memory"));
5560 for (hn = 0; hn < nbuckets; ++hn)
5565 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5568 if (maxlength < ++lengths[hn])
5573 counts = (int *) calloc (maxlength + 1, sizeof (int));
5576 error (_("Out of memory"));
5580 for (hn = 0; hn < nbuckets; ++hn)
5581 ++ counts [lengths [hn]];
5585 printf (" 0 %-10d (%5.1f%%)\n",
5586 counts[0], (counts[0] * 100.0) / nbuckets);
5587 for (si = 1; si <= maxlength; ++si)
5589 nzero_counts += counts[si] * si;
5590 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5591 si, counts[si], (counts[si] * 100.0) / nbuckets,
5592 (nzero_counts * 100.0) / nsyms);
5600 if (buckets != NULL)
5610 process_syminfo (file)
5611 FILE * file ATTRIBUTE_UNUSED;
5615 if (dynamic_syminfo == NULL
5617 /* No syminfo, this is ok. */
5620 /* There better should be a dynamic symbol section. */
5621 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5625 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5626 dynamic_syminfo_offset, dynamic_syminfo_nent);
5628 printf (_(" Num: Name BoundTo Flags\n"));
5629 for (i = 0; i < dynamic_syminfo_nent; ++i)
5631 unsigned short int flags = dynamic_syminfo[i].si_flags;
5633 printf ("%4d: ", i);
5634 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
5637 switch (dynamic_syminfo[i].si_boundto)
5639 case SYMINFO_BT_SELF:
5640 fputs ("SELF ", stdout);
5642 case SYMINFO_BT_PARENT:
5643 fputs ("PARENT ", stdout);
5646 if (dynamic_syminfo[i].si_boundto > 0
5647 && dynamic_syminfo[i].si_boundto < dynamic_size)
5649 print_symbol (10, dynamic_strings
5651 [dynamic_syminfo[i].si_boundto].d_un.d_val);
5655 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5659 if (flags & SYMINFO_FLG_DIRECT)
5661 if (flags & SYMINFO_FLG_PASSTHRU)
5662 printf (" PASSTHRU");
5663 if (flags & SYMINFO_FLG_COPY)
5665 if (flags & SYMINFO_FLG_LAZYLOAD)
5666 printf (" LAZYLOAD");
5674 #ifdef SUPPORT_DISASSEMBLY
5676 disassemble_section (section, file)
5677 Elf32_Internal_Shdr * section;
5680 printf (_("\nAssembly dump of section %s\n"),
5681 SECTION_NAME (section));
5683 /* XXX -- to be done --- XXX */
5690 dump_section (section, file)
5691 Elf32_Internal_Shdr * section;
5694 bfd_size_type bytes;
5696 unsigned char * data;
5697 unsigned char * start;
5699 bytes = section->sh_size;
5703 printf (_("\nSection '%s' has no data to dump.\n"),
5704 SECTION_NAME (section));
5708 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5710 addr = section->sh_addr;
5712 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5725 lbytes = (bytes > 16 ? 16 : bytes);
5727 printf (" 0x%8.8lx ", (unsigned long) addr);
5729 switch (elf_header.e_ident [EI_DATA])
5733 for (j = 15; j >= 0; j --)
5736 printf ("%2.2x", data [j]);
5746 for (j = 0; j < 16; j++)
5749 printf ("%2.2x", data [j]);
5759 for (j = 0; j < lbytes; j++)
5762 if (k >= ' ' && k < 0x80)
5781 static unsigned long int
5782 read_leb128 (data, length_return, sign)
5783 unsigned char * data;
5784 int * length_return;
5787 unsigned long int result = 0;
5788 unsigned int num_read = 0;
5797 result |= (byte & 0x7f) << shift;
5802 while (byte & 0x80);
5804 if (length_return != NULL)
5805 * length_return = num_read;
5807 if (sign && (shift < 32) && (byte & 0x40))
5808 result |= -1 << shift;
5813 typedef struct State_Machine_Registers
5815 unsigned long address;
5818 unsigned int column;
5822 /* This variable hold the number of the last entry seen
5823 in the File Table. */
5824 unsigned int last_file_entry;
5827 static SMR state_machine_regs;
5830 reset_state_machine (is_stmt)
5833 state_machine_regs.address = 0;
5834 state_machine_regs.file = 1;
5835 state_machine_regs.line = 1;
5836 state_machine_regs.column = 0;
5837 state_machine_regs.is_stmt = is_stmt;
5838 state_machine_regs.basic_block = 0;
5839 state_machine_regs.end_sequence = 0;
5840 state_machine_regs.last_file_entry = 0;
5843 /* Handled an extend line op. Returns true if this is the end
5846 process_extended_line_op (data, is_stmt, pointer_size)
5847 unsigned char * data;
5851 unsigned char op_code;
5854 unsigned char * name;
5857 len = read_leb128 (data, & bytes_read, 0);
5862 warn (_("badly formed extended line op encountered!\n"));
5867 op_code = * data ++;
5869 printf (_(" Extended opcode %d: "), op_code);
5873 case DW_LNE_end_sequence:
5874 printf (_("End of Sequence\n\n"));
5875 reset_state_machine (is_stmt);
5878 case DW_LNE_set_address:
5879 adr = byte_get (data, pointer_size);
5880 printf (_("set Address to 0x%lx\n"), adr);
5881 state_machine_regs.address = adr;
5884 case DW_LNE_define_file:
5885 printf (_(" define new File Table entry\n"));
5886 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5888 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5890 data += strlen ((char *) data) + 1;
5891 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5893 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5895 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5896 printf (_("%s\n\n"), name);
5900 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5907 /* Size of pointers in the .debug_line section. This information is not
5908 really present in that section. It's obtained before dumping the debug
5909 sections by doing some pre-scan of the .debug_info section. */
5910 static int debug_line_pointer_size = 4;
5913 display_debug_lines (section, start, file)
5914 Elf32_Internal_Shdr * section;
5915 unsigned char * start;
5916 FILE * file ATTRIBUTE_UNUSED;
5918 DWARF2_External_LineInfo * external;
5919 DWARF2_Internal_LineInfo info;
5920 unsigned char * standard_opcodes;
5921 unsigned char * data = start;
5922 unsigned char * end = start + section->sh_size;
5923 unsigned char * end_of_sequence;
5926 printf (_("\nDump of debug contents of section %s:\n\n"),
5927 SECTION_NAME (section));
5931 external = (DWARF2_External_LineInfo *) data;
5933 /* Check the length of the block. */
5934 info.li_length = BYTE_GET (external->li_length);
5936 if (info.li_length == 0xffffffff)
5938 warn (_("64-bit DWARF line info is not supported yet.\n"));
5942 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5945 (_("The line info appears to be corrupt - the section is too small\n"));
5949 /* Check its version number. */
5950 info.li_version = BYTE_GET (external->li_version);
5951 if (info.li_version != 2)
5953 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5957 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5958 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5959 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5960 info.li_line_base = BYTE_GET (external->li_line_base);
5961 info.li_line_range = BYTE_GET (external->li_line_range);
5962 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5964 /* Sign extend the line base field. */
5965 info.li_line_base <<= 24;
5966 info.li_line_base >>= 24;
5968 printf (_(" Length: %ld\n"), info.li_length);
5969 printf (_(" DWARF Version: %d\n"), info.li_version);
5970 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
5971 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5972 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5973 printf (_(" Line Base: %d\n"), info.li_line_base);
5974 printf (_(" Line Range: %d\n"), info.li_line_range);
5975 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5977 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5979 reset_state_machine (info.li_default_is_stmt);
5981 /* Display the contents of the Opcodes table. */
5982 standard_opcodes = data + sizeof (* external);
5984 printf (_("\n Opcodes:\n"));
5986 for (i = 1; i < info.li_opcode_base; i++)
5987 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5989 /* Display the contents of the Directory table. */
5990 data = standard_opcodes + info.li_opcode_base - 1;
5993 printf (_("\n The Directory Table is empty.\n"));
5996 printf (_("\n The Directory Table:\n"));
6000 printf (_(" %s\n"), data);
6002 data += strlen ((char *) data) + 1;
6006 /* Skip the NUL at the end of the table. */
6009 /* Display the contents of the File Name table. */
6011 printf (_("\n The File Name Table is empty.\n"));
6014 printf (_("\n The File Name Table:\n"));
6015 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6019 unsigned char * name;
6022 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
6025 data += strlen ((char *) data) + 1;
6027 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6029 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6031 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6033 printf (_("%s\n"), name);
6037 /* Skip the NUL at the end of the table. */
6040 /* Now display the statements. */
6041 printf (_("\n Line Number Statements:\n"));
6044 while (data < end_of_sequence)
6046 unsigned char op_code;
6050 op_code = * data ++;
6052 if (op_code >= info.li_opcode_base)
6054 op_code -= info.li_opcode_base;
6055 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6056 state_machine_regs.address += adv;
6057 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6058 op_code, adv, state_machine_regs.address);
6059 adv = (op_code % info.li_line_range) + info.li_line_base;
6060 state_machine_regs.line += adv;
6061 printf (_(" and Line by %d to %d\n"),
6062 adv, state_machine_regs.line);
6064 else switch (op_code)
6066 case DW_LNS_extended_op:
6067 data += process_extended_line_op (data, info.li_default_is_stmt,
6068 debug_line_pointer_size);
6072 printf (_(" Copy\n"));
6075 case DW_LNS_advance_pc:
6076 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6078 state_machine_regs.address += adv;
6079 printf (_(" Advance PC by %d to %lx\n"), adv,
6080 state_machine_regs.address);
6083 case DW_LNS_advance_line:
6084 adv = read_leb128 (data, & bytes_read, 1);
6086 state_machine_regs.line += adv;
6087 printf (_(" Advance Line by %d to %d\n"), adv,
6088 state_machine_regs.line);
6091 case DW_LNS_set_file:
6092 adv = read_leb128 (data, & bytes_read, 0);
6094 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6096 state_machine_regs.file = adv;
6099 case DW_LNS_set_column:
6100 adv = read_leb128 (data, & bytes_read, 0);
6102 printf (_(" Set column to %d\n"), adv);
6103 state_machine_regs.column = adv;
6106 case DW_LNS_negate_stmt:
6107 adv = state_machine_regs.is_stmt;
6109 printf (_(" Set is_stmt to %d\n"), adv);
6110 state_machine_regs.is_stmt = adv;
6113 case DW_LNS_set_basic_block:
6114 printf (_(" Set basic block\n"));
6115 state_machine_regs.basic_block = 1;
6118 case DW_LNS_const_add_pc:
6119 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6120 * info.li_min_insn_length);
6121 state_machine_regs.address += adv;
6122 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6123 state_machine_regs.address);
6126 case DW_LNS_fixed_advance_pc:
6127 adv = byte_get (data, 2);
6129 state_machine_regs.address += adv;
6130 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6131 adv, state_machine_regs.address);
6134 case DW_LNS_set_prologue_end:
6135 printf (_(" Set prologue_end to true\n"));
6138 case DW_LNS_set_epilogue_begin:
6139 printf (_(" Set epilogue_begin to true\n"));
6142 case DW_LNS_set_isa:
6143 adv = read_leb128 (data, & bytes_read, 0);
6145 printf (_(" Set ISA to %d\n"), adv);
6149 printf (_(" Unknown opcode %d with operands: "), op_code);
6152 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6154 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6155 i == 1 ? "" : ", ");
6170 display_debug_pubnames (section, start, file)
6171 Elf32_Internal_Shdr * section;
6172 unsigned char * start;
6173 FILE * file ATTRIBUTE_UNUSED;
6175 DWARF2_External_PubNames * external;
6176 DWARF2_Internal_PubNames pubnames;
6177 unsigned char * end;
6179 end = start + section->sh_size;
6181 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6185 unsigned char * data;
6186 unsigned long offset;
6188 external = (DWARF2_External_PubNames *) start;
6190 pubnames.pn_length = BYTE_GET (external->pn_length);
6191 pubnames.pn_version = BYTE_GET (external->pn_version);
6192 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6193 pubnames.pn_size = BYTE_GET (external->pn_size);
6195 data = start + sizeof (* external);
6196 start += pubnames.pn_length + sizeof (external->pn_length);
6198 if (pubnames.pn_length == 0xffffffff)
6200 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6204 if (pubnames.pn_version != 2)
6206 static int warned = 0;
6210 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6217 printf (_(" Length: %ld\n"),
6218 pubnames.pn_length);
6219 printf (_(" Version: %d\n"),
6220 pubnames.pn_version);
6221 printf (_(" Offset into .debug_info section: %ld\n"),
6222 pubnames.pn_offset);
6223 printf (_(" Size of area in .debug_info section: %ld\n"),
6226 printf (_("\n Offset\tName\n"));
6230 offset = byte_get (data, 4);
6235 printf (" %ld\t\t%s\n", offset, data);
6236 data += strlen ((char *) data) + 1;
6239 while (offset != 0);
6252 case DW_TAG_padding: return "DW_TAG_padding";
6253 case DW_TAG_array_type: return "DW_TAG_array_type";
6254 case DW_TAG_class_type: return "DW_TAG_class_type";
6255 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6256 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6257 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6258 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6259 case DW_TAG_label: return "DW_TAG_label";
6260 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6261 case DW_TAG_member: return "DW_TAG_member";
6262 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6263 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6264 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6265 case DW_TAG_string_type: return "DW_TAG_string_type";
6266 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6267 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6268 case DW_TAG_typedef: return "DW_TAG_typedef";
6269 case DW_TAG_union_type: return "DW_TAG_union_type";
6270 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6271 case DW_TAG_variant: return "DW_TAG_variant";
6272 case DW_TAG_common_block: return "DW_TAG_common_block";
6273 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6274 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6275 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6276 case DW_TAG_module: return "DW_TAG_module";
6277 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6278 case DW_TAG_set_type: return "DW_TAG_set_type";
6279 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6280 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6281 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6282 case DW_TAG_base_type: return "DW_TAG_base_type";
6283 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6284 case DW_TAG_const_type: return "DW_TAG_const_type";
6285 case DW_TAG_constant: return "DW_TAG_constant";
6286 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6287 case DW_TAG_file_type: return "DW_TAG_file_type";
6288 case DW_TAG_friend: return "DW_TAG_friend";
6289 case DW_TAG_namelist: return "DW_TAG_namelist";
6290 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6291 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6292 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6293 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6294 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6295 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6296 case DW_TAG_try_block: return "DW_TAG_try_block";
6297 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6298 case DW_TAG_variable: return "DW_TAG_variable";
6299 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6300 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6301 case DW_TAG_format_label: return "DW_TAG_format_label";
6302 case DW_TAG_function_template: return "DW_TAG_function_template";
6303 case DW_TAG_class_template: return "DW_TAG_class_template";
6304 /* DWARF 2.1 values. */
6305 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6306 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6307 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6308 case DW_TAG_namespace: return "DW_TAG_namespace";
6309 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6310 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6311 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6312 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6315 static char buffer [100];
6317 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6324 get_AT_name (attribute)
6325 unsigned long attribute;
6329 case DW_AT_sibling: return "DW_AT_sibling";
6330 case DW_AT_location: return "DW_AT_location";
6331 case DW_AT_name: return "DW_AT_name";
6332 case DW_AT_ordering: return "DW_AT_ordering";
6333 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6334 case DW_AT_byte_size: return "DW_AT_byte_size";
6335 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6336 case DW_AT_bit_size: return "DW_AT_bit_size";
6337 case DW_AT_element_list: return "DW_AT_element_list";
6338 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6339 case DW_AT_low_pc: return "DW_AT_low_pc";
6340 case DW_AT_high_pc: return "DW_AT_high_pc";
6341 case DW_AT_language: return "DW_AT_language";
6342 case DW_AT_member: return "DW_AT_member";
6343 case DW_AT_discr: return "DW_AT_discr";
6344 case DW_AT_discr_value: return "DW_AT_discr_value";
6345 case DW_AT_visibility: return "DW_AT_visibility";
6346 case DW_AT_import: return "DW_AT_import";
6347 case DW_AT_string_length: return "DW_AT_string_length";
6348 case DW_AT_common_reference: return "DW_AT_common_reference";
6349 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6350 case DW_AT_const_value: return "DW_AT_const_value";
6351 case DW_AT_containing_type: return "DW_AT_containing_type";
6352 case DW_AT_default_value: return "DW_AT_default_value";
6353 case DW_AT_inline: return "DW_AT_inline";
6354 case DW_AT_is_optional: return "DW_AT_is_optional";
6355 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6356 case DW_AT_producer: return "DW_AT_producer";
6357 case DW_AT_prototyped: return "DW_AT_prototyped";
6358 case DW_AT_return_addr: return "DW_AT_return_addr";
6359 case DW_AT_start_scope: return "DW_AT_start_scope";
6360 case DW_AT_stride_size: return "DW_AT_stride_size";
6361 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6362 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6363 case DW_AT_accessibility: return "DW_AT_accessibility";
6364 case DW_AT_address_class: return "DW_AT_address_class";
6365 case DW_AT_artificial: return "DW_AT_artificial";
6366 case DW_AT_base_types: return "DW_AT_base_types";
6367 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6368 case DW_AT_count: return "DW_AT_count";
6369 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6370 case DW_AT_decl_column: return "DW_AT_decl_column";
6371 case DW_AT_decl_file: return "DW_AT_decl_file";
6372 case DW_AT_decl_line: return "DW_AT_decl_line";
6373 case DW_AT_declaration: return "DW_AT_declaration";
6374 case DW_AT_discr_list: return "DW_AT_discr_list";
6375 case DW_AT_encoding: return "DW_AT_encoding";
6376 case DW_AT_external: return "DW_AT_external";
6377 case DW_AT_frame_base: return "DW_AT_frame_base";
6378 case DW_AT_friend: return "DW_AT_friend";
6379 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6380 case DW_AT_macro_info: return "DW_AT_macro_info";
6381 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6382 case DW_AT_priority: return "DW_AT_priority";
6383 case DW_AT_segment: return "DW_AT_segment";
6384 case DW_AT_specification: return "DW_AT_specification";
6385 case DW_AT_static_link: return "DW_AT_static_link";
6386 case DW_AT_type: return "DW_AT_type";
6387 case DW_AT_use_location: return "DW_AT_use_location";
6388 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6389 case DW_AT_virtuality: return "DW_AT_virtuality";
6390 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6391 /* DWARF 2.1 values. */
6392 case DW_AT_allocated: return "DW_AT_allocated";
6393 case DW_AT_associated: return "DW_AT_associated";
6394 case DW_AT_data_location: return "DW_AT_data_location";
6395 case DW_AT_stride: return "DW_AT_stride";
6396 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6397 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6398 case DW_AT_extension: return "DW_AT_extension";
6399 case DW_AT_ranges: return "DW_AT_ranges";
6400 case DW_AT_trampoline: return "DW_AT_trampoline";
6401 case DW_AT_call_column: return "DW_AT_call_column";
6402 case DW_AT_call_file: return "DW_AT_call_file";
6403 case DW_AT_call_line: return "DW_AT_call_line";
6404 /* SGI/MIPS extensions. */
6405 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6406 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6407 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6408 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6409 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6410 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6411 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6412 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6413 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6414 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6415 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6416 /* GNU extensions. */
6417 case DW_AT_sf_names: return "DW_AT_sf_names";
6418 case DW_AT_src_info: return "DW_AT_src_info";
6419 case DW_AT_mac_info: return "DW_AT_mac_info";
6420 case DW_AT_src_coords: return "DW_AT_src_coords";
6421 case DW_AT_body_begin: return "DW_AT_body_begin";
6422 case DW_AT_body_end: return "DW_AT_body_end";
6425 static char buffer [100];
6427 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6434 get_FORM_name (form)
6439 case DW_FORM_addr: return "DW_FORM_addr";
6440 case DW_FORM_block2: return "DW_FORM_block2";
6441 case DW_FORM_block4: return "DW_FORM_block4";
6442 case DW_FORM_data2: return "DW_FORM_data2";
6443 case DW_FORM_data4: return "DW_FORM_data4";
6444 case DW_FORM_data8: return "DW_FORM_data8";
6445 case DW_FORM_string: return "DW_FORM_string";
6446 case DW_FORM_block: return "DW_FORM_block";
6447 case DW_FORM_block1: return "DW_FORM_block1";
6448 case DW_FORM_data1: return "DW_FORM_data1";
6449 case DW_FORM_flag: return "DW_FORM_flag";
6450 case DW_FORM_sdata: return "DW_FORM_sdata";
6451 case DW_FORM_strp: return "DW_FORM_strp";
6452 case DW_FORM_udata: return "DW_FORM_udata";
6453 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6454 case DW_FORM_ref1: return "DW_FORM_ref1";
6455 case DW_FORM_ref2: return "DW_FORM_ref2";
6456 case DW_FORM_ref4: return "DW_FORM_ref4";
6457 case DW_FORM_ref8: return "DW_FORM_ref8";
6458 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6459 case DW_FORM_indirect: return "DW_FORM_indirect";
6462 static char buffer [100];
6464 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6470 /* FIXME: There are better and more effiecint ways to handle
6471 these structures. For now though, I just want something that
6472 is simple to implement. */
6473 typedef struct abbrev_attr
6475 unsigned long attribute;
6477 struct abbrev_attr * next;
6481 typedef struct abbrev_entry
6483 unsigned long entry;
6486 struct abbrev_attr * first_attr;
6487 struct abbrev_attr * last_attr;
6488 struct abbrev_entry * next;
6492 static abbrev_entry * first_abbrev = NULL;
6493 static abbrev_entry * last_abbrev = NULL;
6496 free_abbrevs PARAMS ((void))
6498 abbrev_entry * abbrev;
6500 for (abbrev = first_abbrev; abbrev;)
6502 abbrev_entry * next = abbrev->next;
6505 for (attr = abbrev->first_attr; attr;)
6507 abbrev_attr * next = attr->next;
6517 last_abbrev = first_abbrev = NULL;
6521 add_abbrev (number, tag, children)
6522 unsigned long number;
6526 abbrev_entry * entry;
6528 entry = (abbrev_entry *) malloc (sizeof (* entry));
6534 entry->entry = number;
6536 entry->children = children;
6537 entry->first_attr = NULL;
6538 entry->last_attr = NULL;
6541 if (first_abbrev == NULL)
6542 first_abbrev = entry;
6544 last_abbrev->next = entry;
6546 last_abbrev = entry;
6550 add_abbrev_attr (attribute, form)
6551 unsigned long attribute;
6556 attr = (abbrev_attr *) malloc (sizeof (* attr));
6562 attr->attribute = attribute;
6566 if (last_abbrev->first_attr == NULL)
6567 last_abbrev->first_attr = attr;
6569 last_abbrev->last_attr->next = attr;
6571 last_abbrev->last_attr = attr;
6574 /* Processes the (partial) contents of a .debug_abbrev section.
6575 Returns NULL if the end of the section was encountered.
6576 Returns the address after the last byte read if the end of
6577 an abbreviation set was found. */
6579 static unsigned char *
6580 process_abbrev_section (start, end)
6581 unsigned char * start;
6582 unsigned char * end;
6584 if (first_abbrev != NULL)
6590 unsigned long entry;
6592 unsigned long attribute;
6595 entry = read_leb128 (start, & bytes_read, 0);
6596 start += bytes_read;
6598 /* A single zero is supposed to end the section according
6599 to the standard. If there's more, then signal that to
6602 return start == end ? NULL : start;
6604 tag = read_leb128 (start, & bytes_read, 0);
6605 start += bytes_read;
6607 children = * start ++;
6609 add_abbrev (entry, tag, children);
6615 attribute = read_leb128 (start, & bytes_read, 0);
6616 start += bytes_read;
6618 form = read_leb128 (start, & bytes_read, 0);
6619 start += bytes_read;
6622 add_abbrev_attr (attribute, form);
6624 while (attribute != 0);
6632 display_debug_macinfo (section, start, file)
6633 Elf32_Internal_Shdr * section;
6634 unsigned char * start;
6635 FILE * file ATTRIBUTE_UNUSED;
6637 unsigned char * end = start + section->sh_size;
6638 unsigned char * curr = start;
6639 unsigned int bytes_read;
6640 enum dwarf_macinfo_record_type op;
6642 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6646 unsigned int lineno;
6647 const char * string;
6654 case DW_MACINFO_start_file:
6656 unsigned int filenum;
6658 lineno = read_leb128 (curr, & bytes_read, 0);
6660 filenum = read_leb128 (curr, & bytes_read, 0);
6663 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6667 case DW_MACINFO_end_file:
6668 printf (_(" DW_MACINFO_end_file\n"));
6671 case DW_MACINFO_define:
6672 lineno = read_leb128 (curr, & bytes_read, 0);
6675 curr += strlen (string) + 1;
6676 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6679 case DW_MACINFO_undef:
6680 lineno = read_leb128 (curr, & bytes_read, 0);
6683 curr += strlen (string) + 1;
6684 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6687 case DW_MACINFO_vendor_ext:
6689 unsigned int constant;
6691 constant = read_leb128 (curr, & bytes_read, 0);
6694 curr += strlen (string) + 1;
6695 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6706 display_debug_abbrev (section, start, file)
6707 Elf32_Internal_Shdr * section;
6708 unsigned char * start;
6709 FILE * file ATTRIBUTE_UNUSED;
6711 abbrev_entry * entry;
6712 unsigned char * end = start + section->sh_size;
6714 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6718 start = process_abbrev_section (start, end);
6720 if (first_abbrev == NULL)
6723 printf (_(" Number TAG\n"));
6725 for (entry = first_abbrev; entry; entry = entry->next)
6729 printf (_(" %ld %s [%s]\n"),
6731 get_TAG_name (entry->tag),
6732 entry->children ? _("has children") : _("no children"));
6734 for (attr = entry->first_attr; attr; attr = attr->next)
6736 printf (_(" %-18s %s\n"),
6737 get_AT_name (attr->attribute),
6738 get_FORM_name (attr->form));
6752 static unsigned char *
6753 display_block (data, length)
6754 unsigned char * data;
6755 unsigned long length;
6757 printf (_(" %lu byte block: "), length);
6760 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6766 decode_location_expression (data, pointer_size, length)
6767 unsigned char * data;
6768 unsigned int pointer_size;
6769 unsigned long length;
6773 unsigned long uvalue;
6774 unsigned char * end = data + length;
6783 printf ("DW_OP_addr: %lx",
6784 (unsigned long) byte_get (data, pointer_size));
6785 data += pointer_size;
6788 printf ("DW_OP_deref");
6791 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6794 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6797 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6801 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6805 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6809 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6813 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6814 (unsigned long) byte_get (data + 4, 4));
6818 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6819 (long) byte_get (data + 4, 4));
6823 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6827 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6831 printf ("DW_OP_dup");
6834 printf ("DW_OP_drop");
6837 printf ("DW_OP_over");
6840 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6843 printf ("DW_OP_swap");
6846 printf ("DW_OP_rot");
6849 printf ("DW_OP_xderef");
6852 printf ("DW_OP_abs");
6855 printf ("DW_OP_and");
6858 printf ("DW_OP_div");
6861 printf ("DW_OP_minus");
6864 printf ("DW_OP_mod");
6867 printf ("DW_OP_mul");
6870 printf ("DW_OP_neg");
6873 printf ("DW_OP_not");
6876 printf ("DW_OP_or");
6879 printf ("DW_OP_plus");
6881 case DW_OP_plus_uconst:
6882 printf ("DW_OP_plus_uconst: %lu",
6883 read_leb128 (data, &bytes_read, 0));
6887 printf ("DW_OP_shl");
6890 printf ("DW_OP_shr");
6893 printf ("DW_OP_shra");
6896 printf ("DW_OP_xor");
6899 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6903 printf ("DW_OP_eq");
6906 printf ("DW_OP_ge");
6909 printf ("DW_OP_gt");
6912 printf ("DW_OP_le");
6915 printf ("DW_OP_lt");
6918 printf ("DW_OP_ne");
6921 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6957 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6992 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7027 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7028 read_leb128 (data, &bytes_read, 1));
7033 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7037 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7041 uvalue = read_leb128 (data, &bytes_read, 0);
7043 printf ("DW_OP_bregx: %lu %ld", uvalue,
7044 read_leb128 (data, &bytes_read, 1));
7048 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7051 case DW_OP_deref_size:
7052 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7054 case DW_OP_xderef_size:
7055 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7058 printf ("DW_OP_nop");
7061 /* DWARF 2.1 extensions. */
7062 case DW_OP_push_object_address:
7063 printf ("DW_OP_push_object_address");
7066 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7070 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7074 printf ("DW_OP_calli");
7078 if (op >= DW_OP_lo_user
7079 && op <= DW_OP_hi_user)
7080 printf (_("(User defined location op)"));
7082 printf (_("(Unknown location op)"));
7083 /* No way to tell where the next op is, so just bail. */
7087 /* Separate the ops. */
7093 static const char * debug_str_contents;
7094 static bfd_vma debug_str_size;
7097 load_debug_str (file)
7100 Elf32_Internal_Shdr * sec;
7103 /* If it is already loaded, do nothing. */
7104 if (debug_str_contents != NULL)
7107 /* Locate the .debug_str section. */
7108 for (i = 0, sec = section_headers;
7109 i < elf_header.e_shnum;
7111 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7114 if (i == elf_header.e_shnum || sec->sh_size == 0)
7117 debug_str_size = sec->sh_size;
7119 debug_str_contents = ((char *)
7120 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7121 _("debug_str section data")));
7127 if (debug_str_contents == NULL)
7130 free ((char *) debug_str_contents);
7131 debug_str_contents = NULL;
7136 fetch_indirect_string (offset)
7137 unsigned long offset;
7139 if (debug_str_contents == NULL)
7140 return _("<no .debug_str section>");
7142 if (offset > debug_str_size)
7143 return _("<offset is too big>");
7145 return debug_str_contents + offset;
7150 display_debug_str (section, start, file)
7151 Elf32_Internal_Shdr * section;
7152 unsigned char * start;
7153 FILE * file ATTRIBUTE_UNUSED;
7155 unsigned long bytes;
7158 addr = section->sh_addr;
7159 bytes = section->sh_size;
7163 printf (_("\nThe .debug_str section is empty.\n"));
7167 printf (_("Contents of the .debug_str section:\n\n"));
7175 lbytes = (bytes > 16 ? 16 : bytes);
7177 printf (" 0x%8.8lx ", (unsigned long) addr);
7179 for (j = 0; j < 16; j++)
7182 printf ("%2.2x", start [j]);
7190 for (j = 0; j < lbytes; j++)
7193 if (k >= ' ' && k < 0x80)
7210 static unsigned char *
7211 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7212 unsigned long attribute;
7214 unsigned char * data;
7215 unsigned long cu_offset;
7216 unsigned long pointer_size;
7218 unsigned long uvalue = 0;
7219 unsigned char * block_start = NULL;
7227 case DW_FORM_ref_addr:
7229 uvalue = byte_get (data, pointer_size);
7230 data += pointer_size;
7234 uvalue = byte_get (data, /* offset_size */ 4);
7235 data += /* offset_size */ 4;
7241 uvalue = byte_get (data ++, 1);
7246 uvalue = byte_get (data, 2);
7252 uvalue = byte_get (data, 4);
7257 uvalue = read_leb128 (data, & bytes_read, 1);
7261 case DW_FORM_ref_udata:
7263 uvalue = read_leb128 (data, & bytes_read, 0);
7267 case DW_FORM_indirect:
7268 form = read_leb128 (data, & bytes_read, 0);
7270 printf (" %s", get_FORM_name (form));
7271 return read_and_display_attr_value (attribute, form, data, cu_offset,
7277 case DW_FORM_ref_addr:
7278 printf (" <#%lx>", uvalue);
7284 case DW_FORM_ref_udata:
7285 printf (" <%lx>", uvalue + cu_offset);
7289 printf (" %#lx", uvalue);
7297 printf (" %ld", uvalue);
7302 uvalue = byte_get (data, 4);
7303 printf (" %lx", uvalue);
7304 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7308 case DW_FORM_string:
7309 printf (" %s", data);
7310 data += strlen ((char *) data) + 1;
7314 uvalue = read_leb128 (data, & bytes_read, 0);
7315 block_start = data + bytes_read;
7316 data = display_block (block_start, uvalue);
7319 case DW_FORM_block1:
7320 uvalue = byte_get (data, 1);
7321 block_start = data + 1;
7322 data = display_block (block_start, uvalue);
7325 case DW_FORM_block2:
7326 uvalue = byte_get (data, 2);
7327 block_start = data + 2;
7328 data = display_block (block_start, uvalue);
7331 case DW_FORM_block4:
7332 uvalue = byte_get (data, 4);
7333 block_start = data + 4;
7334 data = display_block (block_start, uvalue);
7338 printf (_(" (indirect string, offset: 0x%lx): "), uvalue);
7339 printf (fetch_indirect_string (uvalue));
7342 case DW_FORM_indirect:
7343 /* Handled above. */
7347 warn (_("Unrecognised form: %d\n"), form);
7351 /* For some attributes we can display futher information. */
7360 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7361 case DW_INL_inlined: printf (_("(inlined)")); break;
7362 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7363 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7364 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7368 case DW_AT_language:
7371 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7372 case DW_LANG_C89: printf ("(ANSI C)"); break;
7373 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7374 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7375 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7376 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7377 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7378 case DW_LANG_Ada83: printf ("(Ada)"); break;
7379 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7380 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7381 /* DWARF 2.1 values. */
7382 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7383 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7384 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7385 /* MIPS extension. */
7386 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7387 default: printf ("(Unknown: %lx)", uvalue); break;
7391 case DW_AT_encoding:
7394 case DW_ATE_void: printf ("(void)"); break;
7395 case DW_ATE_address: printf ("(machine address)"); break;
7396 case DW_ATE_boolean: printf ("(boolean)"); break;
7397 case DW_ATE_complex_float: printf ("(complex float)"); break;
7398 case DW_ATE_float: printf ("(float)"); break;
7399 case DW_ATE_signed: printf ("(signed)"); break;
7400 case DW_ATE_signed_char: printf ("(signed char)"); break;
7401 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7402 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7403 /* DWARF 2.1 value. */
7404 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7406 if (uvalue >= DW_ATE_lo_user
7407 && uvalue <= DW_ATE_hi_user)
7408 printf ("(user defined type)");
7410 printf ("(unknown type)");
7415 case DW_AT_accessibility:
7418 case DW_ACCESS_public: printf ("(public)"); break;
7419 case DW_ACCESS_protected: printf ("(protected)"); break;
7420 case DW_ACCESS_private: printf ("(private)"); break;
7421 default: printf ("(unknown accessibility)"); break;
7425 case DW_AT_visibility:
7428 case DW_VIS_local: printf ("(local)"); break;
7429 case DW_VIS_exported: printf ("(exported)"); break;
7430 case DW_VIS_qualified: printf ("(qualified)"); break;
7431 default: printf ("(unknown visibility)"); break;
7435 case DW_AT_virtuality:
7438 case DW_VIRTUALITY_none: printf ("(none)"); break;
7439 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7440 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7441 default: printf ("(unknown virtuality)"); break;
7445 case DW_AT_identifier_case:
7448 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7449 case DW_ID_up_case: printf ("(up_case)"); break;
7450 case DW_ID_down_case: printf ("(down_case)"); break;
7451 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7452 default: printf ("(unknown case)"); break;
7456 case DW_AT_calling_convention:
7459 case DW_CC_normal: printf ("(normal)"); break;
7460 case DW_CC_program: printf ("(program)"); break;
7461 case DW_CC_nocall: printf ("(nocall)"); break;
7463 if (uvalue >= DW_CC_lo_user
7464 && uvalue <= DW_CC_hi_user)
7465 printf ("(user defined)");
7467 printf ("(unknown convention)");
7471 case DW_AT_ordering:
7474 case -1: printf ("(undefined)"); break;
7475 case 0: printf ("(row major)"); break;
7476 case 1: printf ("(column major)"); break;
7480 case DW_AT_frame_base:
7481 case DW_AT_location:
7482 case DW_AT_data_member_location:
7483 case DW_AT_vtable_elem_location:
7484 case DW_AT_allocated:
7485 case DW_AT_associated:
7486 case DW_AT_data_location:
7488 case DW_AT_upper_bound:
7489 case DW_AT_lower_bound:
7493 decode_location_expression (block_start, pointer_size, uvalue);
7505 static unsigned char *
7506 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7507 unsigned long attribute;
7509 unsigned char * data;
7510 unsigned long cu_offset;
7511 unsigned long pointer_size;
7513 printf (" %-18s:", get_AT_name (attribute));
7514 data = read_and_display_attr_value (attribute, form, data, cu_offset,
7521 display_debug_info (section, start, file)
7522 Elf32_Internal_Shdr * section;
7523 unsigned char * start;
7526 unsigned char * end = start + section->sh_size;
7527 unsigned char * section_begin = start;
7529 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7531 load_debug_str (file);
7535 DWARF2_External_CompUnit * external;
7536 DWARF2_Internal_CompUnit compunit;
7537 Elf32_Internal_Shdr * relsec;
7538 unsigned char * tags;
7541 unsigned long cu_offset;
7543 external = (DWARF2_External_CompUnit *) start;
7545 compunit.cu_length = BYTE_GET (external->cu_length);
7546 compunit.cu_version = BYTE_GET (external->cu_version);
7547 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7548 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7550 if (compunit.cu_length == 0xffffffff)
7552 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7556 /* Check for RELA relocations in the abbrev_offset address, and
7558 for (relsec = section_headers;
7559 relsec < section_headers + elf_header.e_shnum;
7562 unsigned long nrelas;
7563 Elf_Internal_Rela *rela, *rp;
7564 Elf32_Internal_Shdr *symsec;
7565 Elf_Internal_Sym *symtab;
7566 Elf_Internal_Sym *sym;
7568 if (relsec->sh_type != SHT_RELA
7569 || SECTION_HEADER (relsec->sh_info) != section)
7572 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7576 symsec = SECTION_HEADER (relsec->sh_link);
7577 symtab = GET_ELF_SYMBOLS (file, symsec);
7579 for (rp = rela; rp < rela + nrelas; ++rp)
7582 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7588 sym = symtab + ELF32_R_SYM (rp->r_info);
7590 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7592 warn (_("Skipping unexpected symbol type %u\n"),
7593 ELF32_ST_TYPE (sym->st_info));
7599 sym = symtab + ELF64_R_SYM (rp->r_info);
7601 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7603 warn (_("Skipping unexpected symbol type %u\n"),
7604 ELF64_ST_TYPE (sym->st_info));
7609 compunit.cu_abbrev_offset += rp->r_addend;
7617 tags = start + sizeof (* external);
7618 cu_offset = start - section_begin;
7619 start += compunit.cu_length + sizeof (external->cu_length);
7621 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7622 printf (_(" Length: %ld\n"), compunit.cu_length);
7623 printf (_(" Version: %d\n"), compunit.cu_version);
7624 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7625 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7627 if (compunit.cu_version != 2)
7629 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7635 /* Read in the abbrevs used by this compilation unit. */
7638 Elf32_Internal_Shdr * sec;
7639 unsigned char * begin;
7641 /* Locate the .debug_abbrev section and process it. */
7642 for (i = 0, sec = section_headers;
7643 i < elf_header.e_shnum;
7645 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7648 if (i == elf_header.e_shnum || sec->sh_size == 0)
7650 warn (_("Unable to locate .debug_abbrev section!\n"));
7654 begin = ((unsigned char *)
7655 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7656 _("debug_abbrev section data")));
7660 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7661 begin + sec->sh_size);
7667 while (tags < start)
7670 unsigned long abbrev_number;
7671 abbrev_entry * entry;
7674 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7677 /* A null DIE marks the end of a list of children. */
7678 if (abbrev_number == 0)
7684 /* Scan through the abbreviation list until we reach the
7686 for (entry = first_abbrev;
7687 entry && entry->entry != abbrev_number;
7688 entry = entry->next)
7693 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7698 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7700 (unsigned long) (tags - section_begin - bytes_read),
7702 get_TAG_name (entry->tag));
7704 for (attr = entry->first_attr; attr; attr = attr->next)
7705 tags = read_and_display_attr (attr->attribute,
7708 compunit.cu_pointer_size);
7710 if (entry->children)
7723 display_debug_aranges (section, start, file)
7724 Elf32_Internal_Shdr * section;
7725 unsigned char * start;
7726 FILE * file ATTRIBUTE_UNUSED;
7728 unsigned char * end = start + section->sh_size;
7730 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7734 DWARF2_External_ARange * external;
7735 DWARF2_Internal_ARange arange;
7736 unsigned char * ranges;
7737 unsigned long length;
7738 unsigned long address;
7741 external = (DWARF2_External_ARange *) start;
7743 arange.ar_length = BYTE_GET (external->ar_length);
7744 arange.ar_version = BYTE_GET (external->ar_version);
7745 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7746 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7747 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7749 if (arange.ar_length == 0xffffffff)
7751 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7755 if (arange.ar_version != 2)
7757 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7761 printf (_(" Length: %ld\n"), arange.ar_length);
7762 printf (_(" Version: %d\n"), arange.ar_version);
7763 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7764 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7765 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7767 printf (_("\n Address Length\n"));
7769 ranges = start + sizeof (* external);
7771 /* Must pad to an alignment boundary that is twice the pointer size. */
7772 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7774 ranges += (2 * arange.ar_pointer_size) - excess;
7778 address = byte_get (ranges, arange.ar_pointer_size);
7780 ranges += arange.ar_pointer_size;
7782 length = byte_get (ranges, arange.ar_pointer_size);
7784 ranges += arange.ar_pointer_size;
7786 /* A pair of zeros marks the end of the list. */
7787 if (address == 0 && length == 0)
7790 printf (" %8.8lx %lu\n", address, length);
7793 start += arange.ar_length + sizeof (external->ar_length);
7801 typedef struct Frame_Chunk
7803 struct Frame_Chunk * next;
7804 unsigned char * chunk_start;
7806 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7807 short int * col_type;
7809 char * augmentation;
7810 unsigned int code_factor;
7812 unsigned long pc_begin;
7813 unsigned long pc_range;
7817 unsigned char fde_encoding;
7821 /* A marker for a col_type that means this column was never referenced
7822 in the frame info. */
7823 #define DW_CFA_unreferenced (-1)
7825 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7826 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7827 static int size_of_encoded_value PARAMS ((int));
7830 frame_need_space (fc, reg)
7834 int prev = fc->ncols;
7836 if (reg < fc->ncols)
7839 fc->ncols = reg + 1;
7840 fc->col_type = (short int *) xrealloc (fc->col_type,
7841 fc->ncols * sizeof (short int));
7842 fc->col_offset = (int *) xrealloc (fc->col_offset,
7843 fc->ncols * sizeof (int));
7845 while (prev < fc->ncols)
7847 fc->col_type[prev] = DW_CFA_unreferenced;
7848 fc->col_offset[prev] = 0;
7854 frame_display_row (fc, need_col_headers, max_regs)
7856 int * need_col_headers;
7862 if (* max_regs < fc->ncols)
7863 * max_regs = fc->ncols;
7865 if (* need_col_headers)
7867 * need_col_headers = 0;
7869 printf (" LOC CFA ");
7871 for (r = 0; r < * max_regs; r++)
7872 if (fc->col_type[r] != DW_CFA_unreferenced)
7877 printf ("r%-4d", r);
7883 printf ("%08lx ", fc->pc_begin);
7884 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7885 printf ("%-8s ", tmp);
7887 for (r = 0; r < fc->ncols; r++)
7889 if (fc->col_type[r] != DW_CFA_unreferenced)
7891 switch (fc->col_type[r])
7893 case DW_CFA_undefined:
7896 case DW_CFA_same_value:
7900 sprintf (tmp, "c%+d", fc->col_offset[r]);
7902 case DW_CFA_register:
7903 sprintf (tmp, "r%d", fc->col_offset[r]);
7906 strcpy (tmp, "n/a");
7909 printf ("%-5s", tmp);
7916 size_of_encoded_value (encoding)
7919 switch (encoding & 0x7)
7922 case 0: return is_32bit_elf ? 4 : 8;
7929 #define GET(N) byte_get (start, N); start += N
7930 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7931 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7934 display_debug_frames (section, start, file)
7935 Elf32_Internal_Shdr * section;
7936 unsigned char * start;
7937 FILE * file ATTRIBUTE_UNUSED;
7939 unsigned char * end = start + section->sh_size;
7940 unsigned char * section_start = start;
7941 Frame_Chunk * chunks = 0;
7942 Frame_Chunk * remembered_state = 0;
7944 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7947 int addr_size = is_32bit_elf ? 4 : 8;
7949 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7953 unsigned char * saved_start;
7954 unsigned char * block_end;
7955 unsigned long length;
7956 unsigned long cie_id;
7959 int need_col_headers = 1;
7960 unsigned char * augmentation_data = NULL;
7961 unsigned long augmentation_data_len = 0;
7962 int encoded_ptr_size = addr_size;
7964 saved_start = start;
7965 length = byte_get (start, 4); start += 4;
7970 if (length == 0xffffffff)
7972 warn (_("64-bit DWARF format frames are not supported yet.\n"));
7976 block_end = saved_start + length + 4;
7977 cie_id = byte_get (start, 4); start += 4;
7979 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7983 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7984 memset (fc, 0, sizeof (Frame_Chunk));
7988 fc->chunk_start = saved_start;
7990 fc->col_type = (short int *) xmalloc (sizeof (short int));
7991 fc->col_offset = (int *) xmalloc (sizeof (int));
7992 frame_need_space (fc, max_regs-1);
7996 fc->augmentation = start;
7997 start = strchr (start, '\0') + 1;
7999 if (fc->augmentation[0] == 'z')
8001 fc->code_factor = LEB ();
8002 fc->data_factor = SLEB ();
8003 fc->ra = byte_get (start, 1); start += 1;
8004 augmentation_data_len = LEB ();
8005 augmentation_data = start;
8006 start += augmentation_data_len;
8008 else if (strcmp (fc->augmentation, "eh") == 0)
8011 fc->code_factor = LEB ();
8012 fc->data_factor = SLEB ();
8013 fc->ra = byte_get (start, 1); start += 1;
8017 fc->code_factor = LEB ();
8018 fc->data_factor = SLEB ();
8019 fc->ra = byte_get (start, 1); start += 1;
8023 if (do_debug_frames_interp)
8024 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8025 (unsigned long)(saved_start - section_start), length, cie_id,
8026 fc->augmentation, fc->code_factor, fc->data_factor,
8030 printf ("\n%08lx %08lx %08lx CIE\n",
8031 (unsigned long)(saved_start - section_start), length, cie_id);
8032 printf (" Version: %d\n", version);
8033 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8034 printf (" Code alignment factor: %u\n", fc->code_factor);
8035 printf (" Data alignment factor: %d\n", fc->data_factor);
8036 printf (" Return address column: %d\n", fc->ra);
8038 if (augmentation_data_len)
8041 printf (" Augmentation data: ");
8042 for (i = 0; i < augmentation_data_len; ++i)
8043 printf (" %02x", augmentation_data[i]);
8049 if (augmentation_data_len)
8051 unsigned char *p, *q;
8052 p = fc->augmentation + 1;
8053 q = augmentation_data;
8060 q += 1 + size_of_encoded_value (*q);
8062 fc->fde_encoding = *q++;
8068 if (fc->fde_encoding)
8069 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8072 frame_need_space (fc, fc->ra);
8076 unsigned char * look_for;
8077 static Frame_Chunk fde_fc;
8080 memset (fc, 0, sizeof (Frame_Chunk));
8082 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8084 for (cie = chunks; cie ; cie = cie->next)
8085 if (cie->chunk_start == look_for)
8090 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8091 cie_id, saved_start);
8094 fc->col_type = (short int *) xmalloc (sizeof (short int));
8095 fc->col_offset = (int *) xmalloc (sizeof (int));
8096 frame_need_space (fc, max_regs - 1);
8098 fc->augmentation = "";
8099 fc->fde_encoding = 0;
8103 fc->ncols = cie->ncols;
8104 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8105 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8106 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8107 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8108 fc->augmentation = cie->augmentation;
8109 fc->code_factor = cie->code_factor;
8110 fc->data_factor = cie->data_factor;
8111 fc->cfa_reg = cie->cfa_reg;
8112 fc->cfa_offset = cie->cfa_offset;
8114 frame_need_space (fc, max_regs-1);
8115 fc->fde_encoding = cie->fde_encoding;
8118 if (fc->fde_encoding)
8119 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8121 fc->pc_begin = byte_get (start, encoded_ptr_size);
8122 start += encoded_ptr_size;
8123 fc->pc_range = byte_get (start, encoded_ptr_size);
8124 start += encoded_ptr_size;
8126 if (cie->augmentation[0] == 'z')
8128 augmentation_data_len = LEB ();
8129 augmentation_data = start;
8130 start += augmentation_data_len;
8133 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8134 (unsigned long)(saved_start - section_start), length, cie_id,
8135 (unsigned long)(cie->chunk_start - section_start),
8136 fc->pc_begin, fc->pc_begin + fc->pc_range);
8137 if (! do_debug_frames_interp && augmentation_data_len)
8140 printf (" Augmentation data: ");
8141 for (i = 0; i < augmentation_data_len; ++i)
8142 printf (" %02x", augmentation_data[i]);
8148 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8149 about to interpret instructions for the chunk. */
8151 if (do_debug_frames_interp)
8153 /* Start by making a pass over the chunk, allocating storage
8154 and taking note of what registers are used. */
8155 unsigned char * tmp = start;
8157 while (start < block_end)
8167 /* Warning: if you add any more cases to this switch, be
8168 sure to add them to the corresponding switch below. */
8171 case DW_CFA_advance_loc:
8175 frame_need_space (fc, opa);
8176 fc->col_type[opa] = DW_CFA_undefined;
8178 case DW_CFA_restore:
8179 frame_need_space (fc, opa);
8180 fc->col_type[opa] = DW_CFA_undefined;
8182 case DW_CFA_set_loc:
8183 start += encoded_ptr_size;
8185 case DW_CFA_advance_loc1:
8188 case DW_CFA_advance_loc2:
8191 case DW_CFA_advance_loc4:
8194 case DW_CFA_offset_extended:
8195 reg = LEB (); LEB ();
8196 frame_need_space (fc, reg);
8197 fc->col_type[reg] = DW_CFA_undefined;
8199 case DW_CFA_restore_extended:
8201 frame_need_space (fc, reg);
8202 fc->col_type[reg] = DW_CFA_undefined;
8204 case DW_CFA_undefined:
8206 frame_need_space (fc, reg);
8207 fc->col_type[reg] = DW_CFA_undefined;
8209 case DW_CFA_same_value:
8211 frame_need_space (fc, reg);
8212 fc->col_type[reg] = DW_CFA_undefined;
8214 case DW_CFA_register:
8215 reg = LEB (); LEB ();
8216 frame_need_space (fc, reg);
8217 fc->col_type[reg] = DW_CFA_undefined;
8219 case DW_CFA_def_cfa:
8222 case DW_CFA_def_cfa_register:
8225 case DW_CFA_def_cfa_offset:
8228 #ifndef DW_CFA_GNU_args_size
8229 #define DW_CFA_GNU_args_size 0x2e
8231 case DW_CFA_GNU_args_size:
8234 #ifndef DW_CFA_GNU_negative_offset_extended
8235 #define DW_CFA_GNU_negative_offset_extended 0x2f
8237 case DW_CFA_GNU_negative_offset_extended:
8238 reg = LEB (); LEB ();
8239 frame_need_space (fc, reg);
8240 fc->col_type[reg] = DW_CFA_undefined;
8249 /* Now we know what registers are used, make a second pass over
8250 the chunk, this time actually printing out the info. */
8252 while (start < block_end)
8255 unsigned long ul, reg, roffs;
8264 /* Warning: if you add any more cases to this switch, be
8265 sure to add them to the corresponding switch above. */
8268 case DW_CFA_advance_loc:
8269 if (do_debug_frames_interp)
8270 frame_display_row (fc, &need_col_headers, &max_regs);
8272 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8273 opa * fc->code_factor,
8274 fc->pc_begin + opa * fc->code_factor);
8275 fc->pc_begin += opa * fc->code_factor;
8280 if (! do_debug_frames_interp)
8281 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8282 opa, roffs * fc->data_factor);
8283 fc->col_type[opa] = DW_CFA_offset;
8284 fc->col_offset[opa] = roffs * fc->data_factor;
8287 case DW_CFA_restore:
8288 if (! do_debug_frames_interp)
8289 printf (" DW_CFA_restore: r%d\n", opa);
8290 fc->col_type[opa] = cie->col_type[opa];
8291 fc->col_offset[opa] = cie->col_offset[opa];
8294 case DW_CFA_set_loc:
8295 vma = byte_get (start, encoded_ptr_size);
8296 start += encoded_ptr_size;
8297 if (do_debug_frames_interp)
8298 frame_display_row (fc, &need_col_headers, &max_regs);
8300 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8304 case DW_CFA_advance_loc1:
8305 ofs = byte_get (start, 1); start += 1;
8306 if (do_debug_frames_interp)
8307 frame_display_row (fc, &need_col_headers, &max_regs);
8309 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8310 ofs * fc->code_factor,
8311 fc->pc_begin + ofs * fc->code_factor);
8312 fc->pc_begin += ofs * fc->code_factor;
8315 case DW_CFA_advance_loc2:
8316 ofs = byte_get (start, 2); start += 2;
8317 if (do_debug_frames_interp)
8318 frame_display_row (fc, &need_col_headers, &max_regs);
8320 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8321 ofs * fc->code_factor,
8322 fc->pc_begin + ofs * fc->code_factor);
8323 fc->pc_begin += ofs * fc->code_factor;
8326 case DW_CFA_advance_loc4:
8327 ofs = byte_get (start, 4); start += 4;
8328 if (do_debug_frames_interp)
8329 frame_display_row (fc, &need_col_headers, &max_regs);
8331 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8332 ofs * fc->code_factor,
8333 fc->pc_begin + ofs * fc->code_factor);
8334 fc->pc_begin += ofs * fc->code_factor;
8337 case DW_CFA_offset_extended:
8340 if (! do_debug_frames_interp)
8341 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8342 reg, roffs * fc->data_factor);
8343 fc->col_type[reg] = DW_CFA_offset;
8344 fc->col_offset[reg] = roffs * fc->data_factor;
8347 case DW_CFA_restore_extended:
8349 if (! do_debug_frames_interp)
8350 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8351 fc->col_type[reg] = cie->col_type[reg];
8352 fc->col_offset[reg] = cie->col_offset[reg];
8355 case DW_CFA_undefined:
8357 if (! do_debug_frames_interp)
8358 printf (" DW_CFA_undefined: r%ld\n", reg);
8359 fc->col_type[reg] = DW_CFA_undefined;
8360 fc->col_offset[reg] = 0;
8363 case DW_CFA_same_value:
8365 if (! do_debug_frames_interp)
8366 printf (" DW_CFA_same_value: r%ld\n", reg);
8367 fc->col_type[reg] = DW_CFA_same_value;
8368 fc->col_offset[reg] = 0;
8371 case DW_CFA_register:
8374 if (! do_debug_frames_interp)
8375 printf (" DW_CFA_register: r%ld\n", reg);
8376 fc->col_type[reg] = DW_CFA_register;
8377 fc->col_offset[reg] = roffs;
8380 case DW_CFA_remember_state:
8381 if (! do_debug_frames_interp)
8382 printf (" DW_CFA_remember_state\n");
8383 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8384 rs->ncols = fc->ncols;
8385 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8386 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8387 memcpy (rs->col_type, fc->col_type, rs->ncols);
8388 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8389 rs->next = remembered_state;
8390 remembered_state = rs;
8393 case DW_CFA_restore_state:
8394 if (! do_debug_frames_interp)
8395 printf (" DW_CFA_restore_state\n");
8396 rs = remembered_state;
8397 remembered_state = rs->next;
8398 frame_need_space (fc, rs->ncols-1);
8399 memcpy (fc->col_type, rs->col_type, rs->ncols);
8400 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8401 free (rs->col_type);
8402 free (rs->col_offset);
8406 case DW_CFA_def_cfa:
8407 fc->cfa_reg = LEB ();
8408 fc->cfa_offset = LEB ();
8409 if (! do_debug_frames_interp)
8410 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8411 fc->cfa_reg, fc->cfa_offset);
8414 case DW_CFA_def_cfa_register:
8415 fc->cfa_reg = LEB ();
8416 if (! do_debug_frames_interp)
8417 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8420 case DW_CFA_def_cfa_offset:
8421 fc->cfa_offset = LEB ();
8422 if (! do_debug_frames_interp)
8423 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8427 if (! do_debug_frames_interp)
8428 printf (" DW_CFA_nop\n");
8431 #ifndef DW_CFA_GNU_window_save
8432 #define DW_CFA_GNU_window_save 0x2d
8434 case DW_CFA_GNU_window_save:
8435 if (! do_debug_frames_interp)
8436 printf (" DW_CFA_GNU_window_save\n");
8439 case DW_CFA_GNU_args_size:
8441 if (! do_debug_frames_interp)
8442 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8445 case DW_CFA_GNU_negative_offset_extended:
8448 frame_need_space (fc, reg);
8449 if (! do_debug_frames_interp)
8450 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8451 reg, l * fc->data_factor);
8452 fc->col_type[reg] = DW_CFA_offset;
8453 fc->col_offset[reg] = l * fc->data_factor;
8457 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8462 if (do_debug_frames_interp)
8463 frame_display_row (fc, &need_col_headers, &max_regs);
8478 display_debug_not_supported (section, start, file)
8479 Elf32_Internal_Shdr * section;
8480 unsigned char * start ATTRIBUTE_UNUSED;
8481 FILE * file ATTRIBUTE_UNUSED;
8483 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8484 SECTION_NAME (section));
8489 /* Pre-scan the .debug_info section to record the size of address.
8490 When dumping the .debug_line, we use that size information, assuming
8491 that all compilation units have the same address size. */
8493 prescan_debug_info (section, start, file)
8494 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8495 unsigned char * start;
8496 FILE * file ATTRIBUTE_UNUSED;
8498 DWARF2_External_CompUnit * external;
8500 external = (DWARF2_External_CompUnit *) start;
8502 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8506 /* A structure containing the name of a debug section and a pointer
8507 to a function that can decode it. The third field is a prescan
8508 function to be run over the section before displaying any of the
8512 const char * const name;
8513 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8514 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8518 { ".debug_abbrev", display_debug_abbrev, NULL },
8519 { ".debug_aranges", display_debug_aranges, NULL },
8520 { ".debug_frame", display_debug_frames, NULL },
8521 { ".debug_info", display_debug_info, prescan_debug_info },
8522 { ".debug_line", display_debug_lines, NULL },
8523 { ".debug_pubnames", display_debug_pubnames, NULL },
8524 { ".eh_frame", display_debug_frames, NULL },
8525 { ".debug_macinfo", display_debug_macinfo, NULL },
8526 { ".debug_str", display_debug_str, NULL },
8528 { ".debug_pubtypes", display_debug_not_supported, NULL },
8529 { ".debug_ranges", display_debug_not_supported, NULL },
8530 { ".debug_static_func", display_debug_not_supported, NULL },
8531 { ".debug_static_vars", display_debug_not_supported, NULL },
8532 { ".debug_types", display_debug_not_supported, NULL },
8533 { ".debug_weaknames", display_debug_not_supported, NULL }
8537 display_debug_section (section, file)
8538 Elf32_Internal_Shdr * section;
8541 char * name = SECTION_NAME (section);
8542 bfd_size_type length;
8543 unsigned char * start;
8546 length = section->sh_size;
8549 printf (_("\nSection '%s' has no debugging data.\n"), name);
8553 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8554 _("debug section data"));
8558 /* See if we know how to display the contents of this section. */
8559 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8560 name = ".debug_info";
8562 for (i = NUM_ELEM (debug_displays); i--;)
8563 if (strcmp (debug_displays[i].name, name) == 0)
8565 debug_displays[i].display (section, start, file);
8570 printf (_("Unrecognised debug section: %s\n"), name);
8574 /* If we loaded in the abbrev section at some point,
8575 we must release it here. */
8582 process_section_contents (file)
8585 Elf32_Internal_Shdr * section;
8591 /* Pre-scan the debug sections to find some debug information not
8592 present in some of them. For the .debug_line, we must find out the
8593 size of address (specified in .debug_info and .debug_aranges). */
8594 for (i = 0, section = section_headers;
8595 i < elf_header.e_shnum && i < num_dump_sects;
8598 char * name = SECTION_NAME (section);
8601 if (section->sh_size == 0)
8604 /* See if there is some pre-scan operation for this section. */
8605 for (j = NUM_ELEM (debug_displays); j--;)
8606 if (strcmp (debug_displays[j].name, name) == 0)
8608 if (debug_displays[j].prescan != NULL)
8610 bfd_size_type length;
8611 unsigned char * start;
8613 length = section->sh_size;
8614 start = ((unsigned char *)
8615 get_data (NULL, file, section->sh_offset, length,
8616 _("debug section data")));
8620 debug_displays[j].prescan (section, start, file);
8628 for (i = 0, section = section_headers;
8629 i < elf_header.e_shnum && i < num_dump_sects;
8632 #ifdef SUPPORT_DISASSEMBLY
8633 if (dump_sects[i] & DISASS_DUMP)
8634 disassemble_section (section, file);
8636 if (dump_sects[i] & HEX_DUMP)
8637 dump_section (section, file);
8639 if (dump_sects[i] & DEBUG_DUMP)
8640 display_debug_section (section, file);
8643 if (i < num_dump_sects)
8644 warn (_("Some sections were not dumped because they do not exist!\n"));
8650 process_mips_fpe_exception (mask)
8656 if (mask & OEX_FPU_INEX)
8657 fputs ("INEX", stdout), first = 0;
8658 if (mask & OEX_FPU_UFLO)
8659 printf ("%sUFLO", first ? "" : "|"), first = 0;
8660 if (mask & OEX_FPU_OFLO)
8661 printf ("%sOFLO", first ? "" : "|"), first = 0;
8662 if (mask & OEX_FPU_DIV0)
8663 printf ("%sDIV0", first ? "" : "|"), first = 0;
8664 if (mask & OEX_FPU_INVAL)
8665 printf ("%sINVAL", first ? "" : "|");
8668 fputs ("0", stdout);
8672 process_mips_specific (file)
8675 Elf_Internal_Dyn * entry;
8676 size_t liblist_offset = 0;
8677 size_t liblistno = 0;
8678 size_t conflictsno = 0;
8679 size_t options_offset = 0;
8680 size_t conflicts_offset = 0;
8682 /* We have a lot of special sections. Thanks SGI! */
8683 if (dynamic_segment == NULL)
8684 /* No information available. */
8687 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8688 switch (entry->d_tag)
8690 case DT_MIPS_LIBLIST:
8691 liblist_offset = entry->d_un.d_val - loadaddr;
8693 case DT_MIPS_LIBLISTNO:
8694 liblistno = entry->d_un.d_val;
8696 case DT_MIPS_OPTIONS:
8697 options_offset = entry->d_un.d_val - loadaddr;
8699 case DT_MIPS_CONFLICT:
8700 conflicts_offset = entry->d_un.d_val - loadaddr;
8702 case DT_MIPS_CONFLICTNO:
8703 conflictsno = entry->d_un.d_val;
8709 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8711 Elf32_External_Lib * elib;
8714 elib = ((Elf32_External_Lib *)
8715 get_data (NULL, file, liblist_offset,
8716 liblistno * sizeof (Elf32_External_Lib),
8720 printf ("\nSection '.liblist' contains %lu entries:\n",
8721 (unsigned long) liblistno);
8722 fputs (" Library Time Stamp Checksum Version Flags\n",
8725 for (cnt = 0; cnt < liblistno; ++cnt)
8732 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8733 time = BYTE_GET (elib[cnt].l_time_stamp);
8734 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8735 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8736 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8738 tmp = gmtime (&time);
8739 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8740 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8741 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8743 printf ("%3lu: ", (unsigned long) cnt);
8744 print_symbol (20, dynamic_strings + liblist.l_name);
8745 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
8748 if (liblist.l_flags == 0)
8759 { " EXACT_MATCH", LL_EXACT_MATCH },
8760 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8761 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8762 { " EXPORTS", LL_EXPORTS },
8763 { " DELAY_LOAD", LL_DELAY_LOAD },
8764 { " DELTA", LL_DELTA }
8766 int flags = liblist.l_flags;
8770 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8772 if ((flags & l_flags_vals[fcnt].bit) != 0)
8774 fputs (l_flags_vals[fcnt].name, stdout);
8775 flags ^= l_flags_vals[fcnt].bit;
8778 printf (" %#x", (unsigned int) flags);
8788 if (options_offset != 0)
8790 Elf_External_Options * eopt;
8791 Elf_Internal_Shdr * sect = section_headers;
8792 Elf_Internal_Options * iopt;
8793 Elf_Internal_Options * option;
8797 /* Find the section header so that we get the size. */
8798 while (sect->sh_type != SHT_MIPS_OPTIONS)
8801 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8802 sect->sh_size, _("options"));
8805 iopt = ((Elf_Internal_Options *)
8806 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8809 error (_("Out of memory"));
8816 while (offset < sect->sh_size)
8818 Elf_External_Options * eoption;
8820 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8822 option->kind = BYTE_GET (eoption->kind);
8823 option->size = BYTE_GET (eoption->size);
8824 option->section = BYTE_GET (eoption->section);
8825 option->info = BYTE_GET (eoption->info);
8827 offset += option->size;
8833 printf (_("\nSection '%s' contains %d entries:\n"),
8834 SECTION_NAME (sect), cnt);
8842 switch (option->kind)
8845 /* This shouldn't happen. */
8846 printf (" NULL %d %lx", option->section, option->info);
8849 printf (" REGINFO ");
8850 if (elf_header.e_machine == EM_MIPS)
8853 Elf32_External_RegInfo * ereg;
8854 Elf32_RegInfo reginfo;
8856 ereg = (Elf32_External_RegInfo *) (option + 1);
8857 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8858 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8859 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8860 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8861 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8862 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8864 printf ("GPR %08lx GP 0x%lx\n",
8866 (unsigned long) reginfo.ri_gp_value);
8867 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8868 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8869 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8874 Elf64_External_RegInfo * ereg;
8875 Elf64_Internal_RegInfo reginfo;
8877 ereg = (Elf64_External_RegInfo *) (option + 1);
8878 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8879 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8880 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8881 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8882 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8883 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8885 printf ("GPR %08lx GP 0x",
8886 reginfo.ri_gprmask);
8887 printf_vma (reginfo.ri_gp_value);
8890 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8891 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8892 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8896 case ODK_EXCEPTIONS:
8897 fputs (" EXCEPTIONS fpe_min(", stdout);
8898 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8899 fputs (") fpe_max(", stdout);
8900 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8901 fputs (")", stdout);
8903 if (option->info & OEX_PAGE0)
8904 fputs (" PAGE0", stdout);
8905 if (option->info & OEX_SMM)
8906 fputs (" SMM", stdout);
8907 if (option->info & OEX_FPDBUG)
8908 fputs (" FPDBUG", stdout);
8909 if (option->info & OEX_DISMISS)
8910 fputs (" DISMISS", stdout);
8913 fputs (" PAD ", stdout);
8914 if (option->info & OPAD_PREFIX)
8915 fputs (" PREFIX", stdout);
8916 if (option->info & OPAD_POSTFIX)
8917 fputs (" POSTFIX", stdout);
8918 if (option->info & OPAD_SYMBOL)
8919 fputs (" SYMBOL", stdout);
8922 fputs (" HWPATCH ", stdout);
8923 if (option->info & OHW_R4KEOP)
8924 fputs (" R4KEOP", stdout);
8925 if (option->info & OHW_R8KPFETCH)
8926 fputs (" R8KPFETCH", stdout);
8927 if (option->info & OHW_R5KEOP)
8928 fputs (" R5KEOP", stdout);
8929 if (option->info & OHW_R5KCVTL)
8930 fputs (" R5KCVTL", stdout);
8933 fputs (" FILL ", stdout);
8934 /* XXX Print content of info word? */
8937 fputs (" TAGS ", stdout);
8938 /* XXX Print content of info word? */
8941 fputs (" HWAND ", stdout);
8942 if (option->info & OHWA0_R4KEOP_CHECKED)
8943 fputs (" R4KEOP_CHECKED", stdout);
8944 if (option->info & OHWA0_R4KEOP_CLEAN)
8945 fputs (" R4KEOP_CLEAN", stdout);
8948 fputs (" HWOR ", stdout);
8949 if (option->info & OHWA0_R4KEOP_CHECKED)
8950 fputs (" R4KEOP_CHECKED", stdout);
8951 if (option->info & OHWA0_R4KEOP_CLEAN)
8952 fputs (" R4KEOP_CLEAN", stdout);
8955 printf (" GP_GROUP %#06lx self-contained %#06lx",
8956 option->info & OGP_GROUP,
8957 (option->info & OGP_SELF) >> 16);
8960 printf (" IDENT %#06lx self-contained %#06lx",
8961 option->info & OGP_GROUP,
8962 (option->info & OGP_SELF) >> 16);
8965 /* This shouldn't happen. */
8966 printf (" %3d ??? %d %lx",
8967 option->kind, option->section, option->info);
8971 len = sizeof (* eopt);
8972 while (len < option->size)
8973 if (((char *) option)[len] >= ' '
8974 && ((char *) option)[len] < 0x7f)
8975 printf ("%c", ((char *) option)[len++]);
8977 printf ("\\%03o", ((char *) option)[len++]);
8979 fputs ("\n", stdout);
8987 if (conflicts_offset != 0 && conflictsno != 0)
8989 Elf32_Conflict * iconf;
8992 if (dynamic_symbols == NULL)
8994 error (_("conflict list with without table"));
8998 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
9001 error (_("Out of memory"));
9007 Elf32_External_Conflict * econf32;
9009 econf32 = ((Elf32_External_Conflict *)
9010 get_data (NULL, file, conflicts_offset,
9011 conflictsno * sizeof (* econf32),
9016 for (cnt = 0; cnt < conflictsno; ++cnt)
9017 iconf[cnt] = BYTE_GET (econf32[cnt]);
9023 Elf64_External_Conflict * econf64;
9025 econf64 = ((Elf64_External_Conflict *)
9026 get_data (NULL, file, conflicts_offset,
9027 conflictsno * sizeof (* econf64),
9032 for (cnt = 0; cnt < conflictsno; ++cnt)
9033 iconf[cnt] = BYTE_GET (econf64[cnt]);
9038 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9039 (long) conflictsno);
9040 puts (_(" Num: Index Value Name"));
9042 for (cnt = 0; cnt < conflictsno; ++cnt)
9044 Elf_Internal_Sym * psym = & dynamic_symbols [iconf [cnt]];
9046 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf [cnt]);
9047 print_vma (psym->st_value, FULL_HEX);
9049 print_symbol (25, dynamic_strings + psym->st_name);
9060 get_note_type (e_type)
9063 static char buff[64];
9067 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9068 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9069 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9070 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9071 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9072 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9073 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9074 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9075 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9076 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9077 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
9079 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9085 get_netbsd_elfcore_note_type (e_type)
9088 static char buff[64];
9092 /* NetBSD core "procinfo" structure. */
9093 return _("NetBSD procinfo structure");
9096 /* As of Jan 2002 there are no other machine-independent notes
9097 defined for NetBSD core files. If the note type is less
9098 than the start of the machine-dependent note types, we don't
9103 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9107 switch (elf_header.e_machine)
9109 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9110 and PT_GETFPREGS == mach+2. */
9115 case EM_SPARC32PLUS:
9119 case 32+0: return _("PT_GETREGS (reg structure)");
9120 case 32+2: return _("PT_GETFPREGS (fpreg structure)");
9126 /* On all other arch's, PT_GETREGS == mach+1 and
9127 PT_GETFPREGS == mach+3. */
9131 case 32+1: return _("PT_GETREGS (reg structure)");
9132 case 32+3: return _("PT_GETFPREGS (fpreg structure)");
9138 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - 32);
9142 /* Note that by the ELF standard, the name field is already null byte
9143 terminated, and namesz includes the terminating null byte.
9144 I.E. the value of namesz for the name "FSF" is 4.
9146 If the value of namesz is zero, there is no name present. */
9148 process_note (pnote)
9149 Elf32_Internal_Note * pnote;
9153 if (pnote->namesz == 0)
9155 /* If there is no note name, then use the default set of
9156 note type strings. */
9157 nt = get_note_type (pnote->type);
9159 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
9161 /* NetBSD-specific core file notes. */
9162 nt = get_netbsd_elfcore_note_type (pnote->type);
9166 /* Don't recognize this note name; just use the default set of
9167 note type strings. */
9168 nt = get_note_type (pnote->type);
9171 printf (" %s\t\t0x%08lx\t%s\n",
9172 pnote->namesz ? pnote->namedata : "(NONE)",
9179 process_corefile_note_segment (file, offset, length)
9184 Elf_External_Note * pnotes;
9185 Elf_External_Note * external;
9191 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9198 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9199 (unsigned long) offset, (unsigned long) length);
9200 printf (_(" Owner\t\tData size\tDescription\n"));
9202 while (external < (Elf_External_Note *)((char *) pnotes + length))
9204 Elf32_Internal_Note inote;
9207 inote.type = BYTE_GET (external->type);
9208 inote.namesz = BYTE_GET (external->namesz);
9209 inote.namedata = external->name;
9210 inote.descsz = BYTE_GET (external->descsz);
9211 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9212 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9214 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9216 /* Verify that name is null terminated. It appears that at least
9217 one version of Linux (RedHat 6.0) generates corefiles that don't
9218 comply with the ELF spec by failing to include the null byte in
9220 if (inote.namedata[inote.namesz] != '\0')
9222 temp = malloc (inote.namesz + 1);
9226 error (_("Out of memory\n"));
9231 strncpy (temp, inote.namedata, inote.namesz);
9232 temp[inote.namesz] = 0;
9234 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9235 inote.namedata = temp;
9238 res &= process_note (& inote);
9253 process_corefile_note_segments (file)
9256 Elf_Internal_Phdr * program_headers;
9257 Elf_Internal_Phdr * segment;
9261 program_headers = (Elf_Internal_Phdr *) malloc
9262 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9264 if (program_headers == NULL)
9266 error (_("Out of memory\n"));
9271 i = get_32bit_program_headers (file, program_headers);
9273 i = get_64bit_program_headers (file, program_headers);
9277 free (program_headers);
9281 for (i = 0, segment = program_headers;
9282 i < elf_header.e_phnum;
9285 if (segment->p_type == PT_NOTE)
9286 res &= process_corefile_note_segment (file,
9287 (bfd_vma) segment->p_offset,
9288 (bfd_vma) segment->p_filesz);
9291 free (program_headers);
9297 process_corefile_contents (file)
9300 /* If we have not been asked to display the notes then do nothing. */
9304 /* If file is not a core file then exit. */
9305 if (elf_header.e_type != ET_CORE)
9308 /* No program headers means no NOTE segment. */
9309 if (elf_header.e_phnum == 0)
9311 printf (_("No note segments present in the core file.\n"));
9315 return process_corefile_note_segments (file);
9319 process_arch_specific (file)
9325 switch (elf_header.e_machine)
9328 case EM_MIPS_RS3_LE:
9329 return process_mips_specific (file);
9338 get_file_header (file)
9341 /* Read in the identity array. */
9342 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9345 /* Determine how to read the rest of the header. */
9346 switch (elf_header.e_ident [EI_DATA])
9348 default: /* fall through */
9349 case ELFDATANONE: /* fall through */
9350 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9351 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9354 /* For now we only support 32 bit and 64 bit ELF files. */
9355 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9357 /* Read in the rest of the header. */
9360 Elf32_External_Ehdr ehdr32;
9362 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9365 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9366 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9367 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9368 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9369 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9370 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9371 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9372 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9373 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9374 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9375 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9376 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9377 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9381 Elf64_External_Ehdr ehdr64;
9383 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9384 we will not be able to cope with the 64bit data found in
9385 64 ELF files. Detect this now and abort before we start
9386 overwritting things. */
9387 if (sizeof (bfd_vma) < 8)
9389 error (_("This instance of readelf has been built without support for a\n\
9390 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9394 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9397 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9398 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9399 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9400 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
9401 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
9402 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
9403 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9404 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9405 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9406 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9407 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9408 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9409 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9412 /* There may be some extensions in the first section header. Don't
9413 bomb if we can't read it. */
9415 get_32bit_section_headers (file, 1);
9417 get_64bit_section_headers (file, 1);
9423 process_file (file_name)
9427 struct stat statbuf;
9430 if (stat (file_name, & statbuf) < 0)
9432 error (_("Cannot stat input file %s.\n"), file_name);
9436 file = fopen (file_name, "rb");
9439 error (_("Input file %s not found.\n"), file_name);
9443 if (! get_file_header (file))
9445 error (_("%s: Failed to read file header\n"), file_name);
9450 /* Initialise per file variables. */
9451 for (i = NUM_ELEM (version_info); i--;)
9452 version_info[i] = 0;
9454 for (i = NUM_ELEM (dynamic_info); i--;)
9455 dynamic_info[i] = 0;
9457 /* Process the file. */
9459 printf (_("\nFile: %s\n"), file_name);
9461 if (! process_file_header ())
9467 process_section_headers (file);
9469 process_program_headers (file);
9471 process_dynamic_segment (file);
9473 process_relocs (file);
9475 process_unwind (file);
9477 process_symbol_table (file);
9479 process_syminfo (file);
9481 process_version_sections (file);
9483 process_section_contents (file);
9485 process_corefile_contents (file);
9487 process_arch_specific (file);
9491 if (section_headers)
9493 free (section_headers);
9494 section_headers = NULL;
9499 free (string_table);
9500 string_table = NULL;
9501 string_table_length = 0;
9504 if (dynamic_strings)
9506 free (dynamic_strings);
9507 dynamic_strings = NULL;
9510 if (dynamic_symbols)
9512 free (dynamic_symbols);
9513 dynamic_symbols = NULL;
9514 num_dynamic_syms = 0;
9517 if (dynamic_syminfo)
9519 free (dynamic_syminfo);
9520 dynamic_syminfo = NULL;
9526 #ifdef SUPPORT_DISASSEMBLY
9527 /* Needed by the i386 disassembler. For extra credit, someone could
9528 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9532 print_address (unsigned int addr, FILE * outfile)
9534 fprintf (outfile,"0x%8.8x", addr);
9537 /* Needed by the i386 disassembler. */
9539 db_task_printsym (unsigned int addr)
9541 print_address (addr, stderr);
9545 int main PARAMS ((int, char **));
9554 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9555 setlocale (LC_MESSAGES, "");
9557 #if defined (HAVE_SETLOCALE)
9558 setlocale (LC_CTYPE, "");
9560 bindtextdomain (PACKAGE, LOCALEDIR);
9561 textdomain (PACKAGE);
9563 parse_args (argc, argv);
9565 if (optind < (argc - 1))
9569 while (optind < argc)
9570 err |= process_file (argv [optind ++]);
9572 if (dump_sects != NULL)