1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998, 99, 2000, 2001 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@cygnus.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"
69 #include "elf/mcore.h"
76 #include "elf/x86-64.h"
82 char * program_name = "readelf";
83 unsigned int dynamic_addr;
84 bfd_size_type dynamic_size;
85 unsigned int rela_addr;
86 unsigned int rela_size;
87 char * dynamic_strings;
89 unsigned long string_table_length;
90 unsigned long num_dynamic_syms;
91 Elf_Internal_Sym * dynamic_symbols;
92 Elf_Internal_Syminfo * dynamic_syminfo;
93 unsigned long dynamic_syminfo_offset;
94 unsigned int dynamic_syminfo_nent;
95 char program_interpreter [64];
96 int dynamic_info[DT_JMPREL + 1];
99 Elf_Internal_Ehdr elf_header;
100 Elf_Internal_Shdr * section_headers;
101 Elf_Internal_Dyn * dynamic_segment;
109 int do_using_dynamic;
116 int do_debug_abbrevs;
118 int do_debug_pubnames;
119 int do_debug_aranges;
125 /* A dynamic array of flags indicating which sections require dumping. */
126 char * dump_sects = NULL;
127 unsigned int num_dump_sects = 0;
129 #define HEX_DUMP (1 << 0)
130 #define DISASS_DUMP (1 << 1)
131 #define DEBUG_DUMP (1 << 2)
133 /* How to rpint a vma value. */
134 typedef enum print_mode
146 /* Forward declarations for dumb compilers. */
147 static void print_vma PARAMS ((bfd_vma, print_mode));
148 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
149 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
150 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
151 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
152 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
153 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
154 static const char * get_dynamic_type PARAMS ((unsigned long));
155 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
156 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
157 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
158 static char * get_file_type PARAMS ((unsigned));
159 static char * get_machine_name PARAMS ((unsigned));
160 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
161 static char * get_machine_flags PARAMS ((unsigned, unsigned));
162 static const char * get_mips_segment_type PARAMS ((unsigned long));
163 static const char * get_parisc_segment_type PARAMS ((unsigned long));
164 static const char * get_ia64_segment_type PARAMS ((unsigned long));
165 static const char * get_segment_type PARAMS ((unsigned long));
166 static const char * get_mips_section_type_name PARAMS ((unsigned int));
167 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
168 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
169 static const char * get_section_type_name PARAMS ((unsigned int));
170 static const char * get_symbol_binding PARAMS ((unsigned int));
171 static const char * get_symbol_type PARAMS ((unsigned int));
172 static const char * get_symbol_visibility PARAMS ((unsigned int));
173 static const char * get_symbol_index_type PARAMS ((unsigned int));
174 static const char * get_dynamic_flags PARAMS ((bfd_vma));
175 static void usage PARAMS ((void));
176 static void parse_args PARAMS ((int, char **));
177 static int process_file_header PARAMS ((void));
178 static int process_program_headers PARAMS ((FILE *));
179 static int process_section_headers PARAMS ((FILE *));
180 static int process_unwind PARAMS ((FILE *));
181 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
182 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
183 static int process_dynamic_segment PARAMS ((FILE *));
184 static int process_symbol_table PARAMS ((FILE *));
185 static int process_section_contents PARAMS ((FILE *));
186 static void process_file PARAMS ((char *));
187 static int process_relocs PARAMS ((FILE *));
188 static int process_version_sections PARAMS ((FILE *));
189 static char * get_ver_flags PARAMS ((unsigned int));
190 static int get_32bit_section_headers PARAMS ((FILE *));
191 static int get_64bit_section_headers PARAMS ((FILE *));
192 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
193 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
194 static int get_file_header PARAMS ((FILE *));
195 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
196 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
197 static const char * get_elf_section_flags PARAMS ((bfd_vma));
198 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
199 static int get_32bit_dynamic_segment PARAMS ((FILE *));
200 static int get_64bit_dynamic_segment PARAMS ((FILE *));
201 #ifdef SUPPORT_DISASSEMBLY
202 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
204 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
205 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
206 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
207 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
208 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
209 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
210 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
211 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
212 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
213 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
214 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
215 static void reset_state_machine PARAMS ((int));
216 static char * get_TAG_name PARAMS ((unsigned long));
217 static char * get_AT_name PARAMS ((unsigned long));
218 static char * get_FORM_name PARAMS ((unsigned long));
219 static void free_abbrevs PARAMS ((void));
220 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
221 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
222 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
223 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
224 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
225 static void request_dump PARAMS ((unsigned int, char));
226 static const char * get_elf_class PARAMS ((unsigned char));
227 static const char * get_data_encoding PARAMS ((unsigned char));
228 static const char * get_osabi_name PARAMS ((unsigned char));
229 static int guess_is_rela PARAMS ((unsigned long));
230 static char * get_note_type PARAMS ((unsigned int));
231 static int process_note PARAMS ((Elf32_Internal_Note *));
232 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
233 static int process_corefile_note_segments PARAMS ((FILE *));
234 static int process_corefile_contents PARAMS ((FILE *));
236 typedef int Elf32_Word;
244 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
245 ((X)->sh_name >= string_table_length \
246 ? "<corrupt>" : string_table + (X)->sh_name))
248 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
250 #define BYTE_GET(field) byte_get (field, sizeof (field))
252 /* If we can support a 64 bit data type then BFD64 should be defined
253 and sizeof (bfd_vma) == 8. In this case when translating from an
254 external 8 byte field to an internal field, we can assume that the
255 internal field is also 8 bytes wide and so we can extract all the data.
256 If, however, BFD64 is not defined, then we must assume that the
257 internal data structure only has 4 byte wide fields that are the
258 equivalent of the 8 byte wide external counterparts, and so we must
259 truncate the data. */
261 #define BYTE_GET8(field) byte_get (field, -8)
263 #define BYTE_GET8(field) byte_get (field, 8)
266 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
268 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
269 if (fseek (file, offset, SEEK_SET)) \
271 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
275 var = (type) malloc (size); \
279 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
283 if (fread (var, size, 1, file) != 1) \
285 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
292 #define GET_DATA(offset, var, reason) \
293 if (fseek (file, offset, SEEK_SET)) \
295 error (_("Unable to seek to %x for %s\n"), offset, reason); \
298 else if (fread (& var, sizeof (var), 1, file) != 1) \
300 error (_("Unable to read data at %x for %s\n"), offset, reason); \
304 #define GET_ELF_SYMBOLS(file, offset, size) \
305 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
306 : get_64bit_elf_symbols (file, offset, size))
309 #ifdef ANSI_PROTOTYPES
311 error (const char * message, ...)
315 fprintf (stderr, _("%s: Error: "), program_name);
316 va_start (args, message);
317 vfprintf (stderr, message, args);
323 warn (const char * message, ...)
327 fprintf (stderr, _("%s: Warning: "), program_name);
328 va_start (args, message);
329 vfprintf (stderr, message, args);
341 fprintf (stderr, _("%s: Error: "), program_name);
343 message = va_arg (args, char *);
344 vfprintf (stderr, message, args);
356 fprintf (stderr, _("%s: Warning: "), program_name);
358 message = va_arg (args, char *);
359 vfprintf (stderr, message, args);
366 byte_get_little_endian (field, size)
367 unsigned char * field;
376 return ((unsigned int) (field [0]))
377 | (((unsigned int) (field [1])) << 8);
380 /* We want to extract data from an 8 byte wide field and
381 place it into a 4 byte wide field. Since this is a little
382 endian source we can juts use the 4 byte extraction code. */
385 return ((unsigned long) (field [0]))
386 | (((unsigned long) (field [1])) << 8)
387 | (((unsigned long) (field [2])) << 16)
388 | (((unsigned long) (field [3])) << 24);
392 /* This is a special case, generated by the BYTE_GET8 macro.
393 It means that we are loading an 8 byte value from a field
394 in an external structure into an 8 byte value in a field
395 in an internal strcuture. */
396 return ((bfd_vma) (field [0]))
397 | (((bfd_vma) (field [1])) << 8)
398 | (((bfd_vma) (field [2])) << 16)
399 | (((bfd_vma) (field [3])) << 24)
400 | (((bfd_vma) (field [4])) << 32)
401 | (((bfd_vma) (field [5])) << 40)
402 | (((bfd_vma) (field [6])) << 48)
403 | (((bfd_vma) (field [7])) << 56);
406 error (_("Unhandled data length: %d\n"), size);
411 /* Print a VMA value. */
413 print_vma (vma, mode)
423 case FULL_HEX: printf ("0x"); /* drop through */
424 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
425 case PREFIX_HEX: printf ("0x"); /* drop through */
426 case HEX: printf ("%lx", (unsigned long) vma); break;
427 case DEC: printf ("%ld", (unsigned long) vma); break;
428 case DEC_5: printf ("%5ld", (long) vma); break;
429 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
450 #if BFD_HOST_64BIT_LONG
453 if (_bfd_int64_high (vma))
454 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
456 printf ("%lx", _bfd_int64_low (vma));
461 #if BFD_HOST_64BIT_LONG
464 if (_bfd_int64_high (vma))
466 printf ("++%ld", _bfd_int64_low (vma));
468 printf ("%ld", _bfd_int64_low (vma));
473 #if BFD_HOST_64BIT_LONG
474 printf ("%5ld", vma);
476 if (_bfd_int64_high (vma))
478 printf ("++%ld", _bfd_int64_low (vma));
480 printf ("%5ld", _bfd_int64_low (vma));
485 #if BFD_HOST_64BIT_LONG
488 if (_bfd_int64_high (vma))
490 printf ("++%lu", _bfd_int64_low (vma));
492 printf ("%lu", _bfd_int64_low (vma));
501 byte_get_big_endian (field, size)
502 unsigned char * field;
511 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
514 return ((unsigned long) (field [3]))
515 | (((unsigned long) (field [2])) << 8)
516 | (((unsigned long) (field [1])) << 16)
517 | (((unsigned long) (field [0])) << 24);
520 /* Although we are extracing data from an 8 byte wide field, we
521 are returning only 4 bytes of data. */
522 return ((unsigned long) (field [7]))
523 | (((unsigned long) (field [6])) << 8)
524 | (((unsigned long) (field [5])) << 16)
525 | (((unsigned long) (field [4])) << 24);
529 /* This is a special case, generated by the BYTE_GET8 macro.
530 It means that we are loading an 8 byte value from a field
531 in an external structure into an 8 byte value in a field
532 in an internal strcuture. */
533 return ((bfd_vma) (field [7]))
534 | (((bfd_vma) (field [6])) << 8)
535 | (((bfd_vma) (field [5])) << 16)
536 | (((bfd_vma) (field [4])) << 24)
537 | (((bfd_vma) (field [3])) << 32)
538 | (((bfd_vma) (field [2])) << 40)
539 | (((bfd_vma) (field [1])) << 48)
540 | (((bfd_vma) (field [0])) << 56);
544 error (_("Unhandled data length: %d\n"), size);
549 /* Guess the relocation size commonly used by the specific machines. */
552 guess_is_rela (e_machine)
553 unsigned long e_machine;
557 /* Targets that use REL relocations. */
568 /* Targets that use RELA relocations. */
576 case EM_CYGNUS_MN10200:
577 case EM_CYGNUS_MN10300:
609 warn (_("Don't know about relocations on this machine architecture\n"));
615 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
617 unsigned long rel_offset;
618 unsigned long rel_size;
619 Elf_Internal_Rela **relasp;
620 unsigned long *nrelasp;
622 Elf_Internal_Rela *relas;
623 unsigned long nrelas;
628 Elf32_External_Rela * erelas;
630 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
631 Elf32_External_Rela *, "relocs");
633 nrelas = rel_size / sizeof (Elf32_External_Rela);
635 relas = (Elf_Internal_Rela *)
636 malloc (nrelas * sizeof (Elf_Internal_Rela));
640 error(_("out of memory parsing relocs"));
644 for (i = 0; i < nrelas; i++)
646 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
647 relas[i].r_info = BYTE_GET (erelas[i].r_info);
648 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
655 Elf64_External_Rela * erelas;
657 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
658 Elf64_External_Rela *, "relocs");
660 nrelas = rel_size / sizeof (Elf64_External_Rela);
662 relas = (Elf_Internal_Rela *)
663 malloc (nrelas * sizeof (Elf_Internal_Rela));
667 error(_("out of memory parsing relocs"));
671 for (i = 0; i < nrelas; i++)
673 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
674 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
675 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
686 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
688 unsigned long rel_offset;
689 unsigned long rel_size;
690 Elf_Internal_Rel **relsp;
691 unsigned long *nrelsp;
693 Elf_Internal_Rel *rels;
699 Elf32_External_Rel * erels;
701 GET_DATA_ALLOC (rel_offset, rel_size, erels,
702 Elf32_External_Rel *, "relocs");
704 nrels = rel_size / sizeof (Elf32_External_Rel);
706 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
710 error(_("out of memory parsing relocs"));
714 for (i = 0; i < nrels; i++)
716 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
717 rels[i].r_info = BYTE_GET (erels[i].r_info);
724 Elf64_External_Rel * erels;
726 GET_DATA_ALLOC (rel_offset, rel_size, erels,
727 Elf64_External_Rel *, "relocs");
729 nrels = rel_size / sizeof (Elf64_External_Rel);
731 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
735 error(_("out of memory parsing relocs"));
739 for (i = 0; i < nrels; i++)
741 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
742 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
752 /* Display the contents of the relocation data found at the specified offset. */
754 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
756 unsigned long rel_offset;
757 unsigned long rel_size;
758 Elf_Internal_Sym * symtab;
764 Elf_Internal_Rel * rels;
765 Elf_Internal_Rela * relas;
768 if (is_rela == UNKNOWN)
769 is_rela = guess_is_rela (elf_header.e_machine);
773 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
778 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
784 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
787 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
789 for (i = 0; i < rel_size; i++)
794 bfd_vma symtab_index;
799 offset = relas [i].r_offset;
800 info = relas [i].r_info;
804 offset = rels [i].r_offset;
805 info = rels [i].r_info;
810 type = ELF32_R_TYPE (info);
811 symtab_index = ELF32_R_SYM (info);
815 if (elf_header.e_machine == EM_SPARCV9)
816 type = ELF64_R_TYPE_ID (info);
818 type = ELF64_R_TYPE (info);
819 /* The #ifdef BFD64 below is to prevent a compile time warning.
820 We know that if we do not have a 64 bit data type that we
821 will never execute this code anyway. */
823 symtab_index = ELF64_R_SYM (info);
827 #ifdef _bfd_int64_low
828 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
830 printf (" %8.8lx %5.5lx ", offset, info);
833 switch (elf_header.e_machine)
840 rtype = elf_m32r_reloc_type (type);
845 rtype = elf_i386_reloc_type (type);
849 rtype = elf_m68k_reloc_type (type);
853 rtype = elf_i960_reloc_type (type);
857 rtype = elf_avr_reloc_type (type);
864 rtype = elf_sparc_reloc_type (type);
868 rtype = v850_reloc_type (type);
872 rtype = elf_d10v_reloc_type (type);
876 rtype = elf_d30v_reloc_type (type);
880 rtype = elf_sh_reloc_type (type);
883 case EM_CYGNUS_MN10300:
884 rtype = elf_mn10300_reloc_type (type);
887 case EM_CYGNUS_MN10200:
888 rtype = elf_mn10200_reloc_type (type);
892 rtype = elf_fr30_reloc_type (type);
896 rtype = elf_mcore_reloc_type (type);
900 rtype = elf_ppc_reloc_type (type);
905 rtype = elf_mips_reloc_type (type);
909 rtype = elf_alpha_reloc_type (type);
913 rtype = elf_arm_reloc_type (type);
918 rtype = elf_arc_reloc_type (type);
922 rtype = elf_hppa_reloc_type (type);
926 rtype = elf_pj_reloc_type (type);
929 rtype = elf_ia64_reloc_type (type);
933 rtype = elf_cris_reloc_type (type);
937 rtype = elf_i860_reloc_type (type);
941 rtype = elf_x86_64_reloc_type (type);
945 rtype = elf_s390_reloc_type (type);
950 #ifdef _bfd_int64_low
951 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
953 printf (_("unrecognised: %-7lx"), type);
956 printf ("%-21.21s", rtype);
962 if (symtab_index >= nsyms)
963 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
966 Elf_Internal_Sym * psym;
968 psym = symtab + symtab_index;
971 print_vma (psym->st_value, LONG_HEX);
974 if (psym->st_name == 0)
976 SECTION_NAME (section_headers + psym->st_shndx));
977 else if (strtab == NULL)
978 printf (_("<string table index %3ld>"), psym->st_name);
980 printf ("%-25.25s", strtab + psym->st_name);
983 printf (" + %lx", (unsigned long) relas [i].r_addend);
989 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
990 print_vma (relas[i].r_addend, LONG_HEX);
993 if (elf_header.e_machine == EM_SPARCV9
994 && !strcmp (rtype, "R_SPARC_OLO10"))
995 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1009 get_mips_dynamic_type (type)
1014 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1015 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1016 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1017 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1018 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1019 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1020 case DT_MIPS_MSYM: return "MIPS_MSYM";
1021 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1022 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1023 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1024 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1025 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1026 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1027 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1028 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1029 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1030 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1031 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1032 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1033 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1034 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1035 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1036 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1037 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1038 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1039 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1040 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1041 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1042 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1043 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1044 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1045 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1046 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1047 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1048 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1049 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1050 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1051 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1052 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1053 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1054 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1055 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1056 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1063 get_sparc64_dynamic_type (type)
1068 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1075 get_parisc_dynamic_type (type)
1080 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1081 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1082 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1083 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1084 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1085 case DT_HP_PREINIT: return "HP_PREINIT";
1086 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1087 case DT_HP_NEEDED: return "HP_NEEDED";
1088 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1089 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1090 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1091 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1092 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1099 get_dynamic_type (type)
1102 static char buff [32];
1106 case DT_NULL: return "NULL";
1107 case DT_NEEDED: return "NEEDED";
1108 case DT_PLTRELSZ: return "PLTRELSZ";
1109 case DT_PLTGOT: return "PLTGOT";
1110 case DT_HASH: return "HASH";
1111 case DT_STRTAB: return "STRTAB";
1112 case DT_SYMTAB: return "SYMTAB";
1113 case DT_RELA: return "RELA";
1114 case DT_RELASZ: return "RELASZ";
1115 case DT_RELAENT: return "RELAENT";
1116 case DT_STRSZ: return "STRSZ";
1117 case DT_SYMENT: return "SYMENT";
1118 case DT_INIT: return "INIT";
1119 case DT_FINI: return "FINI";
1120 case DT_SONAME: return "SONAME";
1121 case DT_RPATH: return "RPATH";
1122 case DT_SYMBOLIC: return "SYMBOLIC";
1123 case DT_REL: return "REL";
1124 case DT_RELSZ: return "RELSZ";
1125 case DT_RELENT: return "RELENT";
1126 case DT_PLTREL: return "PLTREL";
1127 case DT_DEBUG: return "DEBUG";
1128 case DT_TEXTREL: return "TEXTREL";
1129 case DT_JMPREL: return "JMPREL";
1130 case DT_BIND_NOW: return "BIND_NOW";
1131 case DT_INIT_ARRAY: return "INIT_ARRAY";
1132 case DT_FINI_ARRAY: return "FINI_ARRAY";
1133 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1134 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1135 case DT_RUNPATH: return "RUNPATH";
1136 case DT_FLAGS: return "FLAGS";
1138 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1139 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1141 case DT_CHECKSUM: return "CHECKSUM";
1142 case DT_PLTPADSZ: return "PLTPADSZ";
1143 case DT_MOVEENT: return "MOVEENT";
1144 case DT_MOVESZ: return "MOVESZ";
1145 case DT_FEATURE: return "FEATURE";
1146 case DT_POSFLAG_1: return "POSFLAG_1";
1147 case DT_SYMINSZ: return "SYMINSZ";
1148 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1150 case DT_ADDRRNGLO: return "ADDRRNGLO";
1151 case DT_CONFIG: return "CONFIG";
1152 case DT_DEPAUDIT: return "DEPAUDIT";
1153 case DT_AUDIT: return "AUDIT";
1154 case DT_PLTPAD: return "PLTPAD";
1155 case DT_MOVETAB: return "MOVETAB";
1156 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1158 case DT_VERSYM: return "VERSYM";
1160 case DT_RELACOUNT: return "RELACOUNT";
1161 case DT_RELCOUNT: return "RELCOUNT";
1162 case DT_FLAGS_1: return "FLAGS_1";
1163 case DT_VERDEF: return "VERDEF";
1164 case DT_VERDEFNUM: return "VERDEFNUM";
1165 case DT_VERNEED: return "VERNEED";
1166 case DT_VERNEEDNUM: return "VERNEEDNUM";
1168 case DT_AUXILIARY: return "AUXILIARY";
1169 case DT_USED: return "USED";
1170 case DT_FILTER: return "FILTER";
1173 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1175 const char * result;
1177 switch (elf_header.e_machine)
1180 case EM_MIPS_RS4_BE:
1181 result = get_mips_dynamic_type (type);
1184 result = get_sparc64_dynamic_type (type);
1194 sprintf (buff, _("Processor Specific: %lx"), type);
1196 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1198 const char * result;
1200 switch (elf_header.e_machine)
1203 result = get_parisc_dynamic_type (type);
1213 sprintf (buff, _("Operating System specific: %lx"), type);
1216 sprintf (buff, _("<unknown>: %lx"), type);
1223 get_file_type (e_type)
1226 static char buff [32];
1230 case ET_NONE: return _("NONE (None)");
1231 case ET_REL: return _("REL (Relocatable file)");
1232 case ET_EXEC: return _("EXEC (Executable file)");
1233 case ET_DYN: return _("DYN (Shared object file)");
1234 case ET_CORE: return _("CORE (Core file)");
1237 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1238 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1239 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1240 sprintf (buff, _("OS Specific: (%x)"), e_type);
1242 sprintf (buff, _("<unknown>: %x"), e_type);
1248 get_machine_name (e_machine)
1251 static char buff [64]; /* XXX */
1255 case EM_NONE: return _("None");
1256 case EM_M32: return "WE32100";
1257 case EM_SPARC: return "Sparc";
1258 case EM_386: return "Intel 80386";
1259 case EM_68K: return "MC68000";
1260 case EM_88K: return "MC88000";
1261 case EM_486: return "Intel 80486";
1262 case EM_860: return "Intel 80860";
1263 case EM_MIPS: return "MIPS R3000";
1264 case EM_S370: return "IBM System/370";
1265 case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
1266 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1267 case EM_PARISC: return "HPPA";
1268 case EM_PPC_OLD: return "Power PC (old)";
1269 case EM_SPARC32PLUS: return "Sparc v8+" ;
1270 case EM_960: return "Intel 90860";
1271 case EM_PPC: return "PowerPC";
1272 case EM_V800: return "NEC V800";
1273 case EM_FR20: return "Fujitsu FR20";
1274 case EM_RH32: return "TRW RH32";
1275 case EM_MCORE: return "MCORE";
1276 case EM_ARM: return "ARM";
1277 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1278 case EM_SH: return "Hitachi SH";
1279 case EM_SPARCV9: return "Sparc v9";
1280 case EM_TRICORE: return "Siemens Tricore";
1281 case EM_ARC: return "ARC";
1282 case EM_H8_300: return "Hitachi H8/300";
1283 case EM_H8_300H: return "Hitachi H8/300H";
1284 case EM_H8S: return "Hitachi H8S";
1285 case EM_H8_500: return "Hitachi H8/500";
1286 case EM_IA_64: return "Intel IA-64";
1287 case EM_MIPS_X: return "Stanford MIPS-X";
1288 case EM_COLDFIRE: return "Motorola Coldfire";
1289 case EM_68HC12: return "Motorola M68HC12";
1290 case EM_ALPHA: return "Alpha";
1291 case EM_CYGNUS_D10V: return "d10v";
1292 case EM_CYGNUS_D30V: return "d30v";
1293 case EM_CYGNUS_ARC: return "ARC";
1294 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1295 case EM_CYGNUS_V850: return "NEC v850";
1296 case EM_CYGNUS_MN10300: return "mn10300";
1297 case EM_CYGNUS_MN10200: return "mn10200";
1298 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1299 case EM_PJ: return "picoJava";
1300 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1301 case EM_PCP: return "Siemens PCP";
1302 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1303 case EM_NDR1: return "Denso NDR1 microprocesspr";
1304 case EM_STARCORE: return "Motorola Star*Core processor";
1305 case EM_ME16: return "Toyota ME16 processor";
1306 case EM_ST100: return "STMicroelectronics ST100 processor";
1307 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1308 case EM_FX66: return "Siemens FX66 microcontroller";
1309 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1310 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1311 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1312 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1313 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1314 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1315 case EM_SVX: return "Silicon Graphics SVx";
1316 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1317 case EM_VAX: return "Digital VAX";
1318 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1319 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1320 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1321 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1322 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1323 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1324 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1325 case EM_PRISM: return "SiTera Prism";
1326 case EM_X86_64: return "Advanced Micro Devices X86-64";
1327 case EM_S390: return "IBM S/390";
1329 sprintf (buff, _("<unknown>: %x"), e_machine);
1335 decode_ARM_machine_flags (e_flags, buf)
1342 eabi = EF_ARM_EABI_VERSION (e_flags);
1343 e_flags &= ~ EF_ARM_EABIMASK;
1345 /* Handle "generic" ARM flags. */
1346 if (e_flags & EF_ARM_RELEXEC)
1348 strcat (buf, ", relocatable executable");
1349 e_flags &= ~ EF_ARM_RELEXEC;
1352 if (e_flags & EF_ARM_HASENTRY)
1354 strcat (buf, ", has entry point");
1355 e_flags &= ~ EF_ARM_HASENTRY;
1358 /* Now handle EABI specific flags. */
1362 strcat (buf, ", <unknown EABI>");
1367 case EF_ARM_EABI_VER1:
1372 /* Process flags one bit at a time. */
1373 flag = e_flags & - e_flags;
1378 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_INTERWORK. */
1379 strcat (buf, ", sorted symbol tables");
1389 case EF_ARM_EABI_UNKNOWN:
1394 /* Process flags one bit at a time. */
1395 flag = e_flags & - e_flags;
1401 strcat (buf, ", interworking enabled");
1405 strcat (buf, ", uses APCS/26");
1409 strcat (buf, ", uses APCS/float");
1413 strcat (buf, ", position independent");
1417 strcat (buf, ", 8 bit structure alignment");
1421 strcat (buf, ", uses new ABI");
1425 strcat (buf, ", uses old ABI");
1429 strcat (buf, ", software FP");
1440 strcat (buf,", <unknown>");
1444 get_machine_flags (e_flags, e_machine)
1448 static char buf [1024];
1460 decode_ARM_machine_flags (e_flags, buf);
1464 if (e_flags & EF_CPU32)
1465 strcat (buf, ", cpu32");
1469 if (e_flags & EF_PPC_EMB)
1470 strcat (buf, ", emb");
1472 if (e_flags & EF_PPC_RELOCATABLE)
1473 strcat (buf, ", relocatable");
1475 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1476 strcat (buf, ", relocatable-lib");
1479 case EM_CYGNUS_V850:
1480 switch (e_flags & EF_V850_ARCH)
1483 strcat (buf, ", v850e");
1486 strcat (buf, ", v850ea");
1489 strcat (buf, ", v850");
1492 strcat (buf, ", unknown v850 architecture variant");
1497 case EM_CYGNUS_M32R:
1498 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1499 strcat (buf, ", m32r");
1504 case EM_MIPS_RS4_BE:
1505 if (e_flags & EF_MIPS_NOREORDER)
1506 strcat (buf, ", noreorder");
1508 if (e_flags & EF_MIPS_PIC)
1509 strcat (buf, ", pic");
1511 if (e_flags & EF_MIPS_CPIC)
1512 strcat (buf, ", cpic");
1514 if (e_flags & EF_MIPS_ABI2)
1515 strcat (buf, ", abi2");
1517 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1518 strcat (buf, ", mips1");
1520 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1521 strcat (buf, ", mips2");
1523 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1524 strcat (buf, ", mips3");
1526 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1527 strcat (buf, ", mips4");
1529 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
1530 strcat (buf, ", mips5");
1532 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
1533 strcat (buf, ", mips32");
1535 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
1536 strcat (buf, ", mips64");
1538 switch ((e_flags & EF_MIPS_MACH))
1540 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1541 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1542 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1543 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1544 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1545 case E_MIPS_MACH_MIPS32_4K: strcat (buf, ", mips32-4k"); break;
1546 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1547 default: strcat (buf, " UNKNOWN"); break;
1552 if (e_flags & EF_SPARC_32PLUS)
1553 strcat (buf, ", v8+");
1555 if (e_flags & EF_SPARC_SUN_US1)
1556 strcat (buf, ", ultrasparcI");
1558 if (e_flags & EF_SPARC_SUN_US3)
1559 strcat (buf, ", ultrasparcIII");
1561 if (e_flags & EF_SPARC_HAL_R1)
1562 strcat (buf, ", halr1");
1564 if (e_flags & EF_SPARC_LEDATA)
1565 strcat (buf, ", ledata");
1567 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1568 strcat (buf, ", tso");
1570 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1571 strcat (buf, ", pso");
1573 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1574 strcat (buf, ", rmo");
1578 switch (e_flags & EF_PARISC_ARCH)
1580 case EFA_PARISC_1_0:
1581 strcpy (buf, ", PA-RISC 1.0");
1583 case EFA_PARISC_1_1:
1584 strcpy (buf, ", PA-RISC 1.1");
1586 case EFA_PARISC_2_0:
1587 strcpy (buf, ", PA-RISC 2.0");
1592 if (e_flags & EF_PARISC_TRAPNIL)
1593 strcat (buf, ", trapnil");
1594 if (e_flags & EF_PARISC_EXT)
1595 strcat (buf, ", ext");
1596 if (e_flags & EF_PARISC_LSB)
1597 strcat (buf, ", lsb");
1598 if (e_flags & EF_PARISC_WIDE)
1599 strcat (buf, ", wide");
1600 if (e_flags & EF_PARISC_NO_KABP)
1601 strcat (buf, ", no kabp");
1602 if (e_flags & EF_PARISC_LAZYSWAP)
1603 strcat (buf, ", lazyswap");
1607 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1608 strcat (buf, ", new calling convention");
1610 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1611 strcat (buf, ", gnu calling convention");
1615 if ((e_flags & EF_IA_64_ABI64))
1616 strcat (buf, ", 64-bit");
1618 strcat (buf, ", 32-bit");
1619 if ((e_flags & EF_IA_64_REDUCEDFP))
1620 strcat (buf, ", reduced fp model");
1621 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1622 strcat (buf, ", no function descriptors, constant gp");
1623 else if ((e_flags & EF_IA_64_CONS_GP))
1624 strcat (buf, ", constant gp");
1625 if ((e_flags & EF_IA_64_ABSOLUTE))
1626 strcat (buf, ", absolute");
1635 get_mips_segment_type (type)
1640 case PT_MIPS_REGINFO:
1642 case PT_MIPS_RTPROC:
1644 case PT_MIPS_OPTIONS:
1654 get_parisc_segment_type (type)
1659 case PT_HP_TLS: return "HP_TLS";
1660 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1661 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1662 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1663 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1664 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1665 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1666 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1667 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1668 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1669 case PT_HP_PARALLEL: return "HP_PARALLEL";
1670 case PT_HP_FASTBIND: return "HP_FASTBIND";
1671 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1672 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1681 get_ia64_segment_type (type)
1686 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1687 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1696 get_segment_type (p_type)
1697 unsigned long p_type;
1699 static char buff [32];
1703 case PT_NULL: return "NULL";
1704 case PT_LOAD: return "LOAD";
1705 case PT_DYNAMIC: return "DYNAMIC";
1706 case PT_INTERP: return "INTERP";
1707 case PT_NOTE: return "NOTE";
1708 case PT_SHLIB: return "SHLIB";
1709 case PT_PHDR: return "PHDR";
1712 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1714 const char * result;
1716 switch (elf_header.e_machine)
1719 case EM_MIPS_RS4_BE:
1720 result = get_mips_segment_type (p_type);
1723 result = get_parisc_segment_type (p_type);
1726 result = get_ia64_segment_type (p_type);
1736 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1738 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1740 const char * result;
1742 switch (elf_header.e_machine)
1745 result = get_parisc_segment_type (p_type);
1755 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1758 sprintf (buff, _("<unknown>: %lx"), p_type);
1765 get_mips_section_type_name (sh_type)
1766 unsigned int sh_type;
1770 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1771 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1772 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1773 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1774 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1775 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1776 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1777 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1778 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1779 case SHT_MIPS_RELD: return "MIPS_RELD";
1780 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1781 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1782 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1783 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1784 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1785 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1786 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1787 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1788 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1789 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1790 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1791 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1792 case SHT_MIPS_LINE: return "MIPS_LINE";
1793 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1794 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1795 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1796 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1797 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1798 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1799 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1800 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1801 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1802 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1803 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1804 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1805 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1806 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1807 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1808 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1816 get_parisc_section_type_name (sh_type)
1817 unsigned int sh_type;
1821 case SHT_PARISC_EXT: return "PARISC_EXT";
1822 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1823 case SHT_PARISC_DOC: return "PARISC_DOC";
1831 get_ia64_section_type_name (sh_type)
1832 unsigned int sh_type;
1836 case SHT_IA_64_EXT: return "IA_64_EXT";
1837 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
1845 get_section_type_name (sh_type)
1846 unsigned int sh_type;
1848 static char buff [32];
1852 case SHT_NULL: return "NULL";
1853 case SHT_PROGBITS: return "PROGBITS";
1854 case SHT_SYMTAB: return "SYMTAB";
1855 case SHT_STRTAB: return "STRTAB";
1856 case SHT_RELA: return "RELA";
1857 case SHT_HASH: return "HASH";
1858 case SHT_DYNAMIC: return "DYNAMIC";
1859 case SHT_NOTE: return "NOTE";
1860 case SHT_NOBITS: return "NOBITS";
1861 case SHT_REL: return "REL";
1862 case SHT_SHLIB: return "SHLIB";
1863 case SHT_DYNSYM: return "DYNSYM";
1864 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1865 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1866 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1867 case SHT_GROUP: return "GROUP";
1868 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
1869 case SHT_GNU_verdef: return "VERDEF";
1870 case SHT_GNU_verneed: return "VERNEED";
1871 case SHT_GNU_versym: return "VERSYM";
1872 case 0x6ffffff0: return "VERSYM";
1873 case 0x6ffffffc: return "VERDEF";
1874 case 0x7ffffffd: return "AUXILIARY";
1875 case 0x7fffffff: return "FILTER";
1878 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1880 const char * result;
1882 switch (elf_header.e_machine)
1885 case EM_MIPS_RS4_BE:
1886 result = get_mips_section_type_name (sh_type);
1889 result = get_parisc_section_type_name (sh_type);
1892 result = get_ia64_section_type_name (sh_type);
1902 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1904 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1905 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1906 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1907 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1909 sprintf (buff, _("<unknown>: %x"), sh_type);
1915 struct option options [] =
1917 {"all", no_argument, 0, 'a'},
1918 {"file-header", no_argument, 0, 'h'},
1919 {"program-headers", no_argument, 0, 'l'},
1920 {"headers", no_argument, 0, 'e'},
1921 {"histogram", no_argument, 0, 'I'},
1922 {"segments", no_argument, 0, 'l'},
1923 {"sections", no_argument, 0, 'S'},
1924 {"section-headers", no_argument, 0, 'S'},
1925 {"symbols", no_argument, 0, 's'},
1926 {"syms", no_argument, 0, 's'},
1927 {"relocs", no_argument, 0, 'r'},
1928 {"notes", no_argument, 0, 'n'},
1929 {"dynamic", no_argument, 0, 'd'},
1930 {"arch-specific", no_argument, 0, 'A'},
1931 {"version-info", no_argument, 0, 'V'},
1932 {"use-dynamic", no_argument, 0, 'D'},
1933 {"hex-dump", required_argument, 0, 'x'},
1934 {"debug-dump", optional_argument, 0, 'w'},
1935 {"unwind", no_argument, 0, 'u'},
1936 #ifdef SUPPORT_DISASSEMBLY
1937 {"instruction-dump", required_argument, 0, 'i'},
1940 {"version", no_argument, 0, 'v'},
1941 {"help", no_argument, 0, 'H'},
1942 {0, no_argument, 0, 0}
1948 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1949 fprintf (stdout, _(" Options are:\n"));
1950 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1951 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
1952 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
1953 fprintf (stdout, _(" Display the program headers\n"));
1954 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
1955 fprintf (stdout, _(" Display the sections' header\n"));
1956 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
1957 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
1958 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
1959 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
1960 fprintf (stdout, _(" -u or --unwind Display the unwind info (if present)\n"));
1961 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1962 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
1963 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1964 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1965 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
1966 fprintf (stdout, _(" Dump the contents of section <number>\n"));
1967 fprintf (stdout, _(" -w[liaprf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=frames]\n"));
1968 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
1969 #ifdef SUPPORT_DISASSEMBLY
1970 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
1971 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
1973 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1974 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
1975 fprintf (stdout, _(" -H or --help Display this information\n"));
1976 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
1982 request_dump (section, type)
1983 unsigned int section;
1986 if (section >= num_dump_sects)
1988 char * new_dump_sects;
1990 new_dump_sects = (char *) calloc (section + 1, 1);
1992 if (new_dump_sects == NULL)
1993 error (_("Out of memory allocating dump request table."));
1996 /* Copy current flag settings. */
1997 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2001 dump_sects = new_dump_sects;
2002 num_dump_sects = section + 1;
2007 dump_sects [section] |= type;
2013 parse_args (argc, argv)
2022 while ((c = getopt_long
2023 (argc, argv, "ersuahnldSDAIw::x:i:vV", options, NULL)) != EOF)
2059 do_using_dynamic ++;
2090 section = strtoul (optarg, & cp, 0);
2091 if (! * cp && section >= 0)
2093 request_dump (section, HEX_DUMP);
2113 do_debug_abbrevs = 1;
2123 do_debug_pubnames = 1;
2128 do_debug_aranges = 1;
2133 do_debug_frames = 1;
2137 warn (_("Unrecognised debug option '%s'\n"), optarg);
2142 #ifdef SUPPORT_DISASSEMBLY
2145 section = strtoul (optarg, & cp, 0);
2146 if (! * cp && section >= 0)
2148 request_dump (section, DISASS_DUMP);
2154 print_version (program_name);
2161 /* xgettext:c-format */
2162 error (_("Invalid option '-%c'\n"), c);
2169 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2170 && !do_segments && !do_header && !do_dump && !do_version
2171 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2175 warn (_("Nothing to do.\n"));
2181 get_elf_class (elf_class)
2182 unsigned char elf_class;
2184 static char buff [32];
2188 case ELFCLASSNONE: return _("none");
2189 case ELFCLASS32: return _("ELF32");
2190 case ELFCLASS64: return _("ELF64");
2192 sprintf (buff, _("<unknown: %x>"), elf_class);
2198 get_data_encoding (encoding)
2199 unsigned char encoding;
2201 static char buff [32];
2205 case ELFDATANONE: return _("none");
2206 case ELFDATA2LSB: return _("2's complement, little endian");
2207 case ELFDATA2MSB: return _("2's complement, big endian");
2209 sprintf (buff, _("<unknown: %x>"), encoding);
2215 get_osabi_name (osabi)
2216 unsigned char osabi;
2218 static char buff [32];
2222 case ELFOSABI_NONE: return _("UNIX - System V");
2223 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2224 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2225 case ELFOSABI_LINUX: return _("UNIX - Linux");
2226 case ELFOSABI_HURD: return _("GNU/Hurd");
2227 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2228 case ELFOSABI_AIX: return _("UNIX - AIX");
2229 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2230 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2231 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2232 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2233 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2234 case ELFOSABI_STANDALONE: return _("Standalone App");
2235 case ELFOSABI_ARM: return _("ARM");
2237 sprintf (buff, _("<unknown: %x>"), osabi);
2242 /* Decode the data held in 'elf_header'. */
2244 process_file_header ()
2246 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2247 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2248 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2249 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2252 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2260 printf (_("ELF Header:\n"));
2261 printf (_(" Magic: "));
2262 for (i = 0; i < EI_NIDENT; i ++)
2263 printf ("%2.2x ", elf_header.e_ident [i]);
2265 printf (_(" Class: %s\n"),
2266 get_elf_class (elf_header.e_ident [EI_CLASS]));
2267 printf (_(" Data: %s\n"),
2268 get_data_encoding (elf_header.e_ident [EI_DATA]));
2269 printf (_(" Version: %d %s\n"),
2270 elf_header.e_ident [EI_VERSION],
2271 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2273 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2276 printf (_(" OS/ABI: %s\n"),
2277 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2278 printf (_(" ABI Version: %d\n"),
2279 elf_header.e_ident [EI_ABIVERSION]);
2280 printf (_(" Type: %s\n"),
2281 get_file_type (elf_header.e_type));
2282 printf (_(" Machine: %s\n"),
2283 get_machine_name (elf_header.e_machine));
2284 printf (_(" Version: 0x%lx\n"),
2285 (unsigned long) elf_header.e_version);
2287 printf (_(" Entry point address: "));
2288 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2289 printf (_("\n Start of program headers: "));
2290 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2291 printf (_(" (bytes into file)\n Start of section headers: "));
2292 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2293 printf (_(" (bytes into file)\n"));
2295 printf (_(" Flags: 0x%lx%s\n"),
2296 (unsigned long) elf_header.e_flags,
2297 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2298 printf (_(" Size of this header: %ld (bytes)\n"),
2299 (long) elf_header.e_ehsize);
2300 printf (_(" Size of program headers: %ld (bytes)\n"),
2301 (long) elf_header.e_phentsize);
2302 printf (_(" Number of program headers: %ld\n"),
2303 (long) elf_header.e_phnum);
2304 printf (_(" Size of section headers: %ld (bytes)\n"),
2305 (long) elf_header.e_shentsize);
2306 printf (_(" Number of section headers: %ld\n"),
2307 (long) elf_header.e_shnum);
2308 printf (_(" Section header string table index: %ld\n"),
2309 (long) elf_header.e_shstrndx);
2317 get_32bit_program_headers (file, program_headers)
2319 Elf_Internal_Phdr * program_headers;
2321 Elf32_External_Phdr * phdrs;
2322 Elf32_External_Phdr * external;
2323 Elf32_Internal_Phdr * internal;
2326 GET_DATA_ALLOC (elf_header.e_phoff,
2327 elf_header.e_phentsize * elf_header.e_phnum,
2328 phdrs, Elf32_External_Phdr *, "program headers");
2330 for (i = 0, internal = program_headers, external = phdrs;
2331 i < elf_header.e_phnum;
2332 i ++, internal ++, external ++)
2334 internal->p_type = BYTE_GET (external->p_type);
2335 internal->p_offset = BYTE_GET (external->p_offset);
2336 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2337 internal->p_paddr = BYTE_GET (external->p_paddr);
2338 internal->p_filesz = BYTE_GET (external->p_filesz);
2339 internal->p_memsz = BYTE_GET (external->p_memsz);
2340 internal->p_flags = BYTE_GET (external->p_flags);
2341 internal->p_align = BYTE_GET (external->p_align);
2350 get_64bit_program_headers (file, program_headers)
2352 Elf_Internal_Phdr * program_headers;
2354 Elf64_External_Phdr * phdrs;
2355 Elf64_External_Phdr * external;
2356 Elf64_Internal_Phdr * internal;
2359 GET_DATA_ALLOC (elf_header.e_phoff,
2360 elf_header.e_phentsize * elf_header.e_phnum,
2361 phdrs, Elf64_External_Phdr *, "program headers");
2363 for (i = 0, internal = program_headers, external = phdrs;
2364 i < elf_header.e_phnum;
2365 i ++, internal ++, external ++)
2367 internal->p_type = BYTE_GET (external->p_type);
2368 internal->p_flags = BYTE_GET (external->p_flags);
2369 internal->p_offset = BYTE_GET8 (external->p_offset);
2370 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2371 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2372 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2373 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2374 internal->p_align = BYTE_GET8 (external->p_align);
2383 process_program_headers (file)
2386 Elf_Internal_Phdr * program_headers;
2387 Elf_Internal_Phdr * segment;
2390 if (elf_header.e_phnum == 0)
2393 printf (_("\nThere are no program headers in this file.\n"));
2397 if (do_segments && !do_header)
2399 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2400 printf (_("Entry point "));
2401 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2402 printf (_("\nThere are %d program headers, starting at offset "),
2403 elf_header.e_phnum);
2404 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2408 program_headers = (Elf_Internal_Phdr *) malloc
2409 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2411 if (program_headers == NULL)
2413 error (_("Out of memory\n"));
2418 i = get_32bit_program_headers (file, program_headers);
2420 i = get_64bit_program_headers (file, program_headers);
2424 free (program_headers);
2431 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2435 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2439 (_(" Type Offset VirtAddr PhysAddr\n"));
2441 (_(" FileSiz MemSiz Flags Align\n"));
2449 for (i = 0, segment = program_headers;
2450 i < elf_header.e_phnum;
2455 printf (" %-14.14s ", get_segment_type (segment->p_type));
2459 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2460 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2461 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2462 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2463 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2465 (segment->p_flags & PF_R ? 'R' : ' '),
2466 (segment->p_flags & PF_W ? 'W' : ' '),
2467 (segment->p_flags & PF_X ? 'E' : ' '));
2468 printf ("%#lx", (unsigned long) segment->p_align);
2472 print_vma (segment->p_offset, FULL_HEX);
2474 print_vma (segment->p_vaddr, FULL_HEX);
2476 print_vma (segment->p_paddr, FULL_HEX);
2478 print_vma (segment->p_filesz, FULL_HEX);
2480 print_vma (segment->p_memsz, FULL_HEX);
2482 (segment->p_flags & PF_R ? 'R' : ' '),
2483 (segment->p_flags & PF_W ? 'W' : ' '),
2484 (segment->p_flags & PF_X ? 'E' : ' '));
2485 print_vma (segment->p_align, HEX);
2489 switch (segment->p_type)
2493 loadaddr = (segment->p_vaddr & 0xfffff000)
2494 - (segment->p_offset & 0xfffff000);
2499 error (_("more than one dynamic segment\n"));
2501 dynamic_addr = segment->p_offset;
2502 dynamic_size = segment->p_filesz;
2506 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2507 error (_("Unable to find program interpreter name\n"));
2510 program_interpreter[0] = 0;
2511 fscanf (file, "%63s", program_interpreter);
2514 printf (_("\n [Requesting program interpreter: %s]"),
2515 program_interpreter);
2521 putc ('\n', stdout);
2530 if (do_segments && section_headers != NULL)
2532 printf (_("\n Section to Segment mapping:\n"));
2533 printf (_(" Segment Sections...\n"));
2535 assert (string_table != NULL);
2537 for (i = 0; i < elf_header.e_phnum; i++)
2540 Elf_Internal_Shdr * section;
2542 segment = program_headers + i;
2543 section = section_headers;
2545 printf (" %2.2d ", i);
2547 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2549 if (section->sh_size > 0
2550 /* Compare allocated sections by VMA, unallocated
2551 sections by file offset. */
2552 && (section->sh_flags & SHF_ALLOC
2553 ? (section->sh_addr >= segment->p_vaddr
2554 && section->sh_addr + section->sh_size
2555 <= segment->p_vaddr + segment->p_memsz)
2556 : ((bfd_vma) section->sh_offset >= segment->p_offset
2557 && (section->sh_offset + section->sh_size
2558 <= segment->p_offset + segment->p_filesz))))
2559 printf ("%s ", SECTION_NAME (section));
2566 free (program_headers);
2573 get_32bit_section_headers (file)
2576 Elf32_External_Shdr * shdrs;
2577 Elf32_Internal_Shdr * internal;
2580 GET_DATA_ALLOC (elf_header.e_shoff,
2581 elf_header.e_shentsize * elf_header.e_shnum,
2582 shdrs, Elf32_External_Shdr *, "section headers");
2584 section_headers = (Elf_Internal_Shdr *) malloc
2585 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2587 if (section_headers == NULL)
2589 error (_("Out of memory\n"));
2593 for (i = 0, internal = section_headers;
2594 i < elf_header.e_shnum;
2597 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2598 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2599 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2600 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2601 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2602 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2603 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2604 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2605 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2606 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2615 get_64bit_section_headers (file)
2618 Elf64_External_Shdr * shdrs;
2619 Elf64_Internal_Shdr * internal;
2622 GET_DATA_ALLOC (elf_header.e_shoff,
2623 elf_header.e_shentsize * elf_header.e_shnum,
2624 shdrs, Elf64_External_Shdr *, "section headers");
2626 section_headers = (Elf_Internal_Shdr *) malloc
2627 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2629 if (section_headers == NULL)
2631 error (_("Out of memory\n"));
2635 for (i = 0, internal = section_headers;
2636 i < elf_header.e_shnum;
2639 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2640 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2641 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2642 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2643 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2644 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2645 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2646 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2647 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2648 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2656 static Elf_Internal_Sym *
2657 get_32bit_elf_symbols (file, offset, number)
2659 unsigned long offset;
2660 unsigned long number;
2662 Elf32_External_Sym * esyms;
2663 Elf_Internal_Sym * isyms;
2664 Elf_Internal_Sym * psym;
2667 GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2668 esyms, Elf32_External_Sym *, "symbols");
2670 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2674 error (_("Out of memory\n"));
2680 for (j = 0, psym = isyms;
2684 psym->st_name = BYTE_GET (esyms[j].st_name);
2685 psym->st_value = BYTE_GET (esyms[j].st_value);
2686 psym->st_size = BYTE_GET (esyms[j].st_size);
2687 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2688 psym->st_info = BYTE_GET (esyms[j].st_info);
2689 psym->st_other = BYTE_GET (esyms[j].st_other);
2697 static Elf_Internal_Sym *
2698 get_64bit_elf_symbols (file, offset, number)
2700 unsigned long offset;
2701 unsigned long number;
2703 Elf64_External_Sym * esyms;
2704 Elf_Internal_Sym * isyms;
2705 Elf_Internal_Sym * psym;
2708 GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2709 esyms, Elf64_External_Sym *, "symbols");
2711 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2715 error (_("Out of memory\n"));
2721 for (j = 0, psym = isyms;
2725 psym->st_name = BYTE_GET (esyms[j].st_name);
2726 psym->st_info = BYTE_GET (esyms[j].st_info);
2727 psym->st_other = BYTE_GET (esyms[j].st_other);
2728 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2729 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2730 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2739 get_elf_section_flags (sh_flags)
2742 static char buff [32];
2750 flag = sh_flags & - sh_flags;
2755 case SHF_WRITE: strcat (buff, "W"); break;
2756 case SHF_ALLOC: strcat (buff, "A"); break;
2757 case SHF_EXECINSTR: strcat (buff, "X"); break;
2758 case SHF_MERGE: strcat (buff, "M"); break;
2759 case SHF_STRINGS: strcat (buff, "S"); break;
2760 case SHF_INFO_LINK: strcat (buff, "I"); break;
2761 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2762 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2763 case SHF_GROUP: strcat (buff, "G"); break;
2766 if (flag & SHF_MASKOS)
2769 sh_flags &= ~ SHF_MASKOS;
2771 else if (flag & SHF_MASKPROC)
2774 sh_flags &= ~ SHF_MASKPROC;
2786 process_section_headers (file)
2789 Elf_Internal_Shdr * section;
2792 section_headers = NULL;
2794 if (elf_header.e_shnum == 0)
2797 printf (_("\nThere are no sections in this file.\n"));
2802 if (do_sections && !do_header)
2803 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2804 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2808 if (! get_32bit_section_headers (file))
2811 else if (! get_64bit_section_headers (file))
2814 /* Read in the string table, so that we have names to display. */
2815 section = section_headers + elf_header.e_shstrndx;
2817 if (section->sh_size != 0)
2819 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2820 string_table, char *, "string table");
2822 string_table_length = section->sh_size;
2825 /* Scan the sections for the dynamic symbol table
2826 and dynamic string table and debug sections. */
2827 dynamic_symbols = NULL;
2828 dynamic_strings = NULL;
2829 dynamic_syminfo = NULL;
2831 for (i = 0, section = section_headers;
2832 i < elf_header.e_shnum;
2835 char * name = SECTION_NAME (section);
2837 if (section->sh_type == SHT_DYNSYM)
2839 if (dynamic_symbols != NULL)
2841 error (_("File contains multiple dynamic symbol tables\n"));
2845 num_dynamic_syms = section->sh_size / section->sh_entsize;
2847 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2849 else if (section->sh_type == SHT_STRTAB
2850 && strcmp (name, ".dynstr") == 0)
2852 if (dynamic_strings != NULL)
2854 error (_("File contains multiple dynamic string tables\n"));
2858 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2859 dynamic_strings, char *, "dynamic strings");
2861 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2862 || do_debug_lines || do_debug_pubnames || do_debug_aranges || do_debug_frames)
2863 && strncmp (name, ".debug_", 7) == 0)
2868 || (do_debug_info && (strcmp (name, "info") == 0))
2869 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2870 || (do_debug_lines && (strcmp (name, "line") == 0))
2871 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2872 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2873 || (do_debug_frames && (strcmp (name, "frame") == 0))
2875 request_dump (i, DEBUG_DUMP);
2877 /* linkonce section to be combined with .debug_info at link time. */
2878 else if ((do_debugging || do_debug_info)
2879 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
2880 request_dump (i, DEBUG_DUMP);
2881 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
2882 request_dump (i, DEBUG_DUMP);
2888 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2892 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2895 printf (_(" [Nr] Name Type Address Offset\n"));
2896 printf (_(" Size EntSize Flags Link Info Align\n"));
2899 for (i = 0, section = section_headers;
2900 i < elf_header.e_shnum;
2903 printf (" [%2d] %-17.17s %-15.15s ",
2905 SECTION_NAME (section),
2906 get_section_type_name (section->sh_type));
2910 print_vma (section->sh_addr, LONG_HEX);
2912 printf ( " %6.6lx %6.6lx %2.2lx",
2913 (unsigned long) section->sh_offset,
2914 (unsigned long) section->sh_size,
2915 (unsigned long) section->sh_entsize);
2917 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2919 printf ("%2ld %3lx %2ld\n",
2920 (unsigned long) section->sh_link,
2921 (unsigned long) section->sh_info,
2922 (unsigned long) section->sh_addralign);
2927 print_vma (section->sh_addr, LONG_HEX);
2928 printf (" %8.8lx", section->sh_offset);
2930 print_vma (section->sh_size, LONG_HEX);
2932 print_vma (section->sh_entsize, LONG_HEX);
2934 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2936 printf (" %2ld %3lx %ld\n",
2937 (unsigned long) section->sh_link,
2938 (unsigned long) section->sh_info,
2939 (unsigned long) section->sh_addralign);
2943 printf (_("Key to Flags:\n"));
2944 printf (_(" W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2945 printf (_(" I (info), L (link order), G (group), x (unknown)\n"));
2946 printf (_(" O (extra OS processing required) o (OS specific), p (processor specific)\n"));
2951 /* Process the reloc section. */
2953 process_relocs (file)
2956 unsigned long rel_size;
2957 unsigned long rel_offset;
2963 if (do_using_dynamic)
2965 int is_rela = FALSE;
2970 if (dynamic_info[DT_REL])
2972 rel_offset = dynamic_info[DT_REL];
2973 rel_size = dynamic_info[DT_RELSZ];
2976 else if (dynamic_info [DT_RELA])
2978 rel_offset = dynamic_info[DT_RELA];
2979 rel_size = dynamic_info[DT_RELASZ];
2982 else if (dynamic_info[DT_JMPREL])
2984 rel_offset = dynamic_info[DT_JMPREL];
2985 rel_size = dynamic_info[DT_PLTRELSZ];
2987 switch (dynamic_info[DT_PLTREL])
3004 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3005 rel_offset, rel_size);
3007 dump_relocations (file, rel_offset - loadaddr, rel_size,
3008 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3011 printf (_("\nThere are no dynamic relocations in this file.\n"));
3015 Elf32_Internal_Shdr * section;
3019 for (i = 0, section = section_headers;
3020 i < elf_header.e_shnum;
3023 if ( section->sh_type != SHT_RELA
3024 && section->sh_type != SHT_REL)
3027 rel_offset = section->sh_offset;
3028 rel_size = section->sh_size;
3032 Elf32_Internal_Shdr * strsec;
3033 Elf32_Internal_Shdr * symsec;
3034 Elf_Internal_Sym * symtab;
3037 unsigned long nsyms;
3039 printf (_("\nRelocation section "));
3041 if (string_table == NULL)
3042 printf ("%d", section->sh_name);
3044 printf ("'%s'", SECTION_NAME (section));
3046 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3047 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3049 symsec = section_headers + section->sh_link;
3051 nsyms = symsec->sh_size / symsec->sh_entsize;
3052 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
3057 strsec = section_headers + symsec->sh_link;
3059 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
3060 char *, "string table");
3062 is_rela = section->sh_type == SHT_RELA;
3064 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
3074 printf (_("\nThere are no relocations in this file.\n"));
3080 #include "unwind-ia64.h"
3082 /* An absolute address consists of a section and an offset. If the
3083 section is NULL, the offset itself is the address, otherwise, the
3084 address equals to LOAD_ADDRESS(section) + offset. */
3088 unsigned short section;
3094 struct unw_table_entry
3096 struct absaddr start;
3098 struct absaddr info;
3100 *table; /* Unwind table. */
3101 unsigned long table_len; /* Length of unwind table. */
3102 const unsigned char * info; /* Unwind info. */
3103 unsigned long info_size; /* Size of unwind info. */
3104 bfd_vma info_addr; /* starting address of unwind info. */
3105 bfd_vma seg_base; /* Starting address of segment. */
3106 Elf_Internal_Sym * symtab; /* The symbol table. */
3107 unsigned long nsyms; /* Number of symbols. */
3108 const char * strtab; /* The string table. */
3109 unsigned long strtab_size; /* Size of string table. */
3112 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3113 struct absaddr, const char **,
3115 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3116 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3117 Elf32_Internal_Shdr *));
3120 find_symbol_for_address (aux, addr, symname, offset)
3121 struct unw_aux_info *aux;
3122 struct absaddr addr;
3123 const char **symname;
3126 bfd_vma dist = (bfd_vma) 0x100000;
3127 Elf_Internal_Sym *sym, *best = NULL;
3130 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3132 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3133 && sym->st_name != 0
3134 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3135 && addr.offset >= sym->st_value
3136 && addr.offset - sym->st_value < dist)
3139 dist = addr.offset - sym->st_value;
3146 *symname = (best->st_name >= aux->strtab_size
3147 ? "<corrupt>" : aux->strtab + best->st_name);
3152 *offset = addr.offset;
3156 dump_ia64_unwind (aux)
3157 struct unw_aux_info *aux;
3160 struct unw_table_entry * tp;
3163 addr_size = is_32bit_elf ? 4 : 8;
3165 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3169 const unsigned char * dp;
3170 const unsigned char * head;
3171 const char * procname;
3173 find_symbol_for_address (aux, tp->start, &procname, &offset);
3175 fputs ("\n<", stdout);
3179 fputs (procname, stdout);
3182 printf ("+%lx", (unsigned long) offset);
3185 fputs (">: [", stdout);
3186 print_vma (tp->start.offset, PREFIX_HEX);
3187 fputc ('-', stdout);
3188 print_vma (tp->end.offset, PREFIX_HEX);
3189 printf ("), info at +0x%lx\n",
3190 (unsigned long) (tp->info.offset - aux->seg_base));
3192 head = aux->info + (tp->info.offset - aux->info_addr);
3193 stamp = BYTE_GET8 ((unsigned char *) head);
3195 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3196 (unsigned) UNW_VER (stamp),
3197 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3198 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3199 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3200 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3202 if (UNW_VER (stamp) != 1)
3204 printf ("\tUnknown version.\n");
3209 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3210 dp = unw_decode (dp, in_body, & in_body);
3215 slurp_ia64_unwind_table (file, aux, sec)
3217 struct unw_aux_info *aux;
3218 Elf32_Internal_Shdr *sec;
3220 unsigned long size, addr_size, nrelas, i;
3221 Elf_Internal_Phdr *prog_hdrs, *seg;
3222 struct unw_table_entry *tep;
3223 Elf32_Internal_Shdr *relsec;
3224 Elf_Internal_Rela *rela, *rp;
3225 unsigned char *table, *tp;
3226 Elf_Internal_Sym *sym;
3227 const char *relname;
3230 addr_size = is_32bit_elf ? 4 : 8;
3232 /* First, find the starting address of the segment that includes
3235 if (elf_header.e_phnum)
3237 prog_hdrs = (Elf_Internal_Phdr *)
3238 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3241 result = get_32bit_program_headers (file, prog_hdrs);
3243 result = get_64bit_program_headers (file, prog_hdrs);
3251 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3253 if (seg->p_type != PT_LOAD)
3256 if (sec->sh_addr >= seg->p_vaddr
3257 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3259 aux->seg_base = seg->p_vaddr;
3267 /* Second, build the unwind table from the contents of the unwind section: */
3268 size = sec->sh_size;
3269 GET_DATA_ALLOC (sec->sh_offset, size, table, char *, "unwind table");
3271 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3272 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3274 tep->start.section = SHN_UNDEF;
3275 tep->end.section = SHN_UNDEF;
3276 tep->info.section = SHN_UNDEF;
3279 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3280 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3281 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3285 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3286 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3287 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3289 tep->start.offset += aux->seg_base;
3290 tep->end.offset += aux->seg_base;
3291 tep->info.offset += aux->seg_base;
3295 /* Third, apply any relocations to the unwind table: */
3297 for (relsec = section_headers;
3298 relsec < section_headers + elf_header.e_shnum;
3301 if (relsec->sh_type != SHT_RELA
3302 || section_headers + relsec->sh_info != sec)
3305 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3309 for (rp = rela; rp < rela + nrelas; ++rp)
3313 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3314 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3316 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3318 warn (_("Skipping unexpected symbol type %u"),
3319 ELF32_ST_TYPE (sym->st_info));
3325 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3326 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3328 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3330 warn (_("Skipping unexpected symbol type %u"),
3331 ELF64_ST_TYPE (sym->st_info));
3336 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3338 warn (_("Skipping unexpected relocation type %s"), relname);
3342 i = rp->r_offset / (3 * addr_size);
3344 switch (rp->r_offset/addr_size % 3)
3347 aux->table[i].start.section = sym->st_shndx;
3348 aux->table[i].start.offset += rp->r_addend;
3351 aux->table[i].end.section = sym->st_shndx;
3352 aux->table[i].end.offset += rp->r_addend;
3355 aux->table[i].info.section = sym->st_shndx;
3356 aux->table[i].info.offset += rp->r_addend;
3366 aux->table_len = size / (3 * addr_size);
3371 process_unwind (file)
3374 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3375 unsigned long i, addr_size;
3376 struct unw_aux_info aux;
3378 memset (& aux, 0, sizeof (aux));
3380 addr_size = is_32bit_elf ? 4 : 8;
3385 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3387 if (sec->sh_type == SHT_SYMTAB)
3389 aux.nsyms = sec->sh_size / sec->sh_entsize;
3390 aux.symtab = GET_ELF_SYMBOLS (file, sec->sh_offset, aux.nsyms);
3392 strsec = section_headers + sec->sh_link;
3393 aux.strtab_size = strsec->sh_size;
3394 GET_DATA_ALLOC (strsec->sh_offset, aux.strtab_size,
3395 (char *) aux.strtab, char *, "string table");
3397 else if (sec->sh_type == SHT_IA_64_UNWIND)
3399 else if (strcmp (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info) == 0)
3401 aux.info_size = sec->sh_size;
3402 aux.info_addr = sec->sh_addr;
3403 GET_DATA_ALLOC (sec->sh_offset, aux.info_size, (char *) aux.info,
3404 char *, "unwind info");
3410 printf (_("\nUnwind section "));
3412 if (string_table == NULL)
3413 printf ("%d", unwsec->sh_name);
3415 printf ("'%s'", SECTION_NAME (unwsec));
3417 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3418 unwsec->sh_offset, (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3420 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3422 if (aux.table_len > 0)
3423 dump_ia64_unwind (& aux);
3426 printf (_("\nThere are no unwind sections in this file.\n"));
3429 free ((char *) aux.table);
3431 free ((char *) aux.info);
3435 free ((char *) aux.strtab);
3441 dynamic_segment_mips_val (entry)
3442 Elf_Internal_Dyn * entry;
3444 switch (entry->d_tag)
3447 if (entry->d_un.d_val == 0)
3451 static const char * opts[] =
3453 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3454 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3455 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3456 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3461 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3462 if (entry->d_un.d_val & (1 << cnt))
3464 printf ("%s%s", first ? "" : " ", opts[cnt]);
3471 case DT_MIPS_IVERSION:
3472 if (dynamic_strings != NULL)
3473 printf ("Interface Version: %s\n",
3474 dynamic_strings + entry->d_un.d_val);
3476 printf ("%ld\n", (long) entry->d_un.d_ptr);
3479 case DT_MIPS_TIME_STAMP:
3484 time_t time = entry->d_un.d_val;
3485 tmp = gmtime (&time);
3486 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3487 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3488 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3489 printf ("Time Stamp: %s\n", timebuf);
3493 case DT_MIPS_RLD_VERSION:
3494 case DT_MIPS_LOCAL_GOTNO:
3495 case DT_MIPS_CONFLICTNO:
3496 case DT_MIPS_LIBLISTNO:
3497 case DT_MIPS_SYMTABNO:
3498 case DT_MIPS_UNREFEXTNO:
3499 case DT_MIPS_HIPAGENO:
3500 case DT_MIPS_DELTA_CLASS_NO:
3501 case DT_MIPS_DELTA_INSTANCE_NO:
3502 case DT_MIPS_DELTA_RELOC_NO:
3503 case DT_MIPS_DELTA_SYM_NO:
3504 case DT_MIPS_DELTA_CLASSSYM_NO:
3505 case DT_MIPS_COMPACT_SIZE:
3506 printf ("%ld\n", (long) entry->d_un.d_ptr);
3510 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3516 dynamic_segment_parisc_val (entry)
3517 Elf_Internal_Dyn * entry;
3519 switch (entry->d_tag)
3521 case DT_HP_DLD_FLAGS:
3530 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3531 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3532 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3533 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3534 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3535 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3536 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3537 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3538 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3539 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3540 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3544 bfd_vma val = entry->d_un.d_val;
3546 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3547 if (val & flags[cnt].bit)
3551 fputs (flags[cnt].str, stdout);
3553 val ^= flags[cnt].bit;
3556 if (val != 0 || first)
3560 print_vma (val, HEX);
3566 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3572 get_32bit_dynamic_segment (file)
3575 Elf32_External_Dyn * edyn;
3576 Elf_Internal_Dyn * entry;
3579 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3580 edyn, Elf32_External_Dyn *, "dynamic segment");
3582 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3583 how large this .dynamic is now. We can do this even before the byte
3584 swapping since the DT_NULL tag is recognizable. */
3586 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3589 dynamic_segment = (Elf_Internal_Dyn *)
3590 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3592 if (dynamic_segment == NULL)
3594 error (_("Out of memory\n"));
3599 for (i = 0, entry = dynamic_segment;
3603 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3604 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3613 get_64bit_dynamic_segment (file)
3616 Elf64_External_Dyn * edyn;
3617 Elf_Internal_Dyn * entry;
3620 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3621 edyn, Elf64_External_Dyn *, "dynamic segment");
3623 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3624 how large this .dynamic is now. We can do this even before the byte
3625 swapping since the DT_NULL tag is recognizable. */
3627 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3630 dynamic_segment = (Elf_Internal_Dyn *)
3631 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3633 if (dynamic_segment == NULL)
3635 error (_("Out of memory\n"));
3640 for (i = 0, entry = dynamic_segment;
3644 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3645 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3654 get_dynamic_flags (flags)
3657 static char buff [64];
3662 flag = flags & - flags;
3667 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3668 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3669 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3670 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3671 default: strcat (buff, "unknown "); break;
3677 /* Parse and display the contents of the dynamic segment. */
3679 process_dynamic_segment (file)
3682 Elf_Internal_Dyn * entry;
3685 if (dynamic_size == 0)
3688 printf (_("\nThere is no dynamic segment in this file.\n"));
3695 if (! get_32bit_dynamic_segment (file))
3698 else if (! get_64bit_dynamic_segment (file))
3701 /* Find the appropriate symbol table. */
3702 if (dynamic_symbols == NULL)
3704 for (i = 0, entry = dynamic_segment;
3708 unsigned long offset;
3710 if (entry->d_tag != DT_SYMTAB)
3713 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3715 /* Since we do not know how big the symbol table is,
3716 we default to reading in the entire file (!) and
3717 processing that. This is overkill, I know, but it
3719 offset = entry->d_un.d_val - loadaddr;
3721 if (fseek (file, 0, SEEK_END))
3722 error (_("Unable to seek to end of file!"));
3725 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3727 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3729 if (num_dynamic_syms < 1)
3731 error (_("Unable to determine the number of symbols to load\n"));
3735 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3739 /* Similarly find a string table. */
3740 if (dynamic_strings == NULL)
3742 for (i = 0, entry = dynamic_segment;
3746 unsigned long offset;
3749 if (entry->d_tag != DT_STRTAB)
3752 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3754 /* Since we do not know how big the string table is,
3755 we default to reading in the entire file (!) and
3756 processing that. This is overkill, I know, but it
3759 offset = entry->d_un.d_val - loadaddr;
3760 if (fseek (file, 0, SEEK_END))
3761 error (_("Unable to seek to end of file\n"));
3762 str_tab_len = ftell (file) - offset;
3764 if (str_tab_len < 1)
3767 (_("Unable to determine the length of the dynamic string table\n"));
3771 GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
3772 "dynamic string table");
3778 /* And find the syminfo section if available. */
3779 if (dynamic_syminfo == NULL)
3781 unsigned int syminsz = 0;
3783 for (i = 0, entry = dynamic_segment;
3787 if (entry->d_tag == DT_SYMINENT)
3789 /* Note: these braces are necessary to avoid a syntax
3790 error from the SunOS4 C compiler. */
3791 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3793 else if (entry->d_tag == DT_SYMINSZ)
3794 syminsz = entry->d_un.d_val;
3795 else if (entry->d_tag == DT_SYMINFO)
3796 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
3799 if (dynamic_syminfo_offset != 0 && syminsz != 0)
3801 Elf_External_Syminfo * extsyminfo;
3802 Elf_Internal_Syminfo * syminfo;
3804 /* There is a syminfo section. Read the data. */
3805 GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3806 Elf_External_Syminfo *, "symbol information");
3808 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3809 if (dynamic_syminfo == NULL)
3811 error (_("Out of memory\n"));
3815 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3816 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3819 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3820 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3827 if (do_dynamic && dynamic_addr)
3828 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3829 dynamic_addr, (long) dynamic_size);
3831 printf (_(" Tag Type Name/Value\n"));
3833 for (i = 0, entry = dynamic_segment;
3842 print_vma (entry->d_tag, FULL_HEX);
3843 dtype = get_dynamic_type (entry->d_tag);
3844 printf (" (%s)%*s", dtype,
3845 ((is_32bit_elf ? 27 : 19)
3846 - (int) strlen (dtype)),
3850 switch (entry->d_tag)
3854 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
3864 switch (entry->d_tag)
3867 printf (_("Auxiliary library"));
3871 printf (_("Filter library"));
3875 printf (_("Configuration file"));
3879 printf (_("Dependency audit library"));
3883 printf (_("Audit library"));
3887 if (dynamic_strings)
3888 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3892 print_vma (entry->d_un.d_val, PREFIX_HEX);
3901 printf (_("Flags:"));
3902 if (entry->d_un.d_val == 0)
3903 printf (_(" None\n"));
3906 unsigned long int val = entry->d_un.d_val;
3907 if (val & DTF_1_PARINIT)
3909 printf (" PARINIT");
3910 val ^= DTF_1_PARINIT;
3912 if (val & DTF_1_CONFEXP)
3914 printf (" CONFEXP");
3915 val ^= DTF_1_CONFEXP;
3918 printf (" %lx", val);
3927 printf (_("Flags:"));
3928 if (entry->d_un.d_val == 0)
3929 printf (_(" None\n"));
3932 unsigned long int val = entry->d_un.d_val;
3933 if (val & DF_P1_LAZYLOAD)
3935 printf (" LAZYLOAD");
3936 val ^= DF_P1_LAZYLOAD;
3938 if (val & DF_P1_GROUPPERM)
3940 printf (" GROUPPERM");
3941 val ^= DF_P1_GROUPPERM;
3944 printf (" %lx", val);
3953 printf (_("Flags:"));
3954 if (entry->d_un.d_val == 0)
3955 printf (_(" None\n"));
3958 unsigned long int val = entry->d_un.d_val;
3964 if (val & DF_1_GLOBAL)
3969 if (val & DF_1_GROUP)
3974 if (val & DF_1_NODELETE)
3976 printf (" NODELETE");
3977 val ^= DF_1_NODELETE;
3979 if (val & DF_1_LOADFLTR)
3981 printf (" LOADFLTR");
3982 val ^= DF_1_LOADFLTR;
3984 if (val & DF_1_INITFIRST)
3986 printf (" INITFIRST");
3987 val ^= DF_1_INITFIRST;
3989 if (val & DF_1_NOOPEN)
3994 if (val & DF_1_ORIGIN)
3999 if (val & DF_1_DIRECT)
4004 if (val & DF_1_TRANS)
4009 if (val & DF_1_INTERPOSE)
4011 printf (" INTERPOSE");
4012 val ^= DF_1_INTERPOSE;
4014 if (val & DF_1_NODEFLIB)
4016 printf (" NODEFLIB");
4017 val ^= DF_1_NODEFLIB;
4019 if (val & DF_1_NODUMP)
4024 if (val & DF_1_CONLFAT)
4026 printf (" CONLFAT");
4027 val ^= DF_1_CONLFAT;
4030 printf (" %lx", val);
4038 puts (get_dynamic_type (entry->d_un.d_val));
4058 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4064 if (dynamic_strings == NULL)
4067 name = dynamic_strings + entry->d_un.d_val;
4071 switch (entry->d_tag)
4074 printf (_("Shared library: [%s]"), name);
4076 if (strcmp (name, program_interpreter) == 0)
4077 printf (_(" program interpreter"));
4081 printf (_("Library soname: [%s]"), name);
4085 printf (_("Library rpath: [%s]"), name);
4089 printf (_("Library runpath: [%s]"), name);
4093 print_vma (entry->d_un.d_val, PREFIX_HEX);
4098 print_vma (entry->d_un.d_val, PREFIX_HEX);
4114 case DT_INIT_ARRAYSZ:
4115 case DT_FINI_ARRAYSZ:
4118 print_vma (entry->d_un.d_val, UNSIGNED);
4119 printf (" (bytes)\n");
4129 print_vma (entry->d_un.d_val, UNSIGNED);
4142 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4146 name = dynamic_strings + entry->d_un.d_val;
4150 printf (_("Not needed object: [%s]\n"), name);
4155 print_vma (entry->d_un.d_val, PREFIX_HEX);
4161 /* The value of this entry is ignored. */
4165 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4166 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4171 switch (elf_header.e_machine)
4174 case EM_MIPS_RS4_BE:
4175 dynamic_segment_mips_val (entry);
4178 dynamic_segment_parisc_val (entry);
4181 print_vma (entry->d_un.d_val, PREFIX_HEX);
4193 get_ver_flags (flags)
4196 static char buff [32];
4203 if (flags & VER_FLG_BASE)
4204 strcat (buff, "BASE ");
4206 if (flags & VER_FLG_WEAK)
4208 if (flags & VER_FLG_BASE)
4209 strcat (buff, "| ");
4211 strcat (buff, "WEAK ");
4214 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4215 strcat (buff, "| <unknown>");
4220 /* Display the contents of the version sections. */
4222 process_version_sections (file)
4225 Elf32_Internal_Shdr * section;
4232 for (i = 0, section = section_headers;
4233 i < elf_header.e_shnum;
4236 switch (section->sh_type)
4238 case SHT_GNU_verdef:
4240 Elf_External_Verdef * edefs;
4247 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4248 SECTION_NAME (section), section->sh_info);
4250 printf (_(" Addr: 0x"));
4251 printf_vma (section->sh_addr);
4252 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4253 (unsigned long) section->sh_offset, section->sh_link,
4254 SECTION_NAME (section_headers + section->sh_link));
4256 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
4257 edefs, Elf_External_Verdef *,
4258 "version definition section");
4260 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4263 Elf_External_Verdef * edef;
4264 Elf_Internal_Verdef ent;
4265 Elf_External_Verdaux * eaux;
4266 Elf_Internal_Verdaux aux;
4270 vstart = ((char *) edefs) + idx;
4272 edef = (Elf_External_Verdef *) vstart;
4274 ent.vd_version = BYTE_GET (edef->vd_version);
4275 ent.vd_flags = BYTE_GET (edef->vd_flags);
4276 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4277 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4278 ent.vd_hash = BYTE_GET (edef->vd_hash);
4279 ent.vd_aux = BYTE_GET (edef->vd_aux);
4280 ent.vd_next = BYTE_GET (edef->vd_next);
4282 printf (_(" %#06x: Rev: %d Flags: %s"),
4283 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4285 printf (_(" Index: %d Cnt: %d "),
4286 ent.vd_ndx, ent.vd_cnt);
4288 vstart += ent.vd_aux;
4290 eaux = (Elf_External_Verdaux *) vstart;
4292 aux.vda_name = BYTE_GET (eaux->vda_name);
4293 aux.vda_next = BYTE_GET (eaux->vda_next);
4295 if (dynamic_strings)
4296 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4298 printf (_("Name index: %ld\n"), aux.vda_name);
4300 isum = idx + ent.vd_aux;
4302 for (j = 1; j < ent.vd_cnt; j ++)
4304 isum += aux.vda_next;
4305 vstart += aux.vda_next;
4307 eaux = (Elf_External_Verdaux *) vstart;
4309 aux.vda_name = BYTE_GET (eaux->vda_name);
4310 aux.vda_next = BYTE_GET (eaux->vda_next);
4312 if (dynamic_strings)
4313 printf (_(" %#06x: Parent %d: %s\n"),
4314 isum, j, dynamic_strings + aux.vda_name);
4316 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4317 isum, j, aux.vda_name);
4327 case SHT_GNU_verneed:
4329 Elf_External_Verneed * eneed;
4335 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4336 SECTION_NAME (section), section->sh_info);
4338 printf (_(" Addr: 0x"));
4339 printf_vma (section->sh_addr);
4340 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4341 (unsigned long) section->sh_offset, section->sh_link,
4342 SECTION_NAME (section_headers + section->sh_link));
4344 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
4345 eneed, Elf_External_Verneed *,
4346 "version need section");
4348 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4350 Elf_External_Verneed * entry;
4351 Elf_Internal_Verneed ent;
4356 vstart = ((char *) eneed) + idx;
4358 entry = (Elf_External_Verneed *) vstart;
4360 ent.vn_version = BYTE_GET (entry->vn_version);
4361 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4362 ent.vn_file = BYTE_GET (entry->vn_file);
4363 ent.vn_aux = BYTE_GET (entry->vn_aux);
4364 ent.vn_next = BYTE_GET (entry->vn_next);
4366 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4368 if (dynamic_strings)
4369 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4371 printf (_(" File: %lx"), ent.vn_file);
4373 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4375 vstart += ent.vn_aux;
4377 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4379 Elf_External_Vernaux * eaux;
4380 Elf_Internal_Vernaux aux;
4382 eaux = (Elf_External_Vernaux *) vstart;
4384 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4385 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4386 aux.vna_other = BYTE_GET (eaux->vna_other);
4387 aux.vna_name = BYTE_GET (eaux->vna_name);
4388 aux.vna_next = BYTE_GET (eaux->vna_next);
4390 if (dynamic_strings)
4391 printf (_(" %#06x: Name: %s"),
4392 isum, dynamic_strings + aux.vna_name);
4394 printf (_(" %#06x: Name index: %lx"),
4395 isum, aux.vna_name);
4397 printf (_(" Flags: %s Version: %d\n"),
4398 get_ver_flags (aux.vna_flags), aux.vna_other);
4400 isum += aux.vna_next;
4401 vstart += aux.vna_next;
4411 case SHT_GNU_versym:
4413 Elf32_Internal_Shdr * link_section;
4416 unsigned char * edata;
4417 unsigned short * data;
4419 Elf_Internal_Sym * symbols;
4420 Elf32_Internal_Shdr * string_sec;
4422 link_section = section_headers + section->sh_link;
4423 total = section->sh_size / section->sh_entsize;
4427 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
4428 link_section->sh_size / link_section->sh_entsize);
4430 string_sec = section_headers + link_section->sh_link;
4432 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4433 strtab, char *, "version string table");
4435 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4436 SECTION_NAME (section), total);
4438 printf (_(" Addr: "));
4439 printf_vma (section->sh_addr);
4440 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4441 (unsigned long) section->sh_offset, section->sh_link,
4442 SECTION_NAME (link_section));
4444 GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4446 total * sizeof (short), edata,
4447 unsigned char *, "version symbol data");
4449 data = (unsigned short *) malloc (total * sizeof (short));
4451 for (cnt = total; cnt --;)
4452 data [cnt] = byte_get (edata + cnt * sizeof (short),
4457 for (cnt = 0; cnt < total; cnt += 4)
4460 int check_def, check_need;
4463 printf (" %03x:", cnt);
4465 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4466 switch (data [cnt + j])
4469 fputs (_(" 0 (*local*) "), stdout);
4473 fputs (_(" 1 (*global*) "), stdout);
4477 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4478 data [cnt + j] & 0x8000 ? 'h' : ' ');
4482 if (symbols [cnt + j].st_shndx >= SHN_LORESERVE
4483 || section_headers[symbols [cnt + j].st_shndx].sh_type
4486 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4493 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4495 Elf_Internal_Verneed ivn;
4496 unsigned long offset;
4498 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4503 Elf_Internal_Vernaux ivna;
4504 Elf_External_Verneed evn;
4505 Elf_External_Vernaux evna;
4506 unsigned long a_off;
4508 GET_DATA (offset, evn, "version need");
4510 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4511 ivn.vn_next = BYTE_GET (evn.vn_next);
4513 a_off = offset + ivn.vn_aux;
4517 GET_DATA (a_off, evna,
4518 "version need aux (2)");
4520 ivna.vna_next = BYTE_GET (evna.vna_next);
4521 ivna.vna_other = BYTE_GET (evna.vna_other);
4523 a_off += ivna.vna_next;
4525 while (ivna.vna_other != data [cnt + j]
4526 && ivna.vna_next != 0);
4528 if (ivna.vna_other == data [cnt + j])
4530 ivna.vna_name = BYTE_GET (evna.vna_name);
4532 name = strtab + ivna.vna_name;
4533 nn += printf ("(%s%-*s",
4535 12 - (int) strlen (name),
4541 offset += ivn.vn_next;
4543 while (ivn.vn_next);
4546 if (check_def && data [cnt + j] != 0x8001
4547 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4549 Elf_Internal_Verdef ivd;
4550 Elf_External_Verdef evd;
4551 unsigned long offset;
4553 offset = version_info
4554 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4558 GET_DATA (offset, evd, "version def");
4560 ivd.vd_next = BYTE_GET (evd.vd_next);
4561 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4563 offset += ivd.vd_next;
4565 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4566 && ivd.vd_next != 0);
4568 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4570 Elf_External_Verdaux evda;
4571 Elf_Internal_Verdaux ivda;
4573 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4575 GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
4576 evda, "version def aux");
4578 ivda.vda_name = BYTE_GET (evda.vda_name);
4580 name = strtab + ivda.vda_name;
4581 nn += printf ("(%s%-*s",
4583 12 - (int) strlen (name),
4589 printf ("%*c", 18 - nn, ' ');
4607 printf (_("\nNo version information found in this file.\n"));
4613 get_symbol_binding (binding)
4614 unsigned int binding;
4616 static char buff [32];
4620 case STB_LOCAL: return "LOCAL";
4621 case STB_GLOBAL: return "GLOBAL";
4622 case STB_WEAK: return "WEAK";
4624 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4625 sprintf (buff, _("<processor specific>: %d"), binding);
4626 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4627 sprintf (buff, _("<OS specific>: %d"), binding);
4629 sprintf (buff, _("<unknown>: %d"), binding);
4635 get_symbol_type (type)
4638 static char buff [32];
4642 case STT_NOTYPE: return "NOTYPE";
4643 case STT_OBJECT: return "OBJECT";
4644 case STT_FUNC: return "FUNC";
4645 case STT_SECTION: return "SECTION";
4646 case STT_FILE: return "FILE";
4647 case STT_COMMON: return "COMMON";
4649 if (type >= STT_LOPROC && type <= STT_HIPROC)
4651 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4652 return "THUMB_FUNC";
4654 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4657 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4658 return "PARISC_MILLI";
4660 sprintf (buff, _("<processor specific>: %d"), type);
4662 else if (type >= STT_LOOS && type <= STT_HIOS)
4664 if (elf_header.e_machine == EM_PARISC)
4666 if (type == STT_HP_OPAQUE)
4668 if (type == STT_HP_STUB)
4672 sprintf (buff, _("<OS specific>: %d"), type);
4675 sprintf (buff, _("<unknown>: %d"), type);
4681 get_symbol_visibility (visibility)
4682 unsigned int visibility;
4686 case STV_DEFAULT: return "DEFAULT";
4687 case STV_INTERNAL: return "INTERNAL";
4688 case STV_HIDDEN: return "HIDDEN";
4689 case STV_PROTECTED: return "PROTECTED";
4695 get_symbol_index_type (type)
4700 case SHN_UNDEF: return "UND";
4701 case SHN_ABS: return "ABS";
4702 case SHN_COMMON: return "COM";
4704 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4706 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4708 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4712 static char buff [32];
4714 sprintf (buff, "%3d", type);
4721 get_dynamic_data (file, number)
4723 unsigned int number;
4725 unsigned char * e_data;
4728 e_data = (unsigned char *) malloc (number * 4);
4732 error (_("Out of memory\n"));
4736 if (fread (e_data, 4, number, file) != number)
4738 error (_("Unable to read in dynamic data\n"));
4742 i_data = (int *) malloc (number * sizeof (* i_data));
4746 error (_("Out of memory\n"));
4752 i_data [number] = byte_get (e_data + number * 4, 4);
4759 /* Dump the symbol table */
4761 process_symbol_table (file)
4764 Elf32_Internal_Shdr * section;
4765 unsigned char nb [4];
4766 unsigned char nc [4];
4769 int * buckets = NULL;
4770 int * chains = NULL;
4772 if (! do_syms && !do_histogram)
4775 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
4778 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
4780 error (_("Unable to seek to start of dynamic information"));
4784 if (fread (nb, sizeof (nb), 1, file) != 1)
4786 error (_("Failed to read in number of buckets\n"));
4790 if (fread (nc, sizeof (nc), 1, file) != 1)
4792 error (_("Failed to read in number of chains\n"));
4796 nbuckets = byte_get (nb, 4);
4797 nchains = byte_get (nc, 4);
4799 buckets = get_dynamic_data (file, nbuckets);
4800 chains = get_dynamic_data (file, nchains);
4802 if (buckets == NULL || chains == NULL)
4807 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4812 printf (_("\nSymbol table for image:\n"));
4814 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4816 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4818 for (hn = 0; hn < nbuckets; hn++)
4823 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4825 Elf_Internal_Sym * psym;
4827 psym = dynamic_symbols + si;
4829 printf (" %3d %3d: ", si, hn);
4830 print_vma (psym->st_value, LONG_HEX);
4832 print_vma (psym->st_size, DEC_5);
4834 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4835 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4836 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4837 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
4838 printf (" %s\n", dynamic_strings + psym->st_name);
4842 else if (do_syms && !do_using_dynamic)
4846 for (i = 0, section = section_headers;
4847 i < elf_header.e_shnum;
4852 Elf_Internal_Sym * symtab;
4853 Elf_Internal_Sym * psym;
4856 if ( section->sh_type != SHT_SYMTAB
4857 && section->sh_type != SHT_DYNSYM)
4860 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4861 SECTION_NAME (section),
4862 (unsigned long) (section->sh_size / section->sh_entsize));
4864 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4866 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4868 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4869 section->sh_size / section->sh_entsize);
4873 if (section->sh_link == elf_header.e_shstrndx)
4874 strtab = string_table;
4877 Elf32_Internal_Shdr * string_sec;
4879 string_sec = section_headers + section->sh_link;
4881 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4882 strtab, char *, "string table");
4885 for (si = 0, psym = symtab;
4886 si < section->sh_size / section->sh_entsize;
4889 printf ("%6d: ", si);
4890 print_vma (psym->st_value, LONG_HEX);
4892 print_vma (psym->st_size, DEC_5);
4893 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4894 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4895 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4896 printf (" %4s", get_symbol_index_type (psym->st_shndx));
4897 printf (" %s", strtab + psym->st_name);
4899 if (section->sh_type == SHT_DYNSYM &&
4900 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4902 unsigned char data[2];
4903 unsigned short vers_data;
4904 unsigned long offset;
4908 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4911 GET_DATA (offset + si * sizeof (vers_data), data,
4914 vers_data = byte_get (data, 2);
4916 is_nobits = psym->st_shndx < SHN_LORESERVE ?
4917 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4920 check_def = (psym->st_shndx != SHN_UNDEF);
4922 if ((vers_data & 0x8000) || vers_data > 1)
4924 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4925 && (is_nobits || ! check_def))
4927 Elf_External_Verneed evn;
4928 Elf_Internal_Verneed ivn;
4929 Elf_Internal_Vernaux ivna;
4931 /* We must test both. */
4932 offset = version_info
4933 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4937 unsigned long vna_off;
4939 GET_DATA (offset, evn, "version need");
4941 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4942 ivn.vn_next = BYTE_GET (evn.vn_next);
4944 vna_off = offset + ivn.vn_aux;
4948 Elf_External_Vernaux evna;
4950 GET_DATA (vna_off, evna,
4951 "version need aux (3)");
4953 ivna.vna_other = BYTE_GET (evna.vna_other);
4954 ivna.vna_next = BYTE_GET (evna.vna_next);
4955 ivna.vna_name = BYTE_GET (evna.vna_name);
4957 vna_off += ivna.vna_next;
4959 while (ivna.vna_other != vers_data
4960 && ivna.vna_next != 0);
4962 if (ivna.vna_other == vers_data)
4965 offset += ivn.vn_next;
4967 while (ivn.vn_next != 0);
4969 if (ivna.vna_other == vers_data)
4972 strtab + ivna.vna_name, ivna.vna_other);
4975 else if (! is_nobits)
4976 error (_("bad dynamic symbol"));
4983 if (vers_data != 0x8001
4984 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4986 Elf_Internal_Verdef ivd;
4987 Elf_Internal_Verdaux ivda;
4988 Elf_External_Verdaux evda;
4989 unsigned long offset;
4992 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4997 Elf_External_Verdef evd;
4999 GET_DATA (offset, evd, "version def");
5001 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5002 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5003 ivd.vd_next = BYTE_GET (evd.vd_next);
5005 offset += ivd.vd_next;
5007 while (ivd.vd_ndx != (vers_data & 0x7fff)
5008 && ivd.vd_next != 0);
5010 offset -= ivd.vd_next;
5011 offset += ivd.vd_aux;
5013 GET_DATA (offset, evda, "version def aux");
5015 ivda.vda_name = BYTE_GET (evda.vda_name);
5017 if (psym->st_name != ivda.vda_name)
5018 printf ((vers_data & 0x8000)
5020 strtab + ivda.vda_name);
5030 if (strtab != string_table)
5036 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5038 if (do_histogram && buckets != NULL)
5045 int nzero_counts = 0;
5048 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5050 printf (_(" Length Number %% of total Coverage\n"));
5052 lengths = (int *) calloc (nbuckets, sizeof (int));
5053 if (lengths == NULL)
5055 error (_("Out of memory"));
5058 for (hn = 0; hn < nbuckets; ++hn)
5063 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5066 if (maxlength < ++lengths[hn])
5071 counts = (int *) calloc (maxlength + 1, sizeof (int));
5074 error (_("Out of memory"));
5078 for (hn = 0; hn < nbuckets; ++hn)
5079 ++ counts [lengths [hn]];
5083 printf (" 0 %-10d (%5.1f%%)\n",
5084 counts[0], (counts[0] * 100.0) / nbuckets);
5085 for (si = 1; si <= maxlength; ++si)
5087 nzero_counts += counts[si] * si;
5088 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5089 si, counts[si], (counts[si] * 100.0) / nbuckets,
5090 (nzero_counts * 100.0) / nsyms);
5098 if (buckets != NULL)
5108 process_syminfo (file)
5109 FILE * file ATTRIBUTE_UNUSED;
5113 if (dynamic_syminfo == NULL
5115 /* No syminfo, this is ok. */
5118 /* There better should be a dynamic symbol section. */
5119 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5123 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5124 dynamic_syminfo_offset, dynamic_syminfo_nent);
5126 printf (_(" Num: Name BoundTo Flags\n"));
5127 for (i = 0; i < dynamic_syminfo_nent; ++i)
5129 unsigned short int flags = dynamic_syminfo[i].si_flags;
5131 printf ("%4d: %-30s ", i,
5132 dynamic_strings + dynamic_symbols[i].st_name);
5134 switch (dynamic_syminfo[i].si_boundto)
5136 case SYMINFO_BT_SELF:
5137 fputs ("SELF ", stdout);
5139 case SYMINFO_BT_PARENT:
5140 fputs ("PARENT ", stdout);
5143 if (dynamic_syminfo[i].si_boundto > 0
5144 && dynamic_syminfo[i].si_boundto < dynamic_size)
5147 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5149 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5153 if (flags & SYMINFO_FLG_DIRECT)
5155 if (flags & SYMINFO_FLG_PASSTHRU)
5156 printf (" PASSTHRU");
5157 if (flags & SYMINFO_FLG_COPY)
5159 if (flags & SYMINFO_FLG_LAZYLOAD)
5160 printf (" LAZYLOAD");
5168 #ifdef SUPPORT_DISASSEMBLY
5170 disassemble_section (section, file)
5171 Elf32_Internal_Shdr * section;
5174 printf (_("\nAssembly dump of section %s\n"),
5175 SECTION_NAME (section));
5177 /* XXX -- to be done --- XXX */
5184 dump_section (section, file)
5185 Elf32_Internal_Shdr * section;
5188 bfd_size_type bytes;
5190 unsigned char * data;
5191 unsigned char * start;
5193 bytes = section->sh_size;
5197 printf (_("\nSection '%s' has no data to dump.\n"),
5198 SECTION_NAME (section));
5202 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5204 addr = section->sh_addr;
5206 GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
5217 lbytes = (bytes > 16 ? 16 : bytes);
5219 printf (" 0x%8.8lx ", (unsigned long) addr);
5221 switch (elf_header.e_ident [EI_DATA])
5225 for (j = 15; j >= 0; j --)
5228 printf ("%2.2x", data [j]);
5238 for (j = 0; j < 16; j++)
5241 printf ("%2.2x", data [j]);
5251 for (j = 0; j < lbytes; j++)
5254 if (k >= ' ' && k < 0x80)
5273 static unsigned long int
5274 read_leb128 (data, length_return, sign)
5275 unsigned char * data;
5276 int * length_return;
5279 unsigned long int result = 0;
5280 unsigned int num_read = 0;
5289 result |= (byte & 0x7f) << shift;
5294 while (byte & 0x80);
5296 if (length_return != NULL)
5297 * length_return = num_read;
5299 if (sign && (shift < 32) && (byte & 0x40))
5300 result |= -1 << shift;
5305 typedef struct State_Machine_Registers
5307 unsigned long address;
5310 unsigned int column;
5314 /* This variable hold the number of the last entry seen
5315 in the File Table. */
5316 unsigned int last_file_entry;
5319 static SMR state_machine_regs;
5322 reset_state_machine (is_stmt)
5325 state_machine_regs.address = 0;
5326 state_machine_regs.file = 1;
5327 state_machine_regs.line = 1;
5328 state_machine_regs.column = 0;
5329 state_machine_regs.is_stmt = is_stmt;
5330 state_machine_regs.basic_block = 0;
5331 state_machine_regs.end_sequence = 0;
5332 state_machine_regs.last_file_entry = 0;
5335 /* Handled an extend line op. Returns true if this is the end
5338 process_extended_line_op (data, is_stmt, pointer_size)
5339 unsigned char * data;
5343 unsigned char op_code;
5346 unsigned char * name;
5349 len = read_leb128 (data, & bytes_read, 0);
5354 warn (_("badly formed extended line op encountered!"));
5359 op_code = * data ++;
5361 printf (_(" Extended opcode %d: "), op_code);
5365 case DW_LNE_end_sequence:
5366 printf (_("End of Sequence\n\n"));
5367 reset_state_machine (is_stmt);
5370 case DW_LNE_set_address:
5371 adr = byte_get (data, pointer_size);
5372 printf (_("set Address to 0x%lx\n"), adr);
5373 state_machine_regs.address = adr;
5376 case DW_LNE_define_file:
5377 printf (_(" define new File Table entry\n"));
5378 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5380 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5382 data += strlen ((char *) data) + 1;
5383 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5385 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5387 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5388 printf (_("%s\n\n"), name);
5392 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5399 /* Size of pointers in the .debug_line section. This information is not
5400 really present in that section. It's obtained before dumping the debug
5401 sections by doing some pre-scan of the .debug_info section. */
5402 static int debug_line_pointer_size = 4;
5405 display_debug_lines (section, start, file)
5406 Elf32_Internal_Shdr * section;
5407 unsigned char * start;
5408 FILE * file ATTRIBUTE_UNUSED;
5410 DWARF2_External_LineInfo * external;
5411 DWARF2_Internal_LineInfo info;
5412 unsigned char * standard_opcodes;
5413 unsigned char * data = start;
5414 unsigned char * end = start + section->sh_size;
5415 unsigned char * end_of_sequence;
5418 printf (_("\nDump of debug contents of section %s:\n\n"),
5419 SECTION_NAME (section));
5423 external = (DWARF2_External_LineInfo *) data;
5425 /* Check the length of the block. */
5426 info.li_length = BYTE_GET (external->li_length);
5427 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5430 (_("The line info appears to be corrupt - the section is too small\n"));
5434 /* Check its version number. */
5435 info.li_version = BYTE_GET (external->li_version);
5436 if (info.li_version != 2)
5438 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5442 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5443 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5444 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5445 info.li_line_base = BYTE_GET (external->li_line_base);
5446 info.li_line_range = BYTE_GET (external->li_line_range);
5447 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5449 /* Sign extend the line base field. */
5450 info.li_line_base <<= 24;
5451 info.li_line_base >>= 24;
5453 printf (_(" Length: %ld\n"), info.li_length);
5454 printf (_(" DWARF Version: %d\n"), info.li_version);
5455 printf (_(" Prolgue Length: %d\n"), info.li_prologue_length);
5456 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5457 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5458 printf (_(" Line Base: %d\n"), info.li_line_base);
5459 printf (_(" Line Range: %d\n"), info.li_line_range);
5460 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5462 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5464 reset_state_machine (info.li_default_is_stmt);
5466 /* Display the contents of the Opcodes table. */
5467 standard_opcodes = data + sizeof (* external);
5469 printf (_("\n Opcodes:\n"));
5471 for (i = 1; i < info.li_opcode_base; i++)
5472 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5474 /* Display the contents of the Directory table. */
5475 data = standard_opcodes + info.li_opcode_base - 1;
5478 printf (_("\n The Directory Table is empty.\n"));
5481 printf (_("\n The Directory Table:\n"));
5485 printf (_(" %s\n"), data);
5487 data += strlen ((char *) data) + 1;
5491 /* Skip the NUL at the end of the table. */
5494 /* Display the contents of the File Name table. */
5496 printf (_("\n The File Name Table is empty.\n"));
5499 printf (_("\n The File Name Table:\n"));
5500 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5504 unsigned char * name;
5507 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5510 data += strlen ((char *) data) + 1;
5512 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5514 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5516 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5518 printf (_("%s\n"), name);
5522 /* Skip the NUL at the end of the table. */
5525 /* Now display the statements. */
5526 printf (_("\n Line Number Statements:\n"));
5529 while (data < end_of_sequence)
5531 unsigned char op_code;
5535 op_code = * data ++;
5539 case DW_LNS_extended_op:
5540 data += process_extended_line_op (data, info.li_default_is_stmt,
5541 debug_line_pointer_size);
5545 printf (_(" Copy\n"));
5548 case DW_LNS_advance_pc:
5549 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5551 state_machine_regs.address += adv;
5552 printf (_(" Advance PC by %d to %lx\n"), adv,
5553 state_machine_regs.address);
5556 case DW_LNS_advance_line:
5557 adv = read_leb128 (data, & bytes_read, 1);
5559 state_machine_regs.line += adv;
5560 printf (_(" Advance Line by %d to %d\n"), adv,
5561 state_machine_regs.line);
5564 case DW_LNS_set_file:
5565 adv = read_leb128 (data, & bytes_read, 0);
5567 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5569 state_machine_regs.file = adv;
5572 case DW_LNS_set_column:
5573 adv = read_leb128 (data, & bytes_read, 0);
5575 printf (_(" Set column to %d\n"), adv);
5576 state_machine_regs.column = adv;
5579 case DW_LNS_negate_stmt:
5580 adv = state_machine_regs.is_stmt;
5582 printf (_(" Set is_stmt to %d\n"), adv);
5583 state_machine_regs.is_stmt = adv;
5586 case DW_LNS_set_basic_block:
5587 printf (_(" Set basic block\n"));
5588 state_machine_regs.basic_block = 1;
5591 case DW_LNS_const_add_pc:
5592 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5593 * info.li_min_insn_length);
5594 state_machine_regs.address += adv;
5595 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5596 state_machine_regs.address);
5599 case DW_LNS_fixed_advance_pc:
5600 adv = byte_get (data, 2);
5602 state_machine_regs.address += adv;
5603 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5604 adv, state_machine_regs.address);
5608 op_code -= info.li_opcode_base;
5609 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5610 state_machine_regs.address += adv;
5611 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5612 op_code, adv, state_machine_regs.address);
5613 adv = (op_code % info.li_line_range) + info.li_line_base;
5614 state_machine_regs.line += adv;
5615 printf (_(" and Line by %d to %d\n"),
5616 adv, state_machine_regs.line);
5627 display_debug_pubnames (section, start, file)
5628 Elf32_Internal_Shdr * section;
5629 unsigned char * start;
5630 FILE * file ATTRIBUTE_UNUSED;
5632 DWARF2_External_PubNames * external;
5633 DWARF2_Internal_PubNames pubnames;
5634 unsigned char * end;
5636 end = start + section->sh_size;
5638 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5642 unsigned char * data;
5643 unsigned long offset;
5645 external = (DWARF2_External_PubNames *) start;
5647 pubnames.pn_length = BYTE_GET (external->pn_length);
5648 pubnames.pn_version = BYTE_GET (external->pn_version);
5649 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5650 pubnames.pn_size = BYTE_GET (external->pn_size);
5652 data = start + sizeof (* external);
5653 start += pubnames.pn_length + sizeof (external->pn_length);
5655 if (pubnames.pn_version != 2)
5657 static int warned = 0;
5661 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5668 printf (_(" Length: %ld\n"),
5669 pubnames.pn_length);
5670 printf (_(" Version: %d\n"),
5671 pubnames.pn_version);
5672 printf (_(" Offset into .debug_info section: %ld\n"),
5673 pubnames.pn_offset);
5674 printf (_(" Size of area in .debug_info section: %ld\n"),
5677 printf (_("\n Offset\tName\n"));
5681 offset = byte_get (data, 4);
5686 printf (" %ld\t\t%s\n", offset, data);
5687 data += strlen ((char *) data) + 1;
5690 while (offset != 0);
5703 case DW_TAG_padding: return "DW_TAG_padding";
5704 case DW_TAG_array_type: return "DW_TAG_array_type";
5705 case DW_TAG_class_type: return "DW_TAG_class_type";
5706 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5707 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5708 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5709 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5710 case DW_TAG_label: return "DW_TAG_label";
5711 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5712 case DW_TAG_member: return "DW_TAG_member";
5713 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5714 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5715 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5716 case DW_TAG_string_type: return "DW_TAG_string_type";
5717 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5718 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5719 case DW_TAG_typedef: return "DW_TAG_typedef";
5720 case DW_TAG_union_type: return "DW_TAG_union_type";
5721 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5722 case DW_TAG_variant: return "DW_TAG_variant";
5723 case DW_TAG_common_block: return "DW_TAG_common_block";
5724 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5725 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5726 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5727 case DW_TAG_module: return "DW_TAG_module";
5728 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5729 case DW_TAG_set_type: return "DW_TAG_set_type";
5730 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5731 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5732 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5733 case DW_TAG_base_type: return "DW_TAG_base_type";
5734 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5735 case DW_TAG_const_type: return "DW_TAG_const_type";
5736 case DW_TAG_constant: return "DW_TAG_constant";
5737 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5738 case DW_TAG_file_type: return "DW_TAG_file_type";
5739 case DW_TAG_friend: return "DW_TAG_friend";
5740 case DW_TAG_namelist: return "DW_TAG_namelist";
5741 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5742 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5743 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5744 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5745 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5746 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5747 case DW_TAG_try_block: return "DW_TAG_try_block";
5748 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5749 case DW_TAG_variable: return "DW_TAG_variable";
5750 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5751 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5752 case DW_TAG_format_label: return "DW_TAG_format_label";
5753 case DW_TAG_function_template: return "DW_TAG_function_template";
5754 case DW_TAG_class_template: return "DW_TAG_class_template";
5757 static char buffer [100];
5759 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
5766 get_AT_name (attribute)
5767 unsigned long attribute;
5771 case DW_AT_sibling: return "DW_AT_sibling";
5772 case DW_AT_location: return "DW_AT_location";
5773 case DW_AT_name: return "DW_AT_name";
5774 case DW_AT_ordering: return "DW_AT_ordering";
5775 case DW_AT_subscr_data: return "DW_AT_subscr_data";
5776 case DW_AT_byte_size: return "DW_AT_byte_size";
5777 case DW_AT_bit_offset: return "DW_AT_bit_offset";
5778 case DW_AT_bit_size: return "DW_AT_bit_size";
5779 case DW_AT_element_list: return "DW_AT_element_list";
5780 case DW_AT_stmt_list: return "DW_AT_stmt_list";
5781 case DW_AT_low_pc: return "DW_AT_low_pc";
5782 case DW_AT_high_pc: return "DW_AT_high_pc";
5783 case DW_AT_language: return "DW_AT_language";
5784 case DW_AT_member: return "DW_AT_member";
5785 case DW_AT_discr: return "DW_AT_discr";
5786 case DW_AT_discr_value: return "DW_AT_discr_value";
5787 case DW_AT_visibility: return "DW_AT_visibility";
5788 case DW_AT_import: return "DW_AT_import";
5789 case DW_AT_string_length: return "DW_AT_string_length";
5790 case DW_AT_common_reference: return "DW_AT_common_reference";
5791 case DW_AT_comp_dir: return "DW_AT_comp_dir";
5792 case DW_AT_const_value: return "DW_AT_const_value";
5793 case DW_AT_containing_type: return "DW_AT_containing_type";
5794 case DW_AT_default_value: return "DW_AT_default_value";
5795 case DW_AT_inline: return "DW_AT_inline";
5796 case DW_AT_is_optional: return "DW_AT_is_optional";
5797 case DW_AT_lower_bound: return "DW_AT_lower_bound";
5798 case DW_AT_producer: return "DW_AT_producer";
5799 case DW_AT_prototyped: return "DW_AT_prototyped";
5800 case DW_AT_return_addr: return "DW_AT_return_addr";
5801 case DW_AT_start_scope: return "DW_AT_start_scope";
5802 case DW_AT_stride_size: return "DW_AT_stride_size";
5803 case DW_AT_upper_bound: return "DW_AT_upper_bound";
5804 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5805 case DW_AT_accessibility: return "DW_AT_accessibility";
5806 case DW_AT_address_class: return "DW_AT_address_class";
5807 case DW_AT_artificial: return "DW_AT_artificial";
5808 case DW_AT_base_types: return "DW_AT_base_types";
5809 case DW_AT_calling_convention: return "DW_AT_calling_convention";
5810 case DW_AT_count: return "DW_AT_count";
5811 case DW_AT_data_member_location: return "DW_AT_data_member_location";
5812 case DW_AT_decl_column: return "DW_AT_decl_column";
5813 case DW_AT_decl_file: return "DW_AT_decl_file";
5814 case DW_AT_decl_line: return "DW_AT_decl_line";
5815 case DW_AT_declaration: return "DW_AT_declaration";
5816 case DW_AT_discr_list: return "DW_AT_discr_list";
5817 case DW_AT_encoding: return "DW_AT_encoding";
5818 case DW_AT_external: return "DW_AT_external";
5819 case DW_AT_frame_base: return "DW_AT_frame_base";
5820 case DW_AT_friend: return "DW_AT_friend";
5821 case DW_AT_identifier_case: return "DW_AT_identifier_case";
5822 case DW_AT_macro_info: return "DW_AT_macro_info";
5823 case DW_AT_namelist_items: return "DW_AT_namelist_items";
5824 case DW_AT_priority: return "DW_AT_priority";
5825 case DW_AT_segment: return "DW_AT_segment";
5826 case DW_AT_specification: return "DW_AT_specification";
5827 case DW_AT_static_link: return "DW_AT_static_link";
5828 case DW_AT_type: return "DW_AT_type";
5829 case DW_AT_use_location: return "DW_AT_use_location";
5830 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5831 case DW_AT_virtuality: return "DW_AT_virtuality";
5832 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5833 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5834 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5835 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5836 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5837 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5838 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5839 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5840 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5841 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5842 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5843 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5844 case DW_AT_sf_names: return "DW_AT_sf_names";
5845 case DW_AT_src_info: return "DW_AT_src_info";
5846 case DW_AT_mac_info: return "DW_AT_mac_info";
5847 case DW_AT_src_coords: return "DW_AT_src_coords";
5848 case DW_AT_body_begin: return "DW_AT_body_begin";
5849 case DW_AT_body_end: return "DW_AT_body_end";
5852 static char buffer [100];
5854 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5861 get_FORM_name (form)
5866 case DW_FORM_addr: return "DW_FORM_addr";
5867 case DW_FORM_block2: return "DW_FORM_block2";
5868 case DW_FORM_block4: return "DW_FORM_block4";
5869 case DW_FORM_data2: return "DW_FORM_data2";
5870 case DW_FORM_data4: return "DW_FORM_data4";
5871 case DW_FORM_data8: return "DW_FORM_data8";
5872 case DW_FORM_string: return "DW_FORM_string";
5873 case DW_FORM_block: return "DW_FORM_block";
5874 case DW_FORM_block1: return "DW_FORM_block1";
5875 case DW_FORM_data1: return "DW_FORM_data1";
5876 case DW_FORM_flag: return "DW_FORM_flag";
5877 case DW_FORM_sdata: return "DW_FORM_sdata";
5878 case DW_FORM_strp: return "DW_FORM_strp";
5879 case DW_FORM_udata: return "DW_FORM_udata";
5880 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5881 case DW_FORM_ref1: return "DW_FORM_ref1";
5882 case DW_FORM_ref2: return "DW_FORM_ref2";
5883 case DW_FORM_ref4: return "DW_FORM_ref4";
5884 case DW_FORM_ref8: return "DW_FORM_ref8";
5885 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5886 case DW_FORM_indirect: return "DW_FORM_indirect";
5889 static char buffer [100];
5891 sprintf (buffer, _("Unknown FORM value: %lx"), form);
5897 /* FIXME: There are better and more effiecint ways to handle
5898 these structures. For now though, I just want something that
5899 is simple to implement. */
5900 typedef struct abbrev_attr
5902 unsigned long attribute;
5904 struct abbrev_attr * next;
5908 typedef struct abbrev_entry
5910 unsigned long entry;
5913 struct abbrev_attr * first_attr;
5914 struct abbrev_attr * last_attr;
5915 struct abbrev_entry * next;
5919 static abbrev_entry * first_abbrev = NULL;
5920 static abbrev_entry * last_abbrev = NULL;
5923 free_abbrevs PARAMS ((void))
5925 abbrev_entry * abbrev;
5927 for (abbrev = first_abbrev; abbrev;)
5929 abbrev_entry * next = abbrev->next;
5932 for (attr = abbrev->first_attr; attr;)
5934 abbrev_attr * next = attr->next;
5944 last_abbrev = first_abbrev = NULL;
5948 add_abbrev (number, tag, children)
5949 unsigned long number;
5953 abbrev_entry * entry;
5955 entry = (abbrev_entry *) malloc (sizeof (* entry));
5961 entry->entry = number;
5963 entry->children = children;
5964 entry->first_attr = NULL;
5965 entry->last_attr = NULL;
5968 if (first_abbrev == NULL)
5969 first_abbrev = entry;
5971 last_abbrev->next = entry;
5973 last_abbrev = entry;
5977 add_abbrev_attr (attribute, form)
5978 unsigned long attribute;
5983 attr = (abbrev_attr *) malloc (sizeof (* attr));
5989 attr->attribute = attribute;
5993 if (last_abbrev->first_attr == NULL)
5994 last_abbrev->first_attr = attr;
5996 last_abbrev->last_attr->next = attr;
5998 last_abbrev->last_attr = attr;
6001 /* Processes the (partial) contents of a .debug_abbrev section.
6002 Returns NULL if the end of the section was encountered.
6003 Returns the address after the last byte read if the end of
6004 an abbreviation set was found. */
6006 static unsigned char *
6007 process_abbrev_section (start, end)
6008 unsigned char * start;
6009 unsigned char * end;
6011 if (first_abbrev != NULL)
6017 unsigned long entry;
6019 unsigned long attribute;
6022 entry = read_leb128 (start, & bytes_read, 0);
6023 start += bytes_read;
6025 /* A single zero is supposed to end the section according
6026 to the standard. If there's more, then signal that to
6029 return start == end ? NULL : start;
6031 tag = read_leb128 (start, & bytes_read, 0);
6032 start += bytes_read;
6034 children = * start ++;
6036 add_abbrev (entry, tag, children);
6042 attribute = read_leb128 (start, & bytes_read, 0);
6043 start += bytes_read;
6045 form = read_leb128 (start, & bytes_read, 0);
6046 start += bytes_read;
6049 add_abbrev_attr (attribute, form);
6051 while (attribute != 0);
6059 display_debug_abbrev (section, start, file)
6060 Elf32_Internal_Shdr * section;
6061 unsigned char * start;
6062 FILE * file ATTRIBUTE_UNUSED;
6064 abbrev_entry * entry;
6065 unsigned char * end = start + section->sh_size;
6067 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6071 start = process_abbrev_section (start, end);
6073 printf (_(" Number TAG\n"));
6075 for (entry = first_abbrev; entry; entry = entry->next)
6079 printf (_(" %ld %s [%s]\n"),
6081 get_TAG_name (entry->tag),
6082 entry->children ? _("has children") : _("no children"));
6084 for (attr = entry->first_attr; attr; attr = attr->next)
6086 printf (_(" %-18s %s\n"),
6087 get_AT_name (attr->attribute),
6088 get_FORM_name (attr->form));
6100 static unsigned char *
6101 display_block (data, length)
6102 unsigned char * data;
6103 unsigned long length;
6105 printf (_(" %lu byte block: "), length);
6108 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6114 decode_location_expression (data, pointer_size, length)
6115 unsigned char * data;
6116 unsigned int pointer_size;
6117 unsigned long length;
6121 unsigned long uvalue;
6122 unsigned char * end = data + length;
6131 printf ("DW_OP_addr: %lx",
6132 (unsigned long) byte_get (data, pointer_size));
6133 data += pointer_size;
6136 printf ("DW_OP_deref");
6139 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6142 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6145 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6149 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6153 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6157 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6161 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6162 (unsigned long) byte_get (data + 4, 4));
6166 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6167 (long) byte_get (data + 4, 4));
6171 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6175 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6179 printf ("DW_OP_dup");
6182 printf ("DW_OP_drop");
6185 printf ("DW_OP_over");
6188 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6191 printf ("DW_OP_swap");
6194 printf ("DW_OP_rot");
6197 printf ("DW_OP_xderef");
6200 printf ("DW_OP_abs");
6203 printf ("DW_OP_and");
6206 printf ("DW_OP_div");
6209 printf ("DW_OP_minus");
6212 printf ("DW_OP_mod");
6215 printf ("DW_OP_mul");
6218 printf ("DW_OP_neg");
6221 printf ("DW_OP_not");
6224 printf ("DW_OP_or");
6227 printf ("DW_OP_plus");
6229 case DW_OP_plus_uconst:
6230 printf ("DW_OP_plus_uconst: %lu",
6231 read_leb128 (data, &bytes_read, 0));
6235 printf ("DW_OP_shl");
6238 printf ("DW_OP_shr");
6241 printf ("DW_OP_shra");
6244 printf ("DW_OP_xor");
6247 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6251 printf ("DW_OP_eq");
6254 printf ("DW_OP_ge");
6257 printf ("DW_OP_gt");
6260 printf ("DW_OP_le");
6263 printf ("DW_OP_lt");
6266 printf ("DW_OP_ne");
6269 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6305 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6340 printf ("DW_OP_reg%d", op - DW_OP_reg0);
6375 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6376 read_leb128 (data, &bytes_read, 1));
6381 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
6385 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
6389 uvalue = read_leb128 (data, &bytes_read, 0);
6391 printf ("DW_OP_bregx: %lu %ld", uvalue,
6392 read_leb128 (data, &bytes_read, 1));
6396 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6399 case DW_OP_deref_size:
6400 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6402 case DW_OP_xderef_size:
6403 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6406 printf ("DW_OP_nop");
6410 if (op >= DW_OP_lo_user
6411 && op <= DW_OP_hi_user)
6412 printf (_("(User defined location op)"));
6414 printf (_("(Unknown location op)"));
6415 /* No way to tell where the next op is, so just bail. */
6422 static unsigned char *
6423 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
6424 unsigned long attribute;
6426 unsigned char * data;
6427 unsigned long cu_offset;
6428 unsigned long pointer_size;
6430 unsigned long uvalue = 0;
6431 unsigned char * block_start = NULL;
6434 printf (" %-18s:", get_AT_name (attribute));
6441 case DW_FORM_ref_addr:
6443 uvalue = byte_get (data, pointer_size);
6444 data += pointer_size;
6450 uvalue = byte_get (data ++, 1);
6455 uvalue = byte_get (data, 2);
6461 uvalue = byte_get (data, 4);
6466 uvalue = read_leb128 (data, & bytes_read, 1);
6470 case DW_FORM_ref_udata:
6472 uvalue = read_leb128 (data, & bytes_read, 0);
6479 case DW_FORM_ref_addr:
6480 printf (" <#%lx>", uvalue);
6486 case DW_FORM_ref_udata:
6487 printf (" <%lx>", uvalue + cu_offset);
6491 printf (" %#lx", uvalue);
6499 printf (" %ld", uvalue);
6504 uvalue = byte_get (data, 4);
6505 printf (" %lx", uvalue);
6506 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6510 case DW_FORM_string:
6511 printf (" %s", data);
6512 data += strlen ((char *) data) + 1;
6516 uvalue = read_leb128 (data, & bytes_read, 0);
6517 block_start = data + bytes_read;
6518 data = display_block (block_start, uvalue);
6521 case DW_FORM_block1:
6522 uvalue = byte_get (data, 1);
6523 block_start = data + 1;
6524 data = display_block (block_start, uvalue);
6527 case DW_FORM_block2:
6528 uvalue = byte_get (data, 2);
6529 block_start = data + 2;
6530 data = display_block (block_start, uvalue);
6533 case DW_FORM_block4:
6534 uvalue = byte_get (data, 4);
6535 block_start = data + 4;
6536 data = display_block (block_start, uvalue);
6540 case DW_FORM_indirect:
6541 warn (_("Unable to handle FORM: %d"), form);
6545 warn (_("Unrecognised form: %d"), form);
6549 /* For some attributes we can display futher information. */
6558 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6559 case DW_INL_inlined: printf (_("(inlined)")); break;
6560 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6561 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6562 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6566 case DW_AT_language:
6569 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6570 case DW_LANG_C89: printf ("(ANSI C)"); break;
6571 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6572 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6573 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6574 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6575 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6576 case DW_LANG_Ada83: printf ("(Ada)"); break;
6577 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6578 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6579 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6580 default: printf ("(Unknown: %lx)", uvalue); break;
6584 case DW_AT_encoding:
6587 case DW_ATE_void: printf ("(void)"); break;
6588 case DW_ATE_address: printf ("(machine address)"); break;
6589 case DW_ATE_boolean: printf ("(boolean)"); break;
6590 case DW_ATE_complex_float: printf ("(complex float)"); break;
6591 case DW_ATE_float: printf ("(float)"); break;
6592 case DW_ATE_signed: printf ("(signed)"); break;
6593 case DW_ATE_signed_char: printf ("(signed char)"); break;
6594 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6595 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6597 if (uvalue >= DW_ATE_lo_user
6598 && uvalue <= DW_ATE_hi_user)
6599 printf ("(user defined type)");
6601 printf ("(unknown type)");
6606 case DW_AT_accessibility:
6609 case DW_ACCESS_public: printf ("(public)"); break;
6610 case DW_ACCESS_protected: printf ("(protected)"); break;
6611 case DW_ACCESS_private: printf ("(private)"); break;
6612 default: printf ("(unknown accessibility)"); break;
6616 case DW_AT_visibility:
6619 case DW_VIS_local: printf ("(local)"); break;
6620 case DW_VIS_exported: printf ("(exported)"); break;
6621 case DW_VIS_qualified: printf ("(qualified)"); break;
6622 default: printf ("(unknown visibility)"); break;
6626 case DW_AT_virtuality:
6629 case DW_VIRTUALITY_none: printf ("(none)"); break;
6630 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6631 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6632 default: printf ("(unknown virtuality)"); break;
6636 case DW_AT_identifier_case:
6639 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6640 case DW_ID_up_case: printf ("(up_case)"); break;
6641 case DW_ID_down_case: printf ("(down_case)"); break;
6642 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6643 default: printf ("(unknown case)"); break;
6647 case DW_AT_calling_convention:
6650 case DW_CC_normal: printf ("(normal)"); break;
6651 case DW_CC_program: printf ("(program)"); break;
6652 case DW_CC_nocall: printf ("(nocall)"); break;
6654 if (uvalue >= DW_CC_lo_user
6655 && uvalue <= DW_CC_hi_user)
6656 printf ("(user defined)");
6658 printf ("(unknown convention)");
6662 case DW_AT_frame_base:
6663 case DW_AT_location:
6664 case DW_AT_data_member_location:
6665 case DW_AT_vtable_elem_location:
6669 decode_location_expression (block_start, pointer_size, uvalue);
6683 display_debug_info (section, start, file)
6684 Elf32_Internal_Shdr * section;
6685 unsigned char * start;
6688 unsigned char * end = start + section->sh_size;
6689 unsigned char * section_begin = start;
6691 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6695 DWARF2_External_CompUnit * external;
6696 DWARF2_Internal_CompUnit compunit;
6697 unsigned char * tags;
6700 unsigned long cu_offset;
6702 external = (DWARF2_External_CompUnit *) start;
6704 compunit.cu_length = BYTE_GET (external->cu_length);
6705 compunit.cu_version = BYTE_GET (external->cu_version);
6706 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6707 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
6709 tags = start + sizeof (* external);
6710 cu_offset = start - section_begin;
6711 start += compunit.cu_length + sizeof (external->cu_length);
6713 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
6714 printf (_(" Length: %ld\n"), compunit.cu_length);
6715 printf (_(" Version: %d\n"), compunit.cu_version);
6716 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6717 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
6719 if (compunit.cu_version != 2)
6721 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6725 if (first_abbrev != NULL)
6728 /* Read in the abbrevs used by this compilation unit. */
6731 Elf32_Internal_Shdr * sec;
6732 unsigned char * begin;
6734 /* Locate the .debug_abbrev section and process it. */
6735 for (i = 0, sec = section_headers;
6736 i < elf_header.e_shnum;
6738 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6741 if (i == -1 || sec->sh_size == 0)
6743 warn (_("Unable to locate .debug_abbrev section!\n"));
6747 GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6748 "debug_abbrev section data");
6750 process_abbrev_section (begin + compunit.cu_abbrev_offset,
6751 begin + sec->sh_size);
6757 while (tags < start)
6760 unsigned long abbrev_number;
6761 abbrev_entry * entry;
6764 abbrev_number = read_leb128 (tags, & bytes_read, 0);
6767 /* A null DIE marks the end of a list of children. */
6768 if (abbrev_number == 0)
6774 /* Scan through the abbreviation list until we reach the
6776 for (entry = first_abbrev;
6777 entry && entry->entry != abbrev_number;
6778 entry = entry->next)
6783 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6788 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6789 level, tags - section_begin - bytes_read,
6791 get_TAG_name (entry->tag));
6793 for (attr = entry->first_attr; attr; attr = attr->next)
6794 tags = read_and_display_attr (attr->attribute,
6797 compunit.cu_pointer_size);
6799 if (entry->children)
6810 display_debug_aranges (section, start, file)
6811 Elf32_Internal_Shdr * section;
6812 unsigned char * start;
6813 FILE * file ATTRIBUTE_UNUSED;
6815 unsigned char * end = start + section->sh_size;
6817 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6821 DWARF2_External_ARange * external;
6822 DWARF2_Internal_ARange arange;
6823 unsigned char * ranges;
6824 unsigned long length;
6825 unsigned long address;
6828 external = (DWARF2_External_ARange *) start;
6830 arange.ar_length = BYTE_GET (external->ar_length);
6831 arange.ar_version = BYTE_GET (external->ar_version);
6832 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
6833 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6834 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6836 if (arange.ar_version != 2)
6838 warn (_("Only DWARF 2 aranges are currently supported.\n"));
6842 printf (_(" Length: %ld\n"), arange.ar_length);
6843 printf (_(" Version: %d\n"), arange.ar_version);
6844 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
6845 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6846 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6848 printf (_("\n Address Length\n"));
6850 ranges = start + sizeof (* external);
6852 /* Must pad to an alignment boundary that is twice the pointer size. */
6853 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
6855 ranges += (2 * arange.ar_pointer_size) - excess;
6859 address = byte_get (ranges, arange.ar_pointer_size);
6861 ranges += arange.ar_pointer_size;
6863 length = byte_get (ranges, arange.ar_pointer_size);
6865 ranges += arange.ar_pointer_size;
6867 /* A pair of zeros marks the end of the list. */
6868 if (address == 0 && length == 0)
6871 printf (" %8.8lx %lu\n", address, length);
6874 start += arange.ar_length + sizeof (external->ar_length);
6882 typedef struct Frame_Chunk
6884 struct Frame_Chunk * next;
6885 unsigned char * chunk_start;
6887 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
6888 short int * col_type;
6890 char * augmentation;
6891 unsigned int code_factor;
6892 unsigned int data_factor;
6893 unsigned long pc_begin;
6894 unsigned long pc_range;
6901 /* A marker for a col_type that means this column was never referenced
6902 in the frame info. */
6903 #define DW_CFA_unreferenced (-1)
6906 frame_need_space (fc, reg)
6910 int prev = fc->ncols;
6912 if (reg < fc->ncols)
6915 fc->ncols = reg + 1;
6916 fc->col_type = (short int *) xrealloc (fc->col_type,
6917 fc->ncols * sizeof (short int));
6918 fc->col_offset = (int *) xrealloc (fc->col_offset,
6919 fc->ncols * sizeof (int));
6921 while (prev < fc->ncols)
6923 fc->col_type[prev] = DW_CFA_unreferenced;
6924 fc->col_offset[prev] = 0;
6930 frame_display_row (fc, need_col_headers, max_regs)
6932 int * need_col_headers;
6938 if (* max_regs < fc->ncols)
6939 * max_regs = fc->ncols;
6941 if (* need_col_headers)
6943 * need_col_headers = 0;
6945 printf (" LOC CFA ");
6947 for (r = 0; r < * max_regs; r++)
6948 if (fc->col_type[r] != DW_CFA_unreferenced)
6953 printf ("r%-4d", r);
6959 printf ("%08x ", (unsigned int) fc->pc_begin);
6960 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
6961 printf ("%-8s ", tmp);
6963 for (r = 0; r < fc->ncols; r++)
6965 if (fc->col_type[r] != DW_CFA_unreferenced)
6967 switch (fc->col_type[r])
6969 case DW_CFA_undefined:
6972 case DW_CFA_same_value:
6976 sprintf (tmp, "c%+d", fc->col_offset[r]);
6978 case DW_CFA_register:
6979 sprintf (tmp, "r%d", fc->col_offset[r]);
6982 strcpy (tmp, "n/a");
6985 printf ("%-5s", tmp);
6991 #define GET(N) byte_get (start, N); start += N
6992 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
6993 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
6996 display_debug_frames (section, start, file)
6997 Elf32_Internal_Shdr * section;
6998 unsigned char * start;
6999 FILE * file ATTRIBUTE_UNUSED;
7001 unsigned char * end = start + section->sh_size;
7002 unsigned char * section_start = start;
7003 Frame_Chunk * chunks = 0;
7004 Frame_Chunk * remembered_state = 0;
7006 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7010 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7014 unsigned char * saved_start;
7015 unsigned char * block_end;
7016 unsigned long length;
7017 unsigned long cie_id;
7020 int need_col_headers = 1;
7022 saved_start = start;
7023 length = byte_get (start, 4); start += 4;
7028 block_end = saved_start + length + 4;
7029 cie_id = byte_get (start, 4); start += 4;
7031 printf ("\n%08x %08lx %08lx ", saved_start - section_start, length, cie_id);
7033 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7035 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7036 memset (fc, 0, sizeof (Frame_Chunk));
7040 fc->chunk_start = saved_start;
7042 fc->col_type = (short int *) xmalloc (sizeof (short int));
7043 fc->col_offset = (int *) xmalloc (sizeof (int));
7044 frame_need_space (fc, max_regs-1);
7046 start ++; /* version */
7047 fc->augmentation = start;
7052 start++; /* skip past NUL */
7054 if (fc->augmentation[0] == 'z')
7057 fc->code_factor = LEB ();
7058 fc->data_factor = SLEB ();
7059 fc->ra = byte_get (start, 1); start += 1;
7061 printf ("skipping %d extra bytes\n", xtra);
7064 else if (strcmp (fc->augmentation, "eh") == 0)
7067 fc->code_factor = LEB ();
7068 fc->data_factor = SLEB ();
7069 fc->ra = byte_get (start, 1); start += 1;
7073 fc->code_factor = LEB ();
7074 fc->data_factor = SLEB ();
7075 fc->ra = byte_get (start, 1); start += 1;
7078 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n",
7079 fc->augmentation, fc->code_factor, fc->data_factor, fc->ra);
7081 frame_need_space (fc, fc->ra);
7085 unsigned char * look_for;
7086 static Frame_Chunk fde_fc;
7089 memset (fc, 0, sizeof (Frame_Chunk));
7091 look_for = is_eh ? start-4-cie_id : (unsigned char *) cie_id;
7093 fc->pc_begin = byte_get (start, 4); start += 4;
7094 fc->pc_range = byte_get (start, 4); start += 4;
7096 for (cie=chunks; cie && (cie->chunk_start != look_for); cie = cie->next);
7099 warn ("Invalid CIE pointer %08x in FDE at %08x\n", cie_id, saved_start);
7102 fc->col_type = (short int *) xmalloc (sizeof (short int));
7103 fc->col_offset = (int *) xmalloc (sizeof (int));
7104 frame_need_space (fc, max_regs - 1);
7106 fc->augmentation = "";
7110 fc->ncols = cie->ncols;
7111 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
7112 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
7113 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7114 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7115 fc->augmentation = cie->augmentation;
7116 fc->code_factor = cie->code_factor;
7117 fc->data_factor = cie->data_factor;
7118 fc->cfa_reg = cie->cfa_reg;
7119 fc->cfa_offset = cie->cfa_offset;
7121 frame_need_space (fc, max_regs-1);
7124 if (cie->augmentation[0] == 'z')
7126 unsigned long l = LEB ();
7130 printf ("FDE cie=%08x pc=%08lx..%08lx\n",
7131 cie->chunk_start-section_start, fc->pc_begin,
7132 fc->pc_begin + fc->pc_range);
7135 /* At this point, fc is the current chunk, cie (if any) is set, and we're
7136 about to interpret instructions for the chunk. */
7138 /* This exists for readelf maintainers. */
7142 /* Start by making a pass over the chunk, allocating storage
7143 and taking note of what registers are used. */
7144 unsigned char * tmp = start;
7146 while (start < block_end)
7157 /* Warning: if you add any more cases to this switch, be
7158 sure to add them to the corresponding switch below. */
7161 case DW_CFA_advance_loc:
7165 frame_need_space (fc, opa);
7166 fc->col_type[opa] = DW_CFA_undefined;
7168 case DW_CFA_restore:
7169 frame_need_space (fc, opa);
7170 fc->col_type[opa] = DW_CFA_undefined;
7172 case DW_CFA_set_loc:
7173 start += sizeof (vma);
7175 case DW_CFA_advance_loc1:
7178 case DW_CFA_advance_loc2:
7181 case DW_CFA_advance_loc4:
7184 case DW_CFA_offset_extended:
7185 reg = LEB (); LEB ();
7186 frame_need_space (fc, reg);
7187 fc->col_type[reg] = DW_CFA_undefined;
7189 case DW_CFA_restore_extended:
7191 frame_need_space (fc, reg);
7192 fc->col_type[reg] = DW_CFA_undefined;
7194 case DW_CFA_undefined:
7196 frame_need_space (fc, reg);
7197 fc->col_type[reg] = DW_CFA_undefined;
7199 case DW_CFA_same_value:
7201 frame_need_space (fc, reg);
7202 fc->col_type[reg] = DW_CFA_undefined;
7204 case DW_CFA_register:
7205 reg = LEB (); LEB ();
7206 frame_need_space (fc, reg);
7207 fc->col_type[reg] = DW_CFA_undefined;
7209 case DW_CFA_def_cfa:
7212 case DW_CFA_def_cfa_register:
7215 case DW_CFA_def_cfa_offset:
7218 #ifndef DW_CFA_GNU_args_size
7219 #define DW_CFA_GNU_args_size 0x2e
7221 case DW_CFA_GNU_args_size:
7224 #ifndef DW_CFA_GNU_negative_offset_extended
7225 #define DW_CFA_GNU_negative_offset_extended 0x2f
7227 case DW_CFA_GNU_negative_offset_extended:
7228 reg = LEB (); LEB ();
7229 frame_need_space (fc, reg);
7230 fc->col_type[reg] = DW_CFA_undefined;
7239 /* Now we know what registers are used, make a second pass over
7240 the chunk, this time actually printing out the info. */
7242 while (start < block_end)
7245 unsigned long ul, reg, roffs;
7254 /* Warning: if you add any more cases to this switch, be
7255 sure to add them to the corresponding switch above. */
7258 case DW_CFA_advance_loc:
7259 frame_display_row (fc, &need_col_headers, &max_regs);
7261 printf (" DW_CFA_advance_loc: %08x = %08x + %d*%d\n",
7262 fc->pc_begin + opa * fc->code_factor, fc->pc_begin, opa, fc->code_factor);
7264 fc->pc_begin += opa * fc->code_factor;
7270 printf (" DW_CFA_offset: r%d = cfa[%d*%d]\n", opa, roffs, fc->data_factor);
7272 fc->col_type[opa] = DW_CFA_offset;
7273 fc->col_offset[opa] = roffs * fc->data_factor;
7276 case DW_CFA_restore:
7278 printf (" DW_CFA_restore: r%d\n", opa);
7280 fc->col_type[opa] = cie->col_type[opa];
7281 fc->col_offset[opa] = cie->col_offset[opa];
7284 case DW_CFA_set_loc:
7285 frame_display_row (fc, &need_col_headers, &max_regs);
7286 vma = byte_get (start, sizeof (vma)); start += sizeof (vma);
7288 printf (" DW_CFA_set_loc: %08x\n", vma);
7293 case DW_CFA_advance_loc1:
7294 frame_display_row (fc, &need_col_headers, &max_regs);
7295 ofs = byte_get (start, 1); start += 1;
7297 printf (" DW_CFA_advance_loc1: %08x = %08x + %d*%d\n",
7298 fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
7300 fc->pc_begin += ofs * fc->code_factor;
7303 case DW_CFA_advance_loc2:
7304 frame_display_row (fc, &need_col_headers, &max_regs);
7305 ofs = byte_get (start, 2); start += 2;
7307 printf (" DW_CFA_advance_loc2: %08x = %08x + %d*%d\n",
7308 fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
7310 fc->pc_begin += ofs * fc->code_factor;
7313 case DW_CFA_advance_loc4:
7314 frame_display_row (fc, &need_col_headers, &max_regs);
7315 ofs = byte_get (start, 4); start += 4;
7317 printf (" DW_CFA_advance_loc4: %08x = %08x + %d*%d\n",
7318 fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
7320 fc->pc_begin += ofs * fc->code_factor;
7323 case DW_CFA_offset_extended:
7327 printf (" DW_CFA_offset_extended: r%d = cfa[%d*%d]\n", reg, roffs, fc->data_factor);
7329 fc->col_type[reg] = DW_CFA_offset;
7330 fc->col_offset[reg] = roffs * fc->data_factor;
7333 case DW_CFA_restore_extended:
7336 printf (" DW_CFA_restore_extended: r%d\n", reg);
7338 fc->col_type[reg] = cie->col_type[reg];
7339 fc->col_offset[reg] = cie->col_offset[reg];
7342 case DW_CFA_undefined:
7345 printf (" DW_CFA_undefined: r%d\n", reg);
7347 fc->col_type[reg] = DW_CFA_undefined;
7348 fc->col_offset[reg] = 0;
7351 case DW_CFA_same_value:
7354 printf (" DW_CFA_same_value: r%d\n", reg);
7356 fc->col_type[reg] = DW_CFA_same_value;
7357 fc->col_offset[reg] = 0;
7360 case DW_CFA_register:
7364 printf (" DW_CFA_register: r%d\n", reg);
7366 fc->col_type[reg] = DW_CFA_register;
7367 fc->col_offset[reg] = roffs;
7370 case DW_CFA_remember_state:
7372 printf (" DW_CFA_remember_state\n");
7374 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7375 rs->ncols = fc->ncols;
7376 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
7377 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
7378 memcpy (rs->col_type, fc->col_type, rs->ncols);
7379 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
7380 rs->next = remembered_state;
7381 remembered_state = rs;
7384 case DW_CFA_restore_state:
7386 printf (" DW_CFA_restore_state\n");
7388 rs = remembered_state;
7389 remembered_state = rs->next;
7390 frame_need_space (fc, rs->ncols-1);
7391 memcpy (fc->col_type, rs->col_type, rs->ncols);
7392 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
7393 free (rs->col_type);
7394 free (rs->col_offset);
7398 case DW_CFA_def_cfa:
7399 fc->cfa_reg = LEB ();
7400 fc->cfa_offset = LEB ();
7402 printf (" DW_CFA_def_cfa: reg %d ofs %d\n", fc->cfa_reg, fc->cfa_offset);
7406 case DW_CFA_def_cfa_register:
7407 fc->cfa_reg = LEB ();
7409 printf (" DW_CFA_def_cfa_reg: %d\n", fc->cfa_reg);
7413 case DW_CFA_def_cfa_offset:
7414 fc->cfa_offset = LEB ();
7416 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
7422 printf (" DW_CFA_nop\n");
7426 #ifndef DW_CFA_GNU_window_save
7427 #define DW_CFA_GNU_window_save 0x2d
7429 case DW_CFA_GNU_window_save:
7431 printf (" DW_CFA_GNU_window_save\n");
7435 #ifndef DW_CFA_GNU_args_size
7436 #define DW_CFA_GNU_args_size 0x2e
7438 case DW_CFA_GNU_args_size:
7441 printf (" DW_CFA_GNU_args_size: %d\n", ul);
7445 #ifndef DW_CFA_GNU_negative_offset_extended
7446 #define DW_CFA_GNU_negative_offset_extended 0x2f
7448 case DW_CFA_GNU_negative_offset_extended:
7451 frame_need_space (fc, reg);
7453 printf (" DW_CFA_GNU_negative_offset_extended: r%d = cfa[%d*%d]\n", reg, l, fc->data_factor);
7455 fc->col_type[reg] = DW_CFA_offset;
7456 fc->col_offset[reg] = l * fc->data_factor;
7460 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
7465 frame_display_row (fc, &need_col_headers, &max_regs);
7480 display_debug_not_supported (section, start, file)
7481 Elf32_Internal_Shdr * section;
7482 unsigned char * start ATTRIBUTE_UNUSED;
7483 FILE * file ATTRIBUTE_UNUSED;
7485 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7486 SECTION_NAME (section));
7491 /* Pre-scan the .debug_info section to record the size of address.
7492 When dumping the .debug_line, we use that size information, assuming
7493 that all compilation units have the same address size. */
7495 prescan_debug_info (section, start, file)
7496 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
7497 unsigned char * start;
7498 FILE * file ATTRIBUTE_UNUSED;
7500 DWARF2_External_CompUnit * external;
7502 external = (DWARF2_External_CompUnit *) start;
7504 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
7508 /* A structure containing the name of a debug section and a pointer
7509 to a function that can decode it. The third field is a prescan
7510 function to be run over the section before displaying any of the
7515 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
7516 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
7520 { ".debug_info", display_debug_info, prescan_debug_info },
7521 { ".debug_abbrev", display_debug_abbrev, NULL },
7522 { ".debug_line", display_debug_lines, NULL },
7523 { ".debug_aranges", display_debug_aranges, NULL },
7524 { ".debug_pubnames", display_debug_pubnames, NULL },
7525 { ".debug_frame", display_debug_frames, NULL },
7526 { ".eh_frame", display_debug_frames, NULL },
7527 { ".debug_macinfo", display_debug_not_supported, NULL },
7528 { ".debug_frame", display_debug_not_supported, NULL },
7529 { ".debug_str", display_debug_not_supported, NULL },
7530 { ".debug_static_func", display_debug_not_supported, NULL },
7531 { ".debug_static_vars", display_debug_not_supported, NULL },
7532 { ".debug_types", display_debug_not_supported, NULL },
7533 { ".debug_weaknames", display_debug_not_supported, NULL }
7537 display_debug_section (section, file)
7538 Elf32_Internal_Shdr * section;
7541 char * name = SECTION_NAME (section);
7542 bfd_size_type length;
7543 unsigned char * start;
7546 length = section->sh_size;
7549 printf (_("\nSection '%s' has no debugging data.\n"), name);
7553 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
7554 "debug section data");
7556 /* See if we know how to display the contents of this section. */
7557 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
7558 name = ".debug_info";
7560 for (i = NUM_ELEM (debug_displays); i--;)
7561 if (strcmp (debug_displays[i].name, name) == 0)
7563 debug_displays[i].display (section, start, file);
7568 printf (_("Unrecognised debug section: %s\n"), name);
7572 /* If we loaded in the abbrev section at some point,
7573 we must release it here. */
7574 if (first_abbrev != NULL)
7581 process_section_contents (file)
7584 Elf32_Internal_Shdr * section;
7590 /* Pre-scan the debug sections to find some debug information not
7591 present in some of them. For the .debug_line, we must find out the
7592 size of address (specified in .debug_info and .debug_aranges). */
7593 for (i = 0, section = section_headers;
7594 i < elf_header.e_shnum && i < num_dump_sects;
7597 char * name = SECTION_NAME (section);
7600 if (section->sh_size == 0)
7603 /* See if there is some pre-scan operation for this section. */
7604 for (j = NUM_ELEM (debug_displays); j--;)
7605 if (strcmp (debug_displays[j].name, name) == 0)
7607 if (debug_displays[j].prescan != NULL)
7609 bfd_size_type length;
7610 unsigned char * start;
7612 length = section->sh_size;
7613 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
7614 "debug section data");
7616 debug_displays[j].prescan (section, start, file);
7624 for (i = 0, section = section_headers;
7625 i < elf_header.e_shnum && i < num_dump_sects;
7628 #ifdef SUPPORT_DISASSEMBLY
7629 if (dump_sects[i] & DISASS_DUMP)
7630 disassemble_section (section, file);
7632 if (dump_sects[i] & HEX_DUMP)
7633 dump_section (section, file);
7635 if (dump_sects[i] & DEBUG_DUMP)
7636 display_debug_section (section, file);
7639 if (i < num_dump_sects)
7640 warn (_("Some sections were not dumped because they do not exist!\n"));
7646 process_mips_fpe_exception (mask)
7652 if (mask & OEX_FPU_INEX)
7653 fputs ("INEX", stdout), first = 0;
7654 if (mask & OEX_FPU_UFLO)
7655 printf ("%sUFLO", first ? "" : "|"), first = 0;
7656 if (mask & OEX_FPU_OFLO)
7657 printf ("%sOFLO", first ? "" : "|"), first = 0;
7658 if (mask & OEX_FPU_DIV0)
7659 printf ("%sDIV0", first ? "" : "|"), first = 0;
7660 if (mask & OEX_FPU_INVAL)
7661 printf ("%sINVAL", first ? "" : "|");
7664 fputs ("0", stdout);
7668 process_mips_specific (file)
7671 Elf_Internal_Dyn * entry;
7672 size_t liblist_offset = 0;
7673 size_t liblistno = 0;
7674 size_t conflictsno = 0;
7675 size_t options_offset = 0;
7676 size_t conflicts_offset = 0;
7678 /* We have a lot of special sections. Thanks SGI! */
7679 if (dynamic_segment == NULL)
7680 /* No information available. */
7683 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
7684 switch (entry->d_tag)
7686 case DT_MIPS_LIBLIST:
7687 liblist_offset = entry->d_un.d_val - loadaddr;
7689 case DT_MIPS_LIBLISTNO:
7690 liblistno = entry->d_un.d_val;
7692 case DT_MIPS_OPTIONS:
7693 options_offset = entry->d_un.d_val - loadaddr;
7695 case DT_MIPS_CONFLICT:
7696 conflicts_offset = entry->d_un.d_val - loadaddr;
7698 case DT_MIPS_CONFLICTNO:
7699 conflictsno = entry->d_un.d_val;
7705 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
7707 Elf32_External_Lib * elib;
7710 GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
7711 elib, Elf32_External_Lib *, "liblist");
7713 printf ("\nSection '.liblist' contains %lu entries:\n",
7714 (unsigned long) liblistno);
7715 fputs (" Library Time Stamp Checksum Version Flags\n",
7718 for (cnt = 0; cnt < liblistno; ++cnt)
7725 liblist.l_name = BYTE_GET (elib[cnt].l_name);
7726 time = BYTE_GET (elib[cnt].l_time_stamp);
7727 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
7728 liblist.l_version = BYTE_GET (elib[cnt].l_version);
7729 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
7731 tmp = gmtime (&time);
7732 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
7733 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7734 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7736 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
7737 dynamic_strings + liblist.l_name, timebuf,
7738 liblist.l_checksum, liblist.l_version);
7740 if (liblist.l_flags == 0)
7751 { " EXACT_MATCH", LL_EXACT_MATCH },
7752 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
7753 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
7754 { " EXPORTS", LL_EXPORTS },
7755 { " DELAY_LOAD", LL_DELAY_LOAD },
7756 { " DELTA", LL_DELTA }
7758 int flags = liblist.l_flags;
7762 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
7764 if ((flags & l_flags_vals[fcnt].bit) != 0)
7766 fputs (l_flags_vals[fcnt].name, stdout);
7767 flags ^= l_flags_vals[fcnt].bit;
7770 printf (" %#x", (unsigned int) flags);
7779 if (options_offset != 0)
7781 Elf_External_Options * eopt;
7782 Elf_Internal_Shdr * sect = section_headers;
7783 Elf_Internal_Options * iopt;
7784 Elf_Internal_Options * option;
7788 /* Find the section header so that we get the size. */
7789 while (sect->sh_type != SHT_MIPS_OPTIONS)
7792 GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
7793 Elf_External_Options *, "options");
7795 iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
7799 error (_("Out of memory"));
7806 while (offset < sect->sh_size)
7808 Elf_External_Options * eoption;
7810 eoption = (Elf_External_Options *) ((char *) eopt + offset);
7812 option->kind = BYTE_GET (eoption->kind);
7813 option->size = BYTE_GET (eoption->size);
7814 option->section = BYTE_GET (eoption->section);
7815 option->info = BYTE_GET (eoption->info);
7817 offset += option->size;
7823 printf (_("\nSection '%s' contains %d entries:\n"),
7824 SECTION_NAME (sect), cnt);
7832 switch (option->kind)
7835 /* This shouldn't happen. */
7836 printf (" NULL %d %lx", option->section, option->info);
7839 printf (" REGINFO ");
7840 if (elf_header.e_machine == EM_MIPS)
7843 Elf32_External_RegInfo * ereg;
7844 Elf32_RegInfo reginfo;
7846 ereg = (Elf32_External_RegInfo *) (option + 1);
7847 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
7848 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
7849 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
7850 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
7851 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
7852 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
7854 printf ("GPR %08lx GP 0x%lx\n",
7856 (unsigned long) reginfo.ri_gp_value);
7857 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
7858 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
7859 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
7864 Elf64_External_RegInfo * ereg;
7865 Elf64_Internal_RegInfo reginfo;
7867 ereg = (Elf64_External_RegInfo *) (option + 1);
7868 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
7869 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
7870 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
7871 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
7872 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
7873 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
7875 printf ("GPR %08lx GP 0x",
7876 reginfo.ri_gprmask);
7877 printf_vma (reginfo.ri_gp_value);
7880 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
7881 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
7882 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
7886 case ODK_EXCEPTIONS:
7887 fputs (" EXCEPTIONS fpe_min(", stdout);
7888 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
7889 fputs (") fpe_max(", stdout);
7890 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
7891 fputs (")", stdout);
7893 if (option->info & OEX_PAGE0)
7894 fputs (" PAGE0", stdout);
7895 if (option->info & OEX_SMM)
7896 fputs (" SMM", stdout);
7897 if (option->info & OEX_FPDBUG)
7898 fputs (" FPDBUG", stdout);
7899 if (option->info & OEX_DISMISS)
7900 fputs (" DISMISS", stdout);
7903 fputs (" PAD ", stdout);
7904 if (option->info & OPAD_PREFIX)
7905 fputs (" PREFIX", stdout);
7906 if (option->info & OPAD_POSTFIX)
7907 fputs (" POSTFIX", stdout);
7908 if (option->info & OPAD_SYMBOL)
7909 fputs (" SYMBOL", stdout);
7912 fputs (" HWPATCH ", stdout);
7913 if (option->info & OHW_R4KEOP)
7914 fputs (" R4KEOP", stdout);
7915 if (option->info & OHW_R8KPFETCH)
7916 fputs (" R8KPFETCH", stdout);
7917 if (option->info & OHW_R5KEOP)
7918 fputs (" R5KEOP", stdout);
7919 if (option->info & OHW_R5KCVTL)
7920 fputs (" R5KCVTL", stdout);
7923 fputs (" FILL ", stdout);
7924 /* XXX Print content of info word? */
7927 fputs (" TAGS ", stdout);
7928 /* XXX Print content of info word? */
7931 fputs (" HWAND ", stdout);
7932 if (option->info & OHWA0_R4KEOP_CHECKED)
7933 fputs (" R4KEOP_CHECKED", stdout);
7934 if (option->info & OHWA0_R4KEOP_CLEAN)
7935 fputs (" R4KEOP_CLEAN", stdout);
7938 fputs (" HWOR ", stdout);
7939 if (option->info & OHWA0_R4KEOP_CHECKED)
7940 fputs (" R4KEOP_CHECKED", stdout);
7941 if (option->info & OHWA0_R4KEOP_CLEAN)
7942 fputs (" R4KEOP_CLEAN", stdout);
7945 printf (" GP_GROUP %#06lx self-contained %#06lx",
7946 option->info & OGP_GROUP,
7947 (option->info & OGP_SELF) >> 16);
7950 printf (" IDENT %#06lx self-contained %#06lx",
7951 option->info & OGP_GROUP,
7952 (option->info & OGP_SELF) >> 16);
7955 /* This shouldn't happen. */
7956 printf (" %3d ??? %d %lx",
7957 option->kind, option->section, option->info);
7961 len = sizeof (* eopt);
7962 while (len < option->size)
7963 if (((char *) option)[len] >= ' '
7964 && ((char *) option)[len] < 0x7f)
7965 printf ("%c", ((char *) option)[len++]);
7967 printf ("\\%03o", ((char *) option)[len++]);
7969 fputs ("\n", stdout);
7976 if (conflicts_offset != 0 && conflictsno != 0)
7978 Elf32_External_Conflict * econf32;
7979 Elf64_External_Conflict * econf64;
7980 Elf32_Conflict * iconf;
7983 if (dynamic_symbols == NULL)
7985 error (_("conflict list with without table"));
7989 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
7992 error (_("Out of memory"));
7998 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (* econf32),
7999 econf32, Elf32_External_Conflict *, "conflict");
8001 for (cnt = 0; cnt < conflictsno; ++cnt)
8002 iconf[cnt] = BYTE_GET (econf32[cnt]);
8006 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (* econf64),
8007 econf64, Elf64_External_Conflict *, "conflict");
8009 for (cnt = 0; cnt < conflictsno; ++cnt)
8010 iconf[cnt] = BYTE_GET (econf64[cnt]);
8013 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
8014 puts (_(" Num: Index Value Name"));
8016 for (cnt = 0; cnt < conflictsno; ++cnt)
8018 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
8020 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
8021 print_vma (psym->st_value, FULL_HEX);
8022 printf (" %s\n", dynamic_strings + psym->st_name);
8032 get_note_type (e_type)
8035 static char buff[64];
8039 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
8040 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
8041 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
8042 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
8043 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
8044 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
8045 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
8046 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
8047 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8048 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8049 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8051 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
8056 /* Note that by the ELF standard, the name field is already null byte
8057 terminated, and namesz includes the terminating null byte.
8058 I.E. the value of namesz for the name "FSF" is 4.
8060 If the value of namesz is zero, there is no name present. */
8062 process_note (pnote)
8063 Elf32_Internal_Note * pnote;
8065 printf (" %s\t\t0x%08lx\t%s\n",
8066 pnote->namesz ? pnote->namedata : "(NONE)",
8067 pnote->descsz, get_note_type (pnote->type));
8073 process_corefile_note_segment (file, offset, length)
8078 Elf_External_Note * pnotes;
8079 Elf_External_Note * external;
8085 GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
8089 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8090 (unsigned long) offset, (unsigned long) length);
8091 printf (_(" Owner\t\tData size\tDescription\n"));
8093 while (external < (Elf_External_Note *)((char *) pnotes + length))
8095 Elf32_Internal_Note inote;
8098 inote.type = BYTE_GET (external->type);
8099 inote.namesz = BYTE_GET (external->namesz);
8100 inote.namedata = external->name;
8101 inote.descsz = BYTE_GET (external->descsz);
8102 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
8103 inote.descpos = offset + (inote.descdata - (char *) pnotes);
8105 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
8107 /* Verify that name is null terminated. It appears that at least
8108 one version of Linux (RedHat 6.0) generates corefiles that don't
8109 comply with the ELF spec by failing to include the null byte in
8111 if (inote.namedata[inote.namesz] != '\0')
8113 temp = malloc (inote.namesz + 1);
8117 error (_("Out of memory\n"));
8122 strncpy (temp, inote.namedata, inote.namesz);
8123 temp[inote.namesz] = 0;
8125 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8126 inote.namedata = temp;
8129 res &= process_note (& inote);
8144 process_corefile_note_segments (file)
8147 Elf_Internal_Phdr * program_headers;
8148 Elf_Internal_Phdr * segment;
8152 program_headers = (Elf_Internal_Phdr *) malloc
8153 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
8155 if (program_headers == NULL)
8157 error (_("Out of memory\n"));
8162 i = get_32bit_program_headers (file, program_headers);
8164 i = get_64bit_program_headers (file, program_headers);
8168 free (program_headers);
8172 for (i = 0, segment = program_headers;
8173 i < elf_header.e_phnum;
8176 if (segment->p_type == PT_NOTE)
8177 res &= process_corefile_note_segment (file,
8178 (bfd_vma) segment->p_offset,
8179 (bfd_vma) segment->p_filesz);
8182 free (program_headers);
8188 process_corefile_contents (file)
8191 /* If we have not been asked to display the notes then do nothing. */
8195 /* If file is not a core file then exit. */
8196 if (elf_header.e_type != ET_CORE)
8199 /* No program headers means no NOTE segment. */
8200 if (elf_header.e_phnum == 0)
8202 printf (_("No note segments present in the core file.\n"));
8206 return process_corefile_note_segments (file);
8210 process_arch_specific (file)
8216 switch (elf_header.e_machine)
8219 case EM_MIPS_RS4_BE:
8220 return process_mips_specific (file);
8229 get_file_header (file)
8232 /* Read in the identity array. */
8233 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
8236 /* Determine how to read the rest of the header. */
8237 switch (elf_header.e_ident [EI_DATA])
8239 default: /* fall through */
8240 case ELFDATANONE: /* fall through */
8241 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
8242 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
8245 /* For now we only support 32 bit and 64 bit ELF files. */
8246 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
8248 /* Read in the rest of the header. */
8251 Elf32_External_Ehdr ehdr32;
8253 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
8256 elf_header.e_type = BYTE_GET (ehdr32.e_type);
8257 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
8258 elf_header.e_version = BYTE_GET (ehdr32.e_version);
8259 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
8260 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
8261 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
8262 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
8263 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
8264 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
8265 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
8266 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
8267 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
8268 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
8272 Elf64_External_Ehdr ehdr64;
8274 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8275 we will not be able to cope with the 64bit data found in
8276 64 ELF files. Detect this now and abort before we start
8277 overwritting things. */
8278 if (sizeof (bfd_vma) < 8)
8280 error (_("This instance of readelf has been built without support for a\n"));
8281 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
8285 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
8288 elf_header.e_type = BYTE_GET (ehdr64.e_type);
8289 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
8290 elf_header.e_version = BYTE_GET (ehdr64.e_version);
8291 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
8292 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
8293 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
8294 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
8295 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
8296 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
8297 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
8298 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
8299 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
8300 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
8307 process_file (file_name)
8311 struct stat statbuf;
8314 if (stat (file_name, & statbuf) < 0)
8316 error (_("Cannot stat input file %s.\n"), file_name);
8320 file = fopen (file_name, "rb");
8323 error (_("Input file %s not found.\n"), file_name);
8327 if (! get_file_header (file))
8329 error (_("%s: Failed to read file header\n"), file_name);
8334 /* Initialise per file variables. */
8335 for (i = NUM_ELEM (version_info); i--;)
8336 version_info[i] = 0;
8338 for (i = NUM_ELEM (dynamic_info); i--;)
8339 dynamic_info[i] = 0;
8341 /* Process the file. */
8343 printf (_("\nFile: %s\n"), file_name);
8345 if (! process_file_header ())
8351 process_section_headers (file);
8353 process_program_headers (file);
8355 process_dynamic_segment (file);
8357 process_relocs (file);
8359 process_unwind (file);
8361 process_symbol_table (file);
8363 process_syminfo (file);
8365 process_version_sections (file);
8367 process_section_contents (file);
8369 process_corefile_contents (file);
8371 process_arch_specific (file);
8375 if (section_headers)
8377 free (section_headers);
8378 section_headers = NULL;
8383 free (string_table);
8384 string_table = NULL;
8385 string_table_length = 0;
8388 if (dynamic_strings)
8390 free (dynamic_strings);
8391 dynamic_strings = NULL;
8394 if (dynamic_symbols)
8396 free (dynamic_symbols);
8397 dynamic_symbols = NULL;
8398 num_dynamic_syms = 0;
8401 if (dynamic_syminfo)
8403 free (dynamic_syminfo);
8404 dynamic_syminfo = NULL;
8408 #ifdef SUPPORT_DISASSEMBLY
8409 /* Needed by the i386 disassembler. For extra credit, someone could
8410 fix this so that we insert symbolic addresses here, esp for GOT/PLT
8414 print_address (unsigned int addr, FILE * outfile)
8416 fprintf (outfile,"0x%8.8x", addr);
8419 /* Needed by the i386 disassembler. */
8421 db_task_printsym (unsigned int addr)
8423 print_address (addr, stderr);
8432 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
8433 setlocale (LC_MESSAGES, "");
8435 bindtextdomain (PACKAGE, LOCALEDIR);
8436 textdomain (PACKAGE);
8438 parse_args (argc, argv);
8440 if (optind < (argc - 1))
8443 while (optind < argc)
8444 process_file (argv [optind ++]);
8446 if (dump_sects != NULL)