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;
120 /* A dynamic array of flags indicating which sections require dumping. */
121 char * dump_sects = NULL;
122 unsigned int num_dump_sects = 0;
124 #define HEX_DUMP (1 << 0)
125 #define DISASS_DUMP (1 << 1)
126 #define DEBUG_DUMP (1 << 2)
128 /* How to rpint a vma value. */
129 typedef enum print_mode
141 /* Forward declarations for dumb compilers. */
142 static void print_vma PARAMS ((bfd_vma, print_mode));
143 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
144 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
145 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
146 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
147 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
148 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
149 static const char * get_dynamic_type PARAMS ((unsigned long));
150 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
151 static char * get_file_type PARAMS ((unsigned));
152 static char * get_machine_name PARAMS ((unsigned));
153 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
154 static char * get_machine_flags PARAMS ((unsigned, unsigned));
155 static const char * get_mips_segment_type PARAMS ((unsigned long));
156 static const char * get_parisc_segment_type PARAMS ((unsigned long));
157 static const char * get_segment_type PARAMS ((unsigned long));
158 static const char * get_mips_section_type_name PARAMS ((unsigned int));
159 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
160 static const char * get_section_type_name PARAMS ((unsigned int));
161 static const char * get_symbol_binding PARAMS ((unsigned int));
162 static const char * get_symbol_type PARAMS ((unsigned int));
163 static const char * get_symbol_visibility PARAMS ((unsigned int));
164 static const char * get_symbol_index_type PARAMS ((unsigned int));
165 static const char * get_dynamic_flags PARAMS ((bfd_vma));
166 static void usage PARAMS ((void));
167 static void parse_args PARAMS ((int, char **));
168 static int process_file_header PARAMS ((void));
169 static int process_program_headers PARAMS ((FILE *));
170 static int process_section_headers PARAMS ((FILE *));
171 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
172 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
173 static int process_dynamic_segment PARAMS ((FILE *));
174 static int process_symbol_table PARAMS ((FILE *));
175 static int process_section_contents PARAMS ((FILE *));
176 static void process_file PARAMS ((char *));
177 static int process_relocs PARAMS ((FILE *));
178 static int process_version_sections PARAMS ((FILE *));
179 static char * get_ver_flags PARAMS ((unsigned int));
180 static int get_32bit_section_headers PARAMS ((FILE *));
181 static int get_64bit_section_headers PARAMS ((FILE *));
182 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
183 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
184 static int get_file_header PARAMS ((FILE *));
185 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
186 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
187 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
188 static int get_32bit_dynamic_segment PARAMS ((FILE *));
189 static int get_64bit_dynamic_segment PARAMS ((FILE *));
190 #ifdef SUPPORT_DISASSEMBLY
191 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
193 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
194 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
195 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
196 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
197 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
198 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
199 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
200 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
201 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
202 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
203 static void reset_state_machine PARAMS ((int));
204 static char * get_TAG_name PARAMS ((unsigned long));
205 static char * get_AT_name PARAMS ((unsigned long));
206 static char * get_FORM_name PARAMS ((unsigned long));
207 static void free_abbrevs PARAMS ((void));
208 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
209 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
210 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
211 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
212 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
213 static void request_dump PARAMS ((unsigned int, char));
214 static const char * get_elf_class PARAMS ((unsigned char));
215 static const char * get_data_encoding PARAMS ((unsigned char));
216 static const char * get_osabi_name PARAMS ((unsigned char));
217 static int guess_is_rela PARAMS ((unsigned long));
218 static char * get_note_type PARAMS ((unsigned int));
219 static int process_note PARAMS ((Elf32_Internal_Note *));
220 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
221 static int process_corefile_note_segments PARAMS ((FILE *));
222 static int process_corefile_contents PARAMS ((FILE *));
224 typedef int Elf32_Word;
232 #define SECTION_NAME(X) (string_table + (X)->sh_name)
234 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
236 #define BYTE_GET(field) byte_get (field, sizeof (field))
238 /* If we can support a 64 bit data type then BFD64 should be defined
239 and sizeof (bfd_vma) == 8. In this case when translating from an
240 external 8 byte field to an internal field, we can assume that the
241 internal field is also 8 bytes wide and so we can extact all the data.
242 If, however, BFD64 is not defined, then we must assume that the
243 internal data structure only has 4 byte wide fields that are the
244 equivalent of the 8 byte wide external counterparts, and so we must
245 truncate the data. */
247 #define BYTE_GET8(field) byte_get (field, -8)
249 #define BYTE_GET8(field) byte_get (field, 8)
252 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
254 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
255 if (fseek (file, offset, SEEK_SET)) \
257 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
261 var = (type) malloc (size); \
265 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
269 if (fread (var, size, 1, file) != 1) \
271 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
278 #define GET_DATA(offset, var, reason) \
279 if (fseek (file, offset, SEEK_SET)) \
281 error (_("Unable to seek to %x for %s\n"), offset, reason); \
284 else if (fread (& var, sizeof (var), 1, file) != 1) \
286 error (_("Unable to read data at %x for %s\n"), offset, reason); \
290 #define GET_ELF_SYMBOLS(file, offset, size) \
291 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
292 : get_64bit_elf_symbols (file, offset, size))
295 #ifdef ANSI_PROTOTYPES
297 error (const char * message, ...)
301 fprintf (stderr, _("%s: Error: "), program_name);
302 va_start (args, message);
303 vfprintf (stderr, message, args);
309 warn (const char * message, ...)
313 fprintf (stderr, _("%s: Warning: "), program_name);
314 va_start (args, message);
315 vfprintf (stderr, message, args);
327 fprintf (stderr, _("%s: Error: "), program_name);
329 message = va_arg (args, char *);
330 vfprintf (stderr, message, args);
342 fprintf (stderr, _("%s: Warning: "), program_name);
344 message = va_arg (args, char *);
345 vfprintf (stderr, message, args);
352 byte_get_little_endian (field, size)
353 unsigned char * field;
362 return ((unsigned int) (field [0]))
363 | (((unsigned int) (field [1])) << 8);
366 /* We want to extract data from an 8 byte wide field and
367 place it into a 4 byte wide field. Since this is a little
368 endian source we can juts use the 4 byte extraction code. */
371 return ((unsigned long) (field [0]))
372 | (((unsigned long) (field [1])) << 8)
373 | (((unsigned long) (field [2])) << 16)
374 | (((unsigned long) (field [3])) << 24);
378 /* This is a special case, generated by the BYTE_GET8 macro.
379 It means that we are loading an 8 byte value from a field
380 in an external structure into an 8 byte value in a field
381 in an internal strcuture. */
382 return ((bfd_vma) (field [0]))
383 | (((bfd_vma) (field [1])) << 8)
384 | (((bfd_vma) (field [2])) << 16)
385 | (((bfd_vma) (field [3])) << 24)
386 | (((bfd_vma) (field [4])) << 32)
387 | (((bfd_vma) (field [5])) << 40)
388 | (((bfd_vma) (field [6])) << 48)
389 | (((bfd_vma) (field [7])) << 56);
392 error (_("Unhandled data length: %d\n"), size);
397 /* Print a VMA value. */
399 print_vma (vma, mode)
409 case FULL_HEX: printf ("0x"); /* drop through */
410 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
411 case PREFIX_HEX: printf ("0x"); /* drop through */
412 case HEX: printf ("%lx", (unsigned long) vma); break;
413 case DEC: printf ("%ld", (unsigned long) vma); break;
414 case DEC_5: printf ("%5ld", (long) vma); break;
415 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
436 #if BFD_HOST_64BIT_LONG
439 if (_bfd_int64_high (vma))
440 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
442 printf ("%lx", _bfd_int64_low (vma));
447 #if BFD_HOST_64BIT_LONG
450 if (_bfd_int64_high (vma))
452 printf ("++%ld", _bfd_int64_low (vma));
454 printf ("%ld", _bfd_int64_low (vma));
459 #if BFD_HOST_64BIT_LONG
460 printf ("%5ld", vma);
462 if (_bfd_int64_high (vma))
464 printf ("++%ld", _bfd_int64_low (vma));
466 printf ("%5ld", _bfd_int64_low (vma));
471 #if BFD_HOST_64BIT_LONG
474 if (_bfd_int64_high (vma))
476 printf ("++%lu", _bfd_int64_low (vma));
478 printf ("%lu", _bfd_int64_low (vma));
487 byte_get_big_endian (field, size)
488 unsigned char * field;
497 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
500 return ((unsigned long) (field [3]))
501 | (((unsigned long) (field [2])) << 8)
502 | (((unsigned long) (field [1])) << 16)
503 | (((unsigned long) (field [0])) << 24);
506 /* Although we are extracing data from an 8 byte wide field, we
507 are returning only 4 bytes of data. */
508 return ((unsigned long) (field [7]))
509 | (((unsigned long) (field [6])) << 8)
510 | (((unsigned long) (field [5])) << 16)
511 | (((unsigned long) (field [4])) << 24);
515 /* This is a special case, generated by the BYTE_GET8 macro.
516 It means that we are loading an 8 byte value from a field
517 in an external structure into an 8 byte value in a field
518 in an internal strcuture. */
519 return ((bfd_vma) (field [7]))
520 | (((bfd_vma) (field [6])) << 8)
521 | (((bfd_vma) (field [5])) << 16)
522 | (((bfd_vma) (field [4])) << 24)
523 | (((bfd_vma) (field [3])) << 32)
524 | (((bfd_vma) (field [2])) << 40)
525 | (((bfd_vma) (field [1])) << 48)
526 | (((bfd_vma) (field [0])) << 56);
530 error (_("Unhandled data length: %d\n"), size);
536 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
538 guess_is_rela (e_machine)
539 unsigned long e_machine;
543 /* Targets that use REL relocations. */
554 /* Targets that use RELA relocations. */
562 case EM_CYGNUS_MN10200:
563 case EM_CYGNUS_MN10300:
593 warn (_("Don't know about relocations on this machine architecture\n"));
598 /* Display the contents of the relocation data found at the specified offset. */
600 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
602 unsigned long rel_offset;
603 unsigned long rel_size;
604 Elf_Internal_Sym * symtab;
610 Elf_Internal_Rel * rels;
611 Elf_Internal_Rela * relas;
614 if (is_rela == UNKNOWN)
615 is_rela = guess_is_rela (elf_header.e_machine);
621 Elf32_External_Rela * erelas;
623 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
624 Elf32_External_Rela *, "relocs");
626 rel_size = rel_size / sizeof (Elf32_External_Rela);
628 relas = (Elf_Internal_Rela *)
629 malloc (rel_size * sizeof (Elf_Internal_Rela));
633 error(_("out of memory parsing relocs"));
637 for (i = 0; i < rel_size; i++)
639 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
640 relas[i].r_info = BYTE_GET (erelas[i].r_info);
641 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
646 rels = (Elf_Internal_Rel *) relas;
650 Elf64_External_Rela * erelas;
652 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
653 Elf64_External_Rela *, "relocs");
655 rel_size = rel_size / sizeof (Elf64_External_Rela);
657 relas = (Elf_Internal_Rela *)
658 malloc (rel_size * sizeof (Elf_Internal_Rela));
662 error(_("out of memory parsing relocs"));
666 for (i = 0; i < rel_size; i++)
668 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
669 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
670 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
675 rels = (Elf_Internal_Rel *) relas;
682 Elf32_External_Rel * erels;
684 GET_DATA_ALLOC (rel_offset, rel_size, erels,
685 Elf32_External_Rel *, "relocs");
687 rel_size = rel_size / sizeof (Elf32_External_Rel);
689 rels = (Elf_Internal_Rel *)
690 malloc (rel_size * sizeof (Elf_Internal_Rel));
694 error(_("out of memory parsing relocs"));
698 for (i = 0; i < rel_size; i++)
700 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
701 rels[i].r_info = BYTE_GET (erels[i].r_info);
706 relas = (Elf_Internal_Rela *) rels;
710 Elf64_External_Rel * erels;
712 GET_DATA_ALLOC (rel_offset, rel_size, erels,
713 Elf64_External_Rel *, "relocs");
715 rel_size = rel_size / sizeof (Elf64_External_Rel);
717 rels = (Elf_Internal_Rel *)
718 malloc (rel_size * sizeof (Elf_Internal_Rel));
722 error(_("out of memory parsing relocs"));
726 for (i = 0; i < rel_size; i++)
728 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
729 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
734 relas = (Elf_Internal_Rela *) rels;
740 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
743 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
745 for (i = 0; i < rel_size; i++)
750 bfd_vma symtab_index;
755 offset = relas [i].r_offset;
756 info = relas [i].r_info;
760 offset = rels [i].r_offset;
761 info = rels [i].r_info;
766 type = ELF32_R_TYPE (info);
767 symtab_index = ELF32_R_SYM (info);
771 if (elf_header.e_machine == EM_SPARCV9)
772 type = ELF64_R_TYPE_ID (info);
774 type = ELF64_R_TYPE (info);
775 /* The #ifdef BFD64 below is to prevent a compile time warning.
776 We know that if we do not have a 64 bit data type that we
777 will never execute this code anyway. */
779 symtab_index = ELF64_R_SYM (info);
783 #ifdef _bfd_int64_low
784 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
786 printf (" %8.8lx %5.5lx ", offset, info);
789 switch (elf_header.e_machine)
796 rtype = elf_m32r_reloc_type (type);
801 rtype = elf_i386_reloc_type (type);
805 rtype = elf_m68k_reloc_type (type);
809 rtype = elf_i960_reloc_type (type);
813 rtype = elf_avr_reloc_type (type);
820 rtype = elf_sparc_reloc_type (type);
824 rtype = v850_reloc_type (type);
828 rtype = elf_d10v_reloc_type (type);
832 rtype = elf_d30v_reloc_type (type);
836 rtype = elf_sh_reloc_type (type);
839 case EM_CYGNUS_MN10300:
840 rtype = elf_mn10300_reloc_type (type);
843 case EM_CYGNUS_MN10200:
844 rtype = elf_mn10200_reloc_type (type);
848 rtype = elf_fr30_reloc_type (type);
852 rtype = elf_mcore_reloc_type (type);
856 rtype = elf_ppc_reloc_type (type);
861 rtype = elf_mips_reloc_type (type);
865 rtype = elf_alpha_reloc_type (type);
869 rtype = elf_arm_reloc_type (type);
873 rtype = elf_arc_reloc_type (type);
877 rtype = elf_hppa_reloc_type (type);
881 rtype = elf_pj_reloc_type (type);
884 rtype = elf_ia64_reloc_type (type);
888 rtype = elf_cris_reloc_type (type);
892 rtype = elf_i860_reloc_type (type);
897 #ifdef _bfd_int64_low
898 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
900 printf (_("unrecognised: %-7lx"), type);
903 printf ("%-21.21s", rtype);
909 if (symtab_index >= nsyms)
910 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
913 Elf_Internal_Sym * psym;
915 psym = symtab + symtab_index;
918 print_vma (psym->st_value, LONG_HEX);
921 if (psym->st_name == 0)
923 SECTION_NAME (section_headers + psym->st_shndx));
924 else if (strtab == NULL)
925 printf (_("<string table index %3ld>"), psym->st_name);
927 printf ("%-25.25s", strtab + psym->st_name);
930 printf (" + %lx", (unsigned long) relas [i].r_addend);
936 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
937 print_vma (relas[i].r_addend, LONG_HEX);
940 if (elf_header.e_machine == EM_SPARCV9
941 && !strcmp (rtype, "R_SPARC_OLO10"))
942 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
953 get_mips_dynamic_type (type)
958 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
959 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
960 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
961 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
962 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
963 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
964 case DT_MIPS_MSYM: return "MIPS_MSYM";
965 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
966 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
967 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
968 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
969 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
970 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
971 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
972 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
973 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
974 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
975 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
976 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
977 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
978 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
979 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
980 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
981 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
982 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
983 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
984 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
985 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
986 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
987 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
988 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
989 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
990 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
991 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
992 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
993 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
994 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
995 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
996 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
997 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
998 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
999 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1000 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1007 get_sparc64_dynamic_type (type)
1012 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1019 get_parisc_dynamic_type (type)
1024 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1025 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1026 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1027 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1028 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1029 case DT_HP_PREINIT: return "HP_PREINIT";
1030 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1031 case DT_HP_NEEDED: return "HP_NEEDED";
1032 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1033 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1034 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1035 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1036 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1043 get_dynamic_type (type)
1046 static char buff [32];
1050 case DT_NULL: return "NULL";
1051 case DT_NEEDED: return "NEEDED";
1052 case DT_PLTRELSZ: return "PLTRELSZ";
1053 case DT_PLTGOT: return "PLTGOT";
1054 case DT_HASH: return "HASH";
1055 case DT_STRTAB: return "STRTAB";
1056 case DT_SYMTAB: return "SYMTAB";
1057 case DT_RELA: return "RELA";
1058 case DT_RELASZ: return "RELASZ";
1059 case DT_RELAENT: return "RELAENT";
1060 case DT_STRSZ: return "STRSZ";
1061 case DT_SYMENT: return "SYMENT";
1062 case DT_INIT: return "INIT";
1063 case DT_FINI: return "FINI";
1064 case DT_SONAME: return "SONAME";
1065 case DT_RPATH: return "RPATH";
1066 case DT_SYMBOLIC: return "SYMBOLIC";
1067 case DT_REL: return "REL";
1068 case DT_RELSZ: return "RELSZ";
1069 case DT_RELENT: return "RELENT";
1070 case DT_PLTREL: return "PLTREL";
1071 case DT_DEBUG: return "DEBUG";
1072 case DT_TEXTREL: return "TEXTREL";
1073 case DT_JMPREL: return "JMPREL";
1074 case DT_BIND_NOW: return "BIND_NOW";
1075 case DT_INIT_ARRAY: return "INIT_ARRAY";
1076 case DT_FINI_ARRAY: return "FINI_ARRAY";
1077 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1078 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1079 case DT_RUNPATH: return "RUNPATH";
1080 case DT_FLAGS: return "FLAGS";
1082 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1083 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1085 case DT_CHECKSUM: return "CHECKSUM";
1086 case DT_PLTPADSZ: return "PLTPADSZ";
1087 case DT_MOVEENT: return "MOVEENT";
1088 case DT_MOVESZ: return "MOVESZ";
1089 case DT_FEATURE: return "FEATURE";
1090 case DT_POSFLAG_1: return "POSFLAG_1";
1091 case DT_SYMINSZ: return "SYMINSZ";
1092 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1094 case DT_ADDRRNGLO: return "ADDRRNGLO";
1095 case DT_CONFIG: return "CONFIG";
1096 case DT_DEPAUDIT: return "DEPAUDIT";
1097 case DT_AUDIT: return "AUDIT";
1098 case DT_PLTPAD: return "PLTPAD";
1099 case DT_MOVETAB: return "MOVETAB";
1100 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1102 case DT_VERSYM: return "VERSYM";
1104 case DT_RELACOUNT: return "RELACOUNT";
1105 case DT_RELCOUNT: return "RELCOUNT";
1106 case DT_FLAGS_1: return "FLAGS_1";
1107 case DT_VERDEF: return "VERDEF";
1108 case DT_VERDEFNUM: return "VERDEFNUM";
1109 case DT_VERNEED: return "VERNEED";
1110 case DT_VERNEEDNUM: return "VERNEEDNUM";
1112 case DT_AUXILIARY: return "AUXILIARY";
1113 case DT_USED: return "USED";
1114 case DT_FILTER: return "FILTER";
1117 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1119 const char * result;
1121 switch (elf_header.e_machine)
1124 case EM_MIPS_RS4_BE:
1125 result = get_mips_dynamic_type (type);
1128 result = get_sparc64_dynamic_type (type);
1138 sprintf (buff, _("Processor Specific: %lx"), type);
1140 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1142 const char * result;
1144 switch (elf_header.e_machine)
1147 result = get_parisc_dynamic_type (type);
1157 sprintf (buff, _("Operating System specific: %lx"), type);
1160 sprintf (buff, _("<unknown>: %lx"), type);
1167 get_file_type (e_type)
1170 static char buff [32];
1174 case ET_NONE: return _("NONE (None)");
1175 case ET_REL: return _("REL (Relocatable file)");
1176 case ET_EXEC: return _("EXEC (Executable file)");
1177 case ET_DYN: return _("DYN (Shared object file)");
1178 case ET_CORE: return _("CORE (Core file)");
1181 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1182 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1183 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1184 sprintf (buff, _("OS Specific: (%x)"), e_type);
1186 sprintf (buff, _("<unknown>: %x"), e_type);
1192 get_machine_name (e_machine)
1195 static char buff [64]; /* XXX */
1199 case EM_NONE: return _("None");
1200 case EM_M32: return "WE32100";
1201 case EM_SPARC: return "Sparc";
1202 case EM_386: return "Intel 80386";
1203 case EM_68K: return "MC68000";
1204 case EM_88K: return "MC88000";
1205 case EM_486: return "Intel 80486";
1206 case EM_860: return "Intel 80860";
1207 case EM_MIPS: return "MIPS R3000";
1208 case EM_S370: return "IBM System/370";
1209 case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
1210 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1211 case EM_PARISC: return "HPPA";
1212 case EM_PPC_OLD: return "Power PC (old)";
1213 case EM_SPARC32PLUS: return "Sparc v8+" ;
1214 case EM_960: return "Intel 90860";
1215 case EM_PPC: return "PowerPC";
1216 case EM_V800: return "NEC V800";
1217 case EM_FR20: return "Fujitsu FR20";
1218 case EM_RH32: return "TRW RH32";
1219 case EM_MCORE: return "MCORE";
1220 case EM_ARM: return "ARM";
1221 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1222 case EM_SH: return "Hitachi SH";
1223 case EM_SPARCV9: return "Sparc v9";
1224 case EM_TRICORE: return "Siemens Tricore";
1225 case EM_ARC: return "Argonaut RISC Core";
1226 case EM_H8_300: return "Hitachi H8/300";
1227 case EM_H8_300H: return "Hitachi H8/300H";
1228 case EM_H8S: return "Hitachi H8S";
1229 case EM_H8_500: return "Hitachi H8/500";
1230 case EM_IA_64: return "Intel IA-64";
1231 case EM_MIPS_X: return "Stanford MIPS-X";
1232 case EM_COLDFIRE: return "Motorola Coldfire";
1233 case EM_68HC12: return "Motorola M68HC12";
1234 case EM_ALPHA: return "Alpha";
1235 case EM_CYGNUS_D10V: return "d10v";
1236 case EM_CYGNUS_D30V: return "d30v";
1237 case EM_CYGNUS_ARC: return "Arc";
1238 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1239 case EM_CYGNUS_V850: return "NEC v850";
1240 case EM_CYGNUS_MN10300: return "mn10300";
1241 case EM_CYGNUS_MN10200: return "mn10200";
1242 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1243 case EM_PJ: return "picoJava";
1244 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1245 case EM_PCP: return "Siemens PCP";
1246 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1247 case EM_NDR1: return "Denso NDR1 microprocesspr";
1248 case EM_STARCORE: return "Motorola Star*Core processor";
1249 case EM_ME16: return "Toyota ME16 processor";
1250 case EM_ST100: return "STMicroelectronics ST100 processor";
1251 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1252 case EM_FX66: return "Siemens FX66 microcontroller";
1253 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1254 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1255 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1256 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1257 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1258 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1259 case EM_SVX: return "Silicon Graphics SVx";
1260 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1261 case EM_VAX: return "Digital VAX";
1262 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1263 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1265 sprintf (buff, _("<unknown>: %x"), e_machine);
1271 decode_ARM_machine_flags (e_flags, buf)
1278 eabi = EF_ARM_EABI_VERSION (e_flags);
1279 e_flags &= ~ EF_ARM_EABIMASK;
1281 /* Handle "generic" ARM flags. */
1282 if (e_flags & EF_ARM_RELEXEC)
1284 strcat (buf, ", relocatable executable");
1285 e_flags &= ~ EF_ARM_RELEXEC;
1288 if (e_flags & EF_ARM_HASENTRY)
1290 strcat (buf, ", has entry point");
1291 e_flags &= ~ EF_ARM_HASENTRY;
1294 /* Now handle EABI specific flags. */
1298 strcat (buf, ", <unknown EABI>");
1303 case EF_ARM_EABI_VER1:
1308 /* Process flags one bit at a time. */
1309 flag = e_flags & - e_flags;
1314 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_INTERWORK. */
1315 strcat (buf, ", sorted symbol tables");
1325 case EF_ARM_EABI_UNKNOWN:
1330 /* Process flags one bit at a time. */
1331 flag = e_flags & - e_flags;
1337 strcat (buf, ", interworking enabled");
1341 strcat (buf, ", uses APCS/26");
1345 strcat (buf, ", uses APCS/float");
1349 strcat (buf, ", position independent");
1353 strcat (buf, ", 8 bit structure alignment");
1357 strcat (buf, ", uses new ABI");
1361 strcat (buf, ", uses old ABI");
1365 strcat (buf, ", software FP");
1376 strcat (buf,", <unknown>");
1380 get_machine_flags (e_flags, e_machine)
1384 static char buf [1024];
1396 decode_ARM_machine_flags (e_flags, buf);
1400 if (e_flags & EF_CPU32)
1401 strcat (buf, ", cpu32");
1405 if (e_flags & EF_PPC_EMB)
1406 strcat (buf, ", emb");
1408 if (e_flags & EF_PPC_RELOCATABLE)
1409 strcat (buf, ", relocatable");
1411 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1412 strcat (buf, ", relocatable-lib");
1415 case EM_CYGNUS_V850:
1416 switch (e_flags & EF_V850_ARCH)
1419 strcat (buf, ", v850e");
1422 strcat (buf, ", v850ea");
1425 strcat (buf, ", v850");
1428 strcat (buf, ", unknown v850 architecture variant");
1433 case EM_CYGNUS_M32R:
1434 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1435 strcat (buf, ", m32r");
1440 case EM_MIPS_RS4_BE:
1441 if (e_flags & EF_MIPS_NOREORDER)
1442 strcat (buf, ", noreorder");
1444 if (e_flags & EF_MIPS_PIC)
1445 strcat (buf, ", pic");
1447 if (e_flags & EF_MIPS_CPIC)
1448 strcat (buf, ", cpic");
1450 if (e_flags & EF_MIPS_ABI2)
1451 strcat (buf, ", abi2");
1453 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1454 strcat (buf, ", mips1");
1456 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1457 strcat (buf, ", mips2");
1459 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1460 strcat (buf, ", mips3");
1462 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1463 strcat (buf, ", mips4");
1465 switch ((e_flags & EF_MIPS_MACH))
1467 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1468 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1469 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1470 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1471 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1472 case E_MIPS_MACH_MIPS32: strcat (buf, ", mips32"); break;
1477 if (e_flags & EF_SPARC_32PLUS)
1478 strcat (buf, ", v8+");
1480 if (e_flags & EF_SPARC_SUN_US1)
1481 strcat (buf, ", ultrasparcI");
1483 if (e_flags & EF_SPARC_SUN_US3)
1484 strcat (buf, ", ultrasparcIII");
1486 if (e_flags & EF_SPARC_HAL_R1)
1487 strcat (buf, ", halr1");
1489 if (e_flags & EF_SPARC_LEDATA)
1490 strcat (buf, ", ledata");
1492 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1493 strcat (buf, ", tso");
1495 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1496 strcat (buf, ", pso");
1498 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1499 strcat (buf, ", rmo");
1503 switch (e_flags & EF_PARISC_ARCH)
1505 case EFA_PARISC_1_0:
1506 strcpy (buf, ", PA-RISC 1.0");
1508 case EFA_PARISC_1_1:
1509 strcpy (buf, ", PA-RISC 1.1");
1511 case EFA_PARISC_2_0:
1512 strcpy (buf, ", PA-RISC 2.0");
1517 if (e_flags & EF_PARISC_TRAPNIL)
1518 strcat (buf, ", trapnil");
1519 if (e_flags & EF_PARISC_EXT)
1520 strcat (buf, ", ext");
1521 if (e_flags & EF_PARISC_LSB)
1522 strcat (buf, ", lsb");
1523 if (e_flags & EF_PARISC_WIDE)
1524 strcat (buf, ", wide");
1525 if (e_flags & EF_PARISC_NO_KABP)
1526 strcat (buf, ", no kabp");
1527 if (e_flags & EF_PARISC_LAZYSWAP)
1528 strcat (buf, ", lazyswap");
1532 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1533 strcat (buf, ", new calling convention");
1535 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1536 strcat (buf, ", gnu calling convention");
1545 get_mips_segment_type (type)
1550 case PT_MIPS_REGINFO:
1552 case PT_MIPS_RTPROC:
1554 case PT_MIPS_OPTIONS:
1564 get_parisc_segment_type (type)
1569 case PT_HP_TLS: return "HP_TLS";
1570 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1571 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1572 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1573 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1574 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1575 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1576 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1577 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1578 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1579 case PT_HP_PARALLEL: return "HP_PARALLEL";
1580 case PT_HP_FASTBIND: return "HP_FASTBIND";
1581 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1582 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1591 get_segment_type (p_type)
1592 unsigned long p_type;
1594 static char buff [32];
1598 case PT_NULL: return "NULL";
1599 case PT_LOAD: return "LOAD";
1600 case PT_DYNAMIC: return "DYNAMIC";
1601 case PT_INTERP: return "INTERP";
1602 case PT_NOTE: return "NOTE";
1603 case PT_SHLIB: return "SHLIB";
1604 case PT_PHDR: return "PHDR";
1607 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1609 const char * result;
1611 switch (elf_header.e_machine)
1614 case EM_MIPS_RS4_BE:
1615 result = get_mips_segment_type (p_type);
1618 result = get_parisc_segment_type (p_type);
1628 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1630 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1632 const char * result;
1634 switch (elf_header.e_machine)
1637 result = get_parisc_segment_type (p_type);
1647 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1650 sprintf (buff, _("<unknown>: %lx"), p_type);
1657 get_mips_section_type_name (sh_type)
1658 unsigned int sh_type;
1662 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1663 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1664 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1665 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1666 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1667 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1668 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1669 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1670 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1671 case SHT_MIPS_RELD: return "MIPS_RELD";
1672 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1673 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1674 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1675 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1676 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1677 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1678 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1679 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1680 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1681 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1682 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1683 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1684 case SHT_MIPS_LINE: return "MIPS_LINE";
1685 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1686 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1687 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1688 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1689 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1690 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1691 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1692 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1693 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1694 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1695 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1696 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1697 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1698 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1699 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1700 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1708 get_parisc_section_type_name (sh_type)
1709 unsigned int sh_type;
1713 case SHT_PARISC_EXT: return "PARISC_EXT";
1714 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1715 case SHT_PARISC_DOC: return "PARISC_DOC";
1723 get_section_type_name (sh_type)
1724 unsigned int sh_type;
1726 static char buff [32];
1730 case SHT_NULL: return "NULL";
1731 case SHT_PROGBITS: return "PROGBITS";
1732 case SHT_SYMTAB: return "SYMTAB";
1733 case SHT_STRTAB: return "STRTAB";
1734 case SHT_RELA: return "RELA";
1735 case SHT_HASH: return "HASH";
1736 case SHT_DYNAMIC: return "DYNAMIC";
1737 case SHT_NOTE: return "NOTE";
1738 case SHT_NOBITS: return "NOBITS";
1739 case SHT_REL: return "REL";
1740 case SHT_SHLIB: return "SHLIB";
1741 case SHT_DYNSYM: return "DYNSYM";
1742 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1743 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1744 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1745 case SHT_GNU_verdef: return "VERDEF";
1746 case SHT_GNU_verneed: return "VERNEED";
1747 case SHT_GNU_versym: return "VERSYM";
1748 case 0x6ffffff0: return "VERSYM";
1749 case 0x6ffffffc: return "VERDEF";
1750 case 0x7ffffffd: return "AUXILIARY";
1751 case 0x7fffffff: return "FILTER";
1754 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1756 const char * result;
1758 switch (elf_header.e_machine)
1761 case EM_MIPS_RS4_BE:
1762 result = get_mips_section_type_name (sh_type);
1765 result = get_parisc_section_type_name (sh_type);
1775 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1777 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1778 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1779 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1780 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1782 sprintf (buff, _("<unknown>: %x"), sh_type);
1788 struct option options [] =
1790 {"all", no_argument, 0, 'a'},
1791 {"file-header", no_argument, 0, 'h'},
1792 {"program-headers", no_argument, 0, 'l'},
1793 {"headers", no_argument, 0, 'e'},
1794 {"histogram", no_argument, 0, 'I'},
1795 {"segments", no_argument, 0, 'l'},
1796 {"sections", no_argument, 0, 'S'},
1797 {"section-headers", no_argument, 0, 'S'},
1798 {"symbols", no_argument, 0, 's'},
1799 {"syms", no_argument, 0, 's'},
1800 {"relocs", no_argument, 0, 'r'},
1801 {"notes", no_argument, 0, 'n'},
1802 {"dynamic", no_argument, 0, 'd'},
1803 {"arch-specific", no_argument, 0, 'A'},
1804 {"version-info", no_argument, 0, 'V'},
1805 {"use-dynamic", no_argument, 0, 'D'},
1806 {"hex-dump", required_argument, 0, 'x'},
1807 {"debug-dump", optional_argument, 0, 'w'},
1808 #ifdef SUPPORT_DISASSEMBLY
1809 {"instruction-dump", required_argument, 0, 'i'},
1812 {"version", no_argument, 0, 'v'},
1813 {"help", no_argument, 0, 'H'},
1814 {0, no_argument, 0, 0}
1820 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1821 fprintf (stdout, _(" Options are:\n"));
1822 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1823 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
1824 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
1825 fprintf (stdout, _(" Display the program headers\n"));
1826 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
1827 fprintf (stdout, _(" Display the sections' header\n"));
1828 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
1829 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
1830 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
1831 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
1832 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1833 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
1834 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1835 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1836 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
1837 fprintf (stdout, _(" Dump the contents of section <number>\n"));
1838 fprintf (stdout, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1839 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
1840 #ifdef SUPPORT_DISASSEMBLY
1841 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
1842 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
1844 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1845 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
1846 fprintf (stdout, _(" -H or --help Display this information\n"));
1847 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
1853 request_dump (section, type)
1854 unsigned int section;
1857 if (section >= num_dump_sects)
1859 char * new_dump_sects;
1861 new_dump_sects = (char *) calloc (section + 1, 1);
1863 if (new_dump_sects == NULL)
1864 error (_("Out of memory allocating dump request table."));
1867 /* Copy current flag settings. */
1868 memcpy (new_dump_sects, dump_sects, num_dump_sects);
1872 dump_sects = new_dump_sects;
1873 num_dump_sects = section + 1;
1878 dump_sects [section] |= type;
1884 parse_args (argc, argv)
1893 while ((c = getopt_long
1894 (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF)
1929 do_using_dynamic ++;
1957 section = strtoul (optarg, & cp, 0);
1958 if (! * cp && section >= 0)
1960 request_dump (section, HEX_DUMP);
1980 do_debug_abbrevs = 1;
1990 do_debug_pubnames = 1;
1995 do_debug_aranges = 1;
1999 warn (_("Unrecognised debug option '%s'\n"), optarg);
2004 #ifdef SUPPORT_DISASSEMBLY
2007 section = strtoul (optarg, & cp, 0);
2008 if (! * cp && section >= 0)
2010 request_dump (section, DISASS_DUMP);
2016 print_version (program_name);
2023 /* xgettext:c-format */
2024 error (_("Invalid option '-%c'\n"), c);
2031 if (!do_dynamic && !do_syms && !do_reloc && !do_sections
2032 && !do_segments && !do_header && !do_dump && !do_version
2033 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2037 warn (_("Nothing to do.\n"));
2043 get_elf_class (elf_class)
2044 unsigned char elf_class;
2046 static char buff [32];
2050 case ELFCLASSNONE: return _("none");
2051 case ELFCLASS32: return _("ELF32");
2052 case ELFCLASS64: return _("ELF64");
2054 sprintf (buff, _("<unknown: %x>"), elf_class);
2060 get_data_encoding (encoding)
2061 unsigned char encoding;
2063 static char buff [32];
2067 case ELFDATANONE: return _("none");
2068 case ELFDATA2LSB: return _("2's complement, little endian");
2069 case ELFDATA2MSB: return _("2's complement, big endian");
2071 sprintf (buff, _("<unknown: %x>"), encoding);
2077 get_osabi_name (osabi)
2078 unsigned char osabi;
2080 static char buff [32];
2084 case ELFOSABI_NONE: return _("UNIX - System V");
2085 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2086 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2087 case ELFOSABI_LINUX: return _("UNIX - Linux");
2088 case ELFOSABI_HURD: return _("GNU/Hurd");
2089 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2090 case ELFOSABI_MONTEREY: return _("UNIX - Monterey");
2091 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2092 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2093 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2094 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2095 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2096 case ELFOSABI_STANDALONE: return _("Standalone App");
2097 case ELFOSABI_ARM: return _("ARM");
2099 sprintf (buff, _("<unknown: %x>"), osabi);
2104 /* Decode the data held in 'elf_header'. */
2106 process_file_header ()
2108 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2109 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2110 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2111 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2114 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2122 printf (_("ELF Header:\n"));
2123 printf (_(" Magic: "));
2124 for (i = 0; i < EI_NIDENT; i ++)
2125 printf ("%2.2x ", elf_header.e_ident [i]);
2127 printf (_(" Class: %s\n"),
2128 get_elf_class (elf_header.e_ident [EI_CLASS]));
2129 printf (_(" Data: %s\n"),
2130 get_data_encoding (elf_header.e_ident [EI_DATA]));
2131 printf (_(" Version: %d %s\n"),
2132 elf_header.e_ident [EI_VERSION],
2133 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2135 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2138 printf (_(" OS/ABI: %s\n"),
2139 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2140 printf (_(" ABI Version: %d\n"),
2141 elf_header.e_ident [EI_ABIVERSION]);
2142 printf (_(" Type: %s\n"),
2143 get_file_type (elf_header.e_type));
2144 printf (_(" Machine: %s\n"),
2145 get_machine_name (elf_header.e_machine));
2146 printf (_(" Version: 0x%lx\n"),
2147 (unsigned long) elf_header.e_version);
2149 printf (_(" Entry point address: "));
2150 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2151 printf (_("\n Start of program headers: "));
2152 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2153 printf (_(" (bytes into file)\n Start of section headers: "));
2154 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2155 printf (_(" (bytes into file)\n"));
2157 printf (_(" Flags: 0x%lx%s\n"),
2158 (unsigned long) elf_header.e_flags,
2159 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2160 printf (_(" Size of this header: %ld (bytes)\n"),
2161 (long) elf_header.e_ehsize);
2162 printf (_(" Size of program headers: %ld (bytes)\n"),
2163 (long) elf_header.e_phentsize);
2164 printf (_(" Number of program headers: %ld\n"),
2165 (long) elf_header.e_phnum);
2166 printf (_(" Size of section headers: %ld (bytes)\n"),
2167 (long) elf_header.e_shentsize);
2168 printf (_(" Number of section headers: %ld\n"),
2169 (long) elf_header.e_shnum);
2170 printf (_(" Section header string table index: %ld\n"),
2171 (long) elf_header.e_shstrndx);
2179 get_32bit_program_headers (file, program_headers)
2181 Elf_Internal_Phdr * program_headers;
2183 Elf32_External_Phdr * phdrs;
2184 Elf32_External_Phdr * external;
2185 Elf32_Internal_Phdr * internal;
2188 GET_DATA_ALLOC (elf_header.e_phoff,
2189 elf_header.e_phentsize * elf_header.e_phnum,
2190 phdrs, Elf32_External_Phdr *, "program headers");
2192 for (i = 0, internal = program_headers, external = phdrs;
2193 i < elf_header.e_phnum;
2194 i ++, internal ++, external ++)
2196 internal->p_type = BYTE_GET (external->p_type);
2197 internal->p_offset = BYTE_GET (external->p_offset);
2198 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2199 internal->p_paddr = BYTE_GET (external->p_paddr);
2200 internal->p_filesz = BYTE_GET (external->p_filesz);
2201 internal->p_memsz = BYTE_GET (external->p_memsz);
2202 internal->p_flags = BYTE_GET (external->p_flags);
2203 internal->p_align = BYTE_GET (external->p_align);
2212 get_64bit_program_headers (file, program_headers)
2214 Elf_Internal_Phdr * program_headers;
2216 Elf64_External_Phdr * phdrs;
2217 Elf64_External_Phdr * external;
2218 Elf64_Internal_Phdr * internal;
2221 GET_DATA_ALLOC (elf_header.e_phoff,
2222 elf_header.e_phentsize * elf_header.e_phnum,
2223 phdrs, Elf64_External_Phdr *, "program headers");
2225 for (i = 0, internal = program_headers, external = phdrs;
2226 i < elf_header.e_phnum;
2227 i ++, internal ++, external ++)
2229 internal->p_type = BYTE_GET (external->p_type);
2230 internal->p_flags = BYTE_GET (external->p_flags);
2231 internal->p_offset = BYTE_GET8 (external->p_offset);
2232 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2233 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2234 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2235 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2236 internal->p_align = BYTE_GET8 (external->p_align);
2245 process_program_headers (file)
2248 Elf_Internal_Phdr * program_headers;
2249 Elf_Internal_Phdr * segment;
2252 if (elf_header.e_phnum == 0)
2255 printf (_("\nThere are no program headers in this file.\n"));
2259 if (do_segments && !do_header)
2261 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2262 printf (_("Entry point "));
2263 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2264 printf (_("\nThere are %d program headers, starting at offset "),
2265 elf_header.e_phnum);
2266 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2270 program_headers = (Elf_Internal_Phdr *) malloc
2271 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2273 if (program_headers == NULL)
2275 error (_("Out of memory\n"));
2280 i = get_32bit_program_headers (file, program_headers);
2282 i = get_64bit_program_headers (file, program_headers);
2286 free (program_headers);
2293 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2297 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2301 (_(" Type Offset VirtAddr PhysAddr\n"));
2303 (_(" FileSiz MemSiz Flags Align\n"));
2311 for (i = 0, segment = program_headers;
2312 i < elf_header.e_phnum;
2317 printf (" %-14.14s ", get_segment_type (segment->p_type));
2321 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2322 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2323 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2324 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2325 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2327 (segment->p_flags & PF_R ? 'R' : ' '),
2328 (segment->p_flags & PF_W ? 'W' : ' '),
2329 (segment->p_flags & PF_X ? 'E' : ' '));
2330 printf ("%#lx", (unsigned long) segment->p_align);
2334 print_vma (segment->p_offset, FULL_HEX);
2336 print_vma (segment->p_vaddr, FULL_HEX);
2338 print_vma (segment->p_paddr, FULL_HEX);
2340 print_vma (segment->p_filesz, FULL_HEX);
2342 print_vma (segment->p_memsz, FULL_HEX);
2344 (segment->p_flags & PF_R ? 'R' : ' '),
2345 (segment->p_flags & PF_W ? 'W' : ' '),
2346 (segment->p_flags & PF_X ? 'E' : ' '));
2347 print_vma (segment->p_align, HEX);
2351 switch (segment->p_type)
2355 loadaddr = (segment->p_vaddr & 0xfffff000)
2356 - (segment->p_offset & 0xfffff000);
2361 error (_("more than one dynamic segment\n"));
2363 dynamic_addr = segment->p_offset;
2364 dynamic_size = segment->p_filesz;
2368 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2369 error (_("Unable to find program interpreter name\n"));
2372 program_interpreter[0] = 0;
2373 fscanf (file, "%63s", program_interpreter);
2376 printf (_("\n [Requesting program interpreter: %s]"),
2377 program_interpreter);
2383 putc ('\n', stdout);
2392 if (do_segments && section_headers != NULL)
2394 printf (_("\n Section to Segment mapping:\n"));
2395 printf (_(" Segment Sections...\n"));
2397 assert (string_table != NULL);
2399 for (i = 0; i < elf_header.e_phnum; i++)
2402 Elf_Internal_Shdr * section;
2404 segment = program_headers + i;
2405 section = section_headers;
2407 printf (" %2.2d ", i);
2409 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2411 if (section->sh_size > 0
2412 /* Compare allocated sections by VMA, unallocated
2413 sections by file offset. */
2414 && (section->sh_flags & SHF_ALLOC
2415 ? (section->sh_addr >= segment->p_vaddr
2416 && section->sh_addr + section->sh_size
2417 <= segment->p_vaddr + segment->p_memsz)
2418 : ((bfd_vma) section->sh_offset >= segment->p_offset
2419 && (section->sh_offset + section->sh_size
2420 <= segment->p_offset + segment->p_filesz))))
2421 printf ("%s ", SECTION_NAME (section));
2428 free (program_headers);
2435 get_32bit_section_headers (file)
2438 Elf32_External_Shdr * shdrs;
2439 Elf32_Internal_Shdr * internal;
2442 GET_DATA_ALLOC (elf_header.e_shoff,
2443 elf_header.e_shentsize * elf_header.e_shnum,
2444 shdrs, Elf32_External_Shdr *, "section headers");
2446 section_headers = (Elf_Internal_Shdr *) malloc
2447 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2449 if (section_headers == NULL)
2451 error (_("Out of memory\n"));
2455 for (i = 0, internal = section_headers;
2456 i < elf_header.e_shnum;
2459 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2460 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2461 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2462 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2463 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2464 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2465 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2466 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2467 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2468 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2477 get_64bit_section_headers (file)
2480 Elf64_External_Shdr * shdrs;
2481 Elf64_Internal_Shdr * internal;
2484 GET_DATA_ALLOC (elf_header.e_shoff,
2485 elf_header.e_shentsize * elf_header.e_shnum,
2486 shdrs, Elf64_External_Shdr *, "section headers");
2488 section_headers = (Elf_Internal_Shdr *) malloc
2489 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2491 if (section_headers == NULL)
2493 error (_("Out of memory\n"));
2497 for (i = 0, internal = section_headers;
2498 i < elf_header.e_shnum;
2501 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2502 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2503 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2504 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2505 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2506 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2507 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2508 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2509 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2510 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2518 static Elf_Internal_Sym *
2519 get_32bit_elf_symbols (file, offset, number)
2521 unsigned long offset;
2522 unsigned long number;
2524 Elf32_External_Sym * esyms;
2525 Elf_Internal_Sym * isyms;
2526 Elf_Internal_Sym * psym;
2529 GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2530 esyms, Elf32_External_Sym *, "symbols");
2532 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2536 error (_("Out of memory\n"));
2542 for (j = 0, psym = isyms;
2546 psym->st_name = BYTE_GET (esyms[j].st_name);
2547 psym->st_value = BYTE_GET (esyms[j].st_value);
2548 psym->st_size = BYTE_GET (esyms[j].st_size);
2549 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2550 psym->st_info = BYTE_GET (esyms[j].st_info);
2551 psym->st_other = BYTE_GET (esyms[j].st_other);
2559 static Elf_Internal_Sym *
2560 get_64bit_elf_symbols (file, offset, number)
2562 unsigned long offset;
2563 unsigned long number;
2565 Elf64_External_Sym * esyms;
2566 Elf_Internal_Sym * isyms;
2567 Elf_Internal_Sym * psym;
2570 GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2571 esyms, Elf64_External_Sym *, "symbols");
2573 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2577 error (_("Out of memory\n"));
2583 for (j = 0, psym = isyms;
2587 psym->st_name = BYTE_GET (esyms[j].st_name);
2588 psym->st_info = BYTE_GET (esyms[j].st_info);
2589 psym->st_other = BYTE_GET (esyms[j].st_other);
2590 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2591 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2592 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2601 get_elf_section_flags (sh_flags)
2604 static char buff [32];
2612 flag = sh_flags & - sh_flags;
2617 case SHF_WRITE: strcat (buff, "W"); break;
2618 case SHF_ALLOC: strcat (buff, "A"); break;
2619 case SHF_EXECINSTR: strcat (buff, "X"); break;
2620 case SHF_MERGE: strcat (buff, "M"); break;
2621 case SHF_STRINGS: strcat (buff, "S"); break;
2622 case SHF_INFO_LINK: strcat (buff, "I"); break;
2623 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2624 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2627 if (flag & SHF_MASKOS)
2630 sh_flags &= ~ SHF_MASKOS;
2632 else if (flag & SHF_MASKPROC)
2635 sh_flags &= ~ SHF_MASKPROC;
2647 process_section_headers (file)
2650 Elf_Internal_Shdr * section;
2653 section_headers = NULL;
2655 if (elf_header.e_shnum == 0)
2658 printf (_("\nThere are no sections in this file.\n"));
2663 if (do_sections && !do_header)
2664 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2665 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2669 if (! get_32bit_section_headers (file))
2672 else if (! get_64bit_section_headers (file))
2675 /* Read in the string table, so that we have names to display. */
2676 section = section_headers + elf_header.e_shstrndx;
2678 if (section->sh_size != 0)
2680 unsigned long string_table_offset;
2682 string_table_offset = section->sh_offset;
2684 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2685 string_table, char *, "string table");
2688 /* Scan the sections for the dynamic symbol table
2689 and dynamic string table and debug sections. */
2690 dynamic_symbols = NULL;
2691 dynamic_strings = NULL;
2692 dynamic_syminfo = NULL;
2694 for (i = 0, section = section_headers;
2695 i < elf_header.e_shnum;
2698 char * name = SECTION_NAME (section);
2700 if (section->sh_type == SHT_DYNSYM)
2702 if (dynamic_symbols != NULL)
2704 error (_("File contains multiple dynamic symbol tables\n"));
2708 num_dynamic_syms = section->sh_size / section->sh_entsize;
2710 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2712 else if (section->sh_type == SHT_STRTAB
2713 && strcmp (name, ".dynstr") == 0)
2715 if (dynamic_strings != NULL)
2717 error (_("File contains multiple dynamic string tables\n"));
2721 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2722 dynamic_strings, char *, "dynamic strings");
2724 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2725 || do_debug_lines || do_debug_pubnames || do_debug_aranges)
2726 && strncmp (name, ".debug_", 7) == 0)
2731 || (do_debug_info && (strcmp (name, "info") == 0))
2732 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2733 || (do_debug_lines && (strcmp (name, "line") == 0))
2734 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2735 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2737 request_dump (i, DEBUG_DUMP);
2744 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2748 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2751 printf (_(" [Nr] Name Type Address Offset\n"));
2752 printf (_(" Size EntSize Flags Link Info Align\n"));
2755 for (i = 0, section = section_headers;
2756 i < elf_header.e_shnum;
2759 printf (" [%2d] %-17.17s %-15.15s ",
2761 SECTION_NAME (section),
2762 get_section_type_name (section->sh_type));
2766 print_vma (section->sh_addr, LONG_HEX);
2768 printf ( " %6.6lx %6.6lx %2.2lx",
2769 (unsigned long) section->sh_offset,
2770 (unsigned long) section->sh_size,
2771 (unsigned long) section->sh_entsize);
2773 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2775 printf (" %2ld %3lx %ld\n",
2776 (unsigned long) section->sh_link,
2777 (unsigned long) section->sh_info,
2778 (unsigned long) section->sh_addralign);
2783 print_vma (section->sh_addr, LONG_HEX);
2784 printf (" %8.8lx", section->sh_offset);
2786 print_vma (section->sh_size, LONG_HEX);
2788 print_vma (section->sh_entsize, LONG_HEX);
2790 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2792 printf (" %2ld %3lx %ld\n",
2793 (unsigned long) section->sh_link,
2794 (unsigned long) section->sh_info,
2795 (unsigned long) section->sh_addralign);
2799 printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2800 printf (_(" I (info), L (link order), O (extra OS processing required)\n"));
2801 printf (_(" o (os specific), p (processor specific) x (unknown)\n"));
2806 /* Process the reloc section. */
2808 process_relocs (file)
2811 unsigned long rel_size;
2812 unsigned long rel_offset;
2818 if (do_using_dynamic)
2820 int is_rela = FALSE;
2825 if (dynamic_info[DT_REL])
2827 rel_offset = dynamic_info[DT_REL];
2828 rel_size = dynamic_info[DT_RELSZ];
2831 else if (dynamic_info [DT_RELA])
2833 rel_offset = dynamic_info[DT_RELA];
2834 rel_size = dynamic_info[DT_RELASZ];
2837 else if (dynamic_info[DT_JMPREL])
2839 rel_offset = dynamic_info[DT_JMPREL];
2840 rel_size = dynamic_info[DT_PLTRELSZ];
2842 switch (dynamic_info[DT_PLTREL])
2859 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2860 rel_offset, rel_size);
2862 dump_relocations (file, rel_offset - loadaddr, rel_size,
2863 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
2866 printf (_("\nThere are no dynamic relocations in this file.\n"));
2870 Elf32_Internal_Shdr * section;
2874 for (i = 0, section = section_headers;
2875 i < elf_header.e_shnum;
2878 if ( section->sh_type != SHT_RELA
2879 && section->sh_type != SHT_REL)
2882 rel_offset = section->sh_offset;
2883 rel_size = section->sh_size;
2887 Elf32_Internal_Shdr * strsec;
2888 Elf32_Internal_Shdr * symsec;
2889 Elf_Internal_Sym * symtab;
2892 unsigned long nsyms;
2894 printf (_("\nRelocation section "));
2896 if (string_table == NULL)
2897 printf ("%d", section->sh_name);
2899 printf ("'%s'", SECTION_NAME (section));
2901 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2902 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
2904 symsec = section_headers + section->sh_link;
2906 nsyms = symsec->sh_size / symsec->sh_entsize;
2907 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
2912 strsec = section_headers + symsec->sh_link;
2914 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
2915 char *, "string table");
2917 is_rela = section->sh_type == SHT_RELA;
2919 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
2929 printf (_("\nThere are no relocations in this file.\n"));
2937 dynamic_segment_mips_val (entry)
2938 Elf_Internal_Dyn * entry;
2940 switch (entry->d_tag)
2943 if (entry->d_un.d_val == 0)
2947 static const char * opts[] =
2949 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2950 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2951 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2952 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2957 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
2958 if (entry->d_un.d_val & (1 << cnt))
2960 printf ("%s%s", first ? "" : " ", opts[cnt]);
2967 case DT_MIPS_IVERSION:
2968 if (dynamic_strings != NULL)
2969 printf ("Interface Version: %s\n",
2970 dynamic_strings + entry->d_un.d_val);
2972 printf ("%ld\n", (long) entry->d_un.d_ptr);
2975 case DT_MIPS_TIME_STAMP:
2980 time_t time = entry->d_un.d_val;
2981 tmp = gmtime (&time);
2982 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
2983 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
2984 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
2985 printf ("Time Stamp: %s\n", timebuf);
2989 case DT_MIPS_RLD_VERSION:
2990 case DT_MIPS_LOCAL_GOTNO:
2991 case DT_MIPS_CONFLICTNO:
2992 case DT_MIPS_LIBLISTNO:
2993 case DT_MIPS_SYMTABNO:
2994 case DT_MIPS_UNREFEXTNO:
2995 case DT_MIPS_HIPAGENO:
2996 case DT_MIPS_DELTA_CLASS_NO:
2997 case DT_MIPS_DELTA_INSTANCE_NO:
2998 case DT_MIPS_DELTA_RELOC_NO:
2999 case DT_MIPS_DELTA_SYM_NO:
3000 case DT_MIPS_DELTA_CLASSSYM_NO:
3001 case DT_MIPS_COMPACT_SIZE:
3002 printf ("%ld\n", (long) entry->d_un.d_ptr);
3006 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3012 dynamic_segment_parisc_val (entry)
3013 Elf_Internal_Dyn * entry;
3015 switch (entry->d_tag)
3017 case DT_HP_DLD_FLAGS:
3026 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3027 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3028 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3029 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3030 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3031 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3032 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3033 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3034 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3035 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3036 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3040 bfd_vma val = entry->d_un.d_val;
3042 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3043 if (val & flags[cnt].bit)
3047 fputs (flags[cnt].str, stdout);
3049 val ^= flags[cnt].bit;
3052 if (val != 0 || first)
3056 print_vma (val, HEX);
3062 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3068 get_32bit_dynamic_segment (file)
3071 Elf32_External_Dyn * edyn;
3072 Elf_Internal_Dyn * entry;
3075 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3076 edyn, Elf32_External_Dyn *, "dynamic segment");
3078 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3079 how large this .dynamic is now. We can do this even before the byte
3080 swapping since the DT_NULL tag is recognizable. */
3082 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3085 dynamic_segment = (Elf_Internal_Dyn *)
3086 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3088 if (dynamic_segment == NULL)
3090 error (_("Out of memory\n"));
3095 for (i = 0, entry = dynamic_segment;
3099 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3100 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3109 get_64bit_dynamic_segment (file)
3112 Elf64_External_Dyn * edyn;
3113 Elf_Internal_Dyn * entry;
3116 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3117 edyn, Elf64_External_Dyn *, "dynamic segment");
3119 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3120 how large this .dynamic is now. We can do this even before the byte
3121 swapping since the DT_NULL tag is recognizable. */
3123 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3126 dynamic_segment = (Elf_Internal_Dyn *)
3127 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3129 if (dynamic_segment == NULL)
3131 error (_("Out of memory\n"));
3136 for (i = 0, entry = dynamic_segment;
3140 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3141 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3150 get_dynamic_flags (flags)
3153 static char buff [64];
3158 flag = flags & - flags;
3163 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3164 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3165 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3166 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3167 default: strcat (buff, "unknown "); break;
3173 /* Parse and display the contents of the dynamic segment. */
3175 process_dynamic_segment (file)
3178 Elf_Internal_Dyn * entry;
3181 if (dynamic_size == 0)
3184 printf (_("\nThere is no dynamic segment in this file.\n"));
3191 if (! get_32bit_dynamic_segment (file))
3194 else if (! get_64bit_dynamic_segment (file))
3197 /* Find the appropriate symbol table. */
3198 if (dynamic_symbols == NULL)
3200 for (i = 0, entry = dynamic_segment;
3204 unsigned long offset;
3206 if (entry->d_tag != DT_SYMTAB)
3209 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3211 /* Since we do not know how big the symbol table is,
3212 we default to reading in the entire file (!) and
3213 processing that. This is overkill, I know, but it
3215 offset = entry->d_un.d_val - loadaddr;
3217 if (fseek (file, 0, SEEK_END))
3218 error (_("Unable to seek to end of file!"));
3221 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3223 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3225 if (num_dynamic_syms < 1)
3227 error (_("Unable to determine the number of symbols to load\n"));
3231 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3235 /* Similarly find a string table. */
3236 if (dynamic_strings == NULL)
3238 for (i = 0, entry = dynamic_segment;
3242 unsigned long offset;
3245 if (entry->d_tag != DT_STRTAB)
3248 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3250 /* Since we do not know how big the string table is,
3251 we default to reading in the entire file (!) and
3252 processing that. This is overkill, I know, but it
3255 offset = entry->d_un.d_val - loadaddr;
3256 if (fseek (file, 0, SEEK_END))
3257 error (_("Unable to seek to end of file\n"));
3258 str_tab_len = ftell (file) - offset;
3260 if (str_tab_len < 1)
3263 (_("Unable to determine the length of the dynamic string table\n"));
3267 GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
3268 "dynamic string table");
3274 /* And find the syminfo section if available. */
3275 if (dynamic_syminfo == NULL)
3277 unsigned int syminsz = 0;
3279 for (i = 0, entry = dynamic_segment;
3283 if (entry->d_tag == DT_SYMINENT)
3285 /* Note: these braces are necessary to avoid a syntax
3286 error from the SunOS4 C compiler. */
3287 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3289 else if (entry->d_tag == DT_SYMINSZ)
3290 syminsz = entry->d_un.d_val;
3291 else if (entry->d_tag == DT_SYMINFO)
3292 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
3295 if (dynamic_syminfo_offset != 0 && syminsz != 0)
3297 Elf_External_Syminfo * extsyminfo;
3298 Elf_Internal_Syminfo * syminfo;
3300 /* There is a syminfo section. Read the data. */
3301 GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3302 Elf_External_Syminfo *, "symbol information");
3304 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3305 if (dynamic_syminfo == NULL)
3307 error (_("Out of memory\n"));
3311 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3312 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3315 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3316 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3323 if (do_dynamic && dynamic_addr)
3324 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3325 dynamic_addr, (long) dynamic_size);
3327 printf (_(" Tag Type Name/Value\n"));
3329 for (i = 0, entry = dynamic_segment;
3338 print_vma (entry->d_tag, FULL_HEX);
3339 dtype = get_dynamic_type (entry->d_tag);
3340 printf (" (%s)%*s", dtype,
3341 ((is_32bit_elf ? 27 : 19)
3342 - (int) strlen (dtype)),
3346 switch (entry->d_tag)
3350 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
3360 switch (entry->d_tag)
3363 printf (_("Auxiliary library"));
3367 printf (_("Filter library"));
3371 printf (_("Configuration file"));
3375 printf (_("Dependency audit library"));
3379 printf (_("Audit library"));
3383 if (dynamic_strings)
3384 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3388 print_vma (entry->d_un.d_val, PREFIX_HEX);
3397 printf (_("Flags:"));
3398 if (entry->d_un.d_val == 0)
3399 printf (_(" None\n"));
3402 unsigned long int val = entry->d_un.d_val;
3403 if (val & DTF_1_PARINIT)
3405 printf (" PARINIT");
3406 val ^= DTF_1_PARINIT;
3408 if (val & DTF_1_CONFEXP)
3410 printf (" CONFEXP");
3411 val ^= DTF_1_CONFEXP;
3414 printf (" %lx", val);
3423 printf (_("Flags:"));
3424 if (entry->d_un.d_val == 0)
3425 printf (_(" None\n"));
3428 unsigned long int val = entry->d_un.d_val;
3429 if (val & DF_P1_LAZYLOAD)
3431 printf (" LAZYLOAD");
3432 val ^= DF_P1_LAZYLOAD;
3434 if (val & DF_P1_GROUPPERM)
3436 printf (" GROUPPERM");
3437 val ^= DF_P1_GROUPPERM;
3440 printf (" %lx", val);
3449 printf (_("Flags:"));
3450 if (entry->d_un.d_val == 0)
3451 printf (_(" None\n"));
3454 unsigned long int val = entry->d_un.d_val;
3460 if (val & DF_1_GLOBAL)
3465 if (val & DF_1_GROUP)
3470 if (val & DF_1_NODELETE)
3472 printf (" NODELETE");
3473 val ^= DF_1_NODELETE;
3475 if (val & DF_1_LOADFLTR)
3477 printf (" LOADFLTR");
3478 val ^= DF_1_LOADFLTR;
3480 if (val & DF_1_INITFIRST)
3482 printf (" INITFIRST");
3483 val ^= DF_1_INITFIRST;
3485 if (val & DF_1_NOOPEN)
3490 if (val & DF_1_ORIGIN)
3495 if (val & DF_1_DIRECT)
3500 if (val & DF_1_TRANS)
3505 if (val & DF_1_INTERPOSE)
3507 printf (" INTERPOSE");
3508 val ^= DF_1_INTERPOSE;
3510 if (val & DF_1_NODEFLIB)
3512 printf (" NODEFLIB");
3513 val ^= DF_1_NODEFLIB;
3515 if (val & DF_1_NODUMP)
3520 if (val & DF_1_CONLFAT)
3522 printf (" CONLFAT");
3523 val ^= DF_1_CONLFAT;
3526 printf (" %lx", val);
3534 puts (get_dynamic_type (entry->d_un.d_val));
3554 dynamic_info[entry->d_tag] = entry->d_un.d_val;
3560 if (dynamic_strings == NULL)
3563 name = dynamic_strings + entry->d_un.d_val;
3567 switch (entry->d_tag)
3570 printf (_("Shared library: [%s]"), name);
3572 if (strcmp (name, program_interpreter) == 0)
3573 printf (_(" program interpreter"));
3577 printf (_("Library soname: [%s]"), name);
3581 printf (_("Library rpath: [%s]"), name);
3585 printf (_("Library runpath: [%s]"), name);
3589 print_vma (entry->d_un.d_val, PREFIX_HEX);
3594 print_vma (entry->d_un.d_val, PREFIX_HEX);
3610 case DT_INIT_ARRAYSZ:
3611 case DT_FINI_ARRAYSZ:
3614 print_vma (entry->d_un.d_val, UNSIGNED);
3615 printf (" (bytes)\n");
3625 print_vma (entry->d_un.d_val, UNSIGNED);
3638 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
3642 name = dynamic_strings + entry->d_un.d_val;
3646 printf (_("Not needed object: [%s]\n"), name);
3651 print_vma (entry->d_un.d_val, PREFIX_HEX);
3657 /* The value of this entry is ignored. */
3661 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
3662 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
3667 switch (elf_header.e_machine)
3670 case EM_MIPS_RS4_BE:
3671 dynamic_segment_mips_val (entry);
3674 dynamic_segment_parisc_val (entry);
3677 print_vma (entry->d_un.d_val, PREFIX_HEX);
3689 get_ver_flags (flags)
3692 static char buff [32];
3699 if (flags & VER_FLG_BASE)
3700 strcat (buff, "BASE ");
3702 if (flags & VER_FLG_WEAK)
3704 if (flags & VER_FLG_BASE)
3705 strcat (buff, "| ");
3707 strcat (buff, "WEAK ");
3710 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
3711 strcat (buff, "| <unknown>");
3716 /* Display the contents of the version sections. */
3718 process_version_sections (file)
3721 Elf32_Internal_Shdr * section;
3728 for (i = 0, section = section_headers;
3729 i < elf_header.e_shnum;
3732 switch (section->sh_type)
3734 case SHT_GNU_verdef:
3736 Elf_External_Verdef * edefs;
3743 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3744 SECTION_NAME (section), section->sh_info);
3746 printf (_(" Addr: 0x"));
3747 printf_vma (section->sh_addr);
3748 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3749 (unsigned long) section->sh_offset, section->sh_link,
3750 SECTION_NAME (section_headers + section->sh_link));
3752 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3753 edefs, Elf_External_Verdef *,
3754 "version definition section");
3756 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
3759 Elf_External_Verdef * edef;
3760 Elf_Internal_Verdef ent;
3761 Elf_External_Verdaux * eaux;
3762 Elf_Internal_Verdaux aux;
3766 vstart = ((char *) edefs) + idx;
3768 edef = (Elf_External_Verdef *) vstart;
3770 ent.vd_version = BYTE_GET (edef->vd_version);
3771 ent.vd_flags = BYTE_GET (edef->vd_flags);
3772 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
3773 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
3774 ent.vd_hash = BYTE_GET (edef->vd_hash);
3775 ent.vd_aux = BYTE_GET (edef->vd_aux);
3776 ent.vd_next = BYTE_GET (edef->vd_next);
3778 printf (_(" %#06x: Rev: %d Flags: %s"),
3779 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
3781 printf (_(" Index: %d Cnt: %d "),
3782 ent.vd_ndx, ent.vd_cnt);
3784 vstart += ent.vd_aux;
3786 eaux = (Elf_External_Verdaux *) vstart;
3788 aux.vda_name = BYTE_GET (eaux->vda_name);
3789 aux.vda_next = BYTE_GET (eaux->vda_next);
3791 if (dynamic_strings)
3792 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
3794 printf (_("Name index: %ld\n"), aux.vda_name);
3796 isum = idx + ent.vd_aux;
3798 for (j = 1; j < ent.vd_cnt; j ++)
3800 isum += aux.vda_next;
3801 vstart += aux.vda_next;
3803 eaux = (Elf_External_Verdaux *) vstart;
3805 aux.vda_name = BYTE_GET (eaux->vda_name);
3806 aux.vda_next = BYTE_GET (eaux->vda_next);
3808 if (dynamic_strings)
3809 printf (_(" %#06x: Parent %d: %s\n"),
3810 isum, j, dynamic_strings + aux.vda_name);
3812 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3813 isum, j, aux.vda_name);
3823 case SHT_GNU_verneed:
3825 Elf_External_Verneed * eneed;
3831 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3832 SECTION_NAME (section), section->sh_info);
3834 printf (_(" Addr: 0x"));
3835 printf_vma (section->sh_addr);
3836 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3837 (unsigned long) section->sh_offset, section->sh_link,
3838 SECTION_NAME (section_headers + section->sh_link));
3840 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3841 eneed, Elf_External_Verneed *,
3842 "version need section");
3844 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
3846 Elf_External_Verneed * entry;
3847 Elf_Internal_Verneed ent;
3852 vstart = ((char *) eneed) + idx;
3854 entry = (Elf_External_Verneed *) vstart;
3856 ent.vn_version = BYTE_GET (entry->vn_version);
3857 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
3858 ent.vn_file = BYTE_GET (entry->vn_file);
3859 ent.vn_aux = BYTE_GET (entry->vn_aux);
3860 ent.vn_next = BYTE_GET (entry->vn_next);
3862 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
3864 if (dynamic_strings)
3865 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
3867 printf (_(" File: %lx"), ent.vn_file);
3869 printf (_(" Cnt: %d\n"), ent.vn_cnt);
3871 vstart += ent.vn_aux;
3873 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
3875 Elf_External_Vernaux * eaux;
3876 Elf_Internal_Vernaux aux;
3878 eaux = (Elf_External_Vernaux *) vstart;
3880 aux.vna_hash = BYTE_GET (eaux->vna_hash);
3881 aux.vna_flags = BYTE_GET (eaux->vna_flags);
3882 aux.vna_other = BYTE_GET (eaux->vna_other);
3883 aux.vna_name = BYTE_GET (eaux->vna_name);
3884 aux.vna_next = BYTE_GET (eaux->vna_next);
3886 if (dynamic_strings)
3887 printf (_(" %#06x: Name: %s"),
3888 isum, dynamic_strings + aux.vna_name);
3890 printf (_(" %#06x: Name index: %lx"),
3891 isum, aux.vna_name);
3893 printf (_(" Flags: %s Version: %d\n"),
3894 get_ver_flags (aux.vna_flags), aux.vna_other);
3896 isum += aux.vna_next;
3897 vstart += aux.vna_next;
3907 case SHT_GNU_versym:
3909 Elf32_Internal_Shdr * link_section;
3912 unsigned char * edata;
3913 unsigned short * data;
3915 Elf_Internal_Sym * symbols;
3916 Elf32_Internal_Shdr * string_sec;
3918 link_section = section_headers + section->sh_link;
3919 total = section->sh_size / section->sh_entsize;
3923 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
3924 link_section->sh_size / link_section->sh_entsize);
3926 string_sec = section_headers + link_section->sh_link;
3928 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
3929 strtab, char *, "version string table");
3931 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3932 SECTION_NAME (section), total);
3934 printf (_(" Addr: "));
3935 printf_vma (section->sh_addr);
3936 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3937 (unsigned long) section->sh_offset, section->sh_link,
3938 SECTION_NAME (link_section));
3940 GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
3942 total * sizeof (short), edata,
3943 unsigned char *, "version symbol data");
3945 data = (unsigned short *) malloc (total * sizeof (short));
3947 for (cnt = total; cnt --;)
3948 data [cnt] = byte_get (edata + cnt * sizeof (short),
3953 for (cnt = 0; cnt < total; cnt += 4)
3958 printf (" %03x:", cnt);
3960 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
3961 switch (data [cnt + j])
3964 fputs (_(" 0 (*local*) "), stdout);
3968 fputs (_(" 1 (*global*) "), stdout);
3972 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
3973 data [cnt + j] & 0x8000 ? 'h' : ' ');
3975 if (symbols [cnt + j].st_shndx < SHN_LORESERVE
3976 && section_headers[symbols [cnt + j].st_shndx].sh_type
3979 /* We must test both. */
3980 Elf_Internal_Verneed ivn;
3981 unsigned long offset;
3983 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3988 Elf_External_Verneed evn;
3989 Elf_External_Vernaux evna;
3990 Elf_Internal_Vernaux ivna;
3991 unsigned long vna_off;
3993 GET_DATA (offset, evn, "version need");
3995 ivn.vn_aux = BYTE_GET (evn.vn_aux);
3996 ivn.vn_next = BYTE_GET (evn.vn_next);
3998 vna_off = offset + ivn.vn_aux;
4002 GET_DATA (vna_off, evna,
4003 "version need aux (1)");
4005 ivna.vna_next = BYTE_GET (evna.vna_next);
4006 ivna.vna_other = BYTE_GET (evna.vna_other);
4008 vna_off += ivna.vna_next;
4010 while (ivna.vna_other != data [cnt + j]
4011 && ivna.vna_next != 0);
4013 if (ivna.vna_other == data [cnt + j])
4015 ivna.vna_name = BYTE_GET (evna.vna_name);
4017 name = strtab + ivna.vna_name;
4018 nn += printf ("(%s%-*s",
4020 12 - (int) strlen (name),
4024 else if (ivn.vn_next == 0)
4026 if (data [cnt + j] != 0x8001)
4028 Elf_Internal_Verdef ivd;
4029 Elf_External_Verdef evd;
4031 offset = version_info
4032 [DT_VERSIONTAGIDX (DT_VERDEF)]
4037 GET_DATA (offset, evd,
4038 "version definition");
4040 ivd.vd_next = BYTE_GET (evd.vd_next);
4041 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4043 offset += ivd.vd_next;
4046 != (data [cnt + j] & 0x7fff)
4047 && ivd.vd_next != 0);
4050 == (data [cnt + j] & 0x7fff))
4052 Elf_External_Verdaux evda;
4053 Elf_Internal_Verdaux ivda;
4055 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4057 GET_DATA (offset + ivd.vd_aux, evda,
4058 "version definition aux");
4061 BYTE_GET (evda.vda_name);
4063 name = strtab + ivda.vda_name;
4067 12 - (int) strlen (name),
4075 offset += ivn.vn_next;
4077 while (ivn.vn_next);
4079 else if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4081 Elf_Internal_Verneed ivn;
4082 unsigned long offset;
4084 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4089 Elf_Internal_Vernaux ivna;
4090 Elf_External_Verneed evn;
4091 Elf_External_Vernaux evna;
4092 unsigned long a_off;
4094 GET_DATA (offset, evn, "version need");
4096 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4097 ivn.vn_next = BYTE_GET (evn.vn_next);
4099 a_off = offset + ivn.vn_aux;
4103 GET_DATA (a_off, evna,
4104 "version need aux (2)");
4106 ivna.vna_next = BYTE_GET (evna.vna_next);
4107 ivna.vna_other = BYTE_GET (evna.vna_other);
4109 a_off += ivna.vna_next;
4111 while (ivna.vna_other != data [cnt + j]
4112 && ivna.vna_next != 0);
4114 if (ivna.vna_other == data [cnt + j])
4116 ivna.vna_name = BYTE_GET (evna.vna_name);
4118 name = strtab + ivna.vna_name;
4119 nn += printf ("(%s%-*s",
4121 12 - (int) strlen (name),
4126 offset += ivn.vn_next;
4128 while (ivn.vn_next);
4130 else if (data [cnt + j] != 0x8001)
4132 Elf_Internal_Verdef ivd;
4133 Elf_External_Verdef evd;
4134 unsigned long offset;
4136 offset = version_info
4137 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4141 GET_DATA (offset, evd, "version def");
4143 ivd.vd_next = BYTE_GET (evd.vd_next);
4144 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4146 offset += ivd.vd_next;
4148 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4149 && ivd.vd_next != 0);
4151 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4153 Elf_External_Verdaux evda;
4154 Elf_Internal_Verdaux ivda;
4156 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4158 GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
4159 evda, "version def aux");
4161 ivda.vda_name = BYTE_GET (evda.vda_name);
4163 name = strtab + ivda.vda_name;
4164 nn += printf ("(%s%-*s",
4166 12 - (int) strlen (name),
4172 printf ("%*c", 18 - nn, ' ');
4190 printf (_("\nNo version information found in this file.\n"));
4196 get_symbol_binding (binding)
4197 unsigned int binding;
4199 static char buff [32];
4203 case STB_LOCAL: return "LOCAL";
4204 case STB_GLOBAL: return "GLOBAL";
4205 case STB_WEAK: return "WEAK";
4207 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4208 sprintf (buff, _("<processor specific>: %d"), binding);
4209 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4210 sprintf (buff, _("<OS specific>: %d"), binding);
4212 sprintf (buff, _("<unknown>: %d"), binding);
4218 get_symbol_type (type)
4221 static char buff [32];
4225 case STT_NOTYPE: return "NOTYPE";
4226 case STT_OBJECT: return "OBJECT";
4227 case STT_FUNC: return "FUNC";
4228 case STT_SECTION: return "SECTION";
4229 case STT_FILE: return "FILE";
4230 case STT_COMMON: return "COMMON";
4232 if (type >= STT_LOPROC && type <= STT_HIPROC)
4234 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4235 return "THUMB_FUNC";
4237 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4240 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4241 return "PARISC_MILLI";
4243 sprintf (buff, _("<processor specific>: %d"), type);
4245 else if (type >= STT_LOOS && type <= STT_HIOS)
4247 if (elf_header.e_machine == EM_PARISC)
4249 if (type == STT_HP_OPAQUE)
4251 if (type == STT_HP_STUB)
4255 sprintf (buff, _("<OS specific>: %d"), type);
4258 sprintf (buff, _("<unknown>: %d"), type);
4264 get_symbol_visibility (visibility)
4265 unsigned int visibility;
4269 case STV_DEFAULT: return "DEFAULT";
4270 case STV_INTERNAL: return "INTERNAL";
4271 case STV_HIDDEN: return "HIDDEN";
4272 case STV_PROTECTED: return "PROTECTED";
4278 get_symbol_index_type (type)
4283 case SHN_UNDEF: return "UND";
4284 case SHN_ABS: return "ABS";
4285 case SHN_COMMON: return "COM";
4287 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4289 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4291 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4295 static char buff [32];
4297 sprintf (buff, "%3d", type);
4304 get_dynamic_data (file, number)
4306 unsigned int number;
4308 unsigned char * e_data;
4311 e_data = (unsigned char *) malloc (number * 4);
4315 error (_("Out of memory\n"));
4319 if (fread (e_data, 4, number, file) != number)
4321 error (_("Unable to read in dynamic data\n"));
4325 i_data = (int *) malloc (number * sizeof (* i_data));
4329 error (_("Out of memory\n"));
4335 i_data [number] = byte_get (e_data + number * 4, 4);
4342 /* Dump the symbol table */
4344 process_symbol_table (file)
4347 Elf32_Internal_Shdr * section;
4348 unsigned char nb [4];
4349 unsigned char nc [4];
4352 int * buckets = NULL;
4353 int * chains = NULL;
4355 if (! do_syms && !do_histogram)
4358 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
4361 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
4363 error (_("Unable to seek to start of dynamic information"));
4367 if (fread (nb, sizeof (nb), 1, file) != 1)
4369 error (_("Failed to read in number of buckets\n"));
4373 if (fread (nc, sizeof (nc), 1, file) != 1)
4375 error (_("Failed to read in number of chains\n"));
4379 nbuckets = byte_get (nb, 4);
4380 nchains = byte_get (nc, 4);
4382 buckets = get_dynamic_data (file, nbuckets);
4383 chains = get_dynamic_data (file, nchains);
4385 if (buckets == NULL || chains == NULL)
4390 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4395 printf (_("\nSymbol table for image:\n"));
4397 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4399 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4401 for (hn = 0; hn < nbuckets; hn++)
4406 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4408 Elf_Internal_Sym * psym;
4410 psym = dynamic_symbols + si;
4412 printf (" %3d %3d: ", si, hn);
4413 print_vma (psym->st_value, LONG_HEX);
4415 print_vma (psym->st_size, DEC_5);
4417 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4418 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4419 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4420 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
4421 printf (" %s\n", dynamic_strings + psym->st_name);
4425 else if (do_syms && !do_using_dynamic)
4429 for (i = 0, section = section_headers;
4430 i < elf_header.e_shnum;
4435 Elf_Internal_Sym * symtab;
4436 Elf_Internal_Sym * psym;
4439 if ( section->sh_type != SHT_SYMTAB
4440 && section->sh_type != SHT_DYNSYM)
4443 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4444 SECTION_NAME (section),
4445 (unsigned long) (section->sh_size / section->sh_entsize));
4447 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4449 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4451 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4452 section->sh_size / section->sh_entsize);
4456 if (section->sh_link == elf_header.e_shstrndx)
4457 strtab = string_table;
4460 Elf32_Internal_Shdr * string_sec;
4462 string_sec = section_headers + section->sh_link;
4464 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4465 strtab, char *, "string table");
4468 for (si = 0, psym = symtab;
4469 si < section->sh_size / section->sh_entsize;
4472 printf ("%6d: ", si);
4473 print_vma (psym->st_value, LONG_HEX);
4475 print_vma (psym->st_size, DEC_5);
4476 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4477 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4478 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4479 printf (" %4s", get_symbol_index_type (psym->st_shndx));
4480 printf (" %s", strtab + psym->st_name);
4482 if (section->sh_type == SHT_DYNSYM &&
4483 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4485 unsigned char data[2];
4486 unsigned short vers_data;
4487 unsigned long offset;
4491 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4494 GET_DATA (offset + si * sizeof (vers_data), data,
4497 vers_data = byte_get (data, 2);
4499 is_nobits = psym->st_shndx < SHN_LORESERVE ?
4500 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4503 check_def = (psym->st_shndx != SHN_UNDEF);
4505 if ((vers_data & 0x8000) || vers_data > 1)
4507 if (is_nobits || ! check_def)
4509 Elf_External_Verneed evn;
4510 Elf_Internal_Verneed ivn;
4511 Elf_Internal_Vernaux ivna;
4513 /* We must test both. */
4514 offset = version_info
4515 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4519 unsigned long vna_off;
4521 GET_DATA (offset, evn, "version need");
4523 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4524 ivn.vn_next = BYTE_GET (evn.vn_next);
4526 vna_off = offset + ivn.vn_aux;
4530 Elf_External_Vernaux evna;
4532 GET_DATA (vna_off, evna,
4533 "version need aux (3)");
4535 ivna.vna_other = BYTE_GET (evna.vna_other);
4536 ivna.vna_next = BYTE_GET (evna.vna_next);
4537 ivna.vna_name = BYTE_GET (evna.vna_name);
4539 vna_off += ivna.vna_next;
4541 while (ivna.vna_other != vers_data
4542 && ivna.vna_next != 0);
4544 if (ivna.vna_other == vers_data)
4547 offset += ivn.vn_next;
4549 while (ivn.vn_next != 0);
4551 if (ivna.vna_other == vers_data)
4554 strtab + ivna.vna_name, ivna.vna_other);
4557 else if (! is_nobits)
4558 error (_("bad dynamic symbol"));
4565 if (vers_data != 0x8001)
4567 Elf_Internal_Verdef ivd;
4568 Elf_Internal_Verdaux ivda;
4569 Elf_External_Verdaux evda;
4570 unsigned long offset;
4573 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4578 Elf_External_Verdef evd;
4580 GET_DATA (offset, evd, "version def");
4582 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4583 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4584 ivd.vd_next = BYTE_GET (evd.vd_next);
4586 offset += ivd.vd_next;
4588 while (ivd.vd_ndx != (vers_data & 0x7fff)
4589 && ivd.vd_next != 0);
4591 offset -= ivd.vd_next;
4592 offset += ivd.vd_aux;
4594 GET_DATA (offset, evda, "version def aux");
4596 ivda.vda_name = BYTE_GET (evda.vda_name);
4598 if (psym->st_name != ivda.vda_name)
4599 printf ((vers_data & 0x8000)
4601 strtab + ivda.vda_name);
4611 if (strtab != string_table)
4617 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4619 if (do_histogram && buckets != NULL)
4626 int nzero_counts = 0;
4629 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4631 printf (_(" Length Number %% of total Coverage\n"));
4633 lengths = (int *) calloc (nbuckets, sizeof (int));
4634 if (lengths == NULL)
4636 error (_("Out of memory"));
4639 for (hn = 0; hn < nbuckets; ++hn)
4644 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
4647 if (maxlength < ++lengths[hn])
4652 counts = (int *) calloc (maxlength + 1, sizeof (int));
4655 error (_("Out of memory"));
4659 for (hn = 0; hn < nbuckets; ++hn)
4660 ++ counts [lengths [hn]];
4664 printf (" 0 %-10d (%5.1f%%)\n",
4665 counts[0], (counts[0] * 100.0) / nbuckets);
4666 for (si = 1; si <= maxlength; ++si)
4668 nzero_counts += counts[si] * si;
4669 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4670 si, counts[si], (counts[si] * 100.0) / nbuckets,
4671 (nzero_counts * 100.0) / nsyms);
4679 if (buckets != NULL)
4689 process_syminfo (file)
4690 FILE * file ATTRIBUTE_UNUSED;
4694 if (dynamic_syminfo == NULL
4696 /* No syminfo, this is ok. */
4699 /* There better should be a dynamic symbol section. */
4700 if (dynamic_symbols == NULL || dynamic_strings == NULL)
4704 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4705 dynamic_syminfo_offset, dynamic_syminfo_nent);
4707 printf (_(" Num: Name BoundTo Flags\n"));
4708 for (i = 0; i < dynamic_syminfo_nent; ++i)
4710 unsigned short int flags = dynamic_syminfo[i].si_flags;
4712 printf ("%4d: %-30s ", i,
4713 dynamic_strings + dynamic_symbols[i].st_name);
4715 switch (dynamic_syminfo[i].si_boundto)
4717 case SYMINFO_BT_SELF:
4718 fputs ("SELF ", stdout);
4720 case SYMINFO_BT_PARENT:
4721 fputs ("PARENT ", stdout);
4724 if (dynamic_syminfo[i].si_boundto > 0
4725 && dynamic_syminfo[i].si_boundto < dynamic_size)
4728 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
4730 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
4734 if (flags & SYMINFO_FLG_DIRECT)
4736 if (flags & SYMINFO_FLG_PASSTHRU)
4737 printf (" PASSTHRU");
4738 if (flags & SYMINFO_FLG_COPY)
4740 if (flags & SYMINFO_FLG_LAZYLOAD)
4741 printf (" LAZYLOAD");
4749 #ifdef SUPPORT_DISASSEMBLY
4751 disassemble_section (section, file)
4752 Elf32_Internal_Shdr * section;
4755 printf (_("\nAssembly dump of section %s\n"),
4756 SECTION_NAME (section));
4758 /* XXX -- to be done --- XXX */
4765 dump_section (section, file)
4766 Elf32_Internal_Shdr * section;
4769 bfd_size_type bytes;
4771 unsigned char * data;
4772 unsigned char * start;
4774 bytes = section->sh_size;
4778 printf (_("\nSection '%s' has no data to dump.\n"),
4779 SECTION_NAME (section));
4783 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
4785 addr = section->sh_addr;
4787 GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
4798 lbytes = (bytes > 16 ? 16 : bytes);
4800 printf (" 0x%8.8lx ", (unsigned long) addr);
4802 switch (elf_header.e_ident [EI_DATA])
4806 for (j = 15; j >= 0; j --)
4809 printf ("%2.2x", data [j]);
4819 for (j = 0; j < 16; j++)
4822 printf ("%2.2x", data [j]);
4832 for (j = 0; j < lbytes; j++)
4835 if (k >= ' ' && k < 0x80)
4854 static unsigned long int
4855 read_leb128 (data, length_return, sign)
4856 unsigned char * data;
4857 int * length_return;
4860 unsigned long int result = 0;
4861 unsigned int num_read = 0;
4870 result |= (byte & 0x7f) << shift;
4875 while (byte & 0x80);
4877 if (length_return != NULL)
4878 * length_return = num_read;
4880 if (sign && (shift < 32) && (byte & 0x40))
4881 result |= -1 << shift;
4886 typedef struct State_Machine_Registers
4888 unsigned long address;
4891 unsigned int column;
4895 /* This variable hold the number of the last entry seen
4896 in the File Table. */
4897 unsigned int last_file_entry;
4900 static SMR state_machine_regs;
4903 reset_state_machine (is_stmt)
4906 state_machine_regs.address = 0;
4907 state_machine_regs.file = 1;
4908 state_machine_regs.line = 1;
4909 state_machine_regs.column = 0;
4910 state_machine_regs.is_stmt = is_stmt;
4911 state_machine_regs.basic_block = 0;
4912 state_machine_regs.end_sequence = 0;
4913 state_machine_regs.last_file_entry = 0;
4916 /* Handled an extend line op. Returns true if this is the end
4919 process_extended_line_op (data, is_stmt, pointer_size)
4920 unsigned char * data;
4924 unsigned char op_code;
4927 unsigned char * name;
4930 len = read_leb128 (data, & bytes_read, 0);
4935 warn (_("badly formed extended line op encountered!"));
4940 op_code = * data ++;
4942 printf (_(" Extended opcode %d: "), op_code);
4946 case DW_LNE_end_sequence:
4947 printf (_("End of Sequence\n\n"));
4948 reset_state_machine (is_stmt);
4951 case DW_LNE_set_address:
4952 adr = byte_get (data, pointer_size);
4953 printf (_("set Address to 0x%lx\n"), adr);
4954 state_machine_regs.address = adr;
4957 case DW_LNE_define_file:
4958 printf (_(" define new File Table entry\n"));
4959 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4961 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4963 data += strlen ((char *) data) + 1;
4964 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4966 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4968 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4969 printf (_("%s\n\n"), name);
4973 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
4980 /* Size of pointers in the .debug_line section. This information is not
4981 really present in that section. It's obtained before dumping the debug
4982 sections by doing some pre-scan of the .debug_info section. */
4983 static int debug_line_pointer_size = 4;
4986 display_debug_lines (section, start, file)
4987 Elf32_Internal_Shdr * section;
4988 unsigned char * start;
4989 FILE * file ATTRIBUTE_UNUSED;
4991 DWARF2_External_LineInfo * external;
4992 DWARF2_Internal_LineInfo info;
4993 unsigned char * standard_opcodes;
4994 unsigned char * data = start;
4995 unsigned char * end = start + section->sh_size;
4996 unsigned char * end_of_sequence;
4999 printf (_("\nDump of debug contents of section %s:\n\n"),
5000 SECTION_NAME (section));
5004 external = (DWARF2_External_LineInfo *) data;
5006 /* Check the length of the block. */
5007 info.li_length = BYTE_GET (external->li_length);
5008 if (info.li_length > section->sh_size)
5011 (_("The line info appears to be corrupt - the section is too small\n"));
5015 /* Check its version number. */
5016 info.li_version = BYTE_GET (external->li_version);
5017 if (info.li_version != 2)
5019 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5023 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5024 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5025 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5026 info.li_line_base = BYTE_GET (external->li_line_base);
5027 info.li_line_range = BYTE_GET (external->li_line_range);
5028 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5030 /* Sign extend the line base field. */
5031 info.li_line_base <<= 24;
5032 info.li_line_base >>= 24;
5034 printf (_(" Length: %ld\n"), info.li_length);
5035 printf (_(" DWARF Version: %d\n"), info.li_version);
5036 printf (_(" Prolgue Length: %d\n"), info.li_prologue_length);
5037 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5038 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5039 printf (_(" Line Base: %d\n"), info.li_line_base);
5040 printf (_(" Line Range: %d\n"), info.li_line_range);
5041 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5043 end_of_sequence = data + info.li_length + sizeof (info.li_length);
5045 reset_state_machine (info.li_default_is_stmt);
5047 /* Display the contents of the Opcodes table. */
5048 standard_opcodes = data + sizeof (* external);
5050 printf (_("\n Opcodes:\n"));
5052 for (i = 1; i < info.li_opcode_base; i++)
5053 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5055 /* Display the contents of the Directory table. */
5056 data = standard_opcodes + info.li_opcode_base - 1;
5059 printf (_("\n The Directory Table is empty.\n"));
5062 printf (_("\n The Directory Table:\n"));
5066 printf (_(" %s\n"), data);
5068 data += strlen ((char *) data) + 1;
5072 /* Skip the NUL at the end of the table. */
5075 /* Display the contents of the File Name table. */
5077 printf (_("\n The File Name Table is empty.\n"));
5080 printf (_("\n The File Name Table:\n"));
5081 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5085 unsigned char * name;
5088 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5091 data += strlen ((char *) data) + 1;
5093 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5095 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5097 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5099 printf (_("%s\n"), name);
5103 /* Skip the NUL at the end of the table. */
5106 /* Now display the statements. */
5107 printf (_("\n Line Number Statements:\n"));
5110 while (data < end_of_sequence)
5112 unsigned char op_code;
5116 op_code = * data ++;
5120 case DW_LNS_extended_op:
5121 data += process_extended_line_op (data, info.li_default_is_stmt,
5122 debug_line_pointer_size);
5126 printf (_(" Copy\n"));
5129 case DW_LNS_advance_pc:
5130 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5132 state_machine_regs.address += adv;
5133 printf (_(" Advance PC by %d to %lx\n"), adv,
5134 state_machine_regs.address);
5137 case DW_LNS_advance_line:
5138 adv = read_leb128 (data, & bytes_read, 1);
5140 state_machine_regs.line += adv;
5141 printf (_(" Advance Line by %d to %d\n"), adv,
5142 state_machine_regs.line);
5145 case DW_LNS_set_file:
5146 adv = read_leb128 (data, & bytes_read, 0);
5148 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5150 state_machine_regs.file = adv;
5153 case DW_LNS_set_column:
5154 adv = read_leb128 (data, & bytes_read, 0);
5156 printf (_(" Set column to %d\n"), adv);
5157 state_machine_regs.column = adv;
5160 case DW_LNS_negate_stmt:
5161 adv = state_machine_regs.is_stmt;
5163 printf (_(" Set is_stmt to %d\n"), adv);
5164 state_machine_regs.is_stmt = adv;
5167 case DW_LNS_set_basic_block:
5168 printf (_(" Set basic block\n"));
5169 state_machine_regs.basic_block = 1;
5172 case DW_LNS_const_add_pc:
5173 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5174 * info.li_min_insn_length);
5175 state_machine_regs.address += adv;
5176 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5177 state_machine_regs.address);
5180 case DW_LNS_fixed_advance_pc:
5181 adv = byte_get (data, 2);
5183 state_machine_regs.address += adv;
5184 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5185 adv, state_machine_regs.address);
5189 op_code -= info.li_opcode_base;
5190 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5191 state_machine_regs.address += adv;
5192 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5193 op_code, adv, state_machine_regs.address);
5194 adv = (op_code % info.li_line_range) + info.li_line_base;
5195 state_machine_regs.line += adv;
5196 printf (_(" and Line by %d to %d\n"),
5197 adv, state_machine_regs.line);
5208 display_debug_pubnames (section, start, file)
5209 Elf32_Internal_Shdr * section;
5210 unsigned char * start;
5211 FILE * file ATTRIBUTE_UNUSED;
5213 DWARF2_External_PubNames * external;
5214 DWARF2_Internal_PubNames pubnames;
5215 unsigned char * end;
5217 end = start + section->sh_size;
5219 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5223 unsigned char * data;
5224 unsigned long offset;
5226 external = (DWARF2_External_PubNames *) start;
5228 pubnames.pn_length = BYTE_GET (external->pn_length);
5229 pubnames.pn_version = BYTE_GET (external->pn_version);
5230 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5231 pubnames.pn_size = BYTE_GET (external->pn_size);
5233 data = start + sizeof (* external);
5234 start += pubnames.pn_length + sizeof (external->pn_length);
5236 if (pubnames.pn_version != 2)
5238 static int warned = 0;
5242 warn (_("Only DWARF 2 pubnames are currently supported\n"));
5249 printf (_(" Length: %ld\n"),
5250 pubnames.pn_length);
5251 printf (_(" Version: %d\n"),
5252 pubnames.pn_version);
5253 printf (_(" Offset into .debug_info section: %ld\n"),
5254 pubnames.pn_offset);
5255 printf (_(" Size of area in .debug_info section: %ld\n"),
5258 printf (_("\n Offset\tName\n"));
5262 offset = byte_get (data, 4);
5267 printf (" %ld\t\t%s\n", offset, data);
5268 data += strlen ((char *) data) + 1;
5271 while (offset != 0);
5284 case DW_TAG_padding: return "DW_TAG_padding";
5285 case DW_TAG_array_type: return "DW_TAG_array_type";
5286 case DW_TAG_class_type: return "DW_TAG_class_type";
5287 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5288 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5289 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5290 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5291 case DW_TAG_label: return "DW_TAG_label";
5292 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5293 case DW_TAG_member: return "DW_TAG_member";
5294 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5295 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5296 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5297 case DW_TAG_string_type: return "DW_TAG_string_type";
5298 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5299 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5300 case DW_TAG_typedef: return "DW_TAG_typedef";
5301 case DW_TAG_union_type: return "DW_TAG_union_type";
5302 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5303 case DW_TAG_variant: return "DW_TAG_variant";
5304 case DW_TAG_common_block: return "DW_TAG_common_block";
5305 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5306 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5307 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5308 case DW_TAG_module: return "DW_TAG_module";
5309 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5310 case DW_TAG_set_type: return "DW_TAG_set_type";
5311 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5312 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5313 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5314 case DW_TAG_base_type: return "DW_TAG_base_type";
5315 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5316 case DW_TAG_const_type: return "DW_TAG_const_type";
5317 case DW_TAG_constant: return "DW_TAG_constant";
5318 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5319 case DW_TAG_file_type: return "DW_TAG_file_type";
5320 case DW_TAG_friend: return "DW_TAG_friend";
5321 case DW_TAG_namelist: return "DW_TAG_namelist";
5322 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5323 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5324 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5325 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5326 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5327 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5328 case DW_TAG_try_block: return "DW_TAG_try_block";
5329 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5330 case DW_TAG_variable: return "DW_TAG_variable";
5331 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5332 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5333 case DW_TAG_format_label: return "DW_TAG_format_label";
5334 case DW_TAG_function_template: return "DW_TAG_function_template";
5335 case DW_TAG_class_template: return "DW_TAG_class_template";
5338 static char buffer [100];
5340 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
5347 get_AT_name (attribute)
5348 unsigned long attribute;
5352 case DW_AT_sibling: return "DW_AT_sibling";
5353 case DW_AT_location: return "DW_AT_location";
5354 case DW_AT_name: return "DW_AT_name";
5355 case DW_AT_ordering: return "DW_AT_ordering";
5356 case DW_AT_subscr_data: return "DW_AT_subscr_data";
5357 case DW_AT_byte_size: return "DW_AT_byte_size";
5358 case DW_AT_bit_offset: return "DW_AT_bit_offset";
5359 case DW_AT_bit_size: return "DW_AT_bit_size";
5360 case DW_AT_element_list: return "DW_AT_element_list";
5361 case DW_AT_stmt_list: return "DW_AT_stmt_list";
5362 case DW_AT_low_pc: return "DW_AT_low_pc";
5363 case DW_AT_high_pc: return "DW_AT_high_pc";
5364 case DW_AT_language: return "DW_AT_language";
5365 case DW_AT_member: return "DW_AT_member";
5366 case DW_AT_discr: return "DW_AT_discr";
5367 case DW_AT_discr_value: return "DW_AT_discr_value";
5368 case DW_AT_visibility: return "DW_AT_visibility";
5369 case DW_AT_import: return "DW_AT_import";
5370 case DW_AT_string_length: return "DW_AT_string_length";
5371 case DW_AT_common_reference: return "DW_AT_common_reference";
5372 case DW_AT_comp_dir: return "DW_AT_comp_dir";
5373 case DW_AT_const_value: return "DW_AT_const_value";
5374 case DW_AT_containing_type: return "DW_AT_containing_type";
5375 case DW_AT_default_value: return "DW_AT_default_value";
5376 case DW_AT_inline: return "DW_AT_inline";
5377 case DW_AT_is_optional: return "DW_AT_is_optional";
5378 case DW_AT_lower_bound: return "DW_AT_lower_bound";
5379 case DW_AT_producer: return "DW_AT_producer";
5380 case DW_AT_prototyped: return "DW_AT_prototyped";
5381 case DW_AT_return_addr: return "DW_AT_return_addr";
5382 case DW_AT_start_scope: return "DW_AT_start_scope";
5383 case DW_AT_stride_size: return "DW_AT_stride_size";
5384 case DW_AT_upper_bound: return "DW_AT_upper_bound";
5385 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5386 case DW_AT_accessibility: return "DW_AT_accessibility";
5387 case DW_AT_address_class: return "DW_AT_address_class";
5388 case DW_AT_artificial: return "DW_AT_artificial";
5389 case DW_AT_base_types: return "DW_AT_base_types";
5390 case DW_AT_calling_convention: return "DW_AT_calling_convention";
5391 case DW_AT_count: return "DW_AT_count";
5392 case DW_AT_data_member_location: return "DW_AT_data_member_location";
5393 case DW_AT_decl_column: return "DW_AT_decl_column";
5394 case DW_AT_decl_file: return "DW_AT_decl_file";
5395 case DW_AT_decl_line: return "DW_AT_decl_line";
5396 case DW_AT_declaration: return "DW_AT_declaration";
5397 case DW_AT_discr_list: return "DW_AT_discr_list";
5398 case DW_AT_encoding: return "DW_AT_encoding";
5399 case DW_AT_external: return "DW_AT_external";
5400 case DW_AT_frame_base: return "DW_AT_frame_base";
5401 case DW_AT_friend: return "DW_AT_friend";
5402 case DW_AT_identifier_case: return "DW_AT_identifier_case";
5403 case DW_AT_macro_info: return "DW_AT_macro_info";
5404 case DW_AT_namelist_items: return "DW_AT_namelist_items";
5405 case DW_AT_priority: return "DW_AT_priority";
5406 case DW_AT_segment: return "DW_AT_segment";
5407 case DW_AT_specification: return "DW_AT_specification";
5408 case DW_AT_static_link: return "DW_AT_static_link";
5409 case DW_AT_type: return "DW_AT_type";
5410 case DW_AT_use_location: return "DW_AT_use_location";
5411 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5412 case DW_AT_virtuality: return "DW_AT_virtuality";
5413 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5414 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5415 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5416 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5417 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5418 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5419 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5420 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5421 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5422 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5423 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5424 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5425 case DW_AT_sf_names: return "DW_AT_sf_names";
5426 case DW_AT_src_info: return "DW_AT_src_info";
5427 case DW_AT_mac_info: return "DW_AT_mac_info";
5428 case DW_AT_src_coords: return "DW_AT_src_coords";
5429 case DW_AT_body_begin: return "DW_AT_body_begin";
5430 case DW_AT_body_end: return "DW_AT_body_end";
5433 static char buffer [100];
5435 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5442 get_FORM_name (form)
5447 case DW_FORM_addr: return "DW_FORM_addr";
5448 case DW_FORM_block2: return "DW_FORM_block2";
5449 case DW_FORM_block4: return "DW_FORM_block4";
5450 case DW_FORM_data2: return "DW_FORM_data2";
5451 case DW_FORM_data4: return "DW_FORM_data4";
5452 case DW_FORM_data8: return "DW_FORM_data8";
5453 case DW_FORM_string: return "DW_FORM_string";
5454 case DW_FORM_block: return "DW_FORM_block";
5455 case DW_FORM_block1: return "DW_FORM_block1";
5456 case DW_FORM_data1: return "DW_FORM_data1";
5457 case DW_FORM_flag: return "DW_FORM_flag";
5458 case DW_FORM_sdata: return "DW_FORM_sdata";
5459 case DW_FORM_strp: return "DW_FORM_strp";
5460 case DW_FORM_udata: return "DW_FORM_udata";
5461 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5462 case DW_FORM_ref1: return "DW_FORM_ref1";
5463 case DW_FORM_ref2: return "DW_FORM_ref2";
5464 case DW_FORM_ref4: return "DW_FORM_ref4";
5465 case DW_FORM_ref8: return "DW_FORM_ref8";
5466 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5467 case DW_FORM_indirect: return "DW_FORM_indirect";
5470 static char buffer [100];
5472 sprintf (buffer, _("Unknown FORM value: %lx"), form);
5478 /* FIXME: There are better and more effiecint ways to handle
5479 these structures. For now though, I just want something that
5480 is simple to implement. */
5481 typedef struct abbrev_attr
5483 unsigned long attribute;
5485 struct abbrev_attr * next;
5489 typedef struct abbrev_entry
5491 unsigned long entry;
5494 struct abbrev_attr * first_attr;
5495 struct abbrev_attr * last_attr;
5496 struct abbrev_entry * next;
5500 static abbrev_entry * first_abbrev = NULL;
5501 static abbrev_entry * last_abbrev = NULL;
5504 free_abbrevs PARAMS ((void))
5506 abbrev_entry * abbrev;
5508 for (abbrev = first_abbrev; abbrev;)
5510 abbrev_entry * next = abbrev->next;
5513 for (attr = abbrev->first_attr; attr;)
5515 abbrev_attr * next = attr->next;
5525 last_abbrev = first_abbrev = NULL;
5529 add_abbrev (number, tag, children)
5530 unsigned long number;
5534 abbrev_entry * entry;
5536 entry = (abbrev_entry *) malloc (sizeof (* entry));
5542 entry->entry = number;
5544 entry->children = children;
5545 entry->first_attr = NULL;
5546 entry->last_attr = NULL;
5549 if (first_abbrev == NULL)
5550 first_abbrev = entry;
5552 last_abbrev->next = entry;
5554 last_abbrev = entry;
5558 add_abbrev_attr (attribute, form)
5559 unsigned long attribute;
5564 attr = (abbrev_attr *) malloc (sizeof (* attr));
5570 attr->attribute = attribute;
5574 if (last_abbrev->first_attr == NULL)
5575 last_abbrev->first_attr = attr;
5577 last_abbrev->last_attr->next = attr;
5579 last_abbrev->last_attr = attr;
5582 /* Processes the (partial) contents of a .debug_abbrev section.
5583 Returns NULL if the end of the section was encountered.
5584 Returns the address after the last byte read if the end of
5585 an abbreviation set was found. */
5587 static unsigned char *
5588 process_abbrev_section (start, end)
5589 unsigned char * start;
5590 unsigned char * end;
5592 if (first_abbrev != NULL)
5598 unsigned long entry;
5600 unsigned long attribute;
5603 entry = read_leb128 (start, & bytes_read, 0);
5604 start += bytes_read;
5606 /* A single zero is supposed to end the section according
5607 to the standard. If there's more, then signal that to
5610 return start == end ? NULL : start;
5612 tag = read_leb128 (start, & bytes_read, 0);
5613 start += bytes_read;
5615 children = * start ++;
5617 add_abbrev (entry, tag, children);
5623 attribute = read_leb128 (start, & bytes_read, 0);
5624 start += bytes_read;
5626 form = read_leb128 (start, & bytes_read, 0);
5627 start += bytes_read;
5630 add_abbrev_attr (attribute, form);
5632 while (attribute != 0);
5640 display_debug_abbrev (section, start, file)
5641 Elf32_Internal_Shdr * section;
5642 unsigned char * start;
5643 FILE * file ATTRIBUTE_UNUSED;
5645 abbrev_entry * entry;
5646 unsigned char * end = start + section->sh_size;
5648 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5652 start = process_abbrev_section (start, end);
5654 printf (_(" Number TAG\n"));
5656 for (entry = first_abbrev; entry; entry = entry->next)
5660 printf (_(" %ld %s [%s]\n"),
5662 get_TAG_name (entry->tag),
5663 entry->children ? _("has children") : _("no children"));
5665 for (attr = entry->first_attr; attr; attr = attr->next)
5667 printf (_(" %-18s %s\n"),
5668 get_AT_name (attr->attribute),
5669 get_FORM_name (attr->form));
5681 static unsigned char *
5682 display_block (data, length)
5683 unsigned char * data;
5684 unsigned long length;
5686 printf (_(" %lu byte block: "), length);
5689 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
5695 decode_location_expression (data, pointer_size, length)
5696 unsigned char * data;
5697 unsigned int pointer_size;
5698 unsigned long length;
5702 unsigned long uvalue;
5703 unsigned char *end = data + length;
5712 printf ("DW_OP_addr: %lx",
5713 (unsigned long) byte_get (data, pointer_size));
5714 data += pointer_size;
5717 printf ("DW_OP_deref");
5720 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
5723 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
5726 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
5730 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
5734 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
5738 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
5742 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
5743 (unsigned long) byte_get (data + 4, 4));
5747 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
5748 (long) byte_get (data + 4, 4));
5752 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
5756 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
5760 printf ("DW_OP_dup");
5763 printf ("DW_OP_drop");
5766 printf ("DW_OP_over");
5769 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
5772 printf ("DW_OP_swap");
5775 printf ("DW_OP_rot");
5778 printf ("DW_OP_xderef");
5781 printf ("DW_OP_abs");
5784 printf ("DW_OP_and");
5787 printf ("DW_OP_div");
5790 printf ("DW_OP_minus");
5793 printf ("DW_OP_mod");
5796 printf ("DW_OP_mul");
5799 printf ("DW_OP_neg");
5802 printf ("DW_OP_not");
5805 printf ("DW_OP_or");
5808 printf ("DW_OP_plus");
5810 case DW_OP_plus_uconst:
5811 printf ("DW_OP_plus_uconst: %lu",
5812 read_leb128 (data, &bytes_read, 0));
5816 printf ("DW_OP_shl");
5819 printf ("DW_OP_shr");
5822 printf ("DW_OP_shra");
5825 printf ("DW_OP_xor");
5828 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
5832 printf ("DW_OP_eq");
5835 printf ("DW_OP_ge");
5838 printf ("DW_OP_gt");
5841 printf ("DW_OP_le");
5844 printf ("DW_OP_lt");
5847 printf ("DW_OP_ne");
5850 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
5886 printf ("DW_OP_lit%d", op - DW_OP_lit0);
5921 printf ("DW_OP_reg%d", op - DW_OP_reg0);
5956 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
5957 read_leb128 (data, &bytes_read, 1));
5962 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
5966 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
5970 uvalue = read_leb128 (data, &bytes_read, 0);
5972 printf ("DW_OP_bregx: %lu %ld", uvalue,
5973 read_leb128 (data, &bytes_read, 1));
5977 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
5980 case DW_OP_deref_size:
5981 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
5983 case DW_OP_xderef_size:
5984 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
5987 printf ("DW_OP_nop");
5991 if (op >= DW_OP_lo_user
5992 && op <= DW_OP_hi_user)
5993 printf (_("(User defined location op)"));
5995 printf (_("(Unknown location op)"));
5996 /* No way to tell where the next op is, so just bail. */
6003 static unsigned char *
6004 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
6005 unsigned long attribute;
6007 unsigned char * data;
6008 unsigned long cu_offset;
6009 unsigned long pointer_size;
6011 unsigned long uvalue = 0;
6012 unsigned char * block_start = NULL;
6015 printf (" %-18s:", get_AT_name (attribute));
6022 case DW_FORM_ref_addr:
6024 uvalue = byte_get (data, pointer_size);
6025 data += pointer_size;
6031 uvalue = byte_get (data ++, 1);
6036 uvalue = byte_get (data, 2);
6042 uvalue = byte_get (data, 4);
6047 uvalue = read_leb128 (data, & bytes_read, 1);
6051 case DW_FORM_ref_udata:
6053 uvalue = read_leb128 (data, & bytes_read, 0);
6060 case DW_FORM_ref_addr:
6061 printf (" <#%lx>", uvalue);
6067 case DW_FORM_ref_udata:
6068 printf (" <%lx>", uvalue + cu_offset);
6072 printf (" %#lx", uvalue);
6080 printf (" %ld", uvalue);
6085 uvalue = byte_get (data, 4);
6086 printf (" %lx", uvalue);
6087 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6091 case DW_FORM_string:
6092 printf (" %s", data);
6093 data += strlen ((char *) data) + 1;
6097 uvalue = read_leb128 (data, & bytes_read, 0);
6098 block_start = data + bytes_read;
6099 data = display_block (block_start, uvalue);
6102 case DW_FORM_block1:
6103 uvalue = byte_get (data, 1);
6104 block_start = data + 1;
6105 data = display_block (block_start, uvalue);
6108 case DW_FORM_block2:
6109 uvalue = byte_get (data, 2);
6110 block_start = data + 2;
6111 data = display_block (block_start, uvalue);
6114 case DW_FORM_block4:
6115 uvalue = byte_get (data, 4);
6116 block_start = data + 4;
6117 data = display_block (block_start, uvalue);
6121 case DW_FORM_indirect:
6122 warn (_("Unable to handle FORM: %d"), form);
6126 warn (_("Unrecognised form: %d"), form);
6130 /* For some attributes we can display futher information. */
6139 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6140 case DW_INL_inlined: printf (_("(inlined)")); break;
6141 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6142 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6143 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6147 case DW_AT_language:
6150 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6151 case DW_LANG_C89: printf ("(ANSI C)"); break;
6152 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6153 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6154 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6155 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6156 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6157 case DW_LANG_Ada83: printf ("(Ada)"); break;
6158 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6159 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6160 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6161 default: printf ("(Unknown: %lx)", uvalue); break;
6165 case DW_AT_encoding:
6168 case DW_ATE_void: printf ("(void)"); break;
6169 case DW_ATE_address: printf ("(machine address)"); break;
6170 case DW_ATE_boolean: printf ("(boolean)"); break;
6171 case DW_ATE_complex_float: printf ("(complex float)"); break;
6172 case DW_ATE_float: printf ("(float)"); break;
6173 case DW_ATE_signed: printf ("(signed)"); break;
6174 case DW_ATE_signed_char: printf ("(signed char)"); break;
6175 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6176 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6178 if (uvalue >= DW_ATE_lo_user
6179 && uvalue <= DW_ATE_hi_user)
6180 printf ("(user defined type)");
6182 printf ("(unknown type)");
6187 case DW_AT_accessibility:
6190 case DW_ACCESS_public: printf ("(public)"); break;
6191 case DW_ACCESS_protected: printf ("(protected)"); break;
6192 case DW_ACCESS_private: printf ("(private)"); break;
6193 default: printf ("(unknown accessibility)"); break;
6197 case DW_AT_visibility:
6200 case DW_VIS_local: printf ("(local)"); break;
6201 case DW_VIS_exported: printf ("(exported)"); break;
6202 case DW_VIS_qualified: printf ("(qualified)"); break;
6203 default: printf ("(unknown visibility)"); break;
6207 case DW_AT_virtuality:
6210 case DW_VIRTUALITY_none: printf ("(none)"); break;
6211 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6212 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6213 default: printf ("(unknown virtuality)"); break;
6217 case DW_AT_identifier_case:
6220 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6221 case DW_ID_up_case: printf ("(up_case)"); break;
6222 case DW_ID_down_case: printf ("(down_case)"); break;
6223 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6224 default: printf ("(unknown case)"); break;
6228 case DW_AT_calling_convention:
6231 case DW_CC_normal: printf ("(normal)"); break;
6232 case DW_CC_program: printf ("(program)"); break;
6233 case DW_CC_nocall: printf ("(nocall)"); break;
6235 if (uvalue >= DW_CC_lo_user
6236 && uvalue <= DW_CC_hi_user)
6237 printf ("(user defined)");
6239 printf ("(unknown convention)");
6243 case DW_AT_frame_base:
6244 case DW_AT_location:
6245 case DW_AT_data_member_location:
6246 case DW_AT_vtable_elem_location:
6250 decode_location_expression (block_start, pointer_size, uvalue);
6264 display_debug_info (section, start, file)
6265 Elf32_Internal_Shdr * section;
6266 unsigned char * start;
6269 unsigned char * end = start + section->sh_size;
6270 unsigned char * section_begin = start;
6272 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6276 DWARF2_External_CompUnit * external;
6277 DWARF2_Internal_CompUnit compunit;
6278 unsigned char * tags;
6281 unsigned long cu_offset;
6283 external = (DWARF2_External_CompUnit *) start;
6285 compunit.cu_length = BYTE_GET (external->cu_length);
6286 compunit.cu_version = BYTE_GET (external->cu_version);
6287 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6288 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
6290 tags = start + sizeof (* external);
6291 cu_offset = start - section_begin;
6292 start += compunit.cu_length + sizeof (external->cu_length);
6294 if (compunit.cu_version != 2)
6296 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6300 printf (_(" Compilation Unit:\n"));
6301 printf (_(" Length: %ld\n"), compunit.cu_length);
6302 printf (_(" Version: %d\n"), compunit.cu_version);
6303 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6304 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
6306 if (first_abbrev != NULL)
6309 /* Read in the abbrevs used by this compilation unit. */
6312 Elf32_Internal_Shdr * sec;
6313 unsigned char * begin;
6315 /* Locate the .debug_abbrev section and process it. */
6316 for (i = 0, sec = section_headers;
6317 i < elf_header.e_shnum;
6319 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6322 if (i == -1 || sec->sh_size == 0)
6324 warn (_("Unable to locate .debug_abbrev section!\n"));
6328 GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6329 "debug_abbrev section data");
6331 process_abbrev_section (begin + compunit.cu_abbrev_offset,
6332 begin + sec->sh_size);
6338 while (tags < start)
6341 unsigned long abbrev_number;
6342 abbrev_entry * entry;
6345 abbrev_number = read_leb128 (tags, & bytes_read, 0);
6348 /* A null DIE marks the end of a list of children. */
6349 if (abbrev_number == 0)
6355 /* Scan through the abbreviation list until we reach the
6357 for (entry = first_abbrev;
6358 entry && entry->entry != abbrev_number;
6359 entry = entry->next)
6364 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6369 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6370 level, tags - section_begin - bytes_read,
6372 get_TAG_name (entry->tag));
6374 for (attr = entry->first_attr; attr; attr = attr->next)
6375 tags = read_and_display_attr (attr->attribute,
6378 compunit.cu_pointer_size);
6380 if (entry->children)
6391 display_debug_aranges (section, start, file)
6392 Elf32_Internal_Shdr * section;
6393 unsigned char * start;
6394 FILE * file ATTRIBUTE_UNUSED;
6396 unsigned char * end = start + section->sh_size;
6398 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6402 DWARF2_External_ARange * external;
6403 DWARF2_Internal_ARange arange;
6404 unsigned char * ranges;
6405 unsigned long length;
6406 unsigned long address;
6409 external = (DWARF2_External_ARange *) start;
6411 arange.ar_length = BYTE_GET (external->ar_length);
6412 arange.ar_version = BYTE_GET (external->ar_version);
6413 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
6414 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6415 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6417 if (arange.ar_version != 2)
6419 warn (_("Only DWARF 2 aranges are currently supported.\n"));
6423 printf (_(" Length: %ld\n"), arange.ar_length);
6424 printf (_(" Version: %d\n"), arange.ar_version);
6425 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
6426 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6427 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6429 printf (_("\n Address Length\n"));
6431 ranges = start + sizeof (* external);
6433 /* Must pad to an alignment boundary that is twice the pointer size. */
6434 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
6436 ranges += (2 * arange.ar_pointer_size) - excess;
6440 address = byte_get (ranges, arange.ar_pointer_size);
6442 ranges += arange.ar_pointer_size;
6444 length = byte_get (ranges, arange.ar_pointer_size);
6446 ranges += arange.ar_pointer_size;
6448 /* A pair of zeros marks the end of the list. */
6449 if (address == 0 && length == 0)
6452 printf (" %8.8lx %lu\n", address, length);
6455 start += arange.ar_length + sizeof (external->ar_length);
6465 display_debug_not_supported (section, start, file)
6466 Elf32_Internal_Shdr * section;
6467 unsigned char * start ATTRIBUTE_UNUSED;
6468 FILE * file ATTRIBUTE_UNUSED;
6470 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6471 SECTION_NAME (section));
6476 /* Pre-scan the .debug_info section to record the size of address.
6477 When dumping the .debug_line, we use that size information, assuming
6478 that all compilation units have the same address size. */
6480 prescan_debug_info (section, start, file)
6481 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
6482 unsigned char * start;
6483 FILE * file ATTRIBUTE_UNUSED;
6485 DWARF2_External_CompUnit * external;
6487 external = (DWARF2_External_CompUnit *) start;
6489 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
6493 /* A structure containing the name of a debug section and a pointer
6494 to a function that can decode it. The third field is a prescan
6495 function to be run over the section before displaying any of the
6500 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6501 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6505 { ".debug_info", display_debug_info, prescan_debug_info },
6506 { ".debug_abbrev", display_debug_abbrev, NULL },
6507 { ".debug_line", display_debug_lines, NULL },
6508 { ".debug_aranges", display_debug_aranges, NULL },
6509 { ".debug_pubnames", display_debug_pubnames, NULL },
6510 { ".debug_macinfo", display_debug_not_supported, NULL },
6511 { ".debug_frame", display_debug_not_supported, NULL },
6512 { ".debug_str", display_debug_not_supported, NULL },
6513 { ".debug_static_func", display_debug_not_supported, NULL },
6514 { ".debug_static_vars", display_debug_not_supported, NULL },
6515 { ".debug_types", display_debug_not_supported, NULL },
6516 { ".debug_weaknames", display_debug_not_supported, NULL }
6520 display_debug_section (section, file)
6521 Elf32_Internal_Shdr * section;
6524 char * name = SECTION_NAME (section);
6525 bfd_size_type length;
6526 unsigned char * start;
6529 length = section->sh_size;
6532 printf (_("\nSection '%s' has no debugging data.\n"), name);
6536 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6537 "debug section data");
6539 /* See if we know how to display the contents of this section. */
6540 for (i = NUM_ELEM (debug_displays); i--;)
6541 if (strcmp (debug_displays[i].name, name) == 0)
6543 debug_displays[i].display (section, start, file);
6548 printf (_("Unrecognised debug section: %s\n"), name);
6552 /* If we loaded in the abbrev section at some point,
6553 we must release it here. */
6554 if (first_abbrev != NULL)
6561 process_section_contents (file)
6564 Elf32_Internal_Shdr * section;
6570 /* Pre-scan the debug sections to find some debug information not
6571 present in some of them. For the .debug_line, we must find out the
6572 size of address (specified in .debug_info and .debug_aranges). */
6573 for (i = 0, section = section_headers;
6574 i < elf_header.e_shnum && i < num_dump_sects;
6577 char * name = SECTION_NAME (section);
6580 if (section->sh_size == 0)
6583 /* See if there is some pre-scan operation for this section. */
6584 for (j = NUM_ELEM (debug_displays); j--;)
6585 if (strcmp (debug_displays[j].name, name) == 0)
6587 if (debug_displays[j].prescan != NULL)
6589 bfd_size_type length;
6590 unsigned char * start;
6592 length = section->sh_size;
6593 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6594 "debug section data");
6596 debug_displays[j].prescan (section, start, file);
6604 for (i = 0, section = section_headers;
6605 i < elf_header.e_shnum && i < num_dump_sects;
6608 #ifdef SUPPORT_DISASSEMBLY
6609 if (dump_sects[i] & DISASS_DUMP)
6610 disassemble_section (section, file);
6612 if (dump_sects[i] & HEX_DUMP)
6613 dump_section (section, file);
6615 if (dump_sects[i] & DEBUG_DUMP)
6616 display_debug_section (section, file);
6619 if (i < num_dump_sects)
6620 warn (_("Some sections were not dumped because they do not exist!\n"));
6626 process_mips_fpe_exception (mask)
6632 if (mask & OEX_FPU_INEX)
6633 fputs ("INEX", stdout), first = 0;
6634 if (mask & OEX_FPU_UFLO)
6635 printf ("%sUFLO", first ? "" : "|"), first = 0;
6636 if (mask & OEX_FPU_OFLO)
6637 printf ("%sOFLO", first ? "" : "|"), first = 0;
6638 if (mask & OEX_FPU_DIV0)
6639 printf ("%sDIV0", first ? "" : "|"), first = 0;
6640 if (mask & OEX_FPU_INVAL)
6641 printf ("%sINVAL", first ? "" : "|");
6644 fputs ("0", stdout);
6648 process_mips_specific (file)
6651 Elf_Internal_Dyn * entry;
6652 size_t liblist_offset = 0;
6653 size_t liblistno = 0;
6654 size_t conflictsno = 0;
6655 size_t options_offset = 0;
6656 size_t conflicts_offset = 0;
6658 /* We have a lot of special sections. Thanks SGI! */
6659 if (dynamic_segment == NULL)
6660 /* No information available. */
6663 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
6664 switch (entry->d_tag)
6666 case DT_MIPS_LIBLIST:
6667 liblist_offset = entry->d_un.d_val - loadaddr;
6669 case DT_MIPS_LIBLISTNO:
6670 liblistno = entry->d_un.d_val;
6672 case DT_MIPS_OPTIONS:
6673 options_offset = entry->d_un.d_val - loadaddr;
6675 case DT_MIPS_CONFLICT:
6676 conflicts_offset = entry->d_un.d_val - loadaddr;
6678 case DT_MIPS_CONFLICTNO:
6679 conflictsno = entry->d_un.d_val;
6685 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
6687 Elf32_External_Lib * elib;
6690 GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
6691 elib, Elf32_External_Lib *, "liblist");
6693 printf ("\nSection '.liblist' contains %lu entries:\n",
6694 (unsigned long) liblistno);
6695 fputs (" Library Time Stamp Checksum Version Flags\n",
6698 for (cnt = 0; cnt < liblistno; ++cnt)
6705 liblist.l_name = BYTE_GET (elib[cnt].l_name);
6706 time = BYTE_GET (elib[cnt].l_time_stamp);
6707 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
6708 liblist.l_version = BYTE_GET (elib[cnt].l_version);
6709 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
6711 tmp = gmtime (&time);
6712 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
6713 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6714 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6716 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
6717 dynamic_strings + liblist.l_name, timebuf,
6718 liblist.l_checksum, liblist.l_version);
6720 if (liblist.l_flags == 0)
6731 { " EXACT_MATCH", LL_EXACT_MATCH },
6732 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
6733 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
6734 { " EXPORTS", LL_EXPORTS },
6735 { " DELAY_LOAD", LL_DELAY_LOAD },
6736 { " DELTA", LL_DELTA }
6738 int flags = liblist.l_flags;
6742 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
6744 if ((flags & l_flags_vals[fcnt].bit) != 0)
6746 fputs (l_flags_vals[fcnt].name, stdout);
6747 flags ^= l_flags_vals[fcnt].bit;
6750 printf (" %#x", (unsigned int) flags);
6759 if (options_offset != 0)
6761 Elf_External_Options * eopt;
6762 Elf_Internal_Shdr * sect = section_headers;
6763 Elf_Internal_Options * iopt;
6764 Elf_Internal_Options * option;
6768 /* Find the section header so that we get the size. */
6769 while (sect->sh_type != SHT_MIPS_OPTIONS)
6772 GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
6773 Elf_External_Options *, "options");
6775 iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
6779 error (_("Out of memory"));
6786 while (offset < sect->sh_size)
6788 Elf_External_Options * eoption;
6790 eoption = (Elf_External_Options *) ((char *) eopt + offset);
6792 option->kind = BYTE_GET (eoption->kind);
6793 option->size = BYTE_GET (eoption->size);
6794 option->section = BYTE_GET (eoption->section);
6795 option->info = BYTE_GET (eoption->info);
6797 offset += option->size;
6803 printf (_("\nSection '%s' contains %d entries:\n"),
6804 string_table + sect->sh_name, cnt);
6812 switch (option->kind)
6815 /* This shouldn't happen. */
6816 printf (" NULL %d %lx", option->section, option->info);
6819 printf (" REGINFO ");
6820 if (elf_header.e_machine == EM_MIPS)
6823 Elf32_External_RegInfo *ereg;
6824 Elf32_RegInfo reginfo;
6826 ereg = (Elf32_External_RegInfo *) (option + 1);
6827 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6828 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6829 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6830 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6831 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6832 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
6834 printf ("GPR %08lx GP 0x%lx\n",
6836 (unsigned long) reginfo.ri_gp_value);
6837 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6838 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6839 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6844 Elf64_External_RegInfo * ereg;
6845 Elf64_Internal_RegInfo reginfo;
6847 ereg = (Elf64_External_RegInfo *) (option + 1);
6848 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6849 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6850 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6851 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6852 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6853 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
6855 printf ("GPR %08lx GP 0x",
6856 reginfo.ri_gprmask);
6857 printf_vma (reginfo.ri_gp_value);
6860 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6861 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6862 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6866 case ODK_EXCEPTIONS:
6867 fputs (" EXCEPTIONS fpe_min(", stdout);
6868 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
6869 fputs (") fpe_max(", stdout);
6870 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
6871 fputs (")", stdout);
6873 if (option->info & OEX_PAGE0)
6874 fputs (" PAGE0", stdout);
6875 if (option->info & OEX_SMM)
6876 fputs (" SMM", stdout);
6877 if (option->info & OEX_FPDBUG)
6878 fputs (" FPDBUG", stdout);
6879 if (option->info & OEX_DISMISS)
6880 fputs (" DISMISS", stdout);
6883 fputs (" PAD ", stdout);
6884 if (option->info & OPAD_PREFIX)
6885 fputs (" PREFIX", stdout);
6886 if (option->info & OPAD_POSTFIX)
6887 fputs (" POSTFIX", stdout);
6888 if (option->info & OPAD_SYMBOL)
6889 fputs (" SYMBOL", stdout);
6892 fputs (" HWPATCH ", stdout);
6893 if (option->info & OHW_R4KEOP)
6894 fputs (" R4KEOP", stdout);
6895 if (option->info & OHW_R8KPFETCH)
6896 fputs (" R8KPFETCH", stdout);
6897 if (option->info & OHW_R5KEOP)
6898 fputs (" R5KEOP", stdout);
6899 if (option->info & OHW_R5KCVTL)
6900 fputs (" R5KCVTL", stdout);
6903 fputs (" FILL ", stdout);
6904 /* XXX Print content of info word? */
6907 fputs (" TAGS ", stdout);
6908 /* XXX Print content of info word? */
6911 fputs (" HWAND ", stdout);
6912 if (option->info & OHWA0_R4KEOP_CHECKED)
6913 fputs (" R4KEOP_CHECKED", stdout);
6914 if (option->info & OHWA0_R4KEOP_CLEAN)
6915 fputs (" R4KEOP_CLEAN", stdout);
6918 fputs (" HWOR ", stdout);
6919 if (option->info & OHWA0_R4KEOP_CHECKED)
6920 fputs (" R4KEOP_CHECKED", stdout);
6921 if (option->info & OHWA0_R4KEOP_CLEAN)
6922 fputs (" R4KEOP_CLEAN", stdout);
6925 printf (" GP_GROUP %#06lx self-contained %#06lx",
6926 option->info & OGP_GROUP,
6927 (option->info & OGP_SELF) >> 16);
6930 printf (" IDENT %#06lx self-contained %#06lx",
6931 option->info & OGP_GROUP,
6932 (option->info & OGP_SELF) >> 16);
6935 /* This shouldn't happen. */
6936 printf (" %3d ??? %d %lx",
6937 option->kind, option->section, option->info);
6941 len = sizeof (*eopt);
6942 while (len < option->size)
6943 if (((char *) option)[len] >= ' '
6944 && ((char *) option)[len] < 0x7f)
6945 printf ("%c", ((char *) option)[len++]);
6947 printf ("\\%03o", ((char *) option)[len++]);
6949 fputs ("\n", stdout);
6956 if (conflicts_offset != 0 && conflictsno != 0)
6958 Elf32_External_Conflict * econf32;
6959 Elf64_External_Conflict * econf64;
6960 Elf32_Conflict * iconf;
6963 if (dynamic_symbols == NULL)
6965 error (_("conflict list with without table"));
6969 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
6972 error (_("Out of memory"));
6978 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32),
6979 econf32, Elf32_External_Conflict *, "conflict");
6981 for (cnt = 0; cnt < conflictsno; ++cnt)
6982 iconf[cnt] = BYTE_GET (econf32[cnt]);
6986 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64),
6987 econf64, Elf64_External_Conflict *, "conflict");
6989 for (cnt = 0; cnt < conflictsno; ++cnt)
6990 iconf[cnt] = BYTE_GET (econf64[cnt]);
6993 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
6994 puts (_(" Num: Index Value Name"));
6996 for (cnt = 0; cnt < conflictsno; ++cnt)
6998 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
7000 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
7001 print_vma (psym->st_value, FULL_HEX);
7002 printf (" %s\n", dynamic_strings + psym->st_name);
7012 get_note_type (e_type)
7015 static char buff[64];
7019 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
7020 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
7021 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
7022 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
7023 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
7024 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
7025 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
7026 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
7027 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
7028 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
7029 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
7031 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
7036 /* Note that by the ELF standard, the name field is already null byte
7037 terminated, and namesz includes the terminating null byte.
7038 I.E. the value of namesz for the name "FSF" is 4.
7040 If the value of namesz is zero, there is no name present. */
7042 process_note (pnote)
7043 Elf32_Internal_Note * pnote;
7045 printf (" %s\t\t0x%08lx\t%s\n",
7046 pnote->namesz ? pnote->namedata : "(NONE)",
7047 pnote->descsz, get_note_type (pnote->type));
7053 process_corefile_note_segment (file, offset, length)
7058 Elf_External_Note * pnotes;
7059 Elf_External_Note * external;
7065 GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
7069 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
7070 (unsigned long) offset, (unsigned long) length);
7071 printf (_(" Owner\t\tData size\tDescription\n"));
7073 while (external < (Elf_External_Note *)((char *) pnotes + length))
7075 Elf32_Internal_Note inote;
7078 inote.type = BYTE_GET (external->type);
7079 inote.namesz = BYTE_GET (external->namesz);
7080 inote.namedata = external->name;
7081 inote.descsz = BYTE_GET (external->descsz);
7082 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
7083 inote.descpos = offset + (inote.descdata - (char *) pnotes);
7085 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
7087 /* Verify that name is null terminated. It appears that at least
7088 one version of Linux (RedHat 6.0) generates corefiles that don't
7089 comply with the ELF spec by failing to include the null byte in
7091 if (inote.namedata[inote.namesz] != '\0')
7093 temp = malloc (inote.namesz + 1);
7097 error (_("Out of memory\n"));
7102 strncpy (temp, inote.namedata, inote.namesz);
7103 temp[inote.namesz] = 0;
7105 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
7106 inote.namedata = temp;
7109 res &= process_note (& inote);
7124 process_corefile_note_segments (file)
7127 Elf_Internal_Phdr * program_headers;
7128 Elf_Internal_Phdr * segment;
7132 program_headers = (Elf_Internal_Phdr *) malloc
7133 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
7135 if (program_headers == NULL)
7137 error (_("Out of memory\n"));
7142 i = get_32bit_program_headers (file, program_headers);
7144 i = get_64bit_program_headers (file, program_headers);
7148 free (program_headers);
7152 for (i = 0, segment = program_headers;
7153 i < elf_header.e_phnum;
7156 if (segment->p_type == PT_NOTE)
7157 res &= process_corefile_note_segment (file,
7158 (bfd_vma) segment->p_offset,
7159 (bfd_vma) segment->p_filesz);
7162 free (program_headers);
7168 process_corefile_contents (file)
7171 /* If we have not been asked to display the notes then do nothing. */
7175 /* If file is not a core file then exit. */
7176 if (elf_header.e_type != ET_CORE)
7179 /* No program headers means no NOTE segment. */
7180 if (elf_header.e_phnum == 0)
7182 printf (_("No note segments present in the core file.\n"));
7186 return process_corefile_note_segments (file);
7190 process_arch_specific (file)
7196 switch (elf_header.e_machine)
7199 case EM_MIPS_RS4_BE:
7200 return process_mips_specific (file);
7209 get_file_header (file)
7212 /* Read in the identity array. */
7213 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
7216 /* Determine how to read the rest of the header. */
7217 switch (elf_header.e_ident [EI_DATA])
7219 default: /* fall through */
7220 case ELFDATANONE: /* fall through */
7221 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
7222 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
7225 /* For now we only support 32 bit and 64 bit ELF files. */
7226 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
7228 /* Read in the rest of the header. */
7231 Elf32_External_Ehdr ehdr32;
7233 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
7236 elf_header.e_type = BYTE_GET (ehdr32.e_type);
7237 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
7238 elf_header.e_version = BYTE_GET (ehdr32.e_version);
7239 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
7240 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
7241 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
7242 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
7243 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
7244 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
7245 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
7246 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
7247 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
7248 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
7252 Elf64_External_Ehdr ehdr64;
7254 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7255 we will not be able to cope with the 64bit data found in
7256 64 ELF files. Detect this now and abort before we start
7257 overwritting things. */
7258 if (sizeof (bfd_vma) < 8)
7260 error (_("This instance of readelf has been built without support for a\n"));
7261 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7265 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
7268 elf_header.e_type = BYTE_GET (ehdr64.e_type);
7269 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
7270 elf_header.e_version = BYTE_GET (ehdr64.e_version);
7271 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
7272 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
7273 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
7274 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
7275 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
7276 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
7277 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
7278 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
7279 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
7280 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
7287 process_file (file_name)
7291 struct stat statbuf;
7294 if (stat (file_name, & statbuf) < 0)
7296 error (_("Cannot stat input file %s.\n"), file_name);
7300 file = fopen (file_name, "rb");
7303 error (_("Input file %s not found.\n"), file_name);
7307 if (! get_file_header (file))
7309 error (_("%s: Failed to read file header\n"), file_name);
7314 /* Initialise per file variables. */
7315 for (i = NUM_ELEM (version_info); i--;)
7316 version_info[i] = 0;
7318 for (i = NUM_ELEM (dynamic_info); i--;)
7319 dynamic_info[i] = 0;
7321 /* Process the file. */
7323 printf (_("\nFile: %s\n"), file_name);
7325 if (! process_file_header ())
7331 process_section_headers (file);
7333 process_program_headers (file);
7335 process_dynamic_segment (file);
7337 process_relocs (file);
7339 process_symbol_table (file);
7341 process_syminfo (file);
7343 process_version_sections (file);
7345 process_section_contents (file);
7347 process_corefile_contents (file);
7349 process_arch_specific (file);
7353 if (section_headers)
7355 free (section_headers);
7356 section_headers = NULL;
7361 free (string_table);
7362 string_table = NULL;
7365 if (dynamic_strings)
7367 free (dynamic_strings);
7368 dynamic_strings = NULL;
7371 if (dynamic_symbols)
7373 free (dynamic_symbols);
7374 dynamic_symbols = NULL;
7375 num_dynamic_syms = 0;
7378 if (dynamic_syminfo)
7380 free (dynamic_syminfo);
7381 dynamic_syminfo = NULL;
7385 #ifdef SUPPORT_DISASSEMBLY
7386 /* Needed by the i386 disassembler. For extra credit, someone could
7387 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7391 print_address (unsigned int addr, FILE * outfile)
7393 fprintf (outfile,"0x%8.8x", addr);
7396 /* Needed by the i386 disassembler. */
7398 db_task_printsym (unsigned int addr)
7400 print_address (addr, stderr);
7409 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7410 setlocale (LC_MESSAGES, "");
7412 bindtextdomain (PACKAGE, LOCALEDIR);
7413 textdomain (PACKAGE);
7415 parse_args (argc, argv);
7417 if (optind < (argc - 1))
7420 while (optind < argc)
7421 process_file (argv [optind ++]);
7423 if (dump_sects != NULL)