1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998, 99, 2000 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"
80 char * program_name = "readelf";
81 unsigned int dynamic_addr;
82 bfd_size_type dynamic_size;
83 unsigned int rela_addr;
84 unsigned int rela_size;
85 char * dynamic_strings;
87 unsigned long num_dynamic_syms;
88 Elf_Internal_Sym * dynamic_symbols;
89 Elf_Internal_Syminfo * dynamic_syminfo;
90 unsigned long dynamic_syminfo_offset;
91 unsigned int dynamic_syminfo_nent;
92 char program_interpreter [64];
93 int dynamic_info[DT_JMPREL + 1];
96 Elf_Internal_Ehdr elf_header;
97 Elf_Internal_Shdr * section_headers;
98 Elf_Internal_Dyn * dynamic_segment;
105 int do_using_dynamic;
112 int do_debug_abbrevs;
114 int do_debug_pubnames;
115 int do_debug_aranges;
121 /* A dynamic array of flags indicating which sections require dumping. */
122 char * dump_sects = NULL;
123 unsigned int num_dump_sects = 0;
125 #define HEX_DUMP (1 << 0)
126 #define DISASS_DUMP (1 << 1)
127 #define DEBUG_DUMP (1 << 2)
129 /* How to rpint a vma value. */
130 typedef enum print_mode
142 /* Forward declarations for dumb compilers. */
143 static void print_vma PARAMS ((bfd_vma, print_mode));
144 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
145 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
146 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
147 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
148 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
149 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
150 static const char * get_dynamic_type PARAMS ((unsigned long));
151 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
152 static char * get_file_type PARAMS ((unsigned));
153 static char * get_machine_name PARAMS ((unsigned));
154 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
155 static char * get_machine_flags PARAMS ((unsigned, unsigned));
156 static const char * get_mips_segment_type PARAMS ((unsigned long));
157 static const char * get_parisc_segment_type PARAMS ((unsigned long));
158 static const char * get_segment_type PARAMS ((unsigned long));
159 static const char * get_mips_section_type_name PARAMS ((unsigned int));
160 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
161 static const char * get_section_type_name PARAMS ((unsigned int));
162 static const char * get_symbol_binding PARAMS ((unsigned int));
163 static const char * get_symbol_type PARAMS ((unsigned int));
164 static const char * get_symbol_visibility PARAMS ((unsigned int));
165 static const char * get_symbol_index_type PARAMS ((unsigned int));
166 static const char * get_dynamic_flags PARAMS ((bfd_vma));
167 static void usage PARAMS ((void));
168 static void parse_args PARAMS ((int, char **));
169 static int process_file_header PARAMS ((void));
170 static int process_program_headers PARAMS ((FILE *));
171 static int process_section_headers PARAMS ((FILE *));
172 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
173 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
174 static int process_dynamic_segment PARAMS ((FILE *));
175 static int process_symbol_table PARAMS ((FILE *));
176 static int process_section_contents PARAMS ((FILE *));
177 static void process_file PARAMS ((char *));
178 static int process_relocs PARAMS ((FILE *));
179 static int process_version_sections PARAMS ((FILE *));
180 static char * get_ver_flags PARAMS ((unsigned int));
181 static int get_32bit_section_headers PARAMS ((FILE *));
182 static int get_64bit_section_headers PARAMS ((FILE *));
183 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
184 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
185 static int get_file_header PARAMS ((FILE *));
186 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
187 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
188 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
189 static int get_32bit_dynamic_segment PARAMS ((FILE *));
190 static int get_64bit_dynamic_segment PARAMS ((FILE *));
191 #ifdef SUPPORT_DISASSEMBLY
192 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
194 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
195 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
196 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
197 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
198 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
199 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
200 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
201 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
202 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
203 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
204 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
205 static void reset_state_machine PARAMS ((int));
206 static char * get_TAG_name PARAMS ((unsigned long));
207 static char * get_AT_name PARAMS ((unsigned long));
208 static char * get_FORM_name PARAMS ((unsigned long));
209 static void free_abbrevs PARAMS ((void));
210 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
211 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
212 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
213 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
214 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
215 static void request_dump PARAMS ((unsigned int, char));
216 static const char * get_elf_class PARAMS ((unsigned char));
217 static const char * get_data_encoding PARAMS ((unsigned char));
218 static const char * get_osabi_name PARAMS ((unsigned char));
219 static int guess_is_rela PARAMS ((unsigned long));
220 static char * get_note_type PARAMS ((unsigned int));
221 static int process_note PARAMS ((Elf32_Internal_Note *));
222 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
223 static int process_corefile_note_segments PARAMS ((FILE *));
224 static int process_corefile_contents PARAMS ((FILE *));
226 typedef int Elf32_Word;
234 #define SECTION_NAME(X) (string_table + (X)->sh_name)
236 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
238 #define BYTE_GET(field) byte_get (field, sizeof (field))
240 /* If we can support a 64 bit data type then BFD64 should be defined
241 and sizeof (bfd_vma) == 8. In this case when translating from an
242 external 8 byte field to an internal field, we can assume that the
243 internal field is also 8 bytes wide and so we can extact all the data.
244 If, however, BFD64 is not defined, then we must assume that the
245 internal data structure only has 4 byte wide fields that are the
246 equivalent of the 8 byte wide external counterparts, and so we must
247 truncate the data. */
249 #define BYTE_GET8(field) byte_get (field, -8)
251 #define BYTE_GET8(field) byte_get (field, 8)
254 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
256 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
257 if (fseek (file, offset, SEEK_SET)) \
259 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
263 var = (type) malloc (size); \
267 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
271 if (fread (var, size, 1, file) != 1) \
273 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
280 #define GET_DATA(offset, var, reason) \
281 if (fseek (file, offset, SEEK_SET)) \
283 error (_("Unable to seek to %x for %s\n"), offset, reason); \
286 else if (fread (& var, sizeof (var), 1, file) != 1) \
288 error (_("Unable to read data at %x for %s\n"), offset, reason); \
292 #define GET_ELF_SYMBOLS(file, offset, size) \
293 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
294 : get_64bit_elf_symbols (file, offset, size))
297 #ifdef ANSI_PROTOTYPES
299 error (const char * message, ...)
303 fprintf (stderr, _("%s: Error: "), program_name);
304 va_start (args, message);
305 vfprintf (stderr, message, args);
311 warn (const char * message, ...)
315 fprintf (stderr, _("%s: Warning: "), program_name);
316 va_start (args, message);
317 vfprintf (stderr, message, args);
329 fprintf (stderr, _("%s: Error: "), program_name);
331 message = va_arg (args, char *);
332 vfprintf (stderr, message, args);
344 fprintf (stderr, _("%s: Warning: "), program_name);
346 message = va_arg (args, char *);
347 vfprintf (stderr, message, args);
354 byte_get_little_endian (field, size)
355 unsigned char * field;
364 return ((unsigned int) (field [0]))
365 | (((unsigned int) (field [1])) << 8);
368 /* We want to extract data from an 8 byte wide field and
369 place it into a 4 byte wide field. Since this is a little
370 endian source we can juts use the 4 byte extraction code. */
373 return ((unsigned long) (field [0]))
374 | (((unsigned long) (field [1])) << 8)
375 | (((unsigned long) (field [2])) << 16)
376 | (((unsigned long) (field [3])) << 24);
380 /* This is a special case, generated by the BYTE_GET8 macro.
381 It means that we are loading an 8 byte value from a field
382 in an external structure into an 8 byte value in a field
383 in an internal strcuture. */
384 return ((bfd_vma) (field [0]))
385 | (((bfd_vma) (field [1])) << 8)
386 | (((bfd_vma) (field [2])) << 16)
387 | (((bfd_vma) (field [3])) << 24)
388 | (((bfd_vma) (field [4])) << 32)
389 | (((bfd_vma) (field [5])) << 40)
390 | (((bfd_vma) (field [6])) << 48)
391 | (((bfd_vma) (field [7])) << 56);
394 error (_("Unhandled data length: %d\n"), size);
399 /* Print a VMA value. */
401 print_vma (vma, mode)
411 case FULL_HEX: printf ("0x"); /* drop through */
412 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
413 case PREFIX_HEX: printf ("0x"); /* drop through */
414 case HEX: printf ("%lx", (unsigned long) vma); break;
415 case DEC: printf ("%ld", (unsigned long) vma); break;
416 case DEC_5: printf ("%5ld", (long) vma); break;
417 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
438 #if BFD_HOST_64BIT_LONG
441 if (_bfd_int64_high (vma))
442 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
444 printf ("%lx", _bfd_int64_low (vma));
449 #if BFD_HOST_64BIT_LONG
452 if (_bfd_int64_high (vma))
454 printf ("++%ld", _bfd_int64_low (vma));
456 printf ("%ld", _bfd_int64_low (vma));
461 #if BFD_HOST_64BIT_LONG
462 printf ("%5ld", vma);
464 if (_bfd_int64_high (vma))
466 printf ("++%ld", _bfd_int64_low (vma));
468 printf ("%5ld", _bfd_int64_low (vma));
473 #if BFD_HOST_64BIT_LONG
476 if (_bfd_int64_high (vma))
478 printf ("++%lu", _bfd_int64_low (vma));
480 printf ("%lu", _bfd_int64_low (vma));
489 byte_get_big_endian (field, size)
490 unsigned char * field;
499 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
502 return ((unsigned long) (field [3]))
503 | (((unsigned long) (field [2])) << 8)
504 | (((unsigned long) (field [1])) << 16)
505 | (((unsigned long) (field [0])) << 24);
508 /* Although we are extracing data from an 8 byte wide field, we
509 are returning only 4 bytes of data. */
510 return ((unsigned long) (field [7]))
511 | (((unsigned long) (field [6])) << 8)
512 | (((unsigned long) (field [5])) << 16)
513 | (((unsigned long) (field [4])) << 24);
517 /* This is a special case, generated by the BYTE_GET8 macro.
518 It means that we are loading an 8 byte value from a field
519 in an external structure into an 8 byte value in a field
520 in an internal strcuture. */
521 return ((bfd_vma) (field [7]))
522 | (((bfd_vma) (field [6])) << 8)
523 | (((bfd_vma) (field [5])) << 16)
524 | (((bfd_vma) (field [4])) << 24)
525 | (((bfd_vma) (field [3])) << 32)
526 | (((bfd_vma) (field [2])) << 40)
527 | (((bfd_vma) (field [1])) << 48)
528 | (((bfd_vma) (field [0])) << 56);
532 error (_("Unhandled data length: %d\n"), size);
538 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
540 guess_is_rela (e_machine)
541 unsigned long e_machine;
545 /* Targets that use REL relocations. */
556 /* Targets that use RELA relocations. */
564 case EM_CYGNUS_MN10200:
565 case EM_CYGNUS_MN10300:
595 warn (_("Don't know about relocations on this machine architecture\n"));
600 /* Display the contents of the relocation data found at the specified offset. */
602 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
604 unsigned long rel_offset;
605 unsigned long rel_size;
606 Elf_Internal_Sym * symtab;
612 Elf_Internal_Rel * rels;
613 Elf_Internal_Rela * relas;
616 if (is_rela == UNKNOWN)
617 is_rela = guess_is_rela (elf_header.e_machine);
623 Elf32_External_Rela * erelas;
625 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
626 Elf32_External_Rela *, "relocs");
628 rel_size = rel_size / sizeof (Elf32_External_Rela);
630 relas = (Elf_Internal_Rela *)
631 malloc (rel_size * sizeof (Elf_Internal_Rela));
635 error(_("out of memory parsing relocs"));
639 for (i = 0; i < rel_size; i++)
641 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
642 relas[i].r_info = BYTE_GET (erelas[i].r_info);
643 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
648 rels = (Elf_Internal_Rel *) relas;
652 Elf64_External_Rela * erelas;
654 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
655 Elf64_External_Rela *, "relocs");
657 rel_size = rel_size / sizeof (Elf64_External_Rela);
659 relas = (Elf_Internal_Rela *)
660 malloc (rel_size * sizeof (Elf_Internal_Rela));
664 error(_("out of memory parsing relocs"));
668 for (i = 0; i < rel_size; i++)
670 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
671 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
672 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
677 rels = (Elf_Internal_Rel *) relas;
684 Elf32_External_Rel * erels;
686 GET_DATA_ALLOC (rel_offset, rel_size, erels,
687 Elf32_External_Rel *, "relocs");
689 rel_size = rel_size / sizeof (Elf32_External_Rel);
691 rels = (Elf_Internal_Rel *)
692 malloc (rel_size * sizeof (Elf_Internal_Rel));
696 error(_("out of memory parsing relocs"));
700 for (i = 0; i < rel_size; i++)
702 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
703 rels[i].r_info = BYTE_GET (erels[i].r_info);
708 relas = (Elf_Internal_Rela *) rels;
712 Elf64_External_Rel * erels;
714 GET_DATA_ALLOC (rel_offset, rel_size, erels,
715 Elf64_External_Rel *, "relocs");
717 rel_size = rel_size / sizeof (Elf64_External_Rel);
719 rels = (Elf_Internal_Rel *)
720 malloc (rel_size * sizeof (Elf_Internal_Rel));
724 error(_("out of memory parsing relocs"));
728 for (i = 0; i < rel_size; i++)
730 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
731 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
736 relas = (Elf_Internal_Rela *) rels;
742 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
745 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
747 for (i = 0; i < rel_size; i++)
752 bfd_vma symtab_index;
757 offset = relas [i].r_offset;
758 info = relas [i].r_info;
762 offset = rels [i].r_offset;
763 info = rels [i].r_info;
768 type = ELF32_R_TYPE (info);
769 symtab_index = ELF32_R_SYM (info);
773 if (elf_header.e_machine == EM_SPARCV9)
774 type = ELF64_R_TYPE_ID (info);
776 type = ELF64_R_TYPE (info);
777 /* The #ifdef BFD64 below is to prevent a compile time warning.
778 We know that if we do not have a 64 bit data type that we
779 will never execute this code anyway. */
781 symtab_index = ELF64_R_SYM (info);
785 #ifdef _bfd_int64_low
786 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
788 printf (" %8.8lx %5.5lx ", offset, info);
791 switch (elf_header.e_machine)
798 rtype = elf_m32r_reloc_type (type);
803 rtype = elf_i386_reloc_type (type);
807 rtype = elf_m68k_reloc_type (type);
811 rtype = elf_i960_reloc_type (type);
815 rtype = elf_avr_reloc_type (type);
822 rtype = elf_sparc_reloc_type (type);
826 rtype = v850_reloc_type (type);
830 rtype = elf_d10v_reloc_type (type);
834 rtype = elf_d30v_reloc_type (type);
838 rtype = elf_sh_reloc_type (type);
841 case EM_CYGNUS_MN10300:
842 rtype = elf_mn10300_reloc_type (type);
845 case EM_CYGNUS_MN10200:
846 rtype = elf_mn10200_reloc_type (type);
850 rtype = elf_fr30_reloc_type (type);
854 rtype = elf_mcore_reloc_type (type);
858 rtype = elf_ppc_reloc_type (type);
863 rtype = elf_mips_reloc_type (type);
867 rtype = elf_alpha_reloc_type (type);
871 rtype = elf_arm_reloc_type (type);
875 rtype = elf_arc_reloc_type (type);
879 rtype = elf_hppa_reloc_type (type);
883 rtype = elf_pj_reloc_type (type);
886 rtype = elf_ia64_reloc_type (type);
890 rtype = elf_cris_reloc_type (type);
894 rtype = elf_i860_reloc_type (type);
899 #ifdef _bfd_int64_low
900 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
902 printf (_("unrecognised: %-7lx"), type);
905 printf ("%-21.21s", rtype);
911 if (symtab_index >= nsyms)
912 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
915 Elf_Internal_Sym * psym;
917 psym = symtab + symtab_index;
920 print_vma (psym->st_value, LONG_HEX);
923 if (psym->st_name == 0)
925 SECTION_NAME (section_headers + psym->st_shndx));
926 else if (strtab == NULL)
927 printf (_("<string table index %3ld>"), psym->st_name);
929 printf ("%-25.25s", strtab + psym->st_name);
932 printf (" + %lx", (unsigned long) relas [i].r_addend);
938 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
939 print_vma (relas[i].r_addend, LONG_HEX);
942 if (elf_header.e_machine == EM_SPARCV9
943 && !strcmp (rtype, "R_SPARC_OLO10"))
944 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
955 get_mips_dynamic_type (type)
960 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
961 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
962 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
963 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
964 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
965 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
966 case DT_MIPS_MSYM: return "MIPS_MSYM";
967 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
968 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
969 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
970 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
971 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
972 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
973 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
974 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
975 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
976 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
977 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
978 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
979 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
980 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
981 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
982 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
983 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
984 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
985 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
986 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
987 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
988 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
989 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
990 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
991 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
992 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
993 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
994 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
995 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
996 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
997 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
998 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
999 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1000 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1001 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1002 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1009 get_sparc64_dynamic_type (type)
1014 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1021 get_parisc_dynamic_type (type)
1026 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1027 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1028 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1029 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1030 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1031 case DT_HP_PREINIT: return "HP_PREINIT";
1032 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1033 case DT_HP_NEEDED: return "HP_NEEDED";
1034 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1035 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1036 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1037 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1038 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1045 get_dynamic_type (type)
1048 static char buff [32];
1052 case DT_NULL: return "NULL";
1053 case DT_NEEDED: return "NEEDED";
1054 case DT_PLTRELSZ: return "PLTRELSZ";
1055 case DT_PLTGOT: return "PLTGOT";
1056 case DT_HASH: return "HASH";
1057 case DT_STRTAB: return "STRTAB";
1058 case DT_SYMTAB: return "SYMTAB";
1059 case DT_RELA: return "RELA";
1060 case DT_RELASZ: return "RELASZ";
1061 case DT_RELAENT: return "RELAENT";
1062 case DT_STRSZ: return "STRSZ";
1063 case DT_SYMENT: return "SYMENT";
1064 case DT_INIT: return "INIT";
1065 case DT_FINI: return "FINI";
1066 case DT_SONAME: return "SONAME";
1067 case DT_RPATH: return "RPATH";
1068 case DT_SYMBOLIC: return "SYMBOLIC";
1069 case DT_REL: return "REL";
1070 case DT_RELSZ: return "RELSZ";
1071 case DT_RELENT: return "RELENT";
1072 case DT_PLTREL: return "PLTREL";
1073 case DT_DEBUG: return "DEBUG";
1074 case DT_TEXTREL: return "TEXTREL";
1075 case DT_JMPREL: return "JMPREL";
1076 case DT_BIND_NOW: return "BIND_NOW";
1077 case DT_INIT_ARRAY: return "INIT_ARRAY";
1078 case DT_FINI_ARRAY: return "FINI_ARRAY";
1079 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1080 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1081 case DT_RUNPATH: return "RUNPATH";
1082 case DT_FLAGS: return "FLAGS";
1084 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1085 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1087 case DT_CHECKSUM: return "CHECKSUM";
1088 case DT_PLTPADSZ: return "PLTPADSZ";
1089 case DT_MOVEENT: return "MOVEENT";
1090 case DT_MOVESZ: return "MOVESZ";
1091 case DT_FEATURE: return "FEATURE";
1092 case DT_POSFLAG_1: return "POSFLAG_1";
1093 case DT_SYMINSZ: return "SYMINSZ";
1094 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1096 case DT_ADDRRNGLO: return "ADDRRNGLO";
1097 case DT_CONFIG: return "CONFIG";
1098 case DT_DEPAUDIT: return "DEPAUDIT";
1099 case DT_AUDIT: return "AUDIT";
1100 case DT_PLTPAD: return "PLTPAD";
1101 case DT_MOVETAB: return "MOVETAB";
1102 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1104 case DT_VERSYM: return "VERSYM";
1106 case DT_RELACOUNT: return "RELACOUNT";
1107 case DT_RELCOUNT: return "RELCOUNT";
1108 case DT_FLAGS_1: return "FLAGS_1";
1109 case DT_VERDEF: return "VERDEF";
1110 case DT_VERDEFNUM: return "VERDEFNUM";
1111 case DT_VERNEED: return "VERNEED";
1112 case DT_VERNEEDNUM: return "VERNEEDNUM";
1114 case DT_AUXILIARY: return "AUXILIARY";
1115 case DT_USED: return "USED";
1116 case DT_FILTER: return "FILTER";
1119 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1121 const char * result;
1123 switch (elf_header.e_machine)
1126 case EM_MIPS_RS4_BE:
1127 result = get_mips_dynamic_type (type);
1130 result = get_sparc64_dynamic_type (type);
1140 sprintf (buff, _("Processor Specific: %lx"), type);
1142 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1144 const char * result;
1146 switch (elf_header.e_machine)
1149 result = get_parisc_dynamic_type (type);
1159 sprintf (buff, _("Operating System specific: %lx"), type);
1162 sprintf (buff, _("<unknown>: %lx"), type);
1169 get_file_type (e_type)
1172 static char buff [32];
1176 case ET_NONE: return _("NONE (None)");
1177 case ET_REL: return _("REL (Relocatable file)");
1178 case ET_EXEC: return _("EXEC (Executable file)");
1179 case ET_DYN: return _("DYN (Shared object file)");
1180 case ET_CORE: return _("CORE (Core file)");
1183 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1184 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1185 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1186 sprintf (buff, _("OS Specific: (%x)"), e_type);
1188 sprintf (buff, _("<unknown>: %x"), e_type);
1194 get_machine_name (e_machine)
1197 static char buff [64]; /* XXX */
1201 case EM_NONE: return _("None");
1202 case EM_M32: return "WE32100";
1203 case EM_SPARC: return "Sparc";
1204 case EM_386: return "Intel 80386";
1205 case EM_68K: return "MC68000";
1206 case EM_88K: return "MC88000";
1207 case EM_486: return "Intel 80486";
1208 case EM_860: return "Intel 80860";
1209 case EM_MIPS: return "MIPS R3000";
1210 case EM_S370: return "IBM System/370";
1211 case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
1212 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1213 case EM_PARISC: return "HPPA";
1214 case EM_PPC_OLD: return "Power PC (old)";
1215 case EM_SPARC32PLUS: return "Sparc v8+" ;
1216 case EM_960: return "Intel 90860";
1217 case EM_PPC: return "PowerPC";
1218 case EM_V800: return "NEC V800";
1219 case EM_FR20: return "Fujitsu FR20";
1220 case EM_RH32: return "TRW RH32";
1221 case EM_MCORE: return "MCORE";
1222 case EM_ARM: return "ARM";
1223 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1224 case EM_SH: return "Hitachi SH";
1225 case EM_SPARCV9: return "Sparc v9";
1226 case EM_TRICORE: return "Siemens Tricore";
1227 case EM_ARC: return "Argonaut RISC Core";
1228 case EM_H8_300: return "Hitachi H8/300";
1229 case EM_H8_300H: return "Hitachi H8/300H";
1230 case EM_H8S: return "Hitachi H8S";
1231 case EM_H8_500: return "Hitachi H8/500";
1232 case EM_IA_64: return "Intel IA-64";
1233 case EM_MIPS_X: return "Stanford MIPS-X";
1234 case EM_COLDFIRE: return "Motorola Coldfire";
1235 case EM_68HC12: return "Motorola M68HC12";
1236 case EM_ALPHA: return "Alpha";
1237 case EM_CYGNUS_D10V: return "d10v";
1238 case EM_CYGNUS_D30V: return "d30v";
1239 case EM_CYGNUS_ARC: return "Arc";
1240 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1241 case EM_CYGNUS_V850: return "NEC v850";
1242 case EM_CYGNUS_MN10300: return "mn10300";
1243 case EM_CYGNUS_MN10200: return "mn10200";
1244 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1245 case EM_PJ: return "picoJava";
1246 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1247 case EM_PCP: return "Siemens PCP";
1248 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1249 case EM_NDR1: return "Denso NDR1 microprocesspr";
1250 case EM_STARCORE: return "Motorola Star*Core processor";
1251 case EM_ME16: return "Toyota ME16 processor";
1252 case EM_ST100: return "STMicroelectronics ST100 processor";
1253 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1254 case EM_FX66: return "Siemens FX66 microcontroller";
1255 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1256 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1257 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1258 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1259 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1260 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1261 case EM_SVX: return "Silicon Graphics SVx";
1262 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1263 case EM_VAX: return "Digital VAX";
1264 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1265 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1266 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1267 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1268 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1269 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1270 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1271 case EM_PRISM: return "SiTera Prism";
1274 sprintf (buff, _("<unknown>: %x"), e_machine);
1280 decode_ARM_machine_flags (e_flags, buf)
1287 eabi = EF_ARM_EABI_VERSION (e_flags);
1288 e_flags &= ~ EF_ARM_EABIMASK;
1290 /* Handle "generic" ARM flags. */
1291 if (e_flags & EF_ARM_RELEXEC)
1293 strcat (buf, ", relocatable executable");
1294 e_flags &= ~ EF_ARM_RELEXEC;
1297 if (e_flags & EF_ARM_HASENTRY)
1299 strcat (buf, ", has entry point");
1300 e_flags &= ~ EF_ARM_HASENTRY;
1303 /* Now handle EABI specific flags. */
1307 strcat (buf, ", <unknown EABI>");
1312 case EF_ARM_EABI_VER1:
1317 /* Process flags one bit at a time. */
1318 flag = e_flags & - e_flags;
1323 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_INTERWORK. */
1324 strcat (buf, ", sorted symbol tables");
1334 case EF_ARM_EABI_UNKNOWN:
1339 /* Process flags one bit at a time. */
1340 flag = e_flags & - e_flags;
1346 strcat (buf, ", interworking enabled");
1350 strcat (buf, ", uses APCS/26");
1354 strcat (buf, ", uses APCS/float");
1358 strcat (buf, ", position independent");
1362 strcat (buf, ", 8 bit structure alignment");
1366 strcat (buf, ", uses new ABI");
1370 strcat (buf, ", uses old ABI");
1374 strcat (buf, ", software FP");
1385 strcat (buf,", <unknown>");
1389 get_machine_flags (e_flags, e_machine)
1393 static char buf [1024];
1405 decode_ARM_machine_flags (e_flags, buf);
1409 if (e_flags & EF_CPU32)
1410 strcat (buf, ", cpu32");
1414 if (e_flags & EF_PPC_EMB)
1415 strcat (buf, ", emb");
1417 if (e_flags & EF_PPC_RELOCATABLE)
1418 strcat (buf, ", relocatable");
1420 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1421 strcat (buf, ", relocatable-lib");
1424 case EM_CYGNUS_V850:
1425 switch (e_flags & EF_V850_ARCH)
1428 strcat (buf, ", v850e");
1431 strcat (buf, ", v850ea");
1434 strcat (buf, ", v850");
1437 strcat (buf, ", unknown v850 architecture variant");
1442 case EM_CYGNUS_M32R:
1443 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1444 strcat (buf, ", m32r");
1449 case EM_MIPS_RS4_BE:
1450 if (e_flags & EF_MIPS_NOREORDER)
1451 strcat (buf, ", noreorder");
1453 if (e_flags & EF_MIPS_PIC)
1454 strcat (buf, ", pic");
1456 if (e_flags & EF_MIPS_CPIC)
1457 strcat (buf, ", cpic");
1459 if (e_flags & EF_MIPS_ABI2)
1460 strcat (buf, ", abi2");
1462 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1463 strcat (buf, ", mips1");
1465 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1466 strcat (buf, ", mips2");
1468 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1469 strcat (buf, ", mips3");
1471 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1472 strcat (buf, ", mips4");
1474 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
1475 strcat (buf, ", mips32");
1477 switch ((e_flags & EF_MIPS_MACH))
1479 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1480 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1481 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1482 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1483 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1484 case E_MIPS_MACH_MIPS32_4K: strcat (buf, ", mips32-4k"); break;
1485 default: strcat (buf, " UNKNOWN"); break;
1490 if (e_flags & EF_SPARC_32PLUS)
1491 strcat (buf, ", v8+");
1493 if (e_flags & EF_SPARC_SUN_US1)
1494 strcat (buf, ", ultrasparcI");
1496 if (e_flags & EF_SPARC_SUN_US3)
1497 strcat (buf, ", ultrasparcIII");
1499 if (e_flags & EF_SPARC_HAL_R1)
1500 strcat (buf, ", halr1");
1502 if (e_flags & EF_SPARC_LEDATA)
1503 strcat (buf, ", ledata");
1505 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1506 strcat (buf, ", tso");
1508 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1509 strcat (buf, ", pso");
1511 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1512 strcat (buf, ", rmo");
1516 switch (e_flags & EF_PARISC_ARCH)
1518 case EFA_PARISC_1_0:
1519 strcpy (buf, ", PA-RISC 1.0");
1521 case EFA_PARISC_1_1:
1522 strcpy (buf, ", PA-RISC 1.1");
1524 case EFA_PARISC_2_0:
1525 strcpy (buf, ", PA-RISC 2.0");
1530 if (e_flags & EF_PARISC_TRAPNIL)
1531 strcat (buf, ", trapnil");
1532 if (e_flags & EF_PARISC_EXT)
1533 strcat (buf, ", ext");
1534 if (e_flags & EF_PARISC_LSB)
1535 strcat (buf, ", lsb");
1536 if (e_flags & EF_PARISC_WIDE)
1537 strcat (buf, ", wide");
1538 if (e_flags & EF_PARISC_NO_KABP)
1539 strcat (buf, ", no kabp");
1540 if (e_flags & EF_PARISC_LAZYSWAP)
1541 strcat (buf, ", lazyswap");
1545 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1546 strcat (buf, ", new calling convention");
1548 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1549 strcat (buf, ", gnu calling convention");
1558 get_mips_segment_type (type)
1563 case PT_MIPS_REGINFO:
1565 case PT_MIPS_RTPROC:
1567 case PT_MIPS_OPTIONS:
1577 get_parisc_segment_type (type)
1582 case PT_HP_TLS: return "HP_TLS";
1583 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1584 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1585 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1586 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1587 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1588 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1589 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1590 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1591 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1592 case PT_HP_PARALLEL: return "HP_PARALLEL";
1593 case PT_HP_FASTBIND: return "HP_FASTBIND";
1594 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1595 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1604 get_segment_type (p_type)
1605 unsigned long p_type;
1607 static char buff [32];
1611 case PT_NULL: return "NULL";
1612 case PT_LOAD: return "LOAD";
1613 case PT_DYNAMIC: return "DYNAMIC";
1614 case PT_INTERP: return "INTERP";
1615 case PT_NOTE: return "NOTE";
1616 case PT_SHLIB: return "SHLIB";
1617 case PT_PHDR: return "PHDR";
1620 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1622 const char * result;
1624 switch (elf_header.e_machine)
1627 case EM_MIPS_RS4_BE:
1628 result = get_mips_segment_type (p_type);
1631 result = get_parisc_segment_type (p_type);
1641 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1643 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1645 const char * result;
1647 switch (elf_header.e_machine)
1650 result = get_parisc_segment_type (p_type);
1660 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1663 sprintf (buff, _("<unknown>: %lx"), p_type);
1670 get_mips_section_type_name (sh_type)
1671 unsigned int sh_type;
1675 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1676 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1677 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1678 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1679 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1680 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1681 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1682 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1683 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1684 case SHT_MIPS_RELD: return "MIPS_RELD";
1685 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1686 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1687 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1688 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1689 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1690 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1691 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1692 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1693 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1694 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1695 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1696 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1697 case SHT_MIPS_LINE: return "MIPS_LINE";
1698 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1699 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1700 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1701 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1702 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1703 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1704 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1705 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1706 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1707 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1708 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1709 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1710 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1711 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1712 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1713 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1721 get_parisc_section_type_name (sh_type)
1722 unsigned int sh_type;
1726 case SHT_PARISC_EXT: return "PARISC_EXT";
1727 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1728 case SHT_PARISC_DOC: return "PARISC_DOC";
1736 get_section_type_name (sh_type)
1737 unsigned int sh_type;
1739 static char buff [32];
1743 case SHT_NULL: return "NULL";
1744 case SHT_PROGBITS: return "PROGBITS";
1745 case SHT_SYMTAB: return "SYMTAB";
1746 case SHT_STRTAB: return "STRTAB";
1747 case SHT_RELA: return "RELA";
1748 case SHT_HASH: return "HASH";
1749 case SHT_DYNAMIC: return "DYNAMIC";
1750 case SHT_NOTE: return "NOTE";
1751 case SHT_NOBITS: return "NOBITS";
1752 case SHT_REL: return "REL";
1753 case SHT_SHLIB: return "SHLIB";
1754 case SHT_DYNSYM: return "DYNSYM";
1755 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1756 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1757 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1758 case SHT_GROUP: return "GROUP";
1759 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
1760 case SHT_GNU_verdef: return "VERDEF";
1761 case SHT_GNU_verneed: return "VERNEED";
1762 case SHT_GNU_versym: return "VERSYM";
1763 case 0x6ffffff0: return "VERSYM";
1764 case 0x6ffffffc: return "VERDEF";
1765 case 0x7ffffffd: return "AUXILIARY";
1766 case 0x7fffffff: return "FILTER";
1769 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1771 const char * result;
1773 switch (elf_header.e_machine)
1776 case EM_MIPS_RS4_BE:
1777 result = get_mips_section_type_name (sh_type);
1780 result = get_parisc_section_type_name (sh_type);
1790 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1792 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1793 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1794 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1795 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1797 sprintf (buff, _("<unknown>: %x"), sh_type);
1803 struct option options [] =
1805 {"all", no_argument, 0, 'a'},
1806 {"file-header", no_argument, 0, 'h'},
1807 {"program-headers", no_argument, 0, 'l'},
1808 {"headers", no_argument, 0, 'e'},
1809 {"histogram", no_argument, 0, 'I'},
1810 {"segments", no_argument, 0, 'l'},
1811 {"sections", no_argument, 0, 'S'},
1812 {"section-headers", no_argument, 0, 'S'},
1813 {"symbols", no_argument, 0, 's'},
1814 {"syms", no_argument, 0, 's'},
1815 {"relocs", no_argument, 0, 'r'},
1816 {"notes", no_argument, 0, 'n'},
1817 {"dynamic", no_argument, 0, 'd'},
1818 {"arch-specific", no_argument, 0, 'A'},
1819 {"version-info", no_argument, 0, 'V'},
1820 {"use-dynamic", no_argument, 0, 'D'},
1821 {"hex-dump", required_argument, 0, 'x'},
1822 {"debug-dump", optional_argument, 0, 'w'},
1823 #ifdef SUPPORT_DISASSEMBLY
1824 {"instruction-dump", required_argument, 0, 'i'},
1827 {"version", no_argument, 0, 'v'},
1828 {"help", no_argument, 0, 'H'},
1829 {0, no_argument, 0, 0}
1835 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1836 fprintf (stdout, _(" Options are:\n"));
1837 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1838 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
1839 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
1840 fprintf (stdout, _(" Display the program headers\n"));
1841 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
1842 fprintf (stdout, _(" Display the sections' header\n"));
1843 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
1844 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
1845 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
1846 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
1847 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1848 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
1849 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1850 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1851 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
1852 fprintf (stdout, _(" Dump the contents of section <number>\n"));
1853 fprintf (stdout, _(" -w[liaprf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=frames]\n"));
1854 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
1855 #ifdef SUPPORT_DISASSEMBLY
1856 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
1857 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
1859 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1860 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
1861 fprintf (stdout, _(" -H or --help Display this information\n"));
1862 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
1868 request_dump (section, type)
1869 unsigned int section;
1872 if (section >= num_dump_sects)
1874 char * new_dump_sects;
1876 new_dump_sects = (char *) calloc (section + 1, 1);
1878 if (new_dump_sects == NULL)
1879 error (_("Out of memory allocating dump request table."));
1882 /* Copy current flag settings. */
1883 memcpy (new_dump_sects, dump_sects, num_dump_sects);
1887 dump_sects = new_dump_sects;
1888 num_dump_sects = section + 1;
1893 dump_sects [section] |= type;
1899 parse_args (argc, argv)
1908 while ((c = getopt_long
1909 (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF)
1944 do_using_dynamic ++;
1972 section = strtoul (optarg, & cp, 0);
1973 if (! * cp && section >= 0)
1975 request_dump (section, HEX_DUMP);
1995 do_debug_abbrevs = 1;
2005 do_debug_pubnames = 1;
2010 do_debug_aranges = 1;
2015 do_debug_frames = 1;
2019 warn (_("Unrecognised debug option '%s'\n"), optarg);
2024 #ifdef SUPPORT_DISASSEMBLY
2027 section = strtoul (optarg, & cp, 0);
2028 if (! * cp && section >= 0)
2030 request_dump (section, DISASS_DUMP);
2036 print_version (program_name);
2043 /* xgettext:c-format */
2044 error (_("Invalid option '-%c'\n"), c);
2051 if (!do_dynamic && !do_syms && !do_reloc && !do_sections
2052 && !do_segments && !do_header && !do_dump && !do_version
2053 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2057 warn (_("Nothing to do.\n"));
2063 get_elf_class (elf_class)
2064 unsigned char elf_class;
2066 static char buff [32];
2070 case ELFCLASSNONE: return _("none");
2071 case ELFCLASS32: return _("ELF32");
2072 case ELFCLASS64: return _("ELF64");
2074 sprintf (buff, _("<unknown: %x>"), elf_class);
2080 get_data_encoding (encoding)
2081 unsigned char encoding;
2083 static char buff [32];
2087 case ELFDATANONE: return _("none");
2088 case ELFDATA2LSB: return _("2's complement, little endian");
2089 case ELFDATA2MSB: return _("2's complement, big endian");
2091 sprintf (buff, _("<unknown: %x>"), encoding);
2097 get_osabi_name (osabi)
2098 unsigned char osabi;
2100 static char buff [32];
2104 case ELFOSABI_NONE: return _("UNIX - System V");
2105 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2106 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2107 case ELFOSABI_LINUX: return _("UNIX - Linux");
2108 case ELFOSABI_HURD: return _("GNU/Hurd");
2109 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2110 case ELFOSABI_AIX: return _("UNIX - AIX");
2111 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2112 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2113 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2114 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2115 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2116 case ELFOSABI_STANDALONE: return _("Standalone App");
2117 case ELFOSABI_ARM: return _("ARM");
2119 sprintf (buff, _("<unknown: %x>"), osabi);
2124 /* Decode the data held in 'elf_header'. */
2126 process_file_header ()
2128 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2129 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2130 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2131 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2134 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2142 printf (_("ELF Header:\n"));
2143 printf (_(" Magic: "));
2144 for (i = 0; i < EI_NIDENT; i ++)
2145 printf ("%2.2x ", elf_header.e_ident [i]);
2147 printf (_(" Class: %s\n"),
2148 get_elf_class (elf_header.e_ident [EI_CLASS]));
2149 printf (_(" Data: %s\n"),
2150 get_data_encoding (elf_header.e_ident [EI_DATA]));
2151 printf (_(" Version: %d %s\n"),
2152 elf_header.e_ident [EI_VERSION],
2153 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2155 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2158 printf (_(" OS/ABI: %s\n"),
2159 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2160 printf (_(" ABI Version: %d\n"),
2161 elf_header.e_ident [EI_ABIVERSION]);
2162 printf (_(" Type: %s\n"),
2163 get_file_type (elf_header.e_type));
2164 printf (_(" Machine: %s\n"),
2165 get_machine_name (elf_header.e_machine));
2166 printf (_(" Version: 0x%lx\n"),
2167 (unsigned long) elf_header.e_version);
2169 printf (_(" Entry point address: "));
2170 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2171 printf (_("\n Start of program headers: "));
2172 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2173 printf (_(" (bytes into file)\n Start of section headers: "));
2174 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2175 printf (_(" (bytes into file)\n"));
2177 printf (_(" Flags: 0x%lx%s\n"),
2178 (unsigned long) elf_header.e_flags,
2179 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2180 printf (_(" Size of this header: %ld (bytes)\n"),
2181 (long) elf_header.e_ehsize);
2182 printf (_(" Size of program headers: %ld (bytes)\n"),
2183 (long) elf_header.e_phentsize);
2184 printf (_(" Number of program headers: %ld\n"),
2185 (long) elf_header.e_phnum);
2186 printf (_(" Size of section headers: %ld (bytes)\n"),
2187 (long) elf_header.e_shentsize);
2188 printf (_(" Number of section headers: %ld\n"),
2189 (long) elf_header.e_shnum);
2190 printf (_(" Section header string table index: %ld\n"),
2191 (long) elf_header.e_shstrndx);
2199 get_32bit_program_headers (file, program_headers)
2201 Elf_Internal_Phdr * program_headers;
2203 Elf32_External_Phdr * phdrs;
2204 Elf32_External_Phdr * external;
2205 Elf32_Internal_Phdr * internal;
2208 GET_DATA_ALLOC (elf_header.e_phoff,
2209 elf_header.e_phentsize * elf_header.e_phnum,
2210 phdrs, Elf32_External_Phdr *, "program headers");
2212 for (i = 0, internal = program_headers, external = phdrs;
2213 i < elf_header.e_phnum;
2214 i ++, internal ++, external ++)
2216 internal->p_type = BYTE_GET (external->p_type);
2217 internal->p_offset = BYTE_GET (external->p_offset);
2218 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2219 internal->p_paddr = BYTE_GET (external->p_paddr);
2220 internal->p_filesz = BYTE_GET (external->p_filesz);
2221 internal->p_memsz = BYTE_GET (external->p_memsz);
2222 internal->p_flags = BYTE_GET (external->p_flags);
2223 internal->p_align = BYTE_GET (external->p_align);
2232 get_64bit_program_headers (file, program_headers)
2234 Elf_Internal_Phdr * program_headers;
2236 Elf64_External_Phdr * phdrs;
2237 Elf64_External_Phdr * external;
2238 Elf64_Internal_Phdr * internal;
2241 GET_DATA_ALLOC (elf_header.e_phoff,
2242 elf_header.e_phentsize * elf_header.e_phnum,
2243 phdrs, Elf64_External_Phdr *, "program headers");
2245 for (i = 0, internal = program_headers, external = phdrs;
2246 i < elf_header.e_phnum;
2247 i ++, internal ++, external ++)
2249 internal->p_type = BYTE_GET (external->p_type);
2250 internal->p_flags = BYTE_GET (external->p_flags);
2251 internal->p_offset = BYTE_GET8 (external->p_offset);
2252 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2253 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2254 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2255 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2256 internal->p_align = BYTE_GET8 (external->p_align);
2265 process_program_headers (file)
2268 Elf_Internal_Phdr * program_headers;
2269 Elf_Internal_Phdr * segment;
2272 if (elf_header.e_phnum == 0)
2275 printf (_("\nThere are no program headers in this file.\n"));
2279 if (do_segments && !do_header)
2281 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2282 printf (_("Entry point "));
2283 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2284 printf (_("\nThere are %d program headers, starting at offset "),
2285 elf_header.e_phnum);
2286 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2290 program_headers = (Elf_Internal_Phdr *) malloc
2291 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2293 if (program_headers == NULL)
2295 error (_("Out of memory\n"));
2300 i = get_32bit_program_headers (file, program_headers);
2302 i = get_64bit_program_headers (file, program_headers);
2306 free (program_headers);
2313 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2317 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2321 (_(" Type Offset VirtAddr PhysAddr\n"));
2323 (_(" FileSiz MemSiz Flags Align\n"));
2331 for (i = 0, segment = program_headers;
2332 i < elf_header.e_phnum;
2337 printf (" %-14.14s ", get_segment_type (segment->p_type));
2341 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2342 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2343 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2344 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2345 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2347 (segment->p_flags & PF_R ? 'R' : ' '),
2348 (segment->p_flags & PF_W ? 'W' : ' '),
2349 (segment->p_flags & PF_X ? 'E' : ' '));
2350 printf ("%#lx", (unsigned long) segment->p_align);
2354 print_vma (segment->p_offset, FULL_HEX);
2356 print_vma (segment->p_vaddr, FULL_HEX);
2358 print_vma (segment->p_paddr, FULL_HEX);
2360 print_vma (segment->p_filesz, FULL_HEX);
2362 print_vma (segment->p_memsz, FULL_HEX);
2364 (segment->p_flags & PF_R ? 'R' : ' '),
2365 (segment->p_flags & PF_W ? 'W' : ' '),
2366 (segment->p_flags & PF_X ? 'E' : ' '));
2367 print_vma (segment->p_align, HEX);
2371 switch (segment->p_type)
2375 loadaddr = (segment->p_vaddr & 0xfffff000)
2376 - (segment->p_offset & 0xfffff000);
2381 error (_("more than one dynamic segment\n"));
2383 dynamic_addr = segment->p_offset;
2384 dynamic_size = segment->p_filesz;
2388 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2389 error (_("Unable to find program interpreter name\n"));
2392 program_interpreter[0] = 0;
2393 fscanf (file, "%63s", program_interpreter);
2396 printf (_("\n [Requesting program interpreter: %s]"),
2397 program_interpreter);
2403 putc ('\n', stdout);
2412 if (do_segments && section_headers != NULL)
2414 printf (_("\n Section to Segment mapping:\n"));
2415 printf (_(" Segment Sections...\n"));
2417 assert (string_table != NULL);
2419 for (i = 0; i < elf_header.e_phnum; i++)
2422 Elf_Internal_Shdr * section;
2424 segment = program_headers + i;
2425 section = section_headers;
2427 printf (" %2.2d ", i);
2429 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2431 if (section->sh_size > 0
2432 /* Compare allocated sections by VMA, unallocated
2433 sections by file offset. */
2434 && (section->sh_flags & SHF_ALLOC
2435 ? (section->sh_addr >= segment->p_vaddr
2436 && section->sh_addr + section->sh_size
2437 <= segment->p_vaddr + segment->p_memsz)
2438 : ((bfd_vma) section->sh_offset >= segment->p_offset
2439 && (section->sh_offset + section->sh_size
2440 <= segment->p_offset + segment->p_filesz))))
2441 printf ("%s ", SECTION_NAME (section));
2448 free (program_headers);
2455 get_32bit_section_headers (file)
2458 Elf32_External_Shdr * shdrs;
2459 Elf32_Internal_Shdr * internal;
2462 GET_DATA_ALLOC (elf_header.e_shoff,
2463 elf_header.e_shentsize * elf_header.e_shnum,
2464 shdrs, Elf32_External_Shdr *, "section headers");
2466 section_headers = (Elf_Internal_Shdr *) malloc
2467 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2469 if (section_headers == NULL)
2471 error (_("Out of memory\n"));
2475 for (i = 0, internal = section_headers;
2476 i < elf_header.e_shnum;
2479 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2480 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2481 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2482 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2483 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2484 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2485 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2486 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2487 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2488 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2497 get_64bit_section_headers (file)
2500 Elf64_External_Shdr * shdrs;
2501 Elf64_Internal_Shdr * internal;
2504 GET_DATA_ALLOC (elf_header.e_shoff,
2505 elf_header.e_shentsize * elf_header.e_shnum,
2506 shdrs, Elf64_External_Shdr *, "section headers");
2508 section_headers = (Elf_Internal_Shdr *) malloc
2509 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2511 if (section_headers == NULL)
2513 error (_("Out of memory\n"));
2517 for (i = 0, internal = section_headers;
2518 i < elf_header.e_shnum;
2521 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2522 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2523 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2524 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2525 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2526 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2527 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2528 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2529 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2530 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2538 static Elf_Internal_Sym *
2539 get_32bit_elf_symbols (file, offset, number)
2541 unsigned long offset;
2542 unsigned long number;
2544 Elf32_External_Sym * esyms;
2545 Elf_Internal_Sym * isyms;
2546 Elf_Internal_Sym * psym;
2549 GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2550 esyms, Elf32_External_Sym *, "symbols");
2552 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2556 error (_("Out of memory\n"));
2562 for (j = 0, psym = isyms;
2566 psym->st_name = BYTE_GET (esyms[j].st_name);
2567 psym->st_value = BYTE_GET (esyms[j].st_value);
2568 psym->st_size = BYTE_GET (esyms[j].st_size);
2569 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2570 psym->st_info = BYTE_GET (esyms[j].st_info);
2571 psym->st_other = BYTE_GET (esyms[j].st_other);
2579 static Elf_Internal_Sym *
2580 get_64bit_elf_symbols (file, offset, number)
2582 unsigned long offset;
2583 unsigned long number;
2585 Elf64_External_Sym * esyms;
2586 Elf_Internal_Sym * isyms;
2587 Elf_Internal_Sym * psym;
2590 GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2591 esyms, Elf64_External_Sym *, "symbols");
2593 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2597 error (_("Out of memory\n"));
2603 for (j = 0, psym = isyms;
2607 psym->st_name = BYTE_GET (esyms[j].st_name);
2608 psym->st_info = BYTE_GET (esyms[j].st_info);
2609 psym->st_other = BYTE_GET (esyms[j].st_other);
2610 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2611 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2612 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2621 get_elf_section_flags (sh_flags)
2624 static char buff [32];
2632 flag = sh_flags & - sh_flags;
2637 case SHF_WRITE: strcat (buff, "W"); break;
2638 case SHF_ALLOC: strcat (buff, "A"); break;
2639 case SHF_EXECINSTR: strcat (buff, "X"); break;
2640 case SHF_MERGE: strcat (buff, "M"); break;
2641 case SHF_STRINGS: strcat (buff, "S"); break;
2642 case SHF_INFO_LINK: strcat (buff, "I"); break;
2643 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2644 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2645 case SHF_GROUP: strcat (buff, "G"); break;
2648 if (flag & SHF_MASKOS)
2651 sh_flags &= ~ SHF_MASKOS;
2653 else if (flag & SHF_MASKPROC)
2656 sh_flags &= ~ SHF_MASKPROC;
2668 process_section_headers (file)
2671 Elf_Internal_Shdr * section;
2674 section_headers = NULL;
2676 if (elf_header.e_shnum == 0)
2679 printf (_("\nThere are no sections in this file.\n"));
2684 if (do_sections && !do_header)
2685 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2686 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2690 if (! get_32bit_section_headers (file))
2693 else if (! get_64bit_section_headers (file))
2696 /* Read in the string table, so that we have names to display. */
2697 section = section_headers + elf_header.e_shstrndx;
2699 if (section->sh_size != 0)
2701 unsigned long string_table_offset;
2703 string_table_offset = section->sh_offset;
2705 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2706 string_table, char *, "string table");
2709 /* Scan the sections for the dynamic symbol table
2710 and dynamic string table and debug sections. */
2711 dynamic_symbols = NULL;
2712 dynamic_strings = NULL;
2713 dynamic_syminfo = NULL;
2715 for (i = 0, section = section_headers;
2716 i < elf_header.e_shnum;
2719 char * name = SECTION_NAME (section);
2721 if (section->sh_type == SHT_DYNSYM)
2723 if (dynamic_symbols != NULL)
2725 error (_("File contains multiple dynamic symbol tables\n"));
2729 num_dynamic_syms = section->sh_size / section->sh_entsize;
2731 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2733 else if (section->sh_type == SHT_STRTAB
2734 && strcmp (name, ".dynstr") == 0)
2736 if (dynamic_strings != NULL)
2738 error (_("File contains multiple dynamic string tables\n"));
2742 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2743 dynamic_strings, char *, "dynamic strings");
2745 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2746 || do_debug_lines || do_debug_pubnames || do_debug_aranges || do_debug_frames)
2747 && strncmp (name, ".debug_", 7) == 0)
2752 || (do_debug_info && (strcmp (name, "info") == 0))
2753 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2754 || (do_debug_lines && (strcmp (name, "line") == 0))
2755 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2756 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2757 || (do_debug_frames && (strcmp (name, "frame") == 0))
2759 request_dump (i, DEBUG_DUMP);
2761 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
2762 request_dump (i, DEBUG_DUMP);
2768 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2772 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2775 printf (_(" [Nr] Name Type Address Offset\n"));
2776 printf (_(" Size EntSize Flags Link Info Align\n"));
2779 for (i = 0, section = section_headers;
2780 i < elf_header.e_shnum;
2783 printf (" [%2d] %-17.17s %-15.15s ",
2785 SECTION_NAME (section),
2786 get_section_type_name (section->sh_type));
2790 print_vma (section->sh_addr, LONG_HEX);
2792 printf ( " %6.6lx %6.6lx %2.2lx",
2793 (unsigned long) section->sh_offset,
2794 (unsigned long) section->sh_size,
2795 (unsigned long) section->sh_entsize);
2797 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2799 printf ("%2ld %3lx %2ld\n",
2800 (unsigned long) section->sh_link,
2801 (unsigned long) section->sh_info,
2802 (unsigned long) section->sh_addralign);
2807 print_vma (section->sh_addr, LONG_HEX);
2808 printf (" %8.8lx", section->sh_offset);
2810 print_vma (section->sh_size, LONG_HEX);
2812 print_vma (section->sh_entsize, LONG_HEX);
2814 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2816 printf (" %2ld %3lx %ld\n",
2817 (unsigned long) section->sh_link,
2818 (unsigned long) section->sh_info,
2819 (unsigned long) section->sh_addralign);
2823 printf (_("Key to Flags:\n"));
2824 printf (_(" W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2825 printf (_(" I (info), L (link order), G (group), x (unknown)\n"));
2826 printf (_(" O (extra OS processing required) o (OS specific), p (processor specific)\n"));
2831 /* Process the reloc section. */
2833 process_relocs (file)
2836 unsigned long rel_size;
2837 unsigned long rel_offset;
2843 if (do_using_dynamic)
2845 int is_rela = FALSE;
2850 if (dynamic_info[DT_REL])
2852 rel_offset = dynamic_info[DT_REL];
2853 rel_size = dynamic_info[DT_RELSZ];
2856 else if (dynamic_info [DT_RELA])
2858 rel_offset = dynamic_info[DT_RELA];
2859 rel_size = dynamic_info[DT_RELASZ];
2862 else if (dynamic_info[DT_JMPREL])
2864 rel_offset = dynamic_info[DT_JMPREL];
2865 rel_size = dynamic_info[DT_PLTRELSZ];
2867 switch (dynamic_info[DT_PLTREL])
2884 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2885 rel_offset, rel_size);
2887 dump_relocations (file, rel_offset - loadaddr, rel_size,
2888 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
2891 printf (_("\nThere are no dynamic relocations in this file.\n"));
2895 Elf32_Internal_Shdr * section;
2899 for (i = 0, section = section_headers;
2900 i < elf_header.e_shnum;
2903 if ( section->sh_type != SHT_RELA
2904 && section->sh_type != SHT_REL)
2907 rel_offset = section->sh_offset;
2908 rel_size = section->sh_size;
2912 Elf32_Internal_Shdr * strsec;
2913 Elf32_Internal_Shdr * symsec;
2914 Elf_Internal_Sym * symtab;
2917 unsigned long nsyms;
2919 printf (_("\nRelocation section "));
2921 if (string_table == NULL)
2922 printf ("%d", section->sh_name);
2924 printf ("'%s'", SECTION_NAME (section));
2926 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2927 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
2929 symsec = section_headers + section->sh_link;
2931 nsyms = symsec->sh_size / symsec->sh_entsize;
2932 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
2937 strsec = section_headers + symsec->sh_link;
2939 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
2940 char *, "string table");
2942 is_rela = section->sh_type == SHT_RELA;
2944 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
2954 printf (_("\nThere are no relocations in this file.\n"));
2962 dynamic_segment_mips_val (entry)
2963 Elf_Internal_Dyn * entry;
2965 switch (entry->d_tag)
2968 if (entry->d_un.d_val == 0)
2972 static const char * opts[] =
2974 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2975 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2976 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2977 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2982 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
2983 if (entry->d_un.d_val & (1 << cnt))
2985 printf ("%s%s", first ? "" : " ", opts[cnt]);
2992 case DT_MIPS_IVERSION:
2993 if (dynamic_strings != NULL)
2994 printf ("Interface Version: %s\n",
2995 dynamic_strings + entry->d_un.d_val);
2997 printf ("%ld\n", (long) entry->d_un.d_ptr);
3000 case DT_MIPS_TIME_STAMP:
3005 time_t time = entry->d_un.d_val;
3006 tmp = gmtime (&time);
3007 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3008 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3009 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3010 printf ("Time Stamp: %s\n", timebuf);
3014 case DT_MIPS_RLD_VERSION:
3015 case DT_MIPS_LOCAL_GOTNO:
3016 case DT_MIPS_CONFLICTNO:
3017 case DT_MIPS_LIBLISTNO:
3018 case DT_MIPS_SYMTABNO:
3019 case DT_MIPS_UNREFEXTNO:
3020 case DT_MIPS_HIPAGENO:
3021 case DT_MIPS_DELTA_CLASS_NO:
3022 case DT_MIPS_DELTA_INSTANCE_NO:
3023 case DT_MIPS_DELTA_RELOC_NO:
3024 case DT_MIPS_DELTA_SYM_NO:
3025 case DT_MIPS_DELTA_CLASSSYM_NO:
3026 case DT_MIPS_COMPACT_SIZE:
3027 printf ("%ld\n", (long) entry->d_un.d_ptr);
3031 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3037 dynamic_segment_parisc_val (entry)
3038 Elf_Internal_Dyn * entry;
3040 switch (entry->d_tag)
3042 case DT_HP_DLD_FLAGS:
3051 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3052 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3053 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3054 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3055 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3056 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3057 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3058 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3059 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3060 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3061 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3065 bfd_vma val = entry->d_un.d_val;
3067 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3068 if (val & flags[cnt].bit)
3072 fputs (flags[cnt].str, stdout);
3074 val ^= flags[cnt].bit;
3077 if (val != 0 || first)
3081 print_vma (val, HEX);
3087 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3093 get_32bit_dynamic_segment (file)
3096 Elf32_External_Dyn * edyn;
3097 Elf_Internal_Dyn * entry;
3100 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3101 edyn, Elf32_External_Dyn *, "dynamic segment");
3103 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3104 how large this .dynamic is now. We can do this even before the byte
3105 swapping since the DT_NULL tag is recognizable. */
3107 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3110 dynamic_segment = (Elf_Internal_Dyn *)
3111 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3113 if (dynamic_segment == NULL)
3115 error (_("Out of memory\n"));
3120 for (i = 0, entry = dynamic_segment;
3124 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3125 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3134 get_64bit_dynamic_segment (file)
3137 Elf64_External_Dyn * edyn;
3138 Elf_Internal_Dyn * entry;
3141 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3142 edyn, Elf64_External_Dyn *, "dynamic segment");
3144 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3145 how large this .dynamic is now. We can do this even before the byte
3146 swapping since the DT_NULL tag is recognizable. */
3148 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3151 dynamic_segment = (Elf_Internal_Dyn *)
3152 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3154 if (dynamic_segment == NULL)
3156 error (_("Out of memory\n"));
3161 for (i = 0, entry = dynamic_segment;
3165 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3166 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3175 get_dynamic_flags (flags)
3178 static char buff [64];
3183 flag = flags & - flags;
3188 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3189 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3190 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3191 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3192 default: strcat (buff, "unknown "); break;
3198 /* Parse and display the contents of the dynamic segment. */
3200 process_dynamic_segment (file)
3203 Elf_Internal_Dyn * entry;
3206 if (dynamic_size == 0)
3209 printf (_("\nThere is no dynamic segment in this file.\n"));
3216 if (! get_32bit_dynamic_segment (file))
3219 else if (! get_64bit_dynamic_segment (file))
3222 /* Find the appropriate symbol table. */
3223 if (dynamic_symbols == NULL)
3225 for (i = 0, entry = dynamic_segment;
3229 unsigned long offset;
3231 if (entry->d_tag != DT_SYMTAB)
3234 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3236 /* Since we do not know how big the symbol table is,
3237 we default to reading in the entire file (!) and
3238 processing that. This is overkill, I know, but it
3240 offset = entry->d_un.d_val - loadaddr;
3242 if (fseek (file, 0, SEEK_END))
3243 error (_("Unable to seek to end of file!"));
3246 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3248 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3250 if (num_dynamic_syms < 1)
3252 error (_("Unable to determine the number of symbols to load\n"));
3256 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3260 /* Similarly find a string table. */
3261 if (dynamic_strings == NULL)
3263 for (i = 0, entry = dynamic_segment;
3267 unsigned long offset;
3270 if (entry->d_tag != DT_STRTAB)
3273 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3275 /* Since we do not know how big the string table is,
3276 we default to reading in the entire file (!) and
3277 processing that. This is overkill, I know, but it
3280 offset = entry->d_un.d_val - loadaddr;
3281 if (fseek (file, 0, SEEK_END))
3282 error (_("Unable to seek to end of file\n"));
3283 str_tab_len = ftell (file) - offset;
3285 if (str_tab_len < 1)
3288 (_("Unable to determine the length of the dynamic string table\n"));
3292 GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
3293 "dynamic string table");
3299 /* And find the syminfo section if available. */
3300 if (dynamic_syminfo == NULL)
3302 unsigned int syminsz = 0;
3304 for (i = 0, entry = dynamic_segment;
3308 if (entry->d_tag == DT_SYMINENT)
3310 /* Note: these braces are necessary to avoid a syntax
3311 error from the SunOS4 C compiler. */
3312 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3314 else if (entry->d_tag == DT_SYMINSZ)
3315 syminsz = entry->d_un.d_val;
3316 else if (entry->d_tag == DT_SYMINFO)
3317 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
3320 if (dynamic_syminfo_offset != 0 && syminsz != 0)
3322 Elf_External_Syminfo * extsyminfo;
3323 Elf_Internal_Syminfo * syminfo;
3325 /* There is a syminfo section. Read the data. */
3326 GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3327 Elf_External_Syminfo *, "symbol information");
3329 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3330 if (dynamic_syminfo == NULL)
3332 error (_("Out of memory\n"));
3336 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3337 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3340 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3341 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3348 if (do_dynamic && dynamic_addr)
3349 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3350 dynamic_addr, (long) dynamic_size);
3352 printf (_(" Tag Type Name/Value\n"));
3354 for (i = 0, entry = dynamic_segment;
3363 print_vma (entry->d_tag, FULL_HEX);
3364 dtype = get_dynamic_type (entry->d_tag);
3365 printf (" (%s)%*s", dtype,
3366 ((is_32bit_elf ? 27 : 19)
3367 - (int) strlen (dtype)),
3371 switch (entry->d_tag)
3375 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
3385 switch (entry->d_tag)
3388 printf (_("Auxiliary library"));
3392 printf (_("Filter library"));
3396 printf (_("Configuration file"));
3400 printf (_("Dependency audit library"));
3404 printf (_("Audit library"));
3408 if (dynamic_strings)
3409 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3413 print_vma (entry->d_un.d_val, PREFIX_HEX);
3422 printf (_("Flags:"));
3423 if (entry->d_un.d_val == 0)
3424 printf (_(" None\n"));
3427 unsigned long int val = entry->d_un.d_val;
3428 if (val & DTF_1_PARINIT)
3430 printf (" PARINIT");
3431 val ^= DTF_1_PARINIT;
3433 if (val & DTF_1_CONFEXP)
3435 printf (" CONFEXP");
3436 val ^= DTF_1_CONFEXP;
3439 printf (" %lx", val);
3448 printf (_("Flags:"));
3449 if (entry->d_un.d_val == 0)
3450 printf (_(" None\n"));
3453 unsigned long int val = entry->d_un.d_val;
3454 if (val & DF_P1_LAZYLOAD)
3456 printf (" LAZYLOAD");
3457 val ^= DF_P1_LAZYLOAD;
3459 if (val & DF_P1_GROUPPERM)
3461 printf (" GROUPPERM");
3462 val ^= DF_P1_GROUPPERM;
3465 printf (" %lx", val);
3474 printf (_("Flags:"));
3475 if (entry->d_un.d_val == 0)
3476 printf (_(" None\n"));
3479 unsigned long int val = entry->d_un.d_val;
3485 if (val & DF_1_GLOBAL)
3490 if (val & DF_1_GROUP)
3495 if (val & DF_1_NODELETE)
3497 printf (" NODELETE");
3498 val ^= DF_1_NODELETE;
3500 if (val & DF_1_LOADFLTR)
3502 printf (" LOADFLTR");
3503 val ^= DF_1_LOADFLTR;
3505 if (val & DF_1_INITFIRST)
3507 printf (" INITFIRST");
3508 val ^= DF_1_INITFIRST;
3510 if (val & DF_1_NOOPEN)
3515 if (val & DF_1_ORIGIN)
3520 if (val & DF_1_DIRECT)
3525 if (val & DF_1_TRANS)
3530 if (val & DF_1_INTERPOSE)
3532 printf (" INTERPOSE");
3533 val ^= DF_1_INTERPOSE;
3535 if (val & DF_1_NODEFLIB)
3537 printf (" NODEFLIB");
3538 val ^= DF_1_NODEFLIB;
3540 if (val & DF_1_NODUMP)
3545 if (val & DF_1_CONLFAT)
3547 printf (" CONLFAT");
3548 val ^= DF_1_CONLFAT;
3551 printf (" %lx", val);
3559 puts (get_dynamic_type (entry->d_un.d_val));
3579 dynamic_info[entry->d_tag] = entry->d_un.d_val;
3585 if (dynamic_strings == NULL)
3588 name = dynamic_strings + entry->d_un.d_val;
3592 switch (entry->d_tag)
3595 printf (_("Shared library: [%s]"), name);
3597 if (strcmp (name, program_interpreter) == 0)
3598 printf (_(" program interpreter"));
3602 printf (_("Library soname: [%s]"), name);
3606 printf (_("Library rpath: [%s]"), name);
3610 printf (_("Library runpath: [%s]"), name);
3614 print_vma (entry->d_un.d_val, PREFIX_HEX);
3619 print_vma (entry->d_un.d_val, PREFIX_HEX);
3635 case DT_INIT_ARRAYSZ:
3636 case DT_FINI_ARRAYSZ:
3639 print_vma (entry->d_un.d_val, UNSIGNED);
3640 printf (" (bytes)\n");
3650 print_vma (entry->d_un.d_val, UNSIGNED);
3663 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
3667 name = dynamic_strings + entry->d_un.d_val;
3671 printf (_("Not needed object: [%s]\n"), name);
3676 print_vma (entry->d_un.d_val, PREFIX_HEX);
3682 /* The value of this entry is ignored. */
3686 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
3687 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
3692 switch (elf_header.e_machine)
3695 case EM_MIPS_RS4_BE:
3696 dynamic_segment_mips_val (entry);
3699 dynamic_segment_parisc_val (entry);
3702 print_vma (entry->d_un.d_val, PREFIX_HEX);
3714 get_ver_flags (flags)
3717 static char buff [32];
3724 if (flags & VER_FLG_BASE)
3725 strcat (buff, "BASE ");
3727 if (flags & VER_FLG_WEAK)
3729 if (flags & VER_FLG_BASE)
3730 strcat (buff, "| ");
3732 strcat (buff, "WEAK ");
3735 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
3736 strcat (buff, "| <unknown>");
3741 /* Display the contents of the version sections. */
3743 process_version_sections (file)
3746 Elf32_Internal_Shdr * section;
3753 for (i = 0, section = section_headers;
3754 i < elf_header.e_shnum;
3757 switch (section->sh_type)
3759 case SHT_GNU_verdef:
3761 Elf_External_Verdef * edefs;
3768 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3769 SECTION_NAME (section), section->sh_info);
3771 printf (_(" Addr: 0x"));
3772 printf_vma (section->sh_addr);
3773 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3774 (unsigned long) section->sh_offset, section->sh_link,
3775 SECTION_NAME (section_headers + section->sh_link));
3777 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3778 edefs, Elf_External_Verdef *,
3779 "version definition section");
3781 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
3784 Elf_External_Verdef * edef;
3785 Elf_Internal_Verdef ent;
3786 Elf_External_Verdaux * eaux;
3787 Elf_Internal_Verdaux aux;
3791 vstart = ((char *) edefs) + idx;
3793 edef = (Elf_External_Verdef *) vstart;
3795 ent.vd_version = BYTE_GET (edef->vd_version);
3796 ent.vd_flags = BYTE_GET (edef->vd_flags);
3797 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
3798 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
3799 ent.vd_hash = BYTE_GET (edef->vd_hash);
3800 ent.vd_aux = BYTE_GET (edef->vd_aux);
3801 ent.vd_next = BYTE_GET (edef->vd_next);
3803 printf (_(" %#06x: Rev: %d Flags: %s"),
3804 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
3806 printf (_(" Index: %d Cnt: %d "),
3807 ent.vd_ndx, ent.vd_cnt);
3809 vstart += ent.vd_aux;
3811 eaux = (Elf_External_Verdaux *) vstart;
3813 aux.vda_name = BYTE_GET (eaux->vda_name);
3814 aux.vda_next = BYTE_GET (eaux->vda_next);
3816 if (dynamic_strings)
3817 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
3819 printf (_("Name index: %ld\n"), aux.vda_name);
3821 isum = idx + ent.vd_aux;
3823 for (j = 1; j < ent.vd_cnt; j ++)
3825 isum += aux.vda_next;
3826 vstart += aux.vda_next;
3828 eaux = (Elf_External_Verdaux *) vstart;
3830 aux.vda_name = BYTE_GET (eaux->vda_name);
3831 aux.vda_next = BYTE_GET (eaux->vda_next);
3833 if (dynamic_strings)
3834 printf (_(" %#06x: Parent %d: %s\n"),
3835 isum, j, dynamic_strings + aux.vda_name);
3837 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3838 isum, j, aux.vda_name);
3848 case SHT_GNU_verneed:
3850 Elf_External_Verneed * eneed;
3856 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3857 SECTION_NAME (section), section->sh_info);
3859 printf (_(" Addr: 0x"));
3860 printf_vma (section->sh_addr);
3861 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3862 (unsigned long) section->sh_offset, section->sh_link,
3863 SECTION_NAME (section_headers + section->sh_link));
3865 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3866 eneed, Elf_External_Verneed *,
3867 "version need section");
3869 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
3871 Elf_External_Verneed * entry;
3872 Elf_Internal_Verneed ent;
3877 vstart = ((char *) eneed) + idx;
3879 entry = (Elf_External_Verneed *) vstart;
3881 ent.vn_version = BYTE_GET (entry->vn_version);
3882 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
3883 ent.vn_file = BYTE_GET (entry->vn_file);
3884 ent.vn_aux = BYTE_GET (entry->vn_aux);
3885 ent.vn_next = BYTE_GET (entry->vn_next);
3887 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
3889 if (dynamic_strings)
3890 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
3892 printf (_(" File: %lx"), ent.vn_file);
3894 printf (_(" Cnt: %d\n"), ent.vn_cnt);
3896 vstart += ent.vn_aux;
3898 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
3900 Elf_External_Vernaux * eaux;
3901 Elf_Internal_Vernaux aux;
3903 eaux = (Elf_External_Vernaux *) vstart;
3905 aux.vna_hash = BYTE_GET (eaux->vna_hash);
3906 aux.vna_flags = BYTE_GET (eaux->vna_flags);
3907 aux.vna_other = BYTE_GET (eaux->vna_other);
3908 aux.vna_name = BYTE_GET (eaux->vna_name);
3909 aux.vna_next = BYTE_GET (eaux->vna_next);
3911 if (dynamic_strings)
3912 printf (_(" %#06x: Name: %s"),
3913 isum, dynamic_strings + aux.vna_name);
3915 printf (_(" %#06x: Name index: %lx"),
3916 isum, aux.vna_name);
3918 printf (_(" Flags: %s Version: %d\n"),
3919 get_ver_flags (aux.vna_flags), aux.vna_other);
3921 isum += aux.vna_next;
3922 vstart += aux.vna_next;
3932 case SHT_GNU_versym:
3934 Elf32_Internal_Shdr * link_section;
3937 unsigned char * edata;
3938 unsigned short * data;
3940 Elf_Internal_Sym * symbols;
3941 Elf32_Internal_Shdr * string_sec;
3943 link_section = section_headers + section->sh_link;
3944 total = section->sh_size / section->sh_entsize;
3948 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
3949 link_section->sh_size / link_section->sh_entsize);
3951 string_sec = section_headers + link_section->sh_link;
3953 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
3954 strtab, char *, "version string table");
3956 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3957 SECTION_NAME (section), total);
3959 printf (_(" Addr: "));
3960 printf_vma (section->sh_addr);
3961 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3962 (unsigned long) section->sh_offset, section->sh_link,
3963 SECTION_NAME (link_section));
3965 GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
3967 total * sizeof (short), edata,
3968 unsigned char *, "version symbol data");
3970 data = (unsigned short *) malloc (total * sizeof (short));
3972 for (cnt = total; cnt --;)
3973 data [cnt] = byte_get (edata + cnt * sizeof (short),
3978 for (cnt = 0; cnt < total; cnt += 4)
3983 printf (" %03x:", cnt);
3985 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
3986 switch (data [cnt + j])
3989 fputs (_(" 0 (*local*) "), stdout);
3993 fputs (_(" 1 (*global*) "), stdout);
3997 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
3998 data [cnt + j] & 0x8000 ? 'h' : ' ');
4000 if (symbols [cnt + j].st_shndx < SHN_LORESERVE
4001 && section_headers[symbols [cnt + j].st_shndx].sh_type
4004 /* We must test both. */
4005 Elf_Internal_Verneed ivn;
4006 unsigned long offset;
4008 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4013 Elf_External_Verneed evn;
4014 Elf_External_Vernaux evna;
4015 Elf_Internal_Vernaux ivna;
4016 unsigned long vna_off;
4018 GET_DATA (offset, evn, "version need");
4020 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4021 ivn.vn_next = BYTE_GET (evn.vn_next);
4023 vna_off = offset + ivn.vn_aux;
4027 GET_DATA (vna_off, evna,
4028 "version need aux (1)");
4030 ivna.vna_next = BYTE_GET (evna.vna_next);
4031 ivna.vna_other = BYTE_GET (evna.vna_other);
4033 vna_off += ivna.vna_next;
4035 while (ivna.vna_other != data [cnt + j]
4036 && ivna.vna_next != 0);
4038 if (ivna.vna_other == data [cnt + j])
4040 ivna.vna_name = BYTE_GET (evna.vna_name);
4042 name = strtab + ivna.vna_name;
4043 nn += printf ("(%s%-*s",
4045 12 - (int) strlen (name),
4049 else if (ivn.vn_next == 0)
4051 if (data [cnt + j] != 0x8001)
4053 Elf_Internal_Verdef ivd;
4054 Elf_External_Verdef evd;
4056 offset = version_info
4057 [DT_VERSIONTAGIDX (DT_VERDEF)]
4062 GET_DATA (offset, evd,
4063 "version definition");
4065 ivd.vd_next = BYTE_GET (evd.vd_next);
4066 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4068 offset += ivd.vd_next;
4071 != (data [cnt + j] & 0x7fff)
4072 && ivd.vd_next != 0);
4075 == (data [cnt + j] & 0x7fff))
4077 Elf_External_Verdaux evda;
4078 Elf_Internal_Verdaux ivda;
4080 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4082 GET_DATA (offset + ivd.vd_aux, evda,
4083 "version definition aux");
4086 BYTE_GET (evda.vda_name);
4088 name = strtab + ivda.vda_name;
4092 12 - (int) strlen (name),
4100 offset += ivn.vn_next;
4102 while (ivn.vn_next);
4104 else if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4106 Elf_Internal_Verneed ivn;
4107 unsigned long offset;
4109 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4114 Elf_Internal_Vernaux ivna;
4115 Elf_External_Verneed evn;
4116 Elf_External_Vernaux evna;
4117 unsigned long a_off;
4119 GET_DATA (offset, evn, "version need");
4121 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4122 ivn.vn_next = BYTE_GET (evn.vn_next);
4124 a_off = offset + ivn.vn_aux;
4128 GET_DATA (a_off, evna,
4129 "version need aux (2)");
4131 ivna.vna_next = BYTE_GET (evna.vna_next);
4132 ivna.vna_other = BYTE_GET (evna.vna_other);
4134 a_off += ivna.vna_next;
4136 while (ivna.vna_other != data [cnt + j]
4137 && ivna.vna_next != 0);
4139 if (ivna.vna_other == data [cnt + j])
4141 ivna.vna_name = BYTE_GET (evna.vna_name);
4143 name = strtab + ivna.vna_name;
4144 nn += printf ("(%s%-*s",
4146 12 - (int) strlen (name),
4151 offset += ivn.vn_next;
4153 while (ivn.vn_next);
4155 else if (data [cnt + j] != 0x8001)
4157 Elf_Internal_Verdef ivd;
4158 Elf_External_Verdef evd;
4159 unsigned long offset;
4161 offset = version_info
4162 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4166 GET_DATA (offset, evd, "version def");
4168 ivd.vd_next = BYTE_GET (evd.vd_next);
4169 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4171 offset += ivd.vd_next;
4173 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4174 && ivd.vd_next != 0);
4176 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4178 Elf_External_Verdaux evda;
4179 Elf_Internal_Verdaux ivda;
4181 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4183 GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
4184 evda, "version def aux");
4186 ivda.vda_name = BYTE_GET (evda.vda_name);
4188 name = strtab + ivda.vda_name;
4189 nn += printf ("(%s%-*s",
4191 12 - (int) strlen (name),
4197 printf ("%*c", 18 - nn, ' ');
4215 printf (_("\nNo version information found in this file.\n"));
4221 get_symbol_binding (binding)
4222 unsigned int binding;
4224 static char buff [32];
4228 case STB_LOCAL: return "LOCAL";
4229 case STB_GLOBAL: return "GLOBAL";
4230 case STB_WEAK: return "WEAK";
4232 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4233 sprintf (buff, _("<processor specific>: %d"), binding);
4234 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4235 sprintf (buff, _("<OS specific>: %d"), binding);
4237 sprintf (buff, _("<unknown>: %d"), binding);
4243 get_symbol_type (type)
4246 static char buff [32];
4250 case STT_NOTYPE: return "NOTYPE";
4251 case STT_OBJECT: return "OBJECT";
4252 case STT_FUNC: return "FUNC";
4253 case STT_SECTION: return "SECTION";
4254 case STT_FILE: return "FILE";
4255 case STT_COMMON: return "COMMON";
4257 if (type >= STT_LOPROC && type <= STT_HIPROC)
4259 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4260 return "THUMB_FUNC";
4262 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4265 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4266 return "PARISC_MILLI";
4268 sprintf (buff, _("<processor specific>: %d"), type);
4270 else if (type >= STT_LOOS && type <= STT_HIOS)
4272 if (elf_header.e_machine == EM_PARISC)
4274 if (type == STT_HP_OPAQUE)
4276 if (type == STT_HP_STUB)
4280 sprintf (buff, _("<OS specific>: %d"), type);
4283 sprintf (buff, _("<unknown>: %d"), type);
4289 get_symbol_visibility (visibility)
4290 unsigned int visibility;
4294 case STV_DEFAULT: return "DEFAULT";
4295 case STV_INTERNAL: return "INTERNAL";
4296 case STV_HIDDEN: return "HIDDEN";
4297 case STV_PROTECTED: return "PROTECTED";
4303 get_symbol_index_type (type)
4308 case SHN_UNDEF: return "UND";
4309 case SHN_ABS: return "ABS";
4310 case SHN_COMMON: return "COM";
4312 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4314 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4316 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4320 static char buff [32];
4322 sprintf (buff, "%3d", type);
4329 get_dynamic_data (file, number)
4331 unsigned int number;
4333 unsigned char * e_data;
4336 e_data = (unsigned char *) malloc (number * 4);
4340 error (_("Out of memory\n"));
4344 if (fread (e_data, 4, number, file) != number)
4346 error (_("Unable to read in dynamic data\n"));
4350 i_data = (int *) malloc (number * sizeof (* i_data));
4354 error (_("Out of memory\n"));
4360 i_data [number] = byte_get (e_data + number * 4, 4);
4367 /* Dump the symbol table */
4369 process_symbol_table (file)
4372 Elf32_Internal_Shdr * section;
4373 unsigned char nb [4];
4374 unsigned char nc [4];
4377 int * buckets = NULL;
4378 int * chains = NULL;
4380 if (! do_syms && !do_histogram)
4383 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
4386 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
4388 error (_("Unable to seek to start of dynamic information"));
4392 if (fread (nb, sizeof (nb), 1, file) != 1)
4394 error (_("Failed to read in number of buckets\n"));
4398 if (fread (nc, sizeof (nc), 1, file) != 1)
4400 error (_("Failed to read in number of chains\n"));
4404 nbuckets = byte_get (nb, 4);
4405 nchains = byte_get (nc, 4);
4407 buckets = get_dynamic_data (file, nbuckets);
4408 chains = get_dynamic_data (file, nchains);
4410 if (buckets == NULL || chains == NULL)
4415 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4420 printf (_("\nSymbol table for image:\n"));
4422 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4424 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4426 for (hn = 0; hn < nbuckets; hn++)
4431 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4433 Elf_Internal_Sym * psym;
4435 psym = dynamic_symbols + si;
4437 printf (" %3d %3d: ", si, hn);
4438 print_vma (psym->st_value, LONG_HEX);
4440 print_vma (psym->st_size, DEC_5);
4442 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4443 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4444 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4445 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
4446 printf (" %s\n", dynamic_strings + psym->st_name);
4450 else if (do_syms && !do_using_dynamic)
4454 for (i = 0, section = section_headers;
4455 i < elf_header.e_shnum;
4460 Elf_Internal_Sym * symtab;
4461 Elf_Internal_Sym * psym;
4464 if ( section->sh_type != SHT_SYMTAB
4465 && section->sh_type != SHT_DYNSYM)
4468 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4469 SECTION_NAME (section),
4470 (unsigned long) (section->sh_size / section->sh_entsize));
4472 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4474 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4476 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4477 section->sh_size / section->sh_entsize);
4481 if (section->sh_link == elf_header.e_shstrndx)
4482 strtab = string_table;
4485 Elf32_Internal_Shdr * string_sec;
4487 string_sec = section_headers + section->sh_link;
4489 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4490 strtab, char *, "string table");
4493 for (si = 0, psym = symtab;
4494 si < section->sh_size / section->sh_entsize;
4497 printf ("%6d: ", si);
4498 print_vma (psym->st_value, LONG_HEX);
4500 print_vma (psym->st_size, DEC_5);
4501 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4502 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4503 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4504 printf (" %4s", get_symbol_index_type (psym->st_shndx));
4505 printf (" %s", strtab + psym->st_name);
4507 if (section->sh_type == SHT_DYNSYM &&
4508 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4510 unsigned char data[2];
4511 unsigned short vers_data;
4512 unsigned long offset;
4516 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4519 GET_DATA (offset + si * sizeof (vers_data), data,
4522 vers_data = byte_get (data, 2);
4524 is_nobits = psym->st_shndx < SHN_LORESERVE ?
4525 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4528 check_def = (psym->st_shndx != SHN_UNDEF);
4530 if ((vers_data & 0x8000) || vers_data > 1)
4532 if (is_nobits || ! check_def)
4534 Elf_External_Verneed evn;
4535 Elf_Internal_Verneed ivn;
4536 Elf_Internal_Vernaux ivna;
4538 /* We must test both. */
4539 offset = version_info
4540 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4544 unsigned long vna_off;
4546 GET_DATA (offset, evn, "version need");
4548 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4549 ivn.vn_next = BYTE_GET (evn.vn_next);
4551 vna_off = offset + ivn.vn_aux;
4555 Elf_External_Vernaux evna;
4557 GET_DATA (vna_off, evna,
4558 "version need aux (3)");
4560 ivna.vna_other = BYTE_GET (evna.vna_other);
4561 ivna.vna_next = BYTE_GET (evna.vna_next);
4562 ivna.vna_name = BYTE_GET (evna.vna_name);
4564 vna_off += ivna.vna_next;
4566 while (ivna.vna_other != vers_data
4567 && ivna.vna_next != 0);
4569 if (ivna.vna_other == vers_data)
4572 offset += ivn.vn_next;
4574 while (ivn.vn_next != 0);
4576 if (ivna.vna_other == vers_data)
4579 strtab + ivna.vna_name, ivna.vna_other);
4582 else if (! is_nobits)
4583 error (_("bad dynamic symbol"));
4590 if (vers_data != 0x8001)
4592 Elf_Internal_Verdef ivd;
4593 Elf_Internal_Verdaux ivda;
4594 Elf_External_Verdaux evda;
4595 unsigned long offset;
4598 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4603 Elf_External_Verdef evd;
4605 GET_DATA (offset, evd, "version def");
4607 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4608 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4609 ivd.vd_next = BYTE_GET (evd.vd_next);
4611 offset += ivd.vd_next;
4613 while (ivd.vd_ndx != (vers_data & 0x7fff)
4614 && ivd.vd_next != 0);
4616 offset -= ivd.vd_next;
4617 offset += ivd.vd_aux;
4619 GET_DATA (offset, evda, "version def aux");
4621 ivda.vda_name = BYTE_GET (evda.vda_name);
4623 if (psym->st_name != ivda.vda_name)
4624 printf ((vers_data & 0x8000)
4626 strtab + ivda.vda_name);
4636 if (strtab != string_table)
4642 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4644 if (do_histogram && buckets != NULL)
4651 int nzero_counts = 0;
4654 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4656 printf (_(" Length Number %% of total Coverage\n"));
4658 lengths = (int *) calloc (nbuckets, sizeof (int));
4659 if (lengths == NULL)
4661 error (_("Out of memory"));
4664 for (hn = 0; hn < nbuckets; ++hn)
4669 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
4672 if (maxlength < ++lengths[hn])
4677 counts = (int *) calloc (maxlength + 1, sizeof (int));
4680 error (_("Out of memory"));
4684 for (hn = 0; hn < nbuckets; ++hn)
4685 ++ counts [lengths [hn]];
4689 printf (" 0 %-10d (%5.1f%%)\n",
4690 counts[0], (counts[0] * 100.0) / nbuckets);
4691 for (si = 1; si <= maxlength; ++si)
4693 nzero_counts += counts[si] * si;
4694 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4695 si, counts[si], (counts[si] * 100.0) / nbuckets,
4696 (nzero_counts * 100.0) / nsyms);
4704 if (buckets != NULL)
4714 process_syminfo (file)
4715 FILE * file ATTRIBUTE_UNUSED;
4719 if (dynamic_syminfo == NULL
4721 /* No syminfo, this is ok. */
4724 /* There better should be a dynamic symbol section. */
4725 if (dynamic_symbols == NULL || dynamic_strings == NULL)
4729 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4730 dynamic_syminfo_offset, dynamic_syminfo_nent);
4732 printf (_(" Num: Name BoundTo Flags\n"));
4733 for (i = 0; i < dynamic_syminfo_nent; ++i)
4735 unsigned short int flags = dynamic_syminfo[i].si_flags;
4737 printf ("%4d: %-30s ", i,
4738 dynamic_strings + dynamic_symbols[i].st_name);
4740 switch (dynamic_syminfo[i].si_boundto)
4742 case SYMINFO_BT_SELF:
4743 fputs ("SELF ", stdout);
4745 case SYMINFO_BT_PARENT:
4746 fputs ("PARENT ", stdout);
4749 if (dynamic_syminfo[i].si_boundto > 0
4750 && dynamic_syminfo[i].si_boundto < dynamic_size)
4753 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
4755 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
4759 if (flags & SYMINFO_FLG_DIRECT)
4761 if (flags & SYMINFO_FLG_PASSTHRU)
4762 printf (" PASSTHRU");
4763 if (flags & SYMINFO_FLG_COPY)
4765 if (flags & SYMINFO_FLG_LAZYLOAD)
4766 printf (" LAZYLOAD");
4774 #ifdef SUPPORT_DISASSEMBLY
4776 disassemble_section (section, file)
4777 Elf32_Internal_Shdr * section;
4780 printf (_("\nAssembly dump of section %s\n"),
4781 SECTION_NAME (section));
4783 /* XXX -- to be done --- XXX */
4790 dump_section (section, file)
4791 Elf32_Internal_Shdr * section;
4794 bfd_size_type bytes;
4796 unsigned char * data;
4797 unsigned char * start;
4799 bytes = section->sh_size;
4803 printf (_("\nSection '%s' has no data to dump.\n"),
4804 SECTION_NAME (section));
4808 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
4810 addr = section->sh_addr;
4812 GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
4823 lbytes = (bytes > 16 ? 16 : bytes);
4825 printf (" 0x%8.8lx ", (unsigned long) addr);
4827 switch (elf_header.e_ident [EI_DATA])
4831 for (j = 15; j >= 0; j --)
4834 printf ("%2.2x", data [j]);
4844 for (j = 0; j < 16; j++)
4847 printf ("%2.2x", data [j]);
4857 for (j = 0; j < lbytes; j++)
4860 if (k >= ' ' && k < 0x80)
4879 static unsigned long int
4880 read_leb128 (data, length_return, sign)
4881 unsigned char * data;
4882 int * length_return;
4885 unsigned long int result = 0;
4886 unsigned int num_read = 0;
4895 result |= (byte & 0x7f) << shift;
4900 while (byte & 0x80);
4902 if (length_return != NULL)
4903 * length_return = num_read;
4905 if (sign && (shift < 32) && (byte & 0x40))
4906 result |= -1 << shift;
4911 typedef struct State_Machine_Registers
4913 unsigned long address;
4916 unsigned int column;
4920 /* This variable hold the number of the last entry seen
4921 in the File Table. */
4922 unsigned int last_file_entry;
4925 static SMR state_machine_regs;
4928 reset_state_machine (is_stmt)
4931 state_machine_regs.address = 0;
4932 state_machine_regs.file = 1;
4933 state_machine_regs.line = 1;
4934 state_machine_regs.column = 0;
4935 state_machine_regs.is_stmt = is_stmt;
4936 state_machine_regs.basic_block = 0;
4937 state_machine_regs.end_sequence = 0;
4938 state_machine_regs.last_file_entry = 0;
4941 /* Handled an extend line op. Returns true if this is the end
4944 process_extended_line_op (data, is_stmt, pointer_size)
4945 unsigned char * data;
4949 unsigned char op_code;
4952 unsigned char * name;
4955 len = read_leb128 (data, & bytes_read, 0);
4960 warn (_("badly formed extended line op encountered!"));
4965 op_code = * data ++;
4967 printf (_(" Extended opcode %d: "), op_code);
4971 case DW_LNE_end_sequence:
4972 printf (_("End of Sequence\n\n"));
4973 reset_state_machine (is_stmt);
4976 case DW_LNE_set_address:
4977 adr = byte_get (data, pointer_size);
4978 printf (_("set Address to 0x%lx\n"), adr);
4979 state_machine_regs.address = adr;
4982 case DW_LNE_define_file:
4983 printf (_(" define new File Table entry\n"));
4984 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4986 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4988 data += strlen ((char *) data) + 1;
4989 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4991 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4993 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4994 printf (_("%s\n\n"), name);
4998 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5005 /* Size of pointers in the .debug_line section. This information is not
5006 really present in that section. It's obtained before dumping the debug
5007 sections by doing some pre-scan of the .debug_info section. */
5008 static int debug_line_pointer_size = 4;
5011 display_debug_lines (section, start, file)
5012 Elf32_Internal_Shdr * section;
5013 unsigned char * start;
5014 FILE * file ATTRIBUTE_UNUSED;
5016 DWARF2_External_LineInfo * external;
5017 DWARF2_Internal_LineInfo info;
5018 unsigned char * standard_opcodes;
5019 unsigned char * data = start;
5020 unsigned char * end = start + section->sh_size;
5021 unsigned char * end_of_sequence;
5024 printf (_("\nDump of debug contents of section %s:\n\n"),
5025 SECTION_NAME (section));
5029 external = (DWARF2_External_LineInfo *) data;
5031 /* Check the length of the block. */
5032 info.li_length = BYTE_GET (external->li_length);
5033 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5036 (_("The line info appears to be corrupt - the section is too small\n"));
5040 /* Check its version number. */
5041 info.li_version = BYTE_GET (external->li_version);
5042 if (info.li_version != 2)
5044 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5048 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5049 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5050 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5051 info.li_line_base = BYTE_GET (external->li_line_base);
5052 info.li_line_range = BYTE_GET (external->li_line_range);
5053 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5055 /* Sign extend the line base field. */
5056 info.li_line_base <<= 24;
5057 info.li_line_base >>= 24;
5059 printf (_(" Length: %ld\n"), info.li_length);
5060 printf (_(" DWARF Version: %d\n"), info.li_version);
5061 printf (_(" Prolgue Length: %d\n"), info.li_prologue_length);
5062 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5063 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5064 printf (_(" Line Base: %d\n"), info.li_line_base);
5065 printf (_(" Line Range: %d\n"), info.li_line_range);
5066 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5068 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5070 reset_state_machine (info.li_default_is_stmt);
5072 /* Display the contents of the Opcodes table. */
5073 standard_opcodes = data + sizeof (* external);
5075 printf (_("\n Opcodes:\n"));
5077 for (i = 1; i < info.li_opcode_base; i++)
5078 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5080 /* Display the contents of the Directory table. */
5081 data = standard_opcodes + info.li_opcode_base - 1;
5084 printf (_("\n The Directory Table is empty.\n"));
5087 printf (_("\n The Directory Table:\n"));
5091 printf (_(" %s\n"), data);
5093 data += strlen ((char *) data) + 1;
5097 /* Skip the NUL at the end of the table. */
5100 /* Display the contents of the File Name table. */
5102 printf (_("\n The File Name Table is empty.\n"));
5105 printf (_("\n The File Name Table:\n"));
5106 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5110 unsigned char * name;
5113 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5116 data += strlen ((char *) data) + 1;
5118 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5120 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5122 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5124 printf (_("%s\n"), name);
5128 /* Skip the NUL at the end of the table. */
5131 /* Now display the statements. */
5132 printf (_("\n Line Number Statements:\n"));
5135 while (data < end_of_sequence)
5137 unsigned char op_code;
5141 op_code = * data ++;
5145 case DW_LNS_extended_op:
5146 data += process_extended_line_op (data, info.li_default_is_stmt,
5147 debug_line_pointer_size);
5151 printf (_(" Copy\n"));
5154 case DW_LNS_advance_pc:
5155 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5157 state_machine_regs.address += adv;
5158 printf (_(" Advance PC by %d to %lx\n"), adv,
5159 state_machine_regs.address);
5162 case DW_LNS_advance_line:
5163 adv = read_leb128 (data, & bytes_read, 1);
5165 state_machine_regs.line += adv;
5166 printf (_(" Advance Line by %d to %d\n"), adv,
5167 state_machine_regs.line);
5170 case DW_LNS_set_file:
5171 adv = read_leb128 (data, & bytes_read, 0);
5173 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5175 state_machine_regs.file = adv;
5178 case DW_LNS_set_column:
5179 adv = read_leb128 (data, & bytes_read, 0);
5181 printf (_(" Set column to %d\n"), adv);
5182 state_machine_regs.column = adv;
5185 case DW_LNS_negate_stmt:
5186 adv = state_machine_regs.is_stmt;
5188 printf (_(" Set is_stmt to %d\n"), adv);
5189 state_machine_regs.is_stmt = adv;
5192 case DW_LNS_set_basic_block:
5193 printf (_(" Set basic block\n"));
5194 state_machine_regs.basic_block = 1;
5197 case DW_LNS_const_add_pc:
5198 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5199 * info.li_min_insn_length);
5200 state_machine_regs.address += adv;
5201 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5202 state_machine_regs.address);
5205 case DW_LNS_fixed_advance_pc:
5206 adv = byte_get (data, 2);
5208 state_machine_regs.address += adv;
5209 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5210 adv, state_machine_regs.address);
5214 op_code -= info.li_opcode_base;
5215 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5216 state_machine_regs.address += adv;
5217 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5218 op_code, adv, state_machine_regs.address);
5219 adv = (op_code % info.li_line_range) + info.li_line_base;
5220 state_machine_regs.line += adv;
5221 printf (_(" and Line by %d to %d\n"),
5222 adv, state_machine_regs.line);
5233 display_debug_pubnames (section, start, file)
5234 Elf32_Internal_Shdr * section;
5235 unsigned char * start;
5236 FILE * file ATTRIBUTE_UNUSED;
5238 DWARF2_External_PubNames * external;
5239 DWARF2_Internal_PubNames pubnames;
5240 unsigned char * end;
5242 end = start + section->sh_size;
5244 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5248 unsigned char * data;
5249 unsigned long offset;
5251 external = (DWARF2_External_PubNames *) start;
5253 pubnames.pn_length = BYTE_GET (external->pn_length);
5254 pubnames.pn_version = BYTE_GET (external->pn_version);
5255 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5256 pubnames.pn_size = BYTE_GET (external->pn_size);
5258 data = start + sizeof (* external);
5259 start += pubnames.pn_length + sizeof (external->pn_length);
5261 if (pubnames.pn_version != 2)
5263 static int warned = 0;
5267 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5274 printf (_(" Length: %ld\n"),
5275 pubnames.pn_length);
5276 printf (_(" Version: %d\n"),
5277 pubnames.pn_version);
5278 printf (_(" Offset into .debug_info section: %ld\n"),
5279 pubnames.pn_offset);
5280 printf (_(" Size of area in .debug_info section: %ld\n"),
5283 printf (_("\n Offset\tName\n"));
5287 offset = byte_get (data, 4);
5292 printf (" %ld\t\t%s\n", offset, data);
5293 data += strlen ((char *) data) + 1;
5296 while (offset != 0);
5309 case DW_TAG_padding: return "DW_TAG_padding";
5310 case DW_TAG_array_type: return "DW_TAG_array_type";
5311 case DW_TAG_class_type: return "DW_TAG_class_type";
5312 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5313 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5314 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5315 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5316 case DW_TAG_label: return "DW_TAG_label";
5317 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5318 case DW_TAG_member: return "DW_TAG_member";
5319 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5320 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5321 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5322 case DW_TAG_string_type: return "DW_TAG_string_type";
5323 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5324 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5325 case DW_TAG_typedef: return "DW_TAG_typedef";
5326 case DW_TAG_union_type: return "DW_TAG_union_type";
5327 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5328 case DW_TAG_variant: return "DW_TAG_variant";
5329 case DW_TAG_common_block: return "DW_TAG_common_block";
5330 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5331 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5332 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5333 case DW_TAG_module: return "DW_TAG_module";
5334 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5335 case DW_TAG_set_type: return "DW_TAG_set_type";
5336 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5337 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5338 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5339 case DW_TAG_base_type: return "DW_TAG_base_type";
5340 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5341 case DW_TAG_const_type: return "DW_TAG_const_type";
5342 case DW_TAG_constant: return "DW_TAG_constant";
5343 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5344 case DW_TAG_file_type: return "DW_TAG_file_type";
5345 case DW_TAG_friend: return "DW_TAG_friend";
5346 case DW_TAG_namelist: return "DW_TAG_namelist";
5347 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5348 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5349 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5350 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5351 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5352 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5353 case DW_TAG_try_block: return "DW_TAG_try_block";
5354 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5355 case DW_TAG_variable: return "DW_TAG_variable";
5356 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5357 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5358 case DW_TAG_format_label: return "DW_TAG_format_label";
5359 case DW_TAG_function_template: return "DW_TAG_function_template";
5360 case DW_TAG_class_template: return "DW_TAG_class_template";
5363 static char buffer [100];
5365 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
5372 get_AT_name (attribute)
5373 unsigned long attribute;
5377 case DW_AT_sibling: return "DW_AT_sibling";
5378 case DW_AT_location: return "DW_AT_location";
5379 case DW_AT_name: return "DW_AT_name";
5380 case DW_AT_ordering: return "DW_AT_ordering";
5381 case DW_AT_subscr_data: return "DW_AT_subscr_data";
5382 case DW_AT_byte_size: return "DW_AT_byte_size";
5383 case DW_AT_bit_offset: return "DW_AT_bit_offset";
5384 case DW_AT_bit_size: return "DW_AT_bit_size";
5385 case DW_AT_element_list: return "DW_AT_element_list";
5386 case DW_AT_stmt_list: return "DW_AT_stmt_list";
5387 case DW_AT_low_pc: return "DW_AT_low_pc";
5388 case DW_AT_high_pc: return "DW_AT_high_pc";
5389 case DW_AT_language: return "DW_AT_language";
5390 case DW_AT_member: return "DW_AT_member";
5391 case DW_AT_discr: return "DW_AT_discr";
5392 case DW_AT_discr_value: return "DW_AT_discr_value";
5393 case DW_AT_visibility: return "DW_AT_visibility";
5394 case DW_AT_import: return "DW_AT_import";
5395 case DW_AT_string_length: return "DW_AT_string_length";
5396 case DW_AT_common_reference: return "DW_AT_common_reference";
5397 case DW_AT_comp_dir: return "DW_AT_comp_dir";
5398 case DW_AT_const_value: return "DW_AT_const_value";
5399 case DW_AT_containing_type: return "DW_AT_containing_type";
5400 case DW_AT_default_value: return "DW_AT_default_value";
5401 case DW_AT_inline: return "DW_AT_inline";
5402 case DW_AT_is_optional: return "DW_AT_is_optional";
5403 case DW_AT_lower_bound: return "DW_AT_lower_bound";
5404 case DW_AT_producer: return "DW_AT_producer";
5405 case DW_AT_prototyped: return "DW_AT_prototyped";
5406 case DW_AT_return_addr: return "DW_AT_return_addr";
5407 case DW_AT_start_scope: return "DW_AT_start_scope";
5408 case DW_AT_stride_size: return "DW_AT_stride_size";
5409 case DW_AT_upper_bound: return "DW_AT_upper_bound";
5410 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5411 case DW_AT_accessibility: return "DW_AT_accessibility";
5412 case DW_AT_address_class: return "DW_AT_address_class";
5413 case DW_AT_artificial: return "DW_AT_artificial";
5414 case DW_AT_base_types: return "DW_AT_base_types";
5415 case DW_AT_calling_convention: return "DW_AT_calling_convention";
5416 case DW_AT_count: return "DW_AT_count";
5417 case DW_AT_data_member_location: return "DW_AT_data_member_location";
5418 case DW_AT_decl_column: return "DW_AT_decl_column";
5419 case DW_AT_decl_file: return "DW_AT_decl_file";
5420 case DW_AT_decl_line: return "DW_AT_decl_line";
5421 case DW_AT_declaration: return "DW_AT_declaration";
5422 case DW_AT_discr_list: return "DW_AT_discr_list";
5423 case DW_AT_encoding: return "DW_AT_encoding";
5424 case DW_AT_external: return "DW_AT_external";
5425 case DW_AT_frame_base: return "DW_AT_frame_base";
5426 case DW_AT_friend: return "DW_AT_friend";
5427 case DW_AT_identifier_case: return "DW_AT_identifier_case";
5428 case DW_AT_macro_info: return "DW_AT_macro_info";
5429 case DW_AT_namelist_items: return "DW_AT_namelist_items";
5430 case DW_AT_priority: return "DW_AT_priority";
5431 case DW_AT_segment: return "DW_AT_segment";
5432 case DW_AT_specification: return "DW_AT_specification";
5433 case DW_AT_static_link: return "DW_AT_static_link";
5434 case DW_AT_type: return "DW_AT_type";
5435 case DW_AT_use_location: return "DW_AT_use_location";
5436 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5437 case DW_AT_virtuality: return "DW_AT_virtuality";
5438 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5439 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5440 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5441 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5442 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5443 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5444 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5445 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5446 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5447 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5448 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5449 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5450 case DW_AT_sf_names: return "DW_AT_sf_names";
5451 case DW_AT_src_info: return "DW_AT_src_info";
5452 case DW_AT_mac_info: return "DW_AT_mac_info";
5453 case DW_AT_src_coords: return "DW_AT_src_coords";
5454 case DW_AT_body_begin: return "DW_AT_body_begin";
5455 case DW_AT_body_end: return "DW_AT_body_end";
5458 static char buffer [100];
5460 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5467 get_FORM_name (form)
5472 case DW_FORM_addr: return "DW_FORM_addr";
5473 case DW_FORM_block2: return "DW_FORM_block2";
5474 case DW_FORM_block4: return "DW_FORM_block4";
5475 case DW_FORM_data2: return "DW_FORM_data2";
5476 case DW_FORM_data4: return "DW_FORM_data4";
5477 case DW_FORM_data8: return "DW_FORM_data8";
5478 case DW_FORM_string: return "DW_FORM_string";
5479 case DW_FORM_block: return "DW_FORM_block";
5480 case DW_FORM_block1: return "DW_FORM_block1";
5481 case DW_FORM_data1: return "DW_FORM_data1";
5482 case DW_FORM_flag: return "DW_FORM_flag";
5483 case DW_FORM_sdata: return "DW_FORM_sdata";
5484 case DW_FORM_strp: return "DW_FORM_strp";
5485 case DW_FORM_udata: return "DW_FORM_udata";
5486 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5487 case DW_FORM_ref1: return "DW_FORM_ref1";
5488 case DW_FORM_ref2: return "DW_FORM_ref2";
5489 case DW_FORM_ref4: return "DW_FORM_ref4";
5490 case DW_FORM_ref8: return "DW_FORM_ref8";
5491 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5492 case DW_FORM_indirect: return "DW_FORM_indirect";
5495 static char buffer [100];
5497 sprintf (buffer, _("Unknown FORM value: %lx"), form);
5503 /* FIXME: There are better and more effiecint ways to handle
5504 these structures. For now though, I just want something that
5505 is simple to implement. */
5506 typedef struct abbrev_attr
5508 unsigned long attribute;
5510 struct abbrev_attr * next;
5514 typedef struct abbrev_entry
5516 unsigned long entry;
5519 struct abbrev_attr * first_attr;
5520 struct abbrev_attr * last_attr;
5521 struct abbrev_entry * next;
5525 static abbrev_entry * first_abbrev = NULL;
5526 static abbrev_entry * last_abbrev = NULL;
5529 free_abbrevs PARAMS ((void))
5531 abbrev_entry * abbrev;
5533 for (abbrev = first_abbrev; abbrev;)
5535 abbrev_entry * next = abbrev->next;
5538 for (attr = abbrev->first_attr; attr;)
5540 abbrev_attr * next = attr->next;
5550 last_abbrev = first_abbrev = NULL;
5554 add_abbrev (number, tag, children)
5555 unsigned long number;
5559 abbrev_entry * entry;
5561 entry = (abbrev_entry *) malloc (sizeof (* entry));
5567 entry->entry = number;
5569 entry->children = children;
5570 entry->first_attr = NULL;
5571 entry->last_attr = NULL;
5574 if (first_abbrev == NULL)
5575 first_abbrev = entry;
5577 last_abbrev->next = entry;
5579 last_abbrev = entry;
5583 add_abbrev_attr (attribute, form)
5584 unsigned long attribute;
5589 attr = (abbrev_attr *) malloc (sizeof (* attr));
5595 attr->attribute = attribute;
5599 if (last_abbrev->first_attr == NULL)
5600 last_abbrev->first_attr = attr;
5602 last_abbrev->last_attr->next = attr;
5604 last_abbrev->last_attr = attr;
5607 /* Processes the (partial) contents of a .debug_abbrev section.
5608 Returns NULL if the end of the section was encountered.
5609 Returns the address after the last byte read if the end of
5610 an abbreviation set was found. */
5612 static unsigned char *
5613 process_abbrev_section (start, end)
5614 unsigned char * start;
5615 unsigned char * end;
5617 if (first_abbrev != NULL)
5623 unsigned long entry;
5625 unsigned long attribute;
5628 entry = read_leb128 (start, & bytes_read, 0);
5629 start += bytes_read;
5631 /* A single zero is supposed to end the section according
5632 to the standard. If there's more, then signal that to
5635 return start == end ? NULL : start;
5637 tag = read_leb128 (start, & bytes_read, 0);
5638 start += bytes_read;
5640 children = * start ++;
5642 add_abbrev (entry, tag, children);
5648 attribute = read_leb128 (start, & bytes_read, 0);
5649 start += bytes_read;
5651 form = read_leb128 (start, & bytes_read, 0);
5652 start += bytes_read;
5655 add_abbrev_attr (attribute, form);
5657 while (attribute != 0);
5665 display_debug_abbrev (section, start, file)
5666 Elf32_Internal_Shdr * section;
5667 unsigned char * start;
5668 FILE * file ATTRIBUTE_UNUSED;
5670 abbrev_entry * entry;
5671 unsigned char * end = start + section->sh_size;
5673 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5677 start = process_abbrev_section (start, end);
5679 printf (_(" Number TAG\n"));
5681 for (entry = first_abbrev; entry; entry = entry->next)
5685 printf (_(" %ld %s [%s]\n"),
5687 get_TAG_name (entry->tag),
5688 entry->children ? _("has children") : _("no children"));
5690 for (attr = entry->first_attr; attr; attr = attr->next)
5692 printf (_(" %-18s %s\n"),
5693 get_AT_name (attr->attribute),
5694 get_FORM_name (attr->form));
5706 static unsigned char *
5707 display_block (data, length)
5708 unsigned char * data;
5709 unsigned long length;
5711 printf (_(" %lu byte block: "), length);
5714 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
5720 decode_location_expression (data, pointer_size, length)
5721 unsigned char * data;
5722 unsigned int pointer_size;
5723 unsigned long length;
5727 unsigned long uvalue;
5728 unsigned char *end = data + length;
5737 printf ("DW_OP_addr: %lx",
5738 (unsigned long) byte_get (data, pointer_size));
5739 data += pointer_size;
5742 printf ("DW_OP_deref");
5745 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
5748 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
5751 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
5755 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
5759 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
5763 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
5767 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
5768 (unsigned long) byte_get (data + 4, 4));
5772 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
5773 (long) byte_get (data + 4, 4));
5777 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
5781 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
5785 printf ("DW_OP_dup");
5788 printf ("DW_OP_drop");
5791 printf ("DW_OP_over");
5794 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
5797 printf ("DW_OP_swap");
5800 printf ("DW_OP_rot");
5803 printf ("DW_OP_xderef");
5806 printf ("DW_OP_abs");
5809 printf ("DW_OP_and");
5812 printf ("DW_OP_div");
5815 printf ("DW_OP_minus");
5818 printf ("DW_OP_mod");
5821 printf ("DW_OP_mul");
5824 printf ("DW_OP_neg");
5827 printf ("DW_OP_not");
5830 printf ("DW_OP_or");
5833 printf ("DW_OP_plus");
5835 case DW_OP_plus_uconst:
5836 printf ("DW_OP_plus_uconst: %lu",
5837 read_leb128 (data, &bytes_read, 0));
5841 printf ("DW_OP_shl");
5844 printf ("DW_OP_shr");
5847 printf ("DW_OP_shra");
5850 printf ("DW_OP_xor");
5853 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
5857 printf ("DW_OP_eq");
5860 printf ("DW_OP_ge");
5863 printf ("DW_OP_gt");
5866 printf ("DW_OP_le");
5869 printf ("DW_OP_lt");
5872 printf ("DW_OP_ne");
5875 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
5911 printf ("DW_OP_lit%d", op - DW_OP_lit0);
5946 printf ("DW_OP_reg%d", op - DW_OP_reg0);
5981 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
5982 read_leb128 (data, &bytes_read, 1));
5987 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
5991 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
5995 uvalue = read_leb128 (data, &bytes_read, 0);
5997 printf ("DW_OP_bregx: %lu %ld", uvalue,
5998 read_leb128 (data, &bytes_read, 1));
6002 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6005 case DW_OP_deref_size:
6006 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6008 case DW_OP_xderef_size:
6009 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6012 printf ("DW_OP_nop");
6016 if (op >= DW_OP_lo_user
6017 && op <= DW_OP_hi_user)
6018 printf (_("(User defined location op)"));
6020 printf (_("(Unknown location op)"));
6021 /* No way to tell where the next op is, so just bail. */
6028 static unsigned char *
6029 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
6030 unsigned long attribute;
6032 unsigned char * data;
6033 unsigned long cu_offset;
6034 unsigned long pointer_size;
6036 unsigned long uvalue = 0;
6037 unsigned char * block_start = NULL;
6040 printf (" %-18s:", get_AT_name (attribute));
6047 case DW_FORM_ref_addr:
6049 uvalue = byte_get (data, pointer_size);
6050 data += pointer_size;
6056 uvalue = byte_get (data ++, 1);
6061 uvalue = byte_get (data, 2);
6067 uvalue = byte_get (data, 4);
6072 uvalue = read_leb128 (data, & bytes_read, 1);
6076 case DW_FORM_ref_udata:
6078 uvalue = read_leb128 (data, & bytes_read, 0);
6085 case DW_FORM_ref_addr:
6086 printf (" <#%lx>", uvalue);
6092 case DW_FORM_ref_udata:
6093 printf (" <%lx>", uvalue + cu_offset);
6097 printf (" %#lx", uvalue);
6105 printf (" %ld", uvalue);
6110 uvalue = byte_get (data, 4);
6111 printf (" %lx", uvalue);
6112 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6116 case DW_FORM_string:
6117 printf (" %s", data);
6118 data += strlen ((char *) data) + 1;
6122 uvalue = read_leb128 (data, & bytes_read, 0);
6123 block_start = data + bytes_read;
6124 data = display_block (block_start, uvalue);
6127 case DW_FORM_block1:
6128 uvalue = byte_get (data, 1);
6129 block_start = data + 1;
6130 data = display_block (block_start, uvalue);
6133 case DW_FORM_block2:
6134 uvalue = byte_get (data, 2);
6135 block_start = data + 2;
6136 data = display_block (block_start, uvalue);
6139 case DW_FORM_block4:
6140 uvalue = byte_get (data, 4);
6141 block_start = data + 4;
6142 data = display_block (block_start, uvalue);
6146 case DW_FORM_indirect:
6147 warn (_("Unable to handle FORM: %d"), form);
6151 warn (_("Unrecognised form: %d"), form);
6155 /* For some attributes we can display futher information. */
6164 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6165 case DW_INL_inlined: printf (_("(inlined)")); break;
6166 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6167 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6168 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6172 case DW_AT_language:
6175 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6176 case DW_LANG_C89: printf ("(ANSI C)"); break;
6177 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6178 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6179 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6180 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6181 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6182 case DW_LANG_Ada83: printf ("(Ada)"); break;
6183 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6184 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6185 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6186 default: printf ("(Unknown: %lx)", uvalue); break;
6190 case DW_AT_encoding:
6193 case DW_ATE_void: printf ("(void)"); break;
6194 case DW_ATE_address: printf ("(machine address)"); break;
6195 case DW_ATE_boolean: printf ("(boolean)"); break;
6196 case DW_ATE_complex_float: printf ("(complex float)"); break;
6197 case DW_ATE_float: printf ("(float)"); break;
6198 case DW_ATE_signed: printf ("(signed)"); break;
6199 case DW_ATE_signed_char: printf ("(signed char)"); break;
6200 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6201 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6203 if (uvalue >= DW_ATE_lo_user
6204 && uvalue <= DW_ATE_hi_user)
6205 printf ("(user defined type)");
6207 printf ("(unknown type)");
6212 case DW_AT_accessibility:
6215 case DW_ACCESS_public: printf ("(public)"); break;
6216 case DW_ACCESS_protected: printf ("(protected)"); break;
6217 case DW_ACCESS_private: printf ("(private)"); break;
6218 default: printf ("(unknown accessibility)"); break;
6222 case DW_AT_visibility:
6225 case DW_VIS_local: printf ("(local)"); break;
6226 case DW_VIS_exported: printf ("(exported)"); break;
6227 case DW_VIS_qualified: printf ("(qualified)"); break;
6228 default: printf ("(unknown visibility)"); break;
6232 case DW_AT_virtuality:
6235 case DW_VIRTUALITY_none: printf ("(none)"); break;
6236 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6237 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6238 default: printf ("(unknown virtuality)"); break;
6242 case DW_AT_identifier_case:
6245 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6246 case DW_ID_up_case: printf ("(up_case)"); break;
6247 case DW_ID_down_case: printf ("(down_case)"); break;
6248 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6249 default: printf ("(unknown case)"); break;
6253 case DW_AT_calling_convention:
6256 case DW_CC_normal: printf ("(normal)"); break;
6257 case DW_CC_program: printf ("(program)"); break;
6258 case DW_CC_nocall: printf ("(nocall)"); break;
6260 if (uvalue >= DW_CC_lo_user
6261 && uvalue <= DW_CC_hi_user)
6262 printf ("(user defined)");
6264 printf ("(unknown convention)");
6268 case DW_AT_frame_base:
6269 case DW_AT_location:
6270 case DW_AT_data_member_location:
6271 case DW_AT_vtable_elem_location:
6275 decode_location_expression (block_start, pointer_size, uvalue);
6289 display_debug_info (section, start, file)
6290 Elf32_Internal_Shdr * section;
6291 unsigned char * start;
6294 unsigned char * end = start + section->sh_size;
6295 unsigned char * section_begin = start;
6297 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6301 DWARF2_External_CompUnit * external;
6302 DWARF2_Internal_CompUnit compunit;
6303 unsigned char * tags;
6306 unsigned long cu_offset;
6308 external = (DWARF2_External_CompUnit *) start;
6310 compunit.cu_length = BYTE_GET (external->cu_length);
6311 compunit.cu_version = BYTE_GET (external->cu_version);
6312 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6313 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
6315 tags = start + sizeof (* external);
6316 cu_offset = start - section_begin;
6317 start += compunit.cu_length + sizeof (external->cu_length);
6319 if (compunit.cu_version != 2)
6321 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6325 printf (_(" Compilation Unit:\n"));
6326 printf (_(" Length: %ld\n"), compunit.cu_length);
6327 printf (_(" Version: %d\n"), compunit.cu_version);
6328 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6329 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
6331 if (first_abbrev != NULL)
6334 /* Read in the abbrevs used by this compilation unit. */
6337 Elf32_Internal_Shdr * sec;
6338 unsigned char * begin;
6340 /* Locate the .debug_abbrev section and process it. */
6341 for (i = 0, sec = section_headers;
6342 i < elf_header.e_shnum;
6344 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6347 if (i == -1 || sec->sh_size == 0)
6349 warn (_("Unable to locate .debug_abbrev section!\n"));
6353 GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6354 "debug_abbrev section data");
6356 process_abbrev_section (begin + compunit.cu_abbrev_offset,
6357 begin + sec->sh_size);
6363 while (tags < start)
6366 unsigned long abbrev_number;
6367 abbrev_entry * entry;
6370 abbrev_number = read_leb128 (tags, & bytes_read, 0);
6373 /* A null DIE marks the end of a list of children. */
6374 if (abbrev_number == 0)
6380 /* Scan through the abbreviation list until we reach the
6382 for (entry = first_abbrev;
6383 entry && entry->entry != abbrev_number;
6384 entry = entry->next)
6389 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6394 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6395 level, tags - section_begin - bytes_read,
6397 get_TAG_name (entry->tag));
6399 for (attr = entry->first_attr; attr; attr = attr->next)
6400 tags = read_and_display_attr (attr->attribute,
6403 compunit.cu_pointer_size);
6405 if (entry->children)
6416 display_debug_aranges (section, start, file)
6417 Elf32_Internal_Shdr * section;
6418 unsigned char * start;
6419 FILE * file ATTRIBUTE_UNUSED;
6421 unsigned char * end = start + section->sh_size;
6423 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6427 DWARF2_External_ARange * external;
6428 DWARF2_Internal_ARange arange;
6429 unsigned char * ranges;
6430 unsigned long length;
6431 unsigned long address;
6434 external = (DWARF2_External_ARange *) start;
6436 arange.ar_length = BYTE_GET (external->ar_length);
6437 arange.ar_version = BYTE_GET (external->ar_version);
6438 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
6439 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6440 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6442 if (arange.ar_version != 2)
6444 warn (_("Only DWARF 2 aranges are currently supported.\n"));
6448 printf (_(" Length: %ld\n"), arange.ar_length);
6449 printf (_(" Version: %d\n"), arange.ar_version);
6450 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
6451 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6452 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6454 printf (_("\n Address Length\n"));
6456 ranges = start + sizeof (* external);
6458 /* Must pad to an alignment boundary that is twice the pointer size. */
6459 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
6461 ranges += (2 * arange.ar_pointer_size) - excess;
6465 address = byte_get (ranges, arange.ar_pointer_size);
6467 ranges += arange.ar_pointer_size;
6469 length = byte_get (ranges, arange.ar_pointer_size);
6471 ranges += arange.ar_pointer_size;
6473 /* A pair of zeros marks the end of the list. */
6474 if (address == 0 && length == 0)
6477 printf (" %8.8lx %lu\n", address, length);
6480 start += arange.ar_length + sizeof (external->ar_length);
6488 typedef struct Frame_Chunk
6490 struct Frame_Chunk *next;
6491 unsigned char *chunk_start;
6493 /* DW_CFA_{undefined,same_value,offset,register} */
6494 unsigned char *col_type;
6497 unsigned int code_factor;
6498 unsigned int data_factor;
6499 unsigned long pc_begin;
6500 unsigned long pc_range;
6508 frame_need_space (fc, reg)
6512 int prev = fc->ncols;
6514 if (reg < fc->ncols)
6516 fc->ncols = reg + 1;
6517 fc->col_type = (unsigned char *) xrealloc (fc->col_type,
6518 fc->ncols * sizeof (unsigned char));
6519 fc->col_offset = (int *) xrealloc (fc->col_offset,
6520 fc->ncols * sizeof (int));
6522 while (prev < fc->ncols)
6524 fc->col_type[prev] = DW_CFA_undefined;
6525 fc->col_offset[prev] = 0;
6531 frame_display_row (fc, need_col_headers, max_regs)
6533 int *need_col_headers;
6539 if (*max_regs < fc->ncols)
6540 *max_regs = fc->ncols;
6541 if (*need_col_headers)
6543 *need_col_headers = 0;
6544 printf (" LOC CFA ");
6545 for (r=0; r<*max_regs; r++)
6549 printf ("r%-4d", r);
6552 printf ("%08x ", (unsigned int) fc->pc_begin);
6553 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
6554 printf ("%-8s ", tmp);
6555 for (r=0; r<fc->ncols; r++)
6557 switch (fc->col_type[r])
6559 case DW_CFA_undefined:
6562 case DW_CFA_same_value:
6566 sprintf (tmp, "c%+d", fc->col_offset[r]);
6568 case DW_CFA_register:
6569 sprintf (tmp, "r%d", fc->col_offset[r]);
6572 strcpy (tmp, "n/a");
6575 printf ("%-5s", tmp);
6580 #define GET(N) byte_get (start, N); start += N
6581 #define LEB() read_leb128 (start, &length_return, 0); start += length_return
6582 #define SLEB() read_leb128 (start, &length_return, 1); start += length_return
6585 display_debug_frames (section, start, file)
6586 Elf32_Internal_Shdr * section;
6587 unsigned char * start;
6588 FILE * file ATTRIBUTE_UNUSED;
6590 unsigned char * end = start + section->sh_size;
6591 unsigned char *section_start = start;
6592 Frame_Chunk *chunks = 0;
6593 Frame_Chunk *remembered_state = 0, *rs;
6594 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
6598 printf (_("The section %s contains:\n"), SECTION_NAME (section));
6602 unsigned char *saved_start, *block_end;
6603 unsigned long length, cie_id;
6604 Frame_Chunk *fc, *cie;
6605 int need_col_headers = 1;
6607 saved_start = start;
6608 length = byte_get (start, 4); start += 4;
6613 block_end = saved_start + length + 4;
6614 cie_id = byte_get (start, 4); start += 4;
6616 printf ("\n%08x %08lx %08lx ", saved_start - section_start, length, cie_id);
6618 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
6620 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
6621 memset (fc, 0, sizeof (Frame_Chunk));
6625 fc->chunk_start = saved_start;
6627 fc->col_type = (unsigned char *) xmalloc (sizeof (unsigned char));
6628 fc->col_offset = (int *) xmalloc (sizeof (int));
6629 frame_need_space (fc, max_regs-1);
6631 start ++; /* version */
6632 fc->augmentation = start;
6633 while (*start) start++; start++; /* skip past NUL */
6634 if (fc->augmentation[0] == 'z')
6637 fc->code_factor = LEB ();
6638 fc->data_factor = SLEB ();
6639 fc->ra = byte_get (start, 1); start += 1;
6641 printf ("skipping %d extra bytes\n", xtra);
6644 else if (strcmp (fc->augmentation, "eh") == 0)
6647 fc->code_factor = LEB ();
6648 fc->data_factor = SLEB ();
6649 fc->ra = byte_get (start, 1); start += 1;
6653 fc->code_factor = LEB ();
6654 fc->data_factor = SLEB ();
6655 fc->ra = byte_get (start, 1); start += 1;
6658 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n",
6659 fc->augmentation, fc->code_factor, fc->data_factor, fc->ra);
6661 frame_need_space (fc, fc->ra);
6665 unsigned char *look_for;
6666 static Frame_Chunk fde_fc;
6668 memset (fc, 0, sizeof (Frame_Chunk));
6670 look_for = is_eh ? start-4-cie_id : (unsigned char *) cie_id;
6672 fc->pc_begin = byte_get (start, 4); start += 4;
6673 fc->pc_range = byte_get (start, 4); start += 4;
6675 for (cie=chunks; cie && (cie->chunk_start != look_for); cie = cie->next);
6678 warn ("Invalid CIE pointer %08x in FDE at %08x\n", cie_id, saved_start);
6681 fc->col_type = (unsigned char *) xmalloc (sizeof (unsigned char));
6682 fc->col_offset = (int *) xmalloc (sizeof (int));
6683 frame_need_space (fc, max_regs-1);
6685 fc->augmentation = "";
6689 fc->ncols = cie->ncols;
6690 fc->col_type = (unsigned char *) xmalloc (fc->ncols * sizeof (unsigned char));
6691 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
6692 memcpy (fc->col_type, cie->col_type, fc->ncols);
6693 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
6694 fc->augmentation = cie->augmentation;
6695 fc->code_factor = cie->code_factor;
6696 fc->data_factor = cie->data_factor;
6697 fc->cfa_reg = cie->cfa_reg;
6698 fc->cfa_offset = cie->cfa_offset;
6700 frame_need_space (fc, max_regs-1);
6703 if (cie->augmentation[0] == 'z')
6705 unsigned long l = LEB ();
6709 printf ("FDE cie=%08x pc=%08lx..%08lx\n",
6710 cie->chunk_start-section_start, fc->pc_begin,
6711 fc->pc_begin + fc->pc_range);
6714 /* At this point, fc is the current chunk, cie (if any) is set, and we're
6715 about to interpret instructions for the chunk. */
6717 /* This exists for readelf maintainers. */
6720 while (start < block_end)
6723 unsigned long ul, reg, roffs;
6734 case DW_CFA_advance_loc:
6735 frame_display_row (fc, &need_col_headers, &max_regs);
6737 printf (" DW_CFA_advance_loc: %08x = %08x + %d*%d\n",
6738 fc->pc_begin + opa * fc->code_factor, fc->pc_begin, opa, fc->code_factor);
6740 fc->pc_begin += opa * fc->code_factor;
6744 frame_need_space (fc, opa);
6747 printf (" DW_CFA_offset: r%d = cfa[%d*%d]\n", opa, roffs, fc->data_factor);
6749 fc->col_type[opa] = DW_CFA_offset;
6750 fc->col_offset[opa] = roffs * fc->data_factor;
6753 case DW_CFA_restore:
6754 frame_need_space (fc, opa);
6756 printf (" DW_CFA_restore: r%d\n", opa);
6758 fc->col_type[opa] = cie->col_type[opa];
6759 fc->col_offset[opa] = cie->col_offset[opa];
6762 case DW_CFA_set_loc:
6763 frame_display_row (fc, &need_col_headers, &max_regs);
6764 vma = byte_get (start, sizeof (vma)); start += sizeof (vma);
6766 printf (" DW_CFA_set_loc: %08x\n", vma);
6771 case DW_CFA_advance_loc1:
6772 frame_display_row (fc, &need_col_headers, &max_regs);
6773 ofs = byte_get (start, 1); start += 1;
6775 printf (" DW_CFA_advance_loc1: %08x = %08x + %d*%d\n",
6776 fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
6778 fc->pc_begin += ofs * fc->code_factor;
6781 case DW_CFA_advance_loc2:
6782 frame_display_row (fc, &need_col_headers, &max_regs);
6783 ofs = byte_get (start, 2); start += 2;
6785 printf (" DW_CFA_advance_loc2: %08x = %08x + %d*%d\n",
6786 fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
6788 fc->pc_begin += ofs * fc->code_factor;
6791 case DW_CFA_advance_loc4:
6792 frame_display_row (fc, &need_col_headers, &max_regs);
6793 ofs = byte_get (start, 4); start += 4;
6795 printf (" DW_CFA_advance_loc4: %08x = %08x + %d*%d\n",
6796 fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
6798 fc->pc_begin += ofs * fc->code_factor;
6801 case DW_CFA_offset_extended:
6804 frame_need_space (fc, reg);
6806 printf (" DW_CFA_offset_extended: r%d = cfa[%d*%d]\n", reg, roffs, fc->data_factor);
6808 fc->col_type[reg] = DW_CFA_offset;
6809 fc->col_offset[reg] = roffs * fc->data_factor;
6812 case DW_CFA_restore_extended:
6814 frame_need_space (fc, reg);
6816 printf (" DW_CFA_restore_extended: r%d\n", reg);
6818 fc->col_type[reg] = cie->col_type[reg];
6819 fc->col_offset[reg] = cie->col_offset[reg];
6822 case DW_CFA_undefined:
6824 frame_need_space (fc, reg);
6826 printf (" DW_CFA_undefined: r%d\n", reg);
6828 fc->col_type[reg] = DW_CFA_undefined;
6829 fc->col_offset[reg] = 0;
6832 case DW_CFA_same_value:
6834 frame_need_space (fc, reg);
6836 printf (" DW_CFA_same_value: r%d\n", reg);
6838 fc->col_type[reg] = DW_CFA_same_value;
6839 fc->col_offset[reg] = 0;
6842 case DW_CFA_register:
6845 frame_need_space (fc, reg);
6847 printf (" DW_CFA_ame_value: r%d\n", reg);
6849 fc->col_type[reg] = DW_CFA_register;
6850 fc->col_offset[reg] = roffs;
6853 case DW_CFA_remember_state:
6855 printf (" DW_CFA_remember_state\n");
6857 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
6858 rs->ncols = fc->ncols;
6859 rs->col_type = (unsigned char *) xmalloc (rs->ncols);
6860 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
6861 memcpy (rs->col_type, fc->col_type, rs->ncols);
6862 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
6863 rs->next = remembered_state;
6864 remembered_state = rs;
6867 case DW_CFA_restore_state:
6869 printf (" DW_CFA_restore_state\n");
6871 rs = remembered_state;
6872 remembered_state = rs->next;
6873 frame_need_space (fc, rs->ncols-1);
6874 memcpy (fc->col_type, rs->col_type, rs->ncols);
6875 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
6876 free (rs->col_type);
6877 free (rs->col_offset);
6881 case DW_CFA_def_cfa:
6882 fc->cfa_reg = LEB ();
6883 fc->cfa_offset = LEB ();
6885 printf (" DW_CFA_def_cfa: reg %d ofs %d\n", fc->cfa_reg, fc->cfa_offset);
6889 case DW_CFA_def_cfa_register:
6890 fc->cfa_reg = LEB ();
6892 printf (" DW_CFA_def_cfa_reg: %d\n", fc->cfa_reg);
6896 case DW_CFA_def_cfa_offset:
6897 fc->cfa_offset = LEB ();
6899 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
6905 printf (" DW_CFA_nop\n");
6909 #ifndef DW_CFA_GNU_window_save
6910 #define DW_CFA_GNU_window_save 0x2d
6912 case DW_CFA_GNU_window_save:
6914 printf (" DW_CFA_GNU_window_save\n");
6918 #ifndef DW_CFA_GNU_args_size
6919 #define DW_CFA_GNU_args_size 0x2e
6921 case DW_CFA_GNU_args_size:
6924 printf (" DW_CFA_GNU_args_size: %d\n", ul);
6928 #ifndef DW_CFA_GNU_negative_offset_extended
6929 #define DW_CFA_GNU_negative_offset_extended 0x2f
6931 case DW_CFA_GNU_negative_offset_extended:
6934 frame_need_space (fc, reg);
6936 printf (" DW_CFA_GNU_negative_offset_extended: r%d = cfa[%d*%d]\n", reg, l, fc->data_factor);
6938 fc->col_type[reg] = DW_CFA_offset;
6939 fc->col_offset[reg] = l * fc->data_factor;
6943 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
6948 frame_display_row (fc, &need_col_headers, &max_regs);
6963 display_debug_not_supported (section, start, file)
6964 Elf32_Internal_Shdr * section;
6965 unsigned char * start ATTRIBUTE_UNUSED;
6966 FILE * file ATTRIBUTE_UNUSED;
6968 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6969 SECTION_NAME (section));
6974 /* Pre-scan the .debug_info section to record the size of address.
6975 When dumping the .debug_line, we use that size information, assuming
6976 that all compilation units have the same address size. */
6978 prescan_debug_info (section, start, file)
6979 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
6980 unsigned char * start;
6981 FILE * file ATTRIBUTE_UNUSED;
6983 DWARF2_External_CompUnit * external;
6985 external = (DWARF2_External_CompUnit *) start;
6987 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
6991 /* A structure containing the name of a debug section and a pointer
6992 to a function that can decode it. The third field is a prescan
6993 function to be run over the section before displaying any of the
6998 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6999 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
7003 { ".debug_info", display_debug_info, prescan_debug_info },
7004 { ".debug_abbrev", display_debug_abbrev, NULL },
7005 { ".debug_line", display_debug_lines, NULL },
7006 { ".debug_aranges", display_debug_aranges, NULL },
7007 { ".debug_pubnames", display_debug_pubnames, NULL },
7008 { ".debug_frame", display_debug_frames, NULL },
7009 { ".eh_frame", display_debug_frames, NULL },
7010 { ".debug_macinfo", display_debug_not_supported, NULL },
7011 { ".debug_frame", display_debug_not_supported, NULL },
7012 { ".debug_str", display_debug_not_supported, NULL },
7013 { ".debug_static_func", display_debug_not_supported, NULL },
7014 { ".debug_static_vars", display_debug_not_supported, NULL },
7015 { ".debug_types", display_debug_not_supported, NULL },
7016 { ".debug_weaknames", display_debug_not_supported, NULL }
7020 display_debug_section (section, file)
7021 Elf32_Internal_Shdr * section;
7024 char * name = SECTION_NAME (section);
7025 bfd_size_type length;
7026 unsigned char * start;
7029 length = section->sh_size;
7032 printf (_("\nSection '%s' has no debugging data.\n"), name);
7036 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
7037 "debug section data");
7039 /* See if we know how to display the contents of this section. */
7040 for (i = NUM_ELEM (debug_displays); i--;)
7041 if (strcmp (debug_displays[i].name, name) == 0)
7043 debug_displays[i].display (section, start, file);
7048 printf (_("Unrecognised debug section: %s\n"), name);
7052 /* If we loaded in the abbrev section at some point,
7053 we must release it here. */
7054 if (first_abbrev != NULL)
7061 process_section_contents (file)
7064 Elf32_Internal_Shdr * section;
7070 /* Pre-scan the debug sections to find some debug information not
7071 present in some of them. For the .debug_line, we must find out the
7072 size of address (specified in .debug_info and .debug_aranges). */
7073 for (i = 0, section = section_headers;
7074 i < elf_header.e_shnum && i < num_dump_sects;
7077 char * name = SECTION_NAME (section);
7080 if (section->sh_size == 0)
7083 /* See if there is some pre-scan operation for this section. */
7084 for (j = NUM_ELEM (debug_displays); j--;)
7085 if (strcmp (debug_displays[j].name, name) == 0)
7087 if (debug_displays[j].prescan != NULL)
7089 bfd_size_type length;
7090 unsigned char * start;
7092 length = section->sh_size;
7093 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
7094 "debug section data");
7096 debug_displays[j].prescan (section, start, file);
7104 for (i = 0, section = section_headers;
7105 i < elf_header.e_shnum && i < num_dump_sects;
7108 #ifdef SUPPORT_DISASSEMBLY
7109 if (dump_sects[i] & DISASS_DUMP)
7110 disassemble_section (section, file);
7112 if (dump_sects[i] & HEX_DUMP)
7113 dump_section (section, file);
7115 if (dump_sects[i] & DEBUG_DUMP)
7116 display_debug_section (section, file);
7119 if (i < num_dump_sects)
7120 warn (_("Some sections were not dumped because they do not exist!\n"));
7126 process_mips_fpe_exception (mask)
7132 if (mask & OEX_FPU_INEX)
7133 fputs ("INEX", stdout), first = 0;
7134 if (mask & OEX_FPU_UFLO)
7135 printf ("%sUFLO", first ? "" : "|"), first = 0;
7136 if (mask & OEX_FPU_OFLO)
7137 printf ("%sOFLO", first ? "" : "|"), first = 0;
7138 if (mask & OEX_FPU_DIV0)
7139 printf ("%sDIV0", first ? "" : "|"), first = 0;
7140 if (mask & OEX_FPU_INVAL)
7141 printf ("%sINVAL", first ? "" : "|");
7144 fputs ("0", stdout);
7148 process_mips_specific (file)
7151 Elf_Internal_Dyn * entry;
7152 size_t liblist_offset = 0;
7153 size_t liblistno = 0;
7154 size_t conflictsno = 0;
7155 size_t options_offset = 0;
7156 size_t conflicts_offset = 0;
7158 /* We have a lot of special sections. Thanks SGI! */
7159 if (dynamic_segment == NULL)
7160 /* No information available. */
7163 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
7164 switch (entry->d_tag)
7166 case DT_MIPS_LIBLIST:
7167 liblist_offset = entry->d_un.d_val - loadaddr;
7169 case DT_MIPS_LIBLISTNO:
7170 liblistno = entry->d_un.d_val;
7172 case DT_MIPS_OPTIONS:
7173 options_offset = entry->d_un.d_val - loadaddr;
7175 case DT_MIPS_CONFLICT:
7176 conflicts_offset = entry->d_un.d_val - loadaddr;
7178 case DT_MIPS_CONFLICTNO:
7179 conflictsno = entry->d_un.d_val;
7185 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
7187 Elf32_External_Lib * elib;
7190 GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
7191 elib, Elf32_External_Lib *, "liblist");
7193 printf ("\nSection '.liblist' contains %lu entries:\n",
7194 (unsigned long) liblistno);
7195 fputs (" Library Time Stamp Checksum Version Flags\n",
7198 for (cnt = 0; cnt < liblistno; ++cnt)
7205 liblist.l_name = BYTE_GET (elib[cnt].l_name);
7206 time = BYTE_GET (elib[cnt].l_time_stamp);
7207 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
7208 liblist.l_version = BYTE_GET (elib[cnt].l_version);
7209 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
7211 tmp = gmtime (&time);
7212 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
7213 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7214 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7216 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
7217 dynamic_strings + liblist.l_name, timebuf,
7218 liblist.l_checksum, liblist.l_version);
7220 if (liblist.l_flags == 0)
7231 { " EXACT_MATCH", LL_EXACT_MATCH },
7232 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
7233 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
7234 { " EXPORTS", LL_EXPORTS },
7235 { " DELAY_LOAD", LL_DELAY_LOAD },
7236 { " DELTA", LL_DELTA }
7238 int flags = liblist.l_flags;
7242 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
7244 if ((flags & l_flags_vals[fcnt].bit) != 0)
7246 fputs (l_flags_vals[fcnt].name, stdout);
7247 flags ^= l_flags_vals[fcnt].bit;
7250 printf (" %#x", (unsigned int) flags);
7259 if (options_offset != 0)
7261 Elf_External_Options * eopt;
7262 Elf_Internal_Shdr * sect = section_headers;
7263 Elf_Internal_Options * iopt;
7264 Elf_Internal_Options * option;
7268 /* Find the section header so that we get the size. */
7269 while (sect->sh_type != SHT_MIPS_OPTIONS)
7272 GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
7273 Elf_External_Options *, "options");
7275 iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
7279 error (_("Out of memory"));
7286 while (offset < sect->sh_size)
7288 Elf_External_Options * eoption;
7290 eoption = (Elf_External_Options *) ((char *) eopt + offset);
7292 option->kind = BYTE_GET (eoption->kind);
7293 option->size = BYTE_GET (eoption->size);
7294 option->section = BYTE_GET (eoption->section);
7295 option->info = BYTE_GET (eoption->info);
7297 offset += option->size;
7303 printf (_("\nSection '%s' contains %d entries:\n"),
7304 string_table + sect->sh_name, cnt);
7312 switch (option->kind)
7315 /* This shouldn't happen. */
7316 printf (" NULL %d %lx", option->section, option->info);
7319 printf (" REGINFO ");
7320 if (elf_header.e_machine == EM_MIPS)
7323 Elf32_External_RegInfo *ereg;
7324 Elf32_RegInfo reginfo;
7326 ereg = (Elf32_External_RegInfo *) (option + 1);
7327 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
7328 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
7329 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
7330 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
7331 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
7332 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
7334 printf ("GPR %08lx GP 0x%lx\n",
7336 (unsigned long) reginfo.ri_gp_value);
7337 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
7338 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
7339 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
7344 Elf64_External_RegInfo * ereg;
7345 Elf64_Internal_RegInfo reginfo;
7347 ereg = (Elf64_External_RegInfo *) (option + 1);
7348 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
7349 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
7350 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
7351 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
7352 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
7353 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
7355 printf ("GPR %08lx GP 0x",
7356 reginfo.ri_gprmask);
7357 printf_vma (reginfo.ri_gp_value);
7360 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
7361 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
7362 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
7366 case ODK_EXCEPTIONS:
7367 fputs (" EXCEPTIONS fpe_min(", stdout);
7368 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
7369 fputs (") fpe_max(", stdout);
7370 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
7371 fputs (")", stdout);
7373 if (option->info & OEX_PAGE0)
7374 fputs (" PAGE0", stdout);
7375 if (option->info & OEX_SMM)
7376 fputs (" SMM", stdout);
7377 if (option->info & OEX_FPDBUG)
7378 fputs (" FPDBUG", stdout);
7379 if (option->info & OEX_DISMISS)
7380 fputs (" DISMISS", stdout);
7383 fputs (" PAD ", stdout);
7384 if (option->info & OPAD_PREFIX)
7385 fputs (" PREFIX", stdout);
7386 if (option->info & OPAD_POSTFIX)
7387 fputs (" POSTFIX", stdout);
7388 if (option->info & OPAD_SYMBOL)
7389 fputs (" SYMBOL", stdout);
7392 fputs (" HWPATCH ", stdout);
7393 if (option->info & OHW_R4KEOP)
7394 fputs (" R4KEOP", stdout);
7395 if (option->info & OHW_R8KPFETCH)
7396 fputs (" R8KPFETCH", stdout);
7397 if (option->info & OHW_R5KEOP)
7398 fputs (" R5KEOP", stdout);
7399 if (option->info & OHW_R5KCVTL)
7400 fputs (" R5KCVTL", stdout);
7403 fputs (" FILL ", stdout);
7404 /* XXX Print content of info word? */
7407 fputs (" TAGS ", stdout);
7408 /* XXX Print content of info word? */
7411 fputs (" HWAND ", stdout);
7412 if (option->info & OHWA0_R4KEOP_CHECKED)
7413 fputs (" R4KEOP_CHECKED", stdout);
7414 if (option->info & OHWA0_R4KEOP_CLEAN)
7415 fputs (" R4KEOP_CLEAN", stdout);
7418 fputs (" HWOR ", stdout);
7419 if (option->info & OHWA0_R4KEOP_CHECKED)
7420 fputs (" R4KEOP_CHECKED", stdout);
7421 if (option->info & OHWA0_R4KEOP_CLEAN)
7422 fputs (" R4KEOP_CLEAN", stdout);
7425 printf (" GP_GROUP %#06lx self-contained %#06lx",
7426 option->info & OGP_GROUP,
7427 (option->info & OGP_SELF) >> 16);
7430 printf (" IDENT %#06lx self-contained %#06lx",
7431 option->info & OGP_GROUP,
7432 (option->info & OGP_SELF) >> 16);
7435 /* This shouldn't happen. */
7436 printf (" %3d ??? %d %lx",
7437 option->kind, option->section, option->info);
7441 len = sizeof (*eopt);
7442 while (len < option->size)
7443 if (((char *) option)[len] >= ' '
7444 && ((char *) option)[len] < 0x7f)
7445 printf ("%c", ((char *) option)[len++]);
7447 printf ("\\%03o", ((char *) option)[len++]);
7449 fputs ("\n", stdout);
7456 if (conflicts_offset != 0 && conflictsno != 0)
7458 Elf32_External_Conflict * econf32;
7459 Elf64_External_Conflict * econf64;
7460 Elf32_Conflict * iconf;
7463 if (dynamic_symbols == NULL)
7465 error (_("conflict list with without table"));
7469 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
7472 error (_("Out of memory"));
7478 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32),
7479 econf32, Elf32_External_Conflict *, "conflict");
7481 for (cnt = 0; cnt < conflictsno; ++cnt)
7482 iconf[cnt] = BYTE_GET (econf32[cnt]);
7486 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64),
7487 econf64, Elf64_External_Conflict *, "conflict");
7489 for (cnt = 0; cnt < conflictsno; ++cnt)
7490 iconf[cnt] = BYTE_GET (econf64[cnt]);
7493 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
7494 puts (_(" Num: Index Value Name"));
7496 for (cnt = 0; cnt < conflictsno; ++cnt)
7498 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
7500 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
7501 print_vma (psym->st_value, FULL_HEX);
7502 printf (" %s\n", dynamic_strings + psym->st_name);
7512 get_note_type (e_type)
7515 static char buff[64];
7519 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
7520 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
7521 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
7522 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
7523 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
7524 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
7525 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
7526 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
7527 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
7528 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
7529 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
7531 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
7536 /* Note that by the ELF standard, the name field is already null byte
7537 terminated, and namesz includes the terminating null byte.
7538 I.E. the value of namesz for the name "FSF" is 4.
7540 If the value of namesz is zero, there is no name present. */
7542 process_note (pnote)
7543 Elf32_Internal_Note * pnote;
7545 printf (" %s\t\t0x%08lx\t%s\n",
7546 pnote->namesz ? pnote->namedata : "(NONE)",
7547 pnote->descsz, get_note_type (pnote->type));
7553 process_corefile_note_segment (file, offset, length)
7558 Elf_External_Note * pnotes;
7559 Elf_External_Note * external;
7565 GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
7569 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
7570 (unsigned long) offset, (unsigned long) length);
7571 printf (_(" Owner\t\tData size\tDescription\n"));
7573 while (external < (Elf_External_Note *)((char *) pnotes + length))
7575 Elf32_Internal_Note inote;
7578 inote.type = BYTE_GET (external->type);
7579 inote.namesz = BYTE_GET (external->namesz);
7580 inote.namedata = external->name;
7581 inote.descsz = BYTE_GET (external->descsz);
7582 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
7583 inote.descpos = offset + (inote.descdata - (char *) pnotes);
7585 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
7587 /* Verify that name is null terminated. It appears that at least
7588 one version of Linux (RedHat 6.0) generates corefiles that don't
7589 comply with the ELF spec by failing to include the null byte in
7591 if (inote.namedata[inote.namesz] != '\0')
7593 temp = malloc (inote.namesz + 1);
7597 error (_("Out of memory\n"));
7602 strncpy (temp, inote.namedata, inote.namesz);
7603 temp[inote.namesz] = 0;
7605 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
7606 inote.namedata = temp;
7609 res &= process_note (& inote);
7624 process_corefile_note_segments (file)
7627 Elf_Internal_Phdr * program_headers;
7628 Elf_Internal_Phdr * segment;
7632 program_headers = (Elf_Internal_Phdr *) malloc
7633 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
7635 if (program_headers == NULL)
7637 error (_("Out of memory\n"));
7642 i = get_32bit_program_headers (file, program_headers);
7644 i = get_64bit_program_headers (file, program_headers);
7648 free (program_headers);
7652 for (i = 0, segment = program_headers;
7653 i < elf_header.e_phnum;
7656 if (segment->p_type == PT_NOTE)
7657 res &= process_corefile_note_segment (file,
7658 (bfd_vma) segment->p_offset,
7659 (bfd_vma) segment->p_filesz);
7662 free (program_headers);
7668 process_corefile_contents (file)
7671 /* If we have not been asked to display the notes then do nothing. */
7675 /* If file is not a core file then exit. */
7676 if (elf_header.e_type != ET_CORE)
7679 /* No program headers means no NOTE segment. */
7680 if (elf_header.e_phnum == 0)
7682 printf (_("No note segments present in the core file.\n"));
7686 return process_corefile_note_segments (file);
7690 process_arch_specific (file)
7696 switch (elf_header.e_machine)
7699 case EM_MIPS_RS4_BE:
7700 return process_mips_specific (file);
7709 get_file_header (file)
7712 /* Read in the identity array. */
7713 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
7716 /* Determine how to read the rest of the header. */
7717 switch (elf_header.e_ident [EI_DATA])
7719 default: /* fall through */
7720 case ELFDATANONE: /* fall through */
7721 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
7722 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
7725 /* For now we only support 32 bit and 64 bit ELF files. */
7726 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
7728 /* Read in the rest of the header. */
7731 Elf32_External_Ehdr ehdr32;
7733 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
7736 elf_header.e_type = BYTE_GET (ehdr32.e_type);
7737 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
7738 elf_header.e_version = BYTE_GET (ehdr32.e_version);
7739 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
7740 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
7741 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
7742 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
7743 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
7744 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
7745 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
7746 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
7747 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
7748 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
7752 Elf64_External_Ehdr ehdr64;
7754 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7755 we will not be able to cope with the 64bit data found in
7756 64 ELF files. Detect this now and abort before we start
7757 overwritting things. */
7758 if (sizeof (bfd_vma) < 8)
7760 error (_("This instance of readelf has been built without support for a\n"));
7761 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7765 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
7768 elf_header.e_type = BYTE_GET (ehdr64.e_type);
7769 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
7770 elf_header.e_version = BYTE_GET (ehdr64.e_version);
7771 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
7772 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
7773 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
7774 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
7775 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
7776 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
7777 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
7778 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
7779 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
7780 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
7787 process_file (file_name)
7791 struct stat statbuf;
7794 if (stat (file_name, & statbuf) < 0)
7796 error (_("Cannot stat input file %s.\n"), file_name);
7800 file = fopen (file_name, "rb");
7803 error (_("Input file %s not found.\n"), file_name);
7807 if (! get_file_header (file))
7809 error (_("%s: Failed to read file header\n"), file_name);
7814 /* Initialise per file variables. */
7815 for (i = NUM_ELEM (version_info); i--;)
7816 version_info[i] = 0;
7818 for (i = NUM_ELEM (dynamic_info); i--;)
7819 dynamic_info[i] = 0;
7821 /* Process the file. */
7823 printf (_("\nFile: %s\n"), file_name);
7825 if (! process_file_header ())
7831 process_section_headers (file);
7833 process_program_headers (file);
7835 process_dynamic_segment (file);
7837 process_relocs (file);
7839 process_symbol_table (file);
7841 process_syminfo (file);
7843 process_version_sections (file);
7845 process_section_contents (file);
7847 process_corefile_contents (file);
7849 process_arch_specific (file);
7853 if (section_headers)
7855 free (section_headers);
7856 section_headers = NULL;
7861 free (string_table);
7862 string_table = NULL;
7865 if (dynamic_strings)
7867 free (dynamic_strings);
7868 dynamic_strings = NULL;
7871 if (dynamic_symbols)
7873 free (dynamic_symbols);
7874 dynamic_symbols = NULL;
7875 num_dynamic_syms = 0;
7878 if (dynamic_syminfo)
7880 free (dynamic_syminfo);
7881 dynamic_syminfo = NULL;
7885 #ifdef SUPPORT_DISASSEMBLY
7886 /* Needed by the i386 disassembler. For extra credit, someone could
7887 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7891 print_address (unsigned int addr, FILE * outfile)
7893 fprintf (outfile,"0x%8.8x", addr);
7896 /* Needed by the i386 disassembler. */
7898 db_task_printsym (unsigned int addr)
7900 print_address (addr, stderr);
7909 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7910 setlocale (LC_MESSAGES, "");
7912 bindtextdomain (PACKAGE, LOCALEDIR);
7913 textdomain (PACKAGE);
7915 parse_args (argc, argv);
7917 if (optind < (argc - 1))
7920 while (optind < argc)
7921 process_file (argv [optind ++]);
7923 if (dump_sects != NULL)